skawu
获得 138 次赞
帮助过414人
#include <reg52.h>#define uchar unsigned char#define uint unsigned int/********************************************************************/sbit DQ = P2^2; //温度传感器信号线sbit rs = P3^5; //LCD数据/命令选择端(H/L)位声明sbit lcden = P3^4; //LCD使能信号端位声明/********************************************************************///uint temp; //定义整型的温度数据//float f_temp; //定义浮点型的温度数据//uint warn_11 = 270; //定义温度设定值,是温度值乘以10后的结果//uint warn_12 = 250; //定义温度下限值//uint warn_h1 = 300; //定义温度上限值/********************************************************************/void delay(uint z); //延时函数void DS18B20_Reset(void); //DQ18B20复位,初始化函数bit DS18B20_Readbit(void); //读1位数据函数uchar DS18B20_ReadByte(void); //读1个字节数据函数void DS18B20_WriteByte(uchar dat); //向DQ18B20写一个字节数据函数void LCD_WriteCom(uchar com); //1602液晶命令写入函数void LCD_WritEDAta(uchar dat); //1602液晶数据写入函数void LCD_Init(); //LCD初始化函数void Display18B20Rom(char Rom); //显示18B20序列号函数/**********************************************//* 主函数 *//**********************************************/void main(){ uchar abcdefgh; LCD_Init(); DS18B20_Reset(); delay(1); DS18B20_WriteByte(0x33); delay(1); a = DS18B20_ReadByte(); b = DS18B20_ReadByte(); c = DS18B20_ReadByte(); d = DS18B20_ReadByte(); e = DS18B20_ReadByte(); f = DS18B20_ReadByte(); g = DS18B20_ReadByte(); h = DS18B20_ReadByte(); LCD_WriteCom(0x80+0x40); Display18B20Rom(h); Display18B20Rom(g); Display18B20Rom(f); Display18B20Rom(e); Display18B20Rom(d); Display18B20Rom(c); Display18B20Rom(b); Display18B20Rom(a); while(1);}/***************************************************//* 延时函数:void delay() *//* 功能:延时函数 *//***************************************************/void delay(uint z)//延时函数{ uint xy; for( x = z; x > 0; x-- ) for( y = 110; y > 0; y-- );}/***************************************************//* DS18B20函数:void DS18B20_Reset() *//* 功能:复位18B20 *//***************************************************/void DS18B20_Reset(void)//DQ18B20复位,初始化函数{ uint i; DQ = 0; i = 103; while( i > 0 ) i--; DQ = 1; i = 4; while( i > 0 ) i--;}/***************************************************//* DS18B20函数:void DS18B20_Readbit() *//* 功能:读1个字节数据函数 *//***************************************************/bit DS18B20_Readbit(void) //读1位数据函数{ uint i; bit dat; DQ = 0; i++; //i++起延时作用 DQ = 1; i++; i++; dat = DQ; i = 8; while( i > 0 )i--; return( dat );}/***************************************************//* DS18B20函数:void DS18B20_ReadByte() *//* 功能:读1个字节数据函数 *//***************************************************/uchar DS18B20_ReadByte(void) //读1个字节数据函数{ uchar ijdat; dat = 0; for( i = 1; i <= 8; i++ ) { j = DS18B20_Readbit(); dat = ( j << 7 ) | ( dat >> 1 ); } return(dat);}/***************************************************//* DS18B20函数:void DS18B20_WriteByte() *//* 功能:向DQ18B20写一个字节数据函数 *//***************************************************/void DS18B20_WriteByte(uchar dat) //向DQ18B20写一个字节数据函数{ uint i; uchar j; bit testb; for( j=1; j<=8; j++) { testb = dat&0x01; dat= dat>>1; if(testb) //写1 { DQ = 0; i++;i++; DQ = 1; i = 8;while(i>0)i--; } else { DQ = 0; //写0 i = 8;while(i>0)i--; DQ = 1; i++;i++; } }}/***********************************************//* LCD函数:void LCD_WriteCom() *//* 功能:向LCD写入命令 *//***********************************************/void LCD_WriteCom(uchar com){ rs = 0; P0 = com; delay(5); lcden = 0; delay(5); lcden = 1; delay(5); lcden = 0;}/***********************************************//* LCD函数:void LCD_WriteData(uchar dat) *//* 功能:向LCD写入数据 *//***********************************************/void LCD_WriteData(uchar dat){ rs = 1; //选择LCD为写入数据状态 lcden = 0; P0 = dat; //将待写入数据放到总线上 delay(5); lcden = 1; //给LCD使能端一个脉冲 delay(5); //信号将之前放到总线上 lcden = 0; //的数据写入LCD delay(5);}/***********************************************//* LCD函数:void LCD_Init() *//* 功能:初始化LCD,设定LCD的初始状态 *//***********************************************/void LCD_Init(){ LCD_WriteCom(0x38); //LCD显示模式设定 delay(15); LCD_WriteCom(0x08); //关闭LCD显示 delay(3); LCD_WriteCom(0x01); //LCD显示清屏 delay(3); LCD_WriteCom(0x06); //设定光标地址指针为自动加1 delay(3); LCD_WriteCom(0x0c); //打开LCD显示,但不显示光标}/**********************************************//* *//* 显示18B20序列号 *//* *//**********************************************/void Display18B20Rom(char Rom){ uchar hl; l = Rom & 0x0f; //取低4位 h = Rom & 0xf0; //取高4位 h >>= 4; if( ( h >= 0x00 )&&( h <= 0x09 ) ) LCD_WriteData(h+0x30); //取ASCII码 else LCD_WriteData(h+0x37); //取ASCII码 if( ( l >= 0x00 )&&( l <= 0x09 ) ) LCD_WriteData(l+0x30); //取ASCII码 else LCD_WriteData(l+0x37); //取ASCII码 }