DS18B20温度测量报警 设定温度上下限.docx
- 文档编号:24598632
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:19
- 大小:16.34KB
DS18B20温度测量报警 设定温度上下限.docx
《DS18B20温度测量报警 设定温度上下限.docx》由会员分享,可在线阅读,更多相关《DS18B20温度测量报警 设定温度上下限.docx(19页珍藏版)》请在冰豆网上搜索。
DS18B20温度测量报警设定温度上下限
DS18B20温度测量报警设定温度上下限
分类:
单片机2011-10-0719:
42719人阅读评论
(1)收藏举报
#include
#include
ucharDQ;
uchark;
sbitds=P2^4;//温度传感器引脚;
sbitbeep=P2^0;//蜂鸣器
uinttemp;
floatftemp;
ucharg1=22,g2=24,d1=20,d2=18;
sbitb=P2^3;//定义按键;
sbita=P2^2;//定义按键;
sbitE=P2^7;//使能信号;
sbitRW=P2^6;//读写选择写指令RS=0;RW=0;D0~D7指令码;E高脉冲;
sbitRS=P2^5;//数据/命令选择写数据RS=1;RW=0;D0~D7数据;E高脉冲
ucharcodetable1[]="DS18B20OK!
";
ucharcodetable2[]="TEMPIS:
.";
//自定义字符显示'C;
ucharcodetable[8]={0x16,0x09,0x08,0x08,0x08,0x09,0x06,0x00};
ucharcodetable3[]="DS18B20ERR0R!
";
ucharcodetable4[]="PLEASECHECK!
";
ucharcodetable7[]="setstandard";
ucharcodetable8[]="tempreture!
";
ucharcodetable5[]="G1=,G2=.";
ucharcodetable6[]="D1=,D2=.";
voiddelay(uintz)//延时函数
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com(ucharcom)//液晶写指令;
{
P1=com;
RS=0;
RW=0;
E=1;
delay(5);
E=0;
delay(5);
}
voidwrite_date(uchardate)//液晶写数据;
{
P1=date;
RS=1;
RW=0;
E=1;
delay(5);
E=0;
delay(5);
}
voidchushi()
{
ucharf;
write_com(0x80);
f=0;
while(table7[f]!
=0)
{
write_date(table7[f]);
f++;
}
write_com(0x80+0x40);
f=0;
while(table8[f]!
=0)
{
write_date(table8[f]);
f++;
}
}
voidinit()//液晶初始化状态;
{
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
chushi();
}
dsreset(void)//DS18B20复位初始化函数
{
uinti;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
DQ=ds;
i=4;
while(i>0)i--;
returnDQ;
}
bittempreadbit(void)//读一位数据函数
{
uinti;
bitdat;
ds=0;i++;
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return(dat);
}
uchartempread(void)//读一个字节数据函数
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
voidtempwritebyte(uchardat)//写一个字节数据函数
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)//写1
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else//写0
{
ds=0;
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
voidtempchange(void)//DS18B20开始获取温度并转换
{
dsreset();
delay
(1);
tempwritebyte(0xcc);
tempwritebyte(0x44);
}
uintget_temp()//读取寄存器中存储的温度数据
{
uchara,b;
dsreset();
delay
(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread();
b=tempread();
temp=b;
temp<<=8;
temp=temp|a;
ftemp=temp*0.0625;
temp=ftemp*10+0.5;
ftemp=ftemp+0.05;
returntemp;
}
voidinit_com(void)//串口初始化;
{
PCON=0x00;
SCON=0x50;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
}
voidcomm(char*parr)//串口发送;
{
do
{
SBUF=*parr++;
while(!
TI);
TI=0;
}while(*parr!
='\0');
}
voidzdy()//自定义字符显示’C;
{uchari;
write_com(0x40);
for(i=0;i<9;i++)
write_date(table[i]);
write_com(0x80+0x40+14);
write_date(0x00);
}
voidok()//温度传感器存在显示温度;
{
uchari;
write_com(0x80);
for(i=0;i<16;i++)
write_date(table1[i]);
write_com(0x80+0x40);
for(i=0;i<16;i++)
write_date(table2[i]);
}
voiderror()//温度传感器不存在显示错误;
{
uchari;
write_com(0x80);
for(i=0;i<16;i++)
write_date(table3[i]);
write_com(0x80+0x40);
for(i=0;i<16;i++)
write_date(table4[i]);
}
voiddisplay()//液晶显示温度;
{
write_com(0x80+0x40+10);
write_date(temp/100+0x30);
write_com(0x80+0x40+11);
write_date(temp%100/10+0x30);
write_com(0x80+0x40+13);
write_date(temp%100%10+0x30);
}
voidfmq(uinti)//蜂鸣器滴答;
{
beep=0;
delay(i);
beep=1;
}
voiddywd(ucharadd,uchardate)//定义温度液晶显示;
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
voiddi()//蜂鸣器滴答;
{
beep=0;
delay(100);
beep=1;
}
uintkeyscan()//按键扫描,调标准温度;
{
ucharf;
if(a==0)
{
delay(10);
if(a==0)
{
k++;
while(!
a);
di();
write_com(0x80);
f=0;
while(table5[f]!
=0)
{
write_date(table5[f]);
f++;
}
write_com(0x80+0x40);
f=0;
while(table6[f]!
=0)
{
write_date(table6[f]);
f++;
}
dywd(4,g1);
dywd(12,g2);
dywd(4+0x40,d1);
dywd(12+0x40,d2);
if(k==1)
{
write_com(0x80+5);
write_com(0x0f);
}
if(k==2)
{
write_com(0x80+13);
write_com(0x0f);
}
if(k==3)
{
write_com(0x80+0x40+5);
write_com(0x0f);
}
if(k==4)
{
write_com(0x80+0x40+13);
write_com(0x0f);
}
if(k==5)
{
write_com(0x0c);
}
}
}
if(k!
=0)
{
if(b==0)
{
delay(10);
if(b==0)
{
while(!
b);
di();
if(k==1)
{
g1--;
if(g1==0)
g1=60;
dywd(4,g1);
write_com(0x80+5);
}
if(k==2)
{
g2--;
if(g1==0)
g2=60;
dywd(12,g2);
write_com(0x80+13);
}
if(k==3)
{
d1--;
if(g1==0)
d1=60;
dywd(4+0x40,d1);
write_com(0x80+0x40+5);
}
if(k==4)
{
d2--;
if(g1==0)
d2=60;
dywd(12+0x40,d2);
write_com(0x80+0x40+13);
}
}
}
}
returng1;
returng2;
returnd1;
returnd2;
}
voidwarn(uinttemp)//温度报警;
{
uchara=d2,b=d1,c=g1,d=g2;
if(temp<=a*10)//灯1,2亮;
{
P0=0xfc;
fmq(250);
display();
}
elseif((temp=a*10))//灯3亮;
{
P0=0xfb;
fmq(20);
display();
}
elseif((temp
{
P0=0xe7;
display();
beep=1;
}
if((temp>c*10)&&(temp { P0=0xdf; fmq(20); display(); } elseif(temp>=d*10)//灯7,8亮; { P0=0x3f; fmq(250); display(); } } voidmain()//主函数 { ucharbuff[4]; init_com();//串口初始化; init();//液晶初始化状态; dsreset();//DS18B20复位初始化函数; tempchange();//DS18B20开始获取温度并转; get_temp();//读取寄存器中存储的温度数据 while (1) { keyscan(); if(k==5) { ok();//温度传感器存在程序; do { tempchange(); sprintf(buff,"%f",ftemp); comm(buff);//串口发送; zdy(); warn(get_temp()); } while(! DQ); error();//温度传感器不存在程序; do { fmq (1); dsreset(); P0=0x00; } while(DQ); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DS18B20温度测量报警 设定温度上下限 DS18B20 温度 测量 报警 设定 下限