1、头文件 #ifndef _DS18B20_H_ #define _DS18B20_H_ #define uchar unsigned char #define uint unsigned int void DS18B20_Delayus(uint us); void DS18B20_reset(); void DS18B20_write(uchar dat); uchar DS18B20_data(); uint read_temperature(); #endif 2、C文件 #include<reg52.h> #include<intrins.h> #include "DS18B20.h" uint TT; //1820温度变量 sbit DQ = P2^1; uchar table_temp[5]; uchar temp_comp; /*******************************************************************/ /* */ /*us级延时函数 */ /* */ /*******************************************************************/ void DS18B20_Delayus(uint us) { while(--us); } void DS18B20_reset() { uchar x = 0; DQ = 1; DS18B20_Delayus(16); //稍做延时 DQ = 0; //将DQ拉低 DS18B20_Delayus(160);//延时400us~960us DQ = 1; //拉高总线 DS18B20_Delayus(28);//延时15us~60us x = DQ; //如果=0则初始化成功 =1则初始化失败 DS18B20_Delayus(40);//延时60us~240us } /*******************************************************************/ /* */ /* 写一个字节 */ /* */ /*******************************************************************/ void DS18B20_write(uchar dat) { uchar i; for(i = 8; i > 0; i--) { DQ = 0; DQ = dat & 0x01; DS18B20_Delayus(10); DQ = 1; dat >>= 1; } } /*******************************************************************/ /* */ /* 读一个字节 */ /* */ /*******************************************************************/ uchar DS18B20_data() { uchar i,dat; for (i = 8; i > 0; i--) { DQ = 0; // 给脉冲信号 dat >>= 1; DQ = 1; // 给脉冲信号 if(DQ) dat |= 0x80; DS18B20_Delayus(8); } return dat; } /*******************************************************************/ /* */ /* 读取温度 */ /* */ /*******************************************************************/ uint read_temperature() { uchar a,b; uint t = 0; float tt = 0; DS18B20_reset();//DS18B20复位 DS18B20_write(0xcc); //跳过读序号列号的操作 DS18B20_write(0x44); //启动温度转换 DS18B20_reset();//DS18B20复位 DS18B20_write(0xcc); //跳过读序号列号的操作 DS18B20_write(0xbe); //读取温度寄存器 a = DS18B20_data(); //读低8位 b = DS18B20_data(); //读高8位 t=b; t<<=8; t=t|a; tt=t*0.0625; t= tt*10+0.5; //放大10倍输出并四舍五入 return(t); } void main() { uchar i_1,tab1,tab2,tab3; LCD_init(); DS18B20_reset(); LCD_write_com(0x80); for(i_1 = 0; i_1 < 5; i_1++) LCD_write_data(table[i_1]); while(1) { TT = read_temperature(); //读温度 tab1 = TT / 100; table_temp[0] = tab1 + 0x30; // 十位 tab2= TT / 10 - tab1*10; table_temp[1] = tab2 + 0x30; //个位 table_temp[2] = '.'; tab3 = TT - tab1*100 - tab2*10; table_temp[3] = tab3 + 0x30; //小数点一位 table_temp[4] = 'C'; //显示温度符号℃ LCD_write_com(0x80+0x06); for(i_1 = 0; i_1 < 5; i_1++) LCD_write_data(table_temp[i_1]); } }