//****************************************//**用DS18B20进行测量,lcd1602显示**//****************************************#include "reg51.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intuchar code table1 []={"ID: "}; //欢迎显示,包括空格在内<=16 uchar code table2 []={"Name: "};//欢迎显示,包括空格在内<=16 uchar code str1 []={" Temperature "};uchar code str2 []={" "};//************管脚定义************************sbit lcd_rs = P3^0; //液晶数据命令选择端sbit lcd_en = P3^1; //液晶使能sbit DQ = P3^6; //液晶使能//************参数定义************************uint tvalue;//温度值uchar tflag;//温度正负标志uchar data disdata[5];//************子函数定义************************void delay(uchar z); //delay延时子程序void init_lcd(); //LCD1602初始化函数void write_com(uchar com); //LCD1602写指令函数void write_data(uchar date); //LCD1602写数据函数void lcd1602_display(uchar *q,uchar *p);//LCD1602显示函数void welcome(); //LCD1602显示欢迎函数void delay_DS18B20(uint i); //delay_DS18B20函数void Init_DS18B20_display(); //DS18B20初始化显示void Init_DS18B20(); //DS18B20初始化uchar ReadOneByte(); //DS18B20读一字节void WriteOneByte(uchar dat); //DS18B20写一字节Read_Temperature(); //DS18B20读取温度值并转换void DS18B20_display(); //DS18B20温度显示//************主函数************************void main(){ welcome();delay(2000);Init_DS18B20_display();while(1){Read_Temperature();DS18B20_display();}}//************delay延时子程序************************void delay(uchar z){uchar x,y;for(x=0;x<z;x++)for(y=0;y<114;y++);}//************LCD1602初始化函数************************void init_lcd(){write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口write_com(0x08); //写一个字符后地址指针加1write_com(0x01); //显示清零,数据指针清零write_com(0x06); //写一个字符后地址指针加1write_com(0x0c); //关显示,光标不显示不闪烁}//************LCD1602写指令函数************************void write_com(uchar com){delay(5);lcd_rs = 0; // 选择写指令lcd_en = 0; // 将使能端置0P2 = com; // 将要写的命令送到数据总线上delay(5); // 延时5ms,待数据稳定lcd_en = 1; // 由于初始化已将lcd_en置为0,使能端给一个高脉冲,delay(5); // 延时5ms,待数据稳定lcd_en = 0; // 将使能端置0以完成脉冲}//************LCD1602写数据函数************************void write_data(uchar date){delay(5);lcd_rs = 1; // 选择写数据lcd_en = 0; // 将使能端置0P2 = date; // 将要写的数据送到数据总线上delay(5); // 延时5ms,待数据稳定lcd_en = 1; // 由于初始化已将lcd_en置为0,使能端给一个高脉冲,delay(5); // 延时5ms,待数据稳定lcd_en = 0; // 将使能端置0以完成脉冲}//************LCD1602显示函数******************void lcd1602_display(uchar *q,uchar *p){write_com(0x80); // 现将数据指针定位到第一行第一个字处while(*q!='\0'){write_data(*q);q++;delay(1);}write_com(0xc0); // 现将数据指针定位到第二行第一个字处while(*p!='\0'){write_data(*p);p++;delay(1);}}//************LCD1602显示欢迎函数****************** void welcome(){init_lcd();lcd1602_display(table1,table2);delay(5000);}//************DS18B20初始化显示**************void Init_DS18B20_display(){init_lcd();lcd1602_display(str1,str2);}//************LCD1602显示函数****************** void delay_DS18B20(uint i){while(i--);}//************DS18B20初始化******************void Init_DS18B20(){DQ = 1; //DQ复位delay_DS18B20(4); //延时DQ = 0; //DQ拉低delay_DS18B20(100); //精确延时大于480usDQ = 1; //拉高delay_DS18B20(40);}//************DS18B20读一字节****************** uchar ReadOneByte(){uchar i,dat = 0;for(i=8;i>0;i--){DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ) dat|=0x80;delay_DS18B20(10);}return (dat);}//************DS18B20写一字节******************void WriteOneByte(uchar dat){uchar i;for(i=8;i>0;i--){DQ = 0;DQ = dat&0x01;delay_DS18B20(10);DQ = 1;dat>>=1;}}//************DS18B20读取温度值并转换****************** Read_Temperature(){uchar a,b;Init_DS18B20();WriteOneByte(0xcc); //跳过读序列号WriteOneByte(0x44); //启动温度转换Init_DS18B20();WriteOneByte(0xcc); //跳过读序列号WriteOneByte(0xbe); //读取温度a = ReadOneByte();b = ReadOneByte();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0xfff)tflag = 0;else{tvalue = ~tvalue+1;tflag = 1;}tvalue = tvalue*(0.625); //温度值扩大10倍,精确到1位小数return (tvalue);}//************DS18B20温度显示******************void DS18B20_display(){uchar flagdat;disdata[0]=tvalue/1000+0x30; //百位数disdata[1]=tvalue%1000/100+0x30;//十位数disdata[2]=tvalue%100/10+0x30; //个位数disdata[3]=tvalue%10+0x30; //小数位if(tflag == 0)flagdat = 0x20; //正温度不显示符号elseflagdat = 0x2d; //负温度显示负号if(disdata[0] == 0x30){disdata[0] =0x20; //如果百位为0,不显示if(disdata[1] == 0x30){disdata[1] =0x20;//如果百位为0,十位为0也不显示}}write_com(0xc4);write_data(flagdat); //显示符号位write_com(0xc5);write_data(disdata[0]);//显示百位write_com(0xc6);write_data(disdata[1]);//显示十位write_com(0xc7);write_data(disdata[2]);//显示个位write_com(0xc8);write_data(0x2e); //显示小数点write_com(0xc9);write_data(disdata[3]);//显示小数位}。