项目演示视频:51单片机——温度报警器_哔哩哔哩_bilibili
一、项目介绍
本项目基于 STC89C52 单片机 设计实现了一个温度报警器系统,可以:
-
读取 DS18B20 温度传感器数据;
-
在 LCD1602 上实时显示当前温度;
-
用户通过按键可设置上下限报警阈值;
-
当温度超过设定阈值时,在 LCD 上显示“OV:H”或“OV:L”报警提示;
-
通过 EEPROM(AT24C02)实现掉电记忆功能;
-
支持按键消抖及定时扫描(使用 Timer0 中断);
二、硬件组成
序号 | 名称 | 功能说明 |
---|---|---|
1 | STC89C52 | 主控芯片 |
2 | DS18B20 | 数字温度传感器 |
3 | LCD1602 | 温度显示屏 |
4 | 蜂鸣器(可扩展) | 超温声音报警 |
5 | 按键模块 | 设置温度阈值 |
6 | AT24C02 EEPROM | 存储上下限设置值 |
7 | 定时器 Timer0 | 按键消抖 |
三、功能亮点
-
实时显示当前温度(精确到两位小数);
-
超过上限温度显示 “OV:H”,低于下限温度显示 “OV:L”;
-
上下限温度通过 4 个按键设置(支持按键防抖);
-
阈值保存在 EEPROM 中,掉电后不丢失;
-
按键值实时反映到 LCD 界面。
四、LCD1602 显示说明
行 | 内容 |
---|---|
第1行 | T: 当前温度 + 超温状态 |
第2行 | TH: 上限值,TL: 下限值 |
T:+026.37 OV:H
TH:+030 TL:+015
五、主函数代码(项目代码已上传)
#include <REGX52.H>
#include "LCD1602.h"
#include "DS18B20.h"
#include "Key.h"
#include "Delay.h"
#include "AT24C02.h"
#include "Timer0.h"
unsigned char KeyNum;
float T,TShow;
char THigh,TLow;
void main()
{
DS18B20_ConvertT();
Delay(1000);
THigh=AT24C02_ReadByte(0);
TLow=AT24C02_ReadByte(1);
if(THigh>125 ||TLow<-55 ||THigh<=TLow ){
THigh=20;
TLow=15;
}
LCD_Init();
LCD_ShowString(1,1,"T:");
LCD_ShowString(2,1,"TH:");
LCD_ShowString(2,9,"TL:");
Timer0_Init();
while(1){
KeyNum=Key();
//温度读取及显示
DS18B20_ConvertT();
T=DS18B20_ReadT();
if(T<0){
LCD_ShowChar(1,3,'-');
TShow=-T;
}
else{
LCD_ShowChar(1,3,'+');
TShow=T;
}
LCD_ShowNum(1,4,TShow,3);
LCD_ShowChar(1,7,'.');
LCD_ShowNum(1,8,(unsigned long)(TShow*100)%100,2);
LCD_ShowSignedNum(2,4,THigh,3);
LCD_ShowSignedNum(2,12,TLow,3);
//阈值判断及显示
if(KeyNum){
if(KeyNum==1){
THigh++;
if(THigh>125) {THigh=125;}
}
if(KeyNum==2){
THigh--;
if(THigh<=TLow) {THigh++;}
}
if(KeyNum==3){
TLow++;
if(TLow>=THigh){TLow--;}
}
if(KeyNum==4){
TLow--;
if(TLow<-55) {THigh=-55;}
}
LCD_ShowSignedNum(2,4,THigh,3);
LCD_ShowSignedNum(2,12,TLow,3);
AT24C02_WriteByte(0,THigh);
Delay(5);
AT24C02_WriteByte(1,TLow);
Delay(5);
}
if(T>THigh)
{
LCD_ShowString(1,13,"OV:H");
}
else if(T<TLow)
{
LCD_ShowString(1,13,"OV:L");
}
else
{
LCD_ShowString(1,13," ");
}
}
}
void Timer0_Routine() interrupt 1
{
static unsigned int T0Count;//静态局部变量,
TL0 = 0x66; //设置定时初值
TH0 = 0xFC; //设置定时初值
T0Count++;
if(T0Count>=20){
T0Count=0;
Key_Loop();
}
}