1、#include#define uchar unsigned char#define uint unsigned intsbit DQ=P10;sbit rs=P20;sbit rw=P21;sbit e=P22;uchar temp1,temp2; /定义两个存放温度的变量/uchar ID8; /存放DS18B20的64位序列号的数组uchar code ID_1=0x28,0x3a,0x24,0xc6,0x02,0x00,0x00,0xa4; /第一个DS18B20的序列号uchar code ID_2=0x28,0x66,0xa2,0xc1,0x02,0x00,0x00,0x26; /
2、第二个DS18B20的序列号uchar code table=0123456789;uchar code table_temp=tempreture:;uchar code table_0=C;/*/ void delay_50us(uint time); /50us的延时函数void write_com(uchar com); /LCD1602写指令void write_data(uchar dat); /LCD1602写数据void init_LCD1602(void); /LCD1602初始化函数 id init_ds18b20(void); /ds18b20初始化void delay(
3、uint t); /while(t-)延时函数void init_ds18b20(void); /DS18B20初始化函数void write_byte(char dat); /ds18b20写一个字节函数uchar read_byte(void); /ds18b20读一个字节函数uchar readtemp1(void); /第一个ds18b20读取温度函数uchar readtemp2(void);/第二个ds18b20读取温度函数void display(void); /LCD1602显示温度函数/*/*void readrom(void) /读取温度传感器的序列号子函数 init_ds
4、18b20();delay_50us(2);write_byte(0x33);ID0=read_byte();ID1=read_byte();ID2=read_byte();ID3=read_byte();ID4=read_byte();ID5=read_byte();ID6=read_byte();ID7=read_byte();/*/*void keep_rom(uchar *p) /存序列号函数uchar i;for(i=0;i8;i+) *p=IDi; p+;/*/*void display_rom(void) /显示序列号函数 uchar i; write_com(0x80); fo
5、r(i=0;i0;time-);for(j=19;j0;j+);/*/void write_com(uchar com) /LCD1602写指令e=0;rs=0;rw=0;P0=com;delay_50us(10);e=1;delay_50us(20);e=0;/*/void write_data(uchar dat) /LCD1602写数据e=0;rs=1;rw=0;P0=dat;delay_50us(10);e=1;delay_50us(20);e=0;/*/void init_LCD1602(void) /LCD1602初始化函数delay_50us(300);write_com(0x3
6、8);delay_50us(100);write_com(0x38);delay_50us(100);write_com(0x38);write_com(0x38);/显示模式设置write_com(0x08);/显示关闭write_com(0x01);/显示清屏write_com(0x06);/显示光标移动设置write_com(0x0c);/显示开及光标设置/*/void delay(uint t) while(t-);/*/void init_ds18b20(void)/初始化 uchar n; DQ=1; /默认为高电平 delay(8); DQ=0; delay(80);/12MHz
7、晶振下大约600微秒的延时 DQ=1; /释放总线 delay(8); n=DQ; delay(4); /*/void write_byte(char dat)/写一个字节 uchar i; for(i=0;i=1; delay(4); /*/uchar read_byte(void)/读一个字节 uchar i; uchar value; for(i=0;i=1; /判断8次,移位七次(起延时作用) DQ=1; if(DQ) /采样,判断DQ value|=0x80; /赋值,与0x80与一下 delay(4); return value;/*/uchar readtemp1(void) u
8、char a,b,i; /读一个高八位,一个低八位 init_ds18b20(); /readrom(); / keep_rom(IP_1); / display_rom(); write_byte(0x55); for(i=0;i8;i+) write_byte(ID_1i); write_byte(0x44); /启动温度测量 delay(300); init_ds18b20(); write_byte(0x55); for(i=0;i8;i+) write_byte(ID_1i); write_byte(0xbe); /读这个温度 a=read_byte(); /低位 b=read_by
9、te(); /高位 b4; /屏蔽低四位 return b;/*/uchar readtemp2(void) uchar a,b,i; /读一个高八位,一个低八位 init_ds18b20(); /readrom(); / keep_rom(IP_1); / display_rom(); write_byte(0x55); for(i=0;i8;i+) write_byte(ID_2i); write_byte(0x44); /启动温度测量 delay(300); init_ds18b20(); write_byte(0x55); for(i=0;i8;i+) write_byte(ID_2i
10、); write_byte(0xbe); /读这个温度 a=read_byte(); /低位 b=read_byte(); /高位 b4; /屏蔽低四位 return b;/*/void display(void) uchar i; write_com(0x80); for(i=0;i11;i+) write_data(table_tempi); /显示tempreturedelay_50us(1); write_com(0x80+0x40); /第一个温度值 write_data(tabletemp1/10); /显示温度十位 write_data(tabletemp1%10); /显示温度个位 write_data(table_00); write_data(table_01); write_com(0x80+0x47); /第二个温度值 write_data(tabletemp2/10); /显示温度十位 write_data(tabletemp2%10); /显示温度个位 write_data(table_00); write_data(table_01);