您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > LCD1602和DS18B20显示温度
您研究一下以下这个程序,然后就可以加上时间功能.多做一点就能多学一点.开机时对DS18B20进行检测,如果DS18B20检测不正常,LCD1602显示:DS18B20ERRORPLEASECHECK蜂鸣器报警。DS18B20检测正常,LCD1602显示:DS18B20OKTEMP:100.8℃如果温度值高位为0,将不显示出来。你可以通过拔插DS18B20查看DS18B20的检测功能。/*ME300B单片机开发系统演示程序-DS18B20温度显示*//*LCD1602显示*//*作者:gguoqing*//*Copyright(C)伟纳电子*//*******************************************************************/#includereg51.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedintsbitDQ=P3^3;//定义DS18B20端口DQsbitBEEP=P3^7;//蜂鸣器驱动线bitpresence;sbitLCD_RS=P2^0;sbitLCD_RW=P2^1;sbitLCD_EN=P2^2;ucharcodecdis1[]={DS18B20OK};ucharcodecdis2[]={TEMP:.C};ucharcodecdis3[]={DS18B20ERR0R};ucharcodecdis4[]={PLEASECHECK};unsignedchardatatemp_data[2]={0x00,0x00};unsignedchardatadisplay[5]={0x00,0x00,0x00,0x00,0x00};unsignedcharcodeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};voidbeep();unsignedcharcodemytab[8]={0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00};#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;}/*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);}/*设定显示位置*//*******************************************************************/voidlcd_pos(ucharpos){lcd_wcmd(pos|0x80);//数据指针=80+地址变量}/*自定义字符写入CGRAM*//*******************************************************************/voidwritetab(){unsignedchari;lcd_wcmd(0x40);//写CGRAMfor(i=0;i8;i++)lcd_wdat(mytab[i]);}/*us级延时函数*//*******************************************************************/voidDelay(unsignedintnum){while(--num);}/*初始化ds1820*//*******************************************************************/Init_DS18B20(void){DQ=1;//DQ复位Delay(8);//稍做延时DQ=0;//单片机将DQ拉低Delay(90);//精确延时大于480usDQ=1;//拉高总线Delay(8);presence=DQ;//如果=0则初始化成功=1则初始化失败Delay(100);DQ=1;return(presence);//返回信号,0=presence,1=nopresence}/*读一个字节*//*******************************************************************/ReadOneChar(void){unsignedchari=0;unsignedchardat=0;for(i=8;i0;i--){DQ=0;//给脉冲信号dat=1;DQ=1;//给脉冲信号if(DQ)dat|=0x80;Delay(4);}return(dat);}/*写一个字节*//*******************************************************************/WriteOneChar(unsignedchardat){unsignedchari=0;for(i=8;i0;i--){DQ=0;DQ=dat&0x01;Delay(5);DQ=1;dat=1;}}/*读取温度*//*******************************************************************/Read_Temperature(void){Init_DS18B20();WriteOneChar(0xCC);//跳过读序号列号的操作WriteOneChar(0x44);//启动温度转换Init_DS18B20();WriteOneChar(0xCC);//跳过读序号列号的操作WriteOneChar(0xBE);//读取温度寄存器temp_data[0]=ReadOneChar();//温度低8位temp_data[1]=ReadOneChar();//温度高8位}/*数据转换与温度显示*//*******************************************************************/Disp_Temperature(){display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]]+0x30;//查表得小数位的值display[4]=((temp_data[0]&0xf0)4)|((temp_data[1]&0x0f)4);display[3]=display[4]/100+0x30;display[1]=display[4]%100;display[2]=display[1]/10+0x30;display[1]=display[1]%10+0x30;if(display[3]==0x30)//高位为0,不显示{display[3]=0x20;if(display[2]==0x30)//次高位为0,不显示display[2]=0x20;}lcd_pos(0x48);lcd_wdat(display[3]);//百位数显示lcd_pos(0x49);lcd_wdat(display[2]);//十位数显示lcd_pos(0x4a);lcd_wdat(display[1]);//个位数显示lcd_pos(0x4c);lcd_wdat(display[0]);//小数位数显示}/*******************************************************************//*蜂鸣器响一声*//*******************************************************************/voidbeep(){unsignedchary;for(y=0;y100;y++){Delay(60);BEEP=!BEEP;//BEEP取反}BEEP=1;//关闭蜂鸣器Delay(40000);}/*DS18B20OK显示菜单*//*******************************************************************/voidOk_Menu(){ucharm;lcd_init();//初始化LCDlcd_pos(0);//设置显示位置为第一行的第1个字符m=0;while(cdis1[m]!='\0'){//显示字符lcd_wdat(cdis1[m]);m++;}lcd_pos(0x40);//设置显示位置为第二行第1个字符m=0;while(cdis2[m]!='\0'){lcd_wdat(cdis2[m]);//显示字符m++;}writetab();//自定义字符写入CGRAMdelay1(5);lcd_pos(0x4d);lcd_w
本文标题:LCD1602和DS18B20显示温度
链接地址:https://www.777doc.com/doc-5713052 .html