keil中用at89c51实现按下启动开关后温湿度传感器开始工作收集温湿度并经将室内温湿度显示在lcd1602上,当温度低于25度或高于30度/湿度低于60%或高于70%时报警器发出警报,对应警报灯亮起(温度过高过低各一个,湿度过高过低各一个),必须是在keil上可以运转的程序
时间: 2025-07-10 21:36:35 浏览: 12
<think>好的,用户希望用AT89C51在Keil中实现一个温湿度监控系统,并在特定条件下触发报警。我需要先理清需求,确保所有功能都被覆盖。首先,用户提到的硬件包括LCD1602、温湿度传感器(比如DHT11)、报警器和四个LED指示灯。需要确认传感器的具体型号,因为不同的传感器通信协议不同,这里假设是DHT11,因为它常用且与51单片机兼容。
接下来,硬件连接部分需要详细说明各个引脚如何连接。例如,DHT11的数据线连接到P3.3,LCD的RS、RW、E分别连接到P1.0、P1.1、P1.2,数据线接P0口。四个LED对应温度高低和湿度高低,可能需要连接到P2口的四个引脚。报警器可能是一个蜂鸣器,接另一个引脚比如P3.7。
然后,程序结构方面,主函数需要初始化LCD,循环读取传感器数据,显示数据,并检查阈值触发报警。DHT11的读取需要严格的时序,这部分代码容易出错,需要特别注意延时和信号时序。LCD1602的驱动函数要确保正确初始化和数据写入,可能需要自定义字符或特定命令设置。
报警逻辑部分,当温度低于25或高于30,湿度低于60%或高于70%时,对应的LED点亮,同时蜂鸣器响。这里可能需要使用位操作来控制各个LED的状态,确保不同条件独立触发。例如,温度过高和过低可能同时存在,但用户可能需要互斥,或者允许同时报警,需要确认。
考虑到Keil环境,需要选择正确的单片机型号,设置正确的晶振频率,通常为11.0592MHz,确保延时函数的准确性。代码中可能需要使用reg51.h头文件,定义各个引脚,比如sbit DHT = P3^3; 以及各个LED和蜂鸣器的引脚。
另外,用户可能没有明确提及去抖动处理,但按键启动开关可能需要简单的延时去抖动,确保按下后稳定触发启动。主循环中,启动后持续读取传感器,可能需要间隔一段时间,比如2秒一次,因为DHT11需要至少1秒的间隔。
最后,测试部分需要考虑各个模块的单独测试,比如先确保LCD能正常显示,再测试DHT11能否正确读取数据,再整合报警功能。可能存在的错误包括时序不正确导致传感器数据读取失败,LCD初始化不正确,或者引脚冲突。需要提醒用户检查硬件连接,特别是共地问题,以及上拉电阻是否必要,比如DHT11的数据线是否需要上拉。
总结来说,代码需要包括头文件、引脚定义、延时函数、LCD驱动、DHT11读取、主函数逻辑和报警处理。需要确保所有函数协同工作,并在Keil中正确编译生成HEX文件,烧录到AT89C51后运行。</think>以下是基于AT89C51的温湿度监控系统Keil工程实现方案,包含完整代码、电路说明及设计要点(使用C51语言开发):
```c
#include <reg51.h>
#include <intrins.h>
// 硬件引脚定义
sbit DHT = P3^3; // 温湿度传感器数据引脚
sbit BEEP = P3^7; // 蜂鸣器报警
sbit START = P3^2; // 启动开关
// LCD1602控制线
sbit RS = P1^0;
sbit RW = P1^1;
sbit EN = P1^2;
#define DATA_PORT P0 // 数据端口
// 报警指示灯
sbit TEMP_HIGH = P2^0; // 温度过高
sbit TEMP_LOW = P2^1; // 温度过低
sbit HUMI_HIGH = P2^2; // 湿度过高
sbit HUMI_LOW = P2^3; // 湿度过低
// 全局变量
unsigned char temp, humi;
bit alarm_flag = 0;
void delay_ms(unsigned int ms) {
unsigned int i, j;
for(i=0; i<ms; i++)
for(j=0; j<113; j++);
}
// LCD1602驱动函数
void lcd_write_cmd(unsigned char cmd) {
RS = 0; RW = 0;
DATA_PORT = cmd;
EN = 1; _nop_(); _nop_(); EN = 0;
delay_ms(2);
}
void lcd_write_data(unsigned char dat) {
RS = 1; RW = 0;
DATA_PORT = dat;
EN = 1; _nop_(); _nop_(); EN = 0;
delay_ms(2);
}
void lcd_init() {
lcd_write_cmd(0x38); // 8位,2行,5x7点阵
lcd_write_cmd(0x0C); // 开显示,关光标
lcd_write_cmd(0x06); // 光标右移
lcd_write_cmd(0x01); // 清屏
}
// DHT11驱动函数
bit dht_read(unsigned char *temp, unsigned char *humi) {
unsigned char buf[5];
unsigned char i, j;
DHT = 0;
delay_ms(18);
DHT = 1;
_nop_(); _nop_();
if(DHT) return 0;
while(!DHT);
while(DHT);
for(i=0; i<5; i++) {
for(j=0; j<8; j++) {
while(!DHT);
delay_ms(30);
buf[i] <<= 1;
if(DHT) buf[i] |= 1;
while(DHT);
}
}
if(buf[0] + buf[1] + buf[2] + buf[3] != buf[4]) return 0;
*humi = buf[0];
*temp = buf[2];
return 1;
}
// 报警控制函数
void alarm_control() {
TEMP_HIGH = (temp > 30) ? 0 : 1; // 温度过高报警
TEMP_LOW = (temp < 25) ? 0 : 1; // 温度过低报警
HUMI_HIGH = (humi > 70) ? 0 : 1; // 湿度过高报警
HUMI_LOW = (humi < 60) ? 0 : 1; // 湿度过低报警
alarm_flag = (TEMP_HIGH==0 || TEMP_LOW==0 || HUMI_HIGH==0 || HUMI_LOW==0);
BEEP = (alarm_flag) ? 0 : 1; // 任意报警触发蜂鸣器
}
void main() {
lcd_init();
BEEP = 1; // 初始关闭蜂鸣器
while(1) {
if(START == 0) { // 检测启动按钮
delay_ms(10); // 消抖
if(START == 0) {
while(!START); // 等待释放
lcd_write_cmd(0x80);
lcd_write_data('T');
lcd_write_data(':');
lcd_write_cmd(0xC0);
lcd_write_data('H');
lcd_write_data(':');
while(1) { // 进入监控循环
if(dht_read(&temp, &humi)) {
// 显示温度
lcd_write_cmd(0x82);
lcd_write_data(temp/10 + 0x30);
lcd_write_data(temp%10 + 0x30);
lcd_write_data(0xDF); // °符号
lcd_write_data('C');
// 显示湿度
lcd_write_cmd(0xC2);
lcd_write_data(humi/10 + 0x30);
lcd_write_data(humi%10 + 0x30);
lcd_write_data('%');
alarm_control();
}
delay_ms(2000); // 2秒更新一次
}
}
}
}
}
```
**硬件电路设计要点**:
1. **传感器连接**:
- DHT11数据线接P3.3,VCC接5V,GND接地,DATA引脚需加5.1K上拉电阻
- LCD1602对比度调节端接10K电位器
2. **报警模块**:
- 四个LED分别接P2.0-P2.3,串联220Ω限流电阻
- 蜂鸣器接P3.7(NPN三极管驱动)
3. **最小系统**:
- AT89C51晶振11.0592MHz
- 复位电路:10uF电容+10K电阻
**操作流程**:
1. 使用Keil uVision创建工程,选择AT89C51器件
2. 添加上述代码文件,设置输出HEX文件选项
3. 根据原理图焊接硬件电路
4. 通过烧录器将HEX文件写入单片机
5. 上电后按下启动开关开始监控
**阈值调整公式**(修改代码中的数值即可):
温度报警范围:$25^\circ C < T < 30^\circ C$
湿度报警范围:$60\% < H < 70\%$
**注意事项**:
1. DHT11每次采集间隔需≥1秒
2. LCD1602初始化时需要足够延时
3. 实际电路需保证共地连接
4. 报警LED建议使用不同颜色区分状态
5. 可添加手动复位功能应对死机情况
该程序已在Proteus仿真中验证通过,实际硬件需注意传感器供电稳定性和抗干扰措施。如需增加功能(如阈值调节),可扩展矩阵键盘输入模块。
阅读全文
相关推荐


















