用1602LCD与DS18B20设计的温度报警器的源程序

发给我一份啊!!!谢谢了!!!
邮箱:liksh521@163.com
......

第1个回答  2011-05-15
/************************************************************************
名称:用数码管与DS18B20设计温度报警器

**************************************************************************/
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit DQ=P3^6;
sbit D1=P1^4;
sbit D2=P1^5;
uchar code DSY_CODE[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X00};//共阴数码管段码及空白显示
uchar code df_Table[]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};//温度小数位对照表
uchar CurrentT=0;//当前读取的温度整数部分
uchar Temp_Value[]={0X00,0X00};//从DS18B20读取的温度值
uchar Display_Digit[]={0,0,0,0};//待显示的各温度数位
bit DS18B20_IS_OK=1;//传感器正常标志

/************************************************************************
程序名称:延时子程序
**************************************************************************/
void Delay(uint t)
{
for(;t>0;t--);
}

/************************************************************************
程序名称:初始化DS18B20;可参考DS18B20的初始化时序图读懂程序
************************************************************************/
uchar Init_DS18B20()
{
uchar status;
DQ=1;
_nop_();_nop_();//从高拉倒低
DQ=0;
Delay(50);
DQ=1;
Delay(6);
status=DQ;
Delay(45);
DQ=1;
return status; //初始化成功返回0
}

/*************************************************************************
程序名称:读一字节
*************************************************************************/
uchar ReadOneByte()
{
uchar i,dat=0;
DQ=1;_nop_();
for(i=0;i<8;i++)
{
DQ=0;dat>>=1;
DQ=1;_nop_();_nop_();
if(DQ)dat|=0X80;
Delay(6);
DQ=1;
}
return dat;
}

/*************************************************************************
程序名称:写一字节
*************************************************************************/
void WriteOneByte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0X01;
Delay(5);
DQ=1;
dat>>=1;
}
}

/*************************************************************************
程序名称:读取温度值
*************************************************************************/
void Read_Temperature()
{
if(Init_DS18B20( )==1)
DS18B20_IS_OK=0; //DS18B20故障
else
{
WriteOneByte(0XCC); //跳过序列号
WriteOneByte(0X44); //启动温度转换
Init_DS18B20();
WriteOneByte(0XCC); //跳过序列号
WriteOneByte(0XBE); //读取温度寄存器
Temp_Value[0]=ReadOneByte(); //温度低8位
Temp_Value[1]=ReadOneByte(); //温度高8位
DS18B20_IS_OK=1;
}
}

/*************************************************************************
程序名称:在数码管上显示温度
*************************************************************************/
void Display_Temperture()
{
uchar i;
uchar t=150; //延时值
uchar ng=0,np=0; //负数标识及负号显示位置
char Signed_Current_Temp;
if((Temp_Value[1]&0XF8)==0XF8) //如果为负数则取反加1,并设置负号标识及负号显示位置
{
Temp_Value[1]=~Temp_Value[1];
Temp_Value[0]=~Temp_Value[0]+1;
if(Temp_Value[0]==0X00) Temp_Value[1]++;
ng=1;np=0XF7; //默认负号显示在左边第1位
}
Display_Digit[0]=df_Table[Temp_Value[0] & 0X0F];//查表得到温度小数部分
CurrentT=((Temp_Value[0] & 0xF0)>>4)|((Temp_Value[1] & 0x07))<<4;//获取温度整数部分(高字节中的低3位与低字节中的高4位,无符号)
Signed_Current_Temp=ng? -CurrentT:CurrentT;//有符号的当前温度值

Display_Digit[3]=CurrentT/100;
Display_Digit[2]=CurrentT%100/10;
Display_Digit[1]=CurrentT%10;

if(Display_Digit[3]==0)
{
Display_Digit[3]=10;
np=0XF7;
if(Display_Digit[2]==0)
{
Display_Digit[2]=10;
np=0XFB; //调整负号位置
}
}

for(i=0;i<30;i++) //刷新显示若干时间
{
P0=DSY_CODE[Display_Digit[0]]; //小数位
P2=0XFE;Delay(t);P2=0XFF;
P0=(DSY_CODE[Display_Digit[1]])|0X80; //个位及小数点
P2=0XFD;Delay(t);P2=0XFF;
P0=DSY_CODE[Display_Digit[2]]; //十位
P2=0XFB;Delay(t);P2=0XFF;
P0=DSY_CODE[Display_Digit[3]]; //百位
P2=0XF7;Delay(t);P2=0XFF;
if(ng) //如果为负,则在调整后的位置显示
{
P0=0X40;P2=np;Delay(t);P2=0XFF;
}
}
if(CurrentT>=125)
D1=0;
else if(ng=1&&CurrentT>=55)
D2=0;
}

/*************************************************************************
主程序
*************************************************************************/
void main(void)
{
Read_Temperature();
Delay(50000);
Delay(50000);
while(1)
{
Read_Temperature();
if(DS18B20_IS_OK) Display_Temperture();
else P0=P2=0X00;
}
}本回答被提问者采纳
第2个回答  2011-05-15
我来帮你搞定追问

发给我啊!!!

追答

我来帮帮你!

用1602LCD与DS18B20设计的温度报警器的源程序
uchar Temp_Value[]={0X00,0X00};\/\/从DS18B20读取的温度值 uchar Display_Digit[]={0,0,0,0};\/\/待显示的各温度数位 bit DS18B20_IS_OK=1;\/\/传感器正常标志 \/ 程序名称:延时子程序 \/ void Delay(uint t){ for(;t>0;t--);} \/ 程序名称:初始化DS18B20;可参考DS18B20的初始化时序图读...

...综合设计中的用1602LCD与DS18B20设计的温度报警器中源程序,求急用...
include<reg51.h> include<string.h> define uchar unsigned char define uint unsigned int void Initialize_LCD();void DelayMS(uint ms);void ShowString(uchar,uchar,uchar *);sbit K1=P3^0;sbit K2=P3^1;sbit K3=P3^2;uchar code Prompt[]="Press K1 - K3 To Start Demo Prog";\/\/...

有关温度报警器的程序,有关DS18B20的程序已写好,求助有关蜂鸣器报警和温...
温度传感器、非挥发的温度报警触发器 TH 和 TL、配置寄存器。其中 DQ 为数字信号输 入\/输出端;GND 为电源地;VDD 为外接供电电源输入端。 2图2:温度采集电路 DS18B20 中的温度传感器可完成对温度的测量,以 12 位转化为例:用 16 位符号扩展的二进制补码读数形式提供,以 0.0625℃\/LSB 形式表达,其中 S 为符号...

1602液晶怎么送数字
\/**\/\/***DS18B20***\/ sbit ds = P2^2;\/\/初始化DS18B20 \/\/让DS18B20一段相对长时间低电平, 然后一段相对非常短时间高电平, 即可启动 void dsInit(){ \/\/对于11.0592MHz时钟, unsigned int型的i, 作一个i++操作的时间大于为8us unsigned int i;ds = 0;i = 100; \/\/拉低约800us,...

基于DS18B20温度传感器和AT98C51单片机的无线温度采集系统设计
说明:本程序使用1602LCD显示。温度采集芯片已经集成,温度模拟信号已经在DS18B20内部转换成数字信号,只需要通过18B20的数据引脚读取即可,具体请详细阅读DS18B20数据手册。要看仿真结果请到个人空间。大同小异,注意时序,串行读写时序要求最严格,程序注释很详细了。\/ 硬件:M16,DS18B20,引脚连线:DQ-PD2,仿真:...

环境温度测量需要那些原件
已知的这些,AT89C51、1602LCD、DS18B20、电阻,已经能够完成温度的检测、显示另外,如果要能够随时设定报警的阀值,则还需要至少一两个按键。或者是采用,

基于51单片机的火灾报警器设计
通过调节DS18B20和RV3滑动变阻器,可以改变温度和烟雾等级,使系统达到报警状态。系统报警状态如下:红色LED点亮,蜂鸣器鸣叫,继电器动作。用户可以通过按键设置烟雾报警等级和温度报警上下限。设置完成后,按下呼叫键,系统立刻进入报警状态,实现声光电一体化报警。此系统设计满足火灾报警需求,通过集成多种传感器...

学习单片机,开发板选购问题
因为群众的眼光是最亮的,呵呵。也不要想着一块板能解决所有单片机学习的问题,功能越强大的板子往往越复杂,对初学者反而明误导作用。屏幕一般是指液晶屏幕吧,LCD1602或者LCD12864,好多开发板默认不配后者,1602十几元,12864贵一些,40-60元之间。初学的话可以不考虑。

MCD1MCD1-DEMO教学实验板
实验板内含8个LED灯,用于直观地展示数据或状态;1602LCD显示则提供了文字和图形的显示能力。此外,还有6位数码管电路,用于数字显示;6个独立键盘,包括外部中断键盘输入,方便用户进行按键操作。红外线遥控接收输入则拓展了遥控控制的应用可能。通信接口方面,实验板配备了RS232,用于串行数据通信,以及SPI和...

...单片机用的ATmega16,液晶是1602,求详细代码
6、蜂鸣器(做单片机发声实验 播放音乐实验 报警实验等声响实验) 7、DS18B20温度传感器,(初步掌握单片机操作后即可亲自编写程序获知当时的温度 可以配合本站原创的PC与单片机双向温度控制程序 将温度实时显示在电脑上) 8、AT24C08外部EEPROM存储芯片(IIC总线元件实验) 9、SPI串行实时时钟 DS1302(熟悉SPI总线 用DS1302可以...

相似回答
大家正在搜