多路温度监控系统最多三路温度监控系统,51单片机+DS18B20+1602。三个按键输入,第一个键用来选择设置报警温度最小值还是报警温度最大值,第二个键加,第三个键减。#includereg51.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedint#defineDQP3&0x07sbitDQ0=P3^0;//定义DS18B20端口DQsbitDQ1=P3^1;sbitDQ2=P3^2;sbitkey0=P1^0;sbitkey1=P1^1;sbitkey2=P1^2;sbitBEEP=P3^6;//蜂鸣器驱动线ucharpresence;//检测18b20是否插好sbitLCD_RS=P2^0;sbitLCD_RW=P2^1;sbitLCD_EN=P2^2;ucharcodecdis1[]={};ucharcodecdis2[]={WENDU:.C};ucharcodecdis3[]={DS18B20ERR0R};ucharcodecdis4[]={PLEASECHECK};unsignedcharcodemytab[8]={0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00};voidbeep();uintwd0=0,wd1=0,wd2=0;uchardat0,dat1,dat2;ucharmin=10;ucharmax=50;#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};/*******************************************************************/voiddelay1(intms){unsignedchary;while(ms--){for(y=0;y250;y++){_nop_();_nop_();_nop_();_nop_();}}}/******************************************************************//*检查LCD忙状态*//*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。*//******************************************************************/bitlcd_busy(){bitresult;LCD_RS=0;LCD_RW=1;LCD_EN=1;delayNOP();result=(bit)(P0&0x80);LCD_EN=0;return(result);}/*写指令数据到LCD*//*RS=L,RW=L,E=高脉冲,D0-D7=指令码。*//*******************************************************************/voidlcd_wcmd(ucharcmd){while(lcd_busy());LCD_RS=0;LCD_RW=0;LCD_EN=0;_nop_();_nop_();P0=cmd;delayNOP();LCD_EN=1;delayNOP();LCD_EN=0;}/*******************************************************************//*写显示数据到LCD*//*RS=H,RW=L,E=高脉冲,D0-D7=数据。*//*******************************************************************/voidlcd_wdat(uchardat){while(lcd_busy());LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;delayNOP();LCD_EN=1;delayNOP();LCD_EN=0;delay1(1);}/*LCD初始化设定*//*******************************************************************/voidlcd_init(){delay1(15);lcd_wcmd(0x01);//清除LCD的显示内容lcd_wcmd(0x38);//16*2显示,5*7点阵,8位数据delay1(5);lcd_wcmd(0x38);delay1(5);lcd_wcmd(0x38);delay1(5);lcd_wcmd(0x0c);//显示开,关光标delay1(5);lcd_wcmd(0x06);//移动光标delay1(5);lcd_wcmd(0x01);//清除LCD的显示内容delay1(5);}voidwritetab(){unsignedchari;lcd_wcmd(0x40);//写CGRAMfor(i=0;i8;i++)lcd_wdat(mytab[i]);}voiddis_string(uchardir,uchara[]){uchari=0;lcd_wcmd(dir);while(a[i]!='\0'){lcd_wdat(a[i]);i++;}}/*us级延时函数*//*******************************************************************/voidDelay(unsignedintnum){while(--num);}/*初始化ds1820*//*******************************************************************/ucharInit_DS18B20(void){DQ0=1;//DQ复位DQ1=1;DQ2=1;Delay(10);//稍做延时DQ0=0;//单片机将DQ拉低DQ1=0;DQ2=0;Delay(100);//精确延时大于480usDQ0=1;//拉高总线DQ1=1;DQ2=1;Delay(8);presence=DQ;Delay(100);DQ0=1;DQ1=1;DQ2=1;return(presence);//返回信号,表示初始化成功,否则表示初始化失败}/*读一个字节*//*******************************************************************/voidReadOneChar(void){unsignedchari=0;dat0=0;dat1=0;dat2=0;for(i=8;i0;i--){DQ0=0;//给脉冲信号DQ1=0;DQ2=0;dat0=1;dat1=1;dat2=1;DQ0=1;//给脉冲信号DQ1=1;DQ2=1;Delay(1);if(DQ0)dat0|=0x80;if(DQ1)dat1|=0x80;if(DQ2)dat2|=0x80;Delay(6);}}/*写一个字节*//*******************************************************************/voidWriteOneChar(unsignedchardat){unsignedchari=0;for(i=8;i0;i--){DQ0=0;DQ1=0;DQ2=0;DQ0=dat&0x01;DQ1=dat&0x01;DQ2=dat&0x01;Delay(6);DQ0=1;DQ1=1;DQ2=1;dat=1;}}/*读取温度*//*******************************************************************/voidRead_Temperature(void){Init_DS18B20();WriteOneChar(0xCC);//跳过读序号列号的操作WriteOneChar(0x44);//启动温度转换Init_DS18B20();WriteOneChar(0xCC);//跳过读序号列号的操作WriteOneChar(0xBE);//读取温度寄存器ReadOneChar();//温度低8位wd0=dat0;wd1=dat1;wd2=dat2;ReadOneChar();//温度高8位wd0=wd0+256*dat0;wd1=wd1+256*dat1;wd2=wd2+256*dat2;wd0=wd0*0.625;wd1=wd1*0.625;wd2=wd2*0.625;}voiddisplay_tem(){BEEP=1;if(presence&0x01)//presence最低位为1说明0号测温度传感器没有正常工作。dis_string(0x80,T0ERROR);else{dis_string(0x80,T0:);lcd_wdat(wd0%1000/100+48);lcd_wdat(wd0%100/10+48);lcd_wdat('.');lcd_wdat(wd0%10+48);writetab();//自定义字符写入CGRAMlcd_wcmd(0x87);lcd_wdat(0x00);//显示自定义字符if((wd0max*10)|(wd0min*10))BEEP=0;}if(presence&0x02)//presence中间位为1说明1号测温度传感器没有正常工作。dis_string(0x88,T1ERROR);else{dis_string(0x88,T1:);lcd_wdat(wd1%1000/100+48);lcd_wdat(wd1%100/10+48);lcd_wdat('.');lcd_wdat(wd1%10+48);writetab();//自定义字符写入CGRAMlcd_wcmd(0x8f);lcd_wdat(0x00);//显示自定义字符if((wd1max*10)|(wd1min*10))BEEP=0;}if(presence&0x04)//presence最高位为1说明2号测温度传感器没有正常工作。dis_string(0xc0,T2ERROR);else{dis_string(0xc0,T2:);lcd_wdat(wd2%1000/100+48);lcd_wdat(wd2%100/10+48);lcd_wdat('.');lcd_wdat(wd2%10+48);writetab();//自定义字符写入CGRAMlcd_wcmd(0x8f);lcd_wdat(0x00);//显示自定义字符if((wd2max*10)|(wd2min*10))BEEP=0;}}ucharset_tem(uchardat){while(1){lcd_wcmd(0xc8);lcd_wdat(dat/10+48);lcd_wdat(dat%10+48);if(key1==0)delay1(10);if(key1==0){while(key1==0);dat++;}if(key2==0)delay1(10);if(key2==0){while(key2==0);dat--;}if(key0==0)delay1(5);if(key0==0)break;}returndat;}/*主函数*//************************************/voidmain(){ucharflage=0;lcd_init();while(1){if(key0==0){delay1(5);if(key0==0){flage++;if(flage==3)flage=0;}}Read_Temperature();switch(flage){case0:display_tem();break;case1:lcd_init();dis_string(0x80,set