要求
1、利用总线OneWire与DS18B20通信
2、从DS18B20中将温度读出并显示在LCD上
3、显示温度警报界限,并在温度超过界限时,在LCD右上角给出警告
4、K1、K2负责调节温度下界,K3、K4负责调节温度上界
5、开机时从AT24C02中读取温度界限,并在温度界限调节时,将调节后的温度界限存储到AT24C02,以便断电后下次开机不用再次调节温度界限
效果
资源
工程文件压缩包
链接:https://pan.baidu.com/s/1n5Zpnr8Kohkz_m5ZBDC7wQ
提取码:p12y
main函数
#include <REGX52.H>
#include "Delay.H"
#include "Key.H"
#include "AT24C02.H"
#include "LCD1602.H"
#include "DS18B20.H"
//温度显示
void Show_Temperature(float T){
//温度正负号
if(T<0){
LCD_ShowString(1,1,"-");
T=-T;
}
else{
LCD_ShowString(1,1,"+");
}
//整数部分显示
LCD_ShowNum(1,2,T,3);
LCD_ShowString(1,5,".");
//小数部分显示,取两位
LCD_ShowNum(1,6,(unsigned long)(T*100)%100,2);
}
//温度阈值显示
void Show_Temperature_Range(char Tl,char Th){
//Tl显示
LCD_ShowString(2,1,"Tl:");
if(Tl<0){
LCD_ShowString(2,4,"-");
Tl=-Tl;
}else{
LCD_ShowString(2,4,"+");
}LCD_ShowNum(2,5,Tl,3);
//Th显示
LCD_ShowString(2,9,"Th:");
if(Th<0){
LCD_ShowString(2,12,"-");
Th=-Th;
}else{
LCD_ShowString(2,12,"+");
}LCD_ShowNum(2,13,Th,3);
}
//温度阈值调整
void Adjust_TR(char *Tl,char *Th,unsigned char KeyNum){
//Tl调整
if(KeyNum==1)(*Tl)--;
if((*Tl)<(*Th) & KeyNum==2)(*Tl)++;
//Th调整
if((*Th)>(*Tl) & KeyNum==3)(*Th)--;
if(KeyNum==4)(*Th)++;
//51单片机自带温度传感器测温范围
if((*Tl)>125 || (*Tl)<-55)(*Tl)=-55;
if((*Th)>125 || (*Th)<-55)(*Th)=125;
//温度存储,两次访问之间给5ms缓冲
AT24C02_WriteByte(0,*Tl);
Delayms(5);
AT24C02_WriteByte(1,*Th);
Delayms(5);
}
//温度警报
void Over_TR(float T,char Tl,char Th){
//低温警报
if(T<Tl) LCD_ShowString(1,12,"OE:Tl");
//高温警报
if(T>Th) LCD_ShowString(1,12,"OE:Th");
//气温正常,警报擦除
if(T>Tl & T<Th) LCD_ShowString(1,12," ");
}
void main(){
float T;
char Tl,Th;
unsigned char KeyNum;
DS18B20_ConvertT();
//延时1s,等待温度转换完毕,避免读出默认值
Delays(1);
LCD_Init();
//气温阈值读取
Tl=AT24C02_ReadByte(0);
Th=AT24C02_ReadByte(1);
while(1){
//温度显示
DS18B20_ConvertT();
T=DS18B20_ReadT();
//温度阈值合法性检测
KeyNum=key();
if(KeyNum)Adjust_TR(&Tl,&Th,KeyNum);
//温度阈值显示
Show_Temperature(T);
Show_Temperature_Range(Tl,Th);
//温度警报
Over_TR(T,Tl,Th);
}
}