#include #include #define uchar unsigned char #define uint unsigned int #define delayNOP() {_nop_();_nop_();_nop_();_nop_();} sbit HI_LED=P2^3; //高温,低温白净闪烁 LED sbit LO_LED=P2^6; s数据线 s报警 sbit RS=P2^0; sbit RW=P2^1; sbit EN=P2^2; s正常显示温度,越界时报警 s显示报警温度 s查看 ROM CODE uchar code RomCodeStr[]={"-- ROM CODE --"}; uchar RomCode[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //位ROM CODE uchar code Temperature_Char[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00}; //温度示字符 uchar code Alarm_Temp[]={"ALARM TEMP Hi Lo"}; uchar Alarm_HI_LO_STR[]={"Hi: Lo: "}; uchar temp_data[2]={0x00,0x00}; uchar temp_alarm[2]={0x00,0x00}; u温度值 u温度报警值 u温度小数位对照表 //....................................................... //报警温度上下限(取值范围:-128~+127)(DS18B20温度范围为:-55~+125) //数组中前一位为高温值,后一位为低温值 //此处类型注意设为char,否则不能进行有符号数的比较 char Alarm_Temp_HL[2]={70,-20}; //............................................................ uchar CurrentT=0; //当前读取温度整数部分 uchar Temp_Value[]={0x00,0x00};//从DS18B20读取的温度值 uchar Display_Digit[]={0,0,0,0};//待显示的各温度数位 bit HI_Alarm=0,LO_Alarm=0; //高低温报警标志 bit DS18B20_IS_OK=1; //传感器正常标志 u定时器延时累加 //........................... //延时 //........................... void DelayXus(int x) { } //....................................... //忙检测 bit LCD_Busy_Check() { bit LCD_Status; RS=0;//寄存器选择 RW=1;//读状态寄存器EN=1;//开始读 DelayXus(1); LCD_Status=(bit)(P0&0x80) ; EN=0; return LCD_Status; } //写LCD指令 void Write_LCD_Command(uchar cmd) { 忙等待 RS=0; //写选择命令寄存器 写 P0=cmd; EN=1; DelayXus(1); EN=0; } //向LCD写数据 void Write_LCD_Data(uchar dat) { 忙等待 RS=1;RW=0;EN=0;P0=dat;EN=1; DelayXus(1); EN=0; } //设置液晶显示位置 void Set_LCD_POS(uchar pos) { } //LCD初始化 void LCD_Initialise() { Write_LCD_Command(0x38); DelayXus(1); 清屏 字符进入模式:屏幕不动,字符后移 显示开,关光标 } //............................................... //.......................................... //自定义字符写CGRAM //.................................. void Write_NEW_LCD_Char() { Write_LCD_Command(0x40); //写CGRAM 写入温度符号 } //............................................ //延时 //........................................................ void Delay(uint num) { } //............................................... //初始化DS18B20 //............................................... uchar Init_DS18B20() { return status; //初始化成功时返回0 } //............................................... //读一节 //............................................... uchar ReadOneByte() { } //............................................... //写一字节 //............................................... void WriteOneByte(uchar dat) { uchar i; for(i=0;i<8;i++) { } } //............................................... //读取温度值 //............................................... void Read_Temperature() { if(Init_DS18B20()==1) //DS18B20故障 WriteOneByte(0xCC); //跳过序列号 WriteOneByte(0x44); //启动温度转换 WriteOneByte(0xCC); //跳过序列号 WriteOneByte(0xBE); //读取温度寄存器 Temp_Value[0]=ReadOneByte(); //温度低8位 Temp_Value[1]=ReadOneByte(); //温度高8位 Alarm_Temp_HL[0]=ReadOneByte(); //报警温度TH Alarm_Temp_HL[1]=ReadOneByte(); //报警温度TL } //............................................... //设置DS18B20温度报警值 //............................................... void Set_Alarm_Temp_Value() { WriteOneByte(0xCC); //跳过序列号 WriteOneByte(0x4E); //将设定的温度报警值写入DS18B20 WriteOneByte(Alarm_Temp_HL[0]); //写TH WriteOneByte(Alarm_Temp_HL[1]); //写TL WriteOneByte(0x7F); //12位精度 WriteOneByte(0xCC); //跳过序列号 WriteOneByte(0x48); //温度报警值存入DS18B20 } //...................................................... //在LCD上显示当前温度 //..................................................... void Display_Temperature() { uchar t=150; //延时值 uchar ng=0; //负数标识 //如果为负数则取反加1,并设置负数标识 if((Temp_Value[1]&0xF8)==0xF8) { 设负数标识 } //查表得到温度小数部分 Display_Digit[0]=df_Table[Temp_Value[0]&0x0F]; //获取温度整数部分(无符号) CurrentT=((Temp_Value[0]&0xF0)>>4)|((Temp_Value[1]&0x07)<<4); //有符号的当前温度值,注意此处定义为char, 其值可为-128~+127 Signed_Current_Temp=ng?-CurrentT:CurrentT; //高低温报警标志设置(与定义为char类型的Alarm_Temp_HL比较,这样可区分正负比较) HI_Alarm=Signed_Current_Temp>=Alarm_Temp_HL[0]?1:0; LO_Alarm=Signed_Current_Temp<=Alarm_Temp_HL[1]?1:0; //将整数部分分解为三位待显示数字 Display_Digit[3]=CurrentT/100; Display_Digit[2]=CurrentT%100/10; Display_Digit[1]=CurrentT%10; //刷新LCD显示缓冲 Current_Temp_Display_Buffer[11]=Display_Digit[0]+'0'; Current_Temp_Display_Buffer[10]='.'; Current_Temp_Display_Buffer[9]=Display_Digit[1]+'0'; Current_Temp_Display_Buffer[8]=Display_Digit[2]+'0'; Current_Temp_Display_Buffer[7]=Display_Digit[3]+'0'; //高位为0时不显示 if(Display_Digit[3]==0) Current_Temp_Display_Buffer[7]=' '; //高位为0且次高位为0时,次高位不显示 if(Display_Digit[2]==0&&Display_Digit[3]==0) Current_Temp_Display_Buffer[8]=' '; //负数符号显示恰当位置 if (ng) { } //在第一行显示标题 Set_LCD_POS(0X00); for(i=0;i<16;i++) Write_LCD_Data( Temp_Disp_Title[i]); //在第二行显示当前温度 Set_LCD_POS(0X40); for(i=0;i<16;i++) Write_LCD_Data(Current_Temp_Display_Buffer[i]); //显示温度符号 Set_LCD_POS(0X4D);Write_LCD_Data(0x00); Set_LCD_POS(0X4E);Write_LCD_Data('C'); } //..................................... //定时器中断,控制报警声音 //................................. void T0_INT() interrupt 1 { { } } //............................................... //ROM CODE转换与显示 //..................................................... void Display_Rom_Code() { { Write_LCD_Data(t); //高位数显示 Write_LCD_Data(t); //低位数显示 } } //.................................. //读位序列码 //............................... void Read_Rom_Code() { WriteOneByte(0x33); //读序列码 } //......................................... //显示ROM CODE //............................... void Display_RomCode() { 显示标题 Write_LCD_Data(RomCodeStr[i]); Read_Rom_Code(); //读位序列码 Display_Rom_Code(); //显示位ROM CODE } //....................................... //显示报警温度 //............................................... void Disp_Alarm_Temperature() { uchar i,ng; //显示Alarm_Temp_HL数组中的报警温度值 //由于Alarm_Temp_HL类型为char,故可以直接进行正负比较 //高温报警值......................... ng=0; if(Alarm_Temp_HL[0]<0) //如果为负数则取反加1 { } //分解高温各数位到待显示串中 Alarm_HI_LO_STR[4]=Alarm_Temp_HL[0]/100+'0'; Alarm_HI_LO_STR[5]=Alarm_Temp_HL[0]/10%10+'0'; Alarm_HI_LO_STR[6]=Alarm_Temp_HL[0]%10+'0'; //屏蔽高位不显示的0 if(Alarm_HI_LO_STR[4]=='0') Alarm_HI_LO_STR[4]=' '; if(Alarm_HI_LO_STR[4]==' '&& Alarm_HI_LO_STR[5]=='0') Alarm_HI_LO_STR[5]=' '; //"-"符号显示 if (ng) { } //低温报警值 ng=0; i如果为负数则取反加1 { Alarm_Temp_HL[1]=~Alarm_Temp_HL[1]+1; ng=1; } //分解低温各数位到待显示串中 Alarm_HI_LO_STR[12]=Alarm_Temp_HL[1]/100+'0'; Alarm_HI_LO_STR[13]=Alarm_Temp_HL[0]/10%10+'0'; Alarm_HI_LO_STR[14]=Alarm_Temp_HL[0]%10+'0'; //屏蔽高位不显示的0 if(Alarm_HI_LO_STR[12]=='0') Alarm_HI_LO_STR[12]=' '; if(Alarm_HI_LO_STR[12]==' '&& Alarm_HI_LO_STR[13]=='0') Alarm_HI_LO_STR[13]=' '; //"-"符号显示 if (ng) { } //显示高低温报警温度值 S显示标题 for (i=0;i<16;i++) Write_LCD_Data(Alarm_Temp[i]); S显示高低温 for (i=0;i<16;i++) Write_LCD_Data(Alarm_HI_LO_STR[i]); } //................................ //主函数 //.................................. void main() { uchar Current_Operation=1; //默认当前操作为显示温度 正常显示当前温度,越界时报警 显示报警温度上下限 显示DS18B20 ROM CODE } }