基于51单片机设计的温度检测与高低温报警系统仿真设计
演示视频
基于51单片机设计的温度检测与高低温报警系统仿真
系统功能简介
1、实时温度测量,可调整温度值
2、显示测量的温度值,按键切换可查看高温和低温报警值
3、可通过按键输入报警最高值以及最低值,通过两个LED指示灯指示当前设置状态指示
4、当温度大于报警最高值或温度低于报警最低值时进行LED和蜂鸣器声光报警。
目录
[1. 引言](#1. 引言)
[2. 硬件电路设计](#2. 硬件电路设计)
[2.1 AT89C51 单片机](#2.1 AT89C51 单片机)
[2.2 DS18B20 温度传感器](#2.2 DS18B20 温度传感器)
[2.3 显示模块](#2.3 显示模块)
[2.4 报警模块](#2.4 报警模块)
[2.5 电路原理图](#2.5 电路原理图)
[3. 软件设计](#3. 软件设计)
[3.1 温度传感器初始化函数](#3.1 温度传感器初始化函数)
[3.2 读取 DS18B20 温度值](#3.2 读取 DS18B20 温度值)
[3.3 显示温度值](#3.3 显示温度值)
[3.4 温度报警功能](#3.4 温度报警功能)
[3.5 按键扫描与处理](#3.5 按键扫描与处理)
[3.6 延时函数](#3.6 延时函数)
[3.7 主程序](#3.7 主程序)
1. 引言
温度监测在工业和日常生活中有广泛的应用,特别是在冷链运输、仓库管理等对温度要求严格的场合。本系统利用DS18B20温度传感器和AT89C51单片机,实现了实时温度监测及超限报警功能。本文将详细描述硬件电路设计和各个功能模块的程序设计。
2. 硬件电路设计
2.1 AT89C51 单片机
AT89C51 是一个功能强大的 8 位单片机,具有丰富的 I/O 端口和外围设备接口。在本系统中,AT89C51 用于读取温度传感器的数据、显示温度并控制报警装置。
2.2 DS18B20 温度传感器
DS18B20 是一种数字温度传感器,具有高精度和易于使用的特点。它通过单总线与单片机连接,能够提供精确的温度读数。
2.3 显示模块
本系统采用 LED 显示器显示温度值。通过多路复用技术,使用少量的 I/O 端口实现对多个数码管的控制。
2.4 报警模块
报警模块包括 LED 指示灯和蜂鸣器。当温度超过设定的高温或低温报警值时,LED 灯闪烁,蜂鸣器发出警报声。
2.5 电路原理图
电路原理图如下所示:
- AT89C51 单片机连接 DS18B20 传感器
- 数码管通过 P0 端口连接显示模块
- LED 指示灯和蜂鸣器分别连接 P1.6 和 P1.7 端口
- 按键通过 P1 端口连接,用于温度设置
3. 软件设计
3.1 温度传感器初始化函数
初始化 DS18B20 温度传感器,确保其进入工作状态。
void Init_DS18B20(void) {
unsigned char x = 0;
DQ = 1;
Delay_DS18B20(8);
DQ = 0;
Delay_DS18B20(80);
DQ = 1;
Delay_DS18B20(14);
x = DQ;
Delay_DS18B20(20);
}
3.2 读取 DS18B20 温度值
读取 DS18B20 传感器的温度数据,并进行相应的转换。
unsigned int ReadTemperature(void) {
unsigned char a, b;
int t = 0;
float tt = 0.0;
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0x44);
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);
a = ReadOneChar();
b = ReadOneChar();
t = b;
t <<= 8;
t |= a;
tt = t * 0.0625 * 10;
tt += 0.05;
return (unsigned int)tt;
}
3.3 显示温度值
将读取到的温度值显示在 LED 显示器上。
void Disp_Temperature(void) {
P0 = ~0x98;
P2 = 0x7F;
Delay(100);
P2 = 0xff;
P0 = ~LEDData[n];
P2 = 0xDF;
Delay(100);
P2 = 0xff;
P0 = ~LEDData[m % 10];
DIAN = 0;
P2 = 0xF7;
Delay(100);
P2 = 0xff;
P0 = ~LEDData[m / 10];
P2 = 0xFD;
Delay(100);
P2 = 0xff;
}
3.4 温度报警功能
当温度超出设定的高温或低温阈值时,触发报警装置。
void check_wendu(void) {
char tempStr[16];
unsigned int c = ReadTemperature();
if (c >= 0) {
sprintf(tempStr, "%u.%u", c / 10, c % 10);
} else {
sprintf(tempStr, "-%u.%u", (unsigned int)(-c) / 10, (unsigned int)(-c) % 10);
}
LCD_DisplayString(tempStr);
if(c >= gaowen || c <= diwen) {
LED = 0;
BEEP = 0;
} else {
LED = 1;
BEEP = 1;
}
}
3.5 按键扫描与处理
扫描按键状态并处理按键输入,用于温度设置和其他功能的实现。
void KeyScan() {
static uchar keybuf[4] = {0xFF, 0xFF, 0xFF, 0xFF};
uchar i;
keybuf[0] = (keybuf[0] << 1) | KEY1;
keybuf[1] = (keybuf[1] << 1) | KEY2;
keybuf[2] = (keybuf[2] << 1) | KEY3;
keybuf[3] = (keybuf[3] << 1) | KEY4;
for(i = 0; i < 4; i++) {
if(keybuf[i] == 0x00)
keystr[i] = 0;
else if(keybuf[i] == 0xFF)
keystr[i] = 1;
}
}
void KeyAction(uchar key) {
switch(key) {
case 0:
if(display_mode == 0) {
display_mode = 1;
LED_SET_HIGHT = 0;
LED_SET_LOW = 1;
} else if(display_mode == 1) {
display_mode = 2;
LED_SET_HIGHT = 1;
LED_SET_LOW = 0;
} else {
display_mode = 0;
LED_SET_HIGHT = 1;
LED_SET_LOW = 1;
}
break;
case 1:
gaowen++;
break;
case 2:
diwen++;
break;
case 3:
gaowen--;
break;
case 4:
diwen--;
break;
}
}
3.6 延时函数
提供各种延时功能,用于在数据传输和显示刷新时控制时间。
void Delay(uint num) {
while(--num);
}
void Delay_DS18B20(int num) {
while(num--);
}
3.7 主程序
主程序中,初始化单片机、温度传感器和显示模块,进入主循环,实时读取温度值并根据设置的高温和低温报警值进行判断,控制显示和报警。
void main(void) {
P1 = 0xFF;
P2 = 0xFF;
LED = 1;
BEEP = 1;
Disp_init();
while(1) {
KeyScan();
check_wendu();
switch(display_mode) {
case 0:
Disp_Temperature();
break;
case 1:
Disp_Temperature_Set_Hight();
break;
case 2:
Disp_Temperature_Set_Low();
break;
}
}
}