while(*p!='\\0') {
writelcddat(*p); p++;
delayms(1); } }
//******************************************************************************************
void readtemperature(void)
{ uchar TL; //储存暂存器的温度低位 uchar TH; //储存暂存器的温度高位 set18b20(); write18b20(0xcc); write18b20(0x44); set18b20(); write18b20(0xcc); write18b20(0xbe); TL=read18b20(); //先读的是温度值低位 TH=read18b20(); //接着读的是温度值高位 distance_data[0]=TH ; //测量结果的高8位
distance_data[1]=TL; //放入16位的高8位 value=TH; value<<=8; value=value|TL; }
/***********************************温度****************************************************/
void disp18b20() //液晶显示温度 { uint i,t; if(value<0x0fff) //是否是负值 tflag=0; else { value=~value+1; tflag=1; } value=value*(0.625)+0.5; //扩大10倍方便读取小数 i=65000;t=220;
显示 LED=1; if((value>HT)&&(crrent=0)) //这里设置温度上限值,来控制继电器,需加crrent=0,不然DS18B20在拔掉后会出错
{ while(t--) while(i--) //这里是继电器导通为3分钟左右,中间不读取温度
{ set18b20(); LED=0; if((value } } /*改变设定温度*/ DC=1;AD=1; if(AD==0) //设定温度加 { HT++; while(!AD); } if(DC==0) //设定温度减 { HT--; while(!DC); } /*************************/ /*读取上限值温度*/ setdat[0]=HT/100+'0'; //十位 setdat[1]=HT0/10+0x30; //个位 setdat[2]=HT+'0'; /*************************/ /*读取当前温度*/ disdat[0]=value/1000+0x30;//百位数 disdat[1]=value00/100+0x30;//十位数 disdat[2]=value0/10+0x30;//个位数 disdat[3]=value+0x30;//小数位 if(tflag==0) disdat[4]=0x20; else disdat[4]=0x2d; //当最高位为0时,最高位不显示 if(disdat[0]==0x30) { disdat[0]=0x20; if(disdat[1]==0x30) disdat[1]=0x20; } /*显示当前温度*/ writelcdcmd(0x86); writelcddat(disdat[4]); //符号位 writelcdcmd(0x87); writelcddat(disdat[0]); writelcdcmd(0x88); writelcddat(disdat[1]); writelcdcmd(0x89); writelcddat(disdat[2]); writelcdcmd(0x8a); writelcddat(0x2e); //小数点 writelcdcmd(0x8b); writelcddat(disdat[3]); writelcdcmd(0x8d); //单位℃ writelcddat(0xdf); writelcdcmd(0x8e); writelcddat('C'); /*显示设定温度温度*/ writelcdcmd(0xc0); writelcddat('H'); writelcdcmd(0xc1); writelcddat('T'); writelcdcmd(0xc2); writelcddat(':'); writelcdcmd(0xc3); writelcddat(setdat[0]); writelcdcmd(0xc4); writelcddat(setdat[1]); writelcdcmd(0xc5); writelcddat('.'); writelcdcmd(0xc6); writelcddat(setdat[2]); } //********************************** 主函 数 ************************************************ void main(void) { uchar xx; init_io(); inilcd(); while(1) { readtemperature(); //实时更新温度 writelcdcmd(0x01); //每次数据变化清屏显示 do { readtemperature(); checkflag(); for(xx=0;xx<2;xx++) { tx_buf[xx]= distance_data[xx];//发数据之前必须把要发送的数据装入它 } TX_Mode(); //必须启动发送模块 delay_ms(5); writelcdcmd(0x80); play(str); disp18b20(); }while(!crrent); //检测DS18B20存在,显示温度 do{ readtemperature(); writelcdcmd(0x80); play(str1); writelcdcmd(0x80+0x40); play(str2); BEE=1; }while(crrent); } } 接收端: #include #define uchar unsigned char #define uint unsigned int sbit lcdrs=P2^0; //定义LCD引脚 sbit lcdrw=P2^1;
相关推荐: