【单片机毕业设计模块选型】STC8G1K08读取DHT11温湿度并在两线LCD1602显示实现方案

STC8G1K08 读取 DHT11 温湿度并在两线 LCD1602 显示实现方案

演示视频:

【开源】51单片机读取DHT11温湿度传感器显示在lcd1602上,并通过蓝牙模块发送到手机app

一、硬件准备与连接

1. 核心器件

  • 主控:STC8G1K08(5V 供电,需外接 11.0592MHz 晶振)

  • 温湿度传感器:DHT11(单总线通信)

  • 显示模块:两线 LCD1602(I2C 接口,含 PCF8574 转接板)

  • 辅助:10KΩ 上拉电阻(DHT11 专用)、杜邦线、5V 电源

2. 引脚连接表

器件引脚STC8G1K08 引脚说明
DHT11VCC5V传感器供电
DHT11GNDGND共地
DHT11DATAP3.2数据引脚,接 10KΩ 上拉
两线 LCD1602SDAP1.2I2C 数据线
两线 LCD1602SCLP1.3I2C 时钟线
两线 LCD1602VCC5V显示模块供电
两线 LCD1602GNDGND共地

二、软件编程实现(Keil C51 环境)

1. 头文件与宏定义

\#include \<STC8.H>

\#include \<intrins.h>

// DHT11引脚定义

sbit DHT11\_DATA = P3^2;

// LCD1602 I2C引脚定义

sbit LCD\_SDA = P1^2;

sbit LCD\_SCL = P1^3;

// LCD1602 I2C地址(默认0x4E,可根据转接板调整)

\#define LCD\_ADDR 0x4E

// 温湿度存储变量

unsigned char temp\_h, temp\_l, humi\_h, humi\_l, check;

2. DHT11 数据读取函数

// 延时函数(1us,STC8G1K08@11.0592MHz)

void Delay1us(void) {

&#x20;   \_nop\_();

}

// DHT11起始信号发送

bit DHT11\_Start(void) {

&#x20;   bit ack;

&#x20;   DHT11\_DATA = 0;

&#x20;   Delay1us() \* 180; // 拉低至少18ms

&#x20;   DHT11\_DATA = 1;

&#x20;   Delay1us() \* 30;  // 拉高20-40us

&#x20;   ack = DHT11\_DATA; // 等待DHT11拉低响应

&#x20;   while(!DHT11\_DATA); // 等待DHT11拉高

&#x20;   return ack;

}

// 读取1字节数据

unsigned char DHT11\_ReadByte(void) {

&#x20;   unsigned char i, dat = 0;

&#x20;   for(i=0; i<8; i++) {

&#x20;       while(DHT11\_DATA); // 等待低电平

&#x20;       while(!DHT11\_DATA); // 等待高电平

&#x20;       Delay1us() \* 30;    // 延时30us判断电平

&#x20;       dat <<= 1;

&#x20;       if(DHT11\_DATA) dat |= 1; // 高电平为1,低电平为0

&#x20;       while(DHT11\_DATA); // 等待高电平结束

&#x20;   }

&#x20;   return dat;

}

// 读取温湿度数据(返回0成功,1失败)

bit DHT11\_ReadData(void) {

&#x20;   if(DHT11\_Start() == 0) {

&#x20;       humi\_h = DHT11\_ReadByte();  // 湿度整数

&#x20;       humi\_l = DHT11\_ReadByte();  // 湿度小数

&#x20;       temp\_h = DHT11\_ReadByte();  // 温度整数

&#x20;       temp\_l = DHT11\_ReadByte();  // 温度小数

&#x20;       check = DHT11\_ReadByte();   // 校验和

&#x20;       // 校验(humi\_h + humi\_l + temp\_h + temp\_l == check)

&#x20;       if((humi\_h + humi\_l + temp\_h + temp\_l) == check) return 0;

&#x20;   }

&#x20;   return 1;

}

3. 两线 LCD1602 驱动函数

// I2C起始信号

void I2C\_Start(void) {

&#x20;   LCD\_SDA = 1;

&#x20;   LCD\_SCL = 1;

&#x20;   Delay1us();

&#x20;   LCD\_SDA = 0;

&#x20;   Delay1us();

&#x20;   LCD\_SCL = 0;

}

// I2C停止信号

void I2C\_Stop(void) {

&#x20;   LCD\_SDA = 0;

&#x20;   LCD\_SCL = 1;

&#x20;   Delay1us();

&#x20;   LCD\_SDA = 1;

&#x20;   Delay1us();

}

// I2C发送应答

void I2C\_Ack(bit ack) {

&#x20;   LCD\_SDA = ack;

&#x20;   Delay1us();

&#x20;   LCD\_SCL = 1;

&#x20;   Delay1us();

&#x20;   LCD\_SCL = 0;

&#x20;   Delay1us();

}

// I2C等待应答

bit I2C\_WaitAck(void) {

&#x20;   bit ack;

&#x20;   LCD\_SDA = 1;

&#x20;   Delay1us();

&#x20;   LCD\_SCL = 1;

&#x20;   Delay1us();

&#x20;   ack = LCD\_SDA;

&#x20;   LCD\_SCL = 0;

&#x20;   Delay1us();

&#x20;   return ack;

}

// I2C发送1字节

void I2C\_SendByte(unsigned char dat) {

&#x20;   unsigned char i;

&#x20;   for(i=0; i<8; i++) {

&#x20;       LCD\_SDA = dat & 0x80;

&#x20;       Delay1us();

&#x20;       LCD\_SCL = 1;

&#x20;       Delay1us();

&#x20;       LCD\_SCL = 0;

&#x20;       dat <<= 1;

&#x20;   }

&#x20;   I2C\_WaitAck();

}

// LCD1602写命令

void LCD\_WriteCmd(unsigned char cmd) {

&#x20;   I2C\_Start();

&#x20;   I2C\_SendByte(LCD\_ADDR);   // 写地址

&#x20;   I2C\_SendByte(0x00);       // 命令标志(RS=0)

&#x20;   I2C\_SendByte(cmd);        // 命令数据

&#x20;   I2C\_Stop();

&#x20;   Delay1us() \* 200; // 命令执行延时

}

// LCD1602写数据

void LCD\_WriteData(unsigned char dat) {

&#x20;   I2C\_Start();

&#x20;   I2C\_SendByte(LCD\_ADDR);   // 写地址

&#x20;   I2C\_SendByte(0x01);       // 数据标志(RS=1)

&#x20;   I2C\_SendByte(dat);        // 显示数据

&#x20;   I2C\_Stop();

&#x20;   Delay1us() \* 200;

}

// LCD1602初始化

void LCD\_Init(void) {

&#x20;   LCD\_WriteCmd(0x38); // 8位总线,2行显示,5\*8点阵

&#x20;   LCD\_WriteCmd(0x0C); // 开显示,关光标

&#x20;   LCD\_WriteCmd(0x06); // 光标右移,画面不滚动

&#x20;   LCD\_WriteCmd(0x01); // 清屏

}

// LCD1602指定位置显示字符串

void LCD\_ShowStr(unsigned char x, unsigned char y, unsigned char \*str) {

&#x20;   if(y == 0) LCD\_WriteCmd(0x80 + x); // 第一行

&#x20;   else LCD\_WriteCmd(0xC0 + x);       // 第二行

&#x20;   while(\*str) {

&#x20;       LCD\_WriteData(\*str++);

&#x20;   }

}

4. 主函数逻辑

void main(void) {

&#x20;   unsigned char disp\_buf\[20];

&#x20;   LCD\_Init();          // 初始化LCD1602

&#x20;   LCD\_ShowStr(0,0,"Temp:    C"); // 第一行显示格式

&#x20;   LCD\_ShowStr(0,1,"Humi:    %"); // 第二行显示格式

&#x20;  &#x20;

&#x20;   while(1) {

&#x20;       if(DHT11\_ReadData() == 0) { // 成功读取数据

&#x20;           // 格式化温度(整数部分)

&#x20;           disp\_buf\[0] = temp\_h / 10 + '0';

&#x20;           disp\_buf\[1] = temp\_h % 10 + '0';

&#x20;           disp\_buf\[2] = '\0';

&#x20;           LCD\_ShowStr(5,0,disp\_buf); // 温度显示在第一行第5位

&#x20;          &#x20;

&#x20;           // 格式化湿度(整数部分)

&#x20;           disp\_buf\[0] = humi\_h / 10 + '0';

&#x20;           disp\_buf\[1] = humi\_h % 10 + '0';

&#x20;           disp\_buf\[2] = '\0';

&#x20;           LCD\_ShowStr(5,1,disp\_buf); // 湿度显示在第二行第5位

&#x20;       }

&#x20;       // 1秒刷新一次

&#x20;       unsigned int i;

&#x20;       for(i=0; i<60000; i++) Delay1us() \* 17;

&#x20;   }

}

三、调试与注意事项

  1. 硬件排查:确保 DHT11 数据引脚接 10KΩ 上拉电阻,LCD1602 I2C 地址与代码一致(可通过万用表测量转接板确定)。

  2. 延时校准:若数据读取失败,调整 DHT11_Start 函数中的延时(如拉低时间改为 20ms),确保与 DHT11 时序匹配。

  3. 显示异常:若 LCD 只亮背光不显示,检查初始化命令(0x38、0x0C)是否正确,或 I2C 引脚接线是否反接。

  4. 电源稳定:建议给系统加 100uF 滤波电容,避免供电波动导致数据异常。

<think>好的,我现在需要帮用户设计一个基于51单片机的实验室安全监控系统。首先,用户的需求是实验室安全监控,可能需要监测环境参数、火灾预警、门禁控制等。根据用户提供的引用内容,特别是引用[1]、[2]、[3],这些资料提到了温湿度传感器、烟雾检测、门禁系统、报警模块等。我需要整合这些信息,制定一个可行的方案。 首先,确定系统的主要功能模块。引用[3]中提到的STM32系统包括温湿度、烟雾、电流监测、RFID门禁、红外传感器、无线通信等。但用户使用的是51单片机,需要考虑其资源限制,比如处理能力、内存、IO口数量等。可能需要简化一些功能,或者选择适合51单片机的传感器。 传感器方面,温湿度可以用DHT11,因为它是单总线通信,对资源要求低,适合51单片机。烟雾检测可以用MQ-2,输出模拟信号,需要AD转换,引用[2]中提到PCF8591作为AD转换芯片,可以借鉴。门禁系统如果用RFID的话,RC522模块需要SPI接口,51单片机可能需要模拟SPI,或者选择更简单的模块,比如矩阵键盘输入密码,这样更容易实现。电流监测可能需要用到电流传感器和运放电路,但实验室安全可能更关注环境参数,所以电流监测可能不是核心,可以暂时省略,或者根据用户需求决定是否加入。 报警模块包括蜂鸣器和继电器,用于触发声光报警和控制风扇、除湿器等设备。无线通信方面,引用[2]和[3]用了GSM和ESP-01S(WiFi模块),51单片机可以通过串口与这些模块通信,发送报警信息或远程控制。但需要考虑51的串口资源是否足够,以及程序复杂度。 接下来是硬件设计部分。需要设计单片机最小系统,包括时钟、复位、电源。传感器接口电路:DHT11接一个IO口,MQ-2接PCF8591的模拟输入,PCF8591通过I2C与51通信。门禁部分如果用RFID,需要连接SPI引脚,但51没有硬件SPI,可能需要软件模拟,会增加代码量。或者改用按键输入密码,配合EEPROM存储密码。红外传感器可以用简单的数字输入,检测有人闯入时触发报警。 显示部分可以用OLED或者LCD,引用[2]中用了OLED,通过I2C或SPI接口,51驱动起来可能比较方便。报警输出部分,蜂鸣器接一个IO口,继电器控制风扇和除湿器,需要三极管或MOS管驱动。 软件部分需要编写各个传感器的驱动程序,比如DHT11的时序读取、PCF8591的AD转换、RFID或键盘输入处理、无线模块的AT指令控制等。主程序逻辑需要循环检测各个传感器数据,判断是否超过阈值,触发报警或控制设备。中断可能用于处理紧急情况,比如烟雾浓度超标立即触发报警。 需要注意51单片机的资源限制,比如内存可能较小,程序需要优化。例如,引用[2]中的代码展示了OLED初始化和串口初始化,可以参考。另外,报警逻辑需要优先级处理,比如火灾预警高于温湿度调节。 最后,测试各个模块的功能,确保传感器数据准确,报警及时,控制可靠。可能需要调试硬件电路,比如传感器的信号调理,防止干扰。 总结,系统应包括传感器数据采集、数据处理、报警控制、人机交互和通信模块。硬件选型要适合51的性能,软件需高效稳定。可能需要参考引用中的电路设计和代码结构,进行调整以适应51单片机的特性。</think>### 基于51单片机的实验室安全监控系统实现方案 #### 一、系统总体架构 系统由**数据采集层、核心控制层、执行输出层**三部分组成(图1)[^1][^3]: $$系统框图$$ ``` 传感器层 → 51单片机 → 报警/执行设备       ↑     ↓     人机交互 ↔ 通信模块 ``` #### 二、核心硬件设计 1. **主控模块** - STC89C52最小系统(晶振11.0592MHz,复位电路,电源滤波) - 扩展32KB EEPROM(AT24C256)存储报警阈值和历史数据 2. **传感器模块** - **DHT11温湿度传感器**:单总线接口(P2.0),测量范围20-90%RH/0-50℃[^3] - **MQ-2烟雾传感器**:通过PCF8591 ADC转换(I²C接口,P2.1-SDA,P2.2-SCL)[^2] - **红外对射传感器**:数字信号输出(P3.2/INT0中断触发) 3. **执行设备** - 声光报警:蜂鸣器(P1.5)+ LED(P1.6) - 继电器控制:ULN2003驱动(P1.0排风扇,P1.1除湿器) - OLED显示屏:SSD1306(I²C接口,P2.3-SDA,P2.4-SCL) 4. **通信模块** - ESP-01S WiFi模块(UART,P3.0-RXD,P3.1-TXD),支持AT指令 - SIM800C GSM模块(可选短信报警)[^2] #### 三、关键电路设计 1. **烟雾检测电路**(图2): ```circuit MQ-2 → 分压电路 → PCF8591通道0      ↓  10kΩ电位器调节灵敏度 ``` 2. **继电器驱动电路**: ```circuit P1.0 → 1KΩ → S8050 → 继电器线圈        ↓      IN4148续流二极管 ``` #### 四、软件实现 1. **主程序流程图**: ```mermaid graph TD A[系统初始化] --> B[传感器数据采集] B --> C{数据判断} C -- 超标 --> D[触发报警] C -- 正常 --> E[显示更新] D --> F[执行设备控制] E --> G[数据上传] G --> H[等待中断] ``` 2. **关键代码示例**: ```c // DHT11数据读取 bit DHT11_Read(float *temp, float *humi) { // 启动信号 DHT = 0; delay_ms(18); DHT = 1; delay_us(30); // 响应检测 if(!DHT) { while(!DHT); while(DHT); // 数据接收(略) *temp = byte2 * 0.1; *humi = byte0 * 0.1; return 1; } return 0; } ``` #### 五、安全防护设计 1. **多级报警机制**: - 初级预警:蜂鸣器间隔鸣响(阈值80%) - 中级报警:LED闪烁+GSM短信通知(阈值100%) - 紧急处置:自动启动排风扇上传平台[^3] 2. **抗干扰设计**: - 传感器信号采用RC滤波电路 - 关键数据三重冗余校验 - 看门狗定时器防死机
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单片机毕业设计-远望创客学堂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值