【51单片机】【protues仿真】基于51单片机烟雾温湿度检测控制系统 - 指南

目录

一、主要功能

二、使用步骤

三、硬件资源

四、软件设计

五、实验现象

一、主要特性

1、LCD1602液晶烟雾值,温度和湿度值
2、允许设置烟雾、温湿度上下限报警值
3、烟雾值高于报警值,会发出声光报警
4、温湿度值低于或高于设定的范围时,会发出声光报警
5、满足烟雾温度过高、湿度过低时,控制继电器吸合,表示灭火
6、内容掉电存储功能

二、启用步骤

基于51单片机的烟雾温湿度检测控制系统通常由传感器模块、显示模块、报警模块及控制模块组成,可实现环境参数的实时监测与智能报警。

三、硬件资源

1、51单片机核心模块
2、按键模块
3、DHT11温湿度传感器、MQ烟雾传感器模块
4、蜂鸣器模块
5、继电器模块
6、LCD1602显示模块

四、软件设计

#include <reg52.h>
#include <intrins.h>

通过#define uchar unsigned char // 以后unsigned char就能够用uchar代替
通过#define uint unsigned int // 以后unsigned int 就能够用uint 代替

sbit LcdRs_P = P2^5; // 1602液晶的RS管脚
sbit LcdRw_P = P2^6; // 1602液晶的RW管脚
sbit LcdEn_P = P2^7; // 1602液晶的EN管脚

uchar AlarmTL; // 温度下限报警值
uchar AlarmTH; // 温度上限报警值
uchar AlarmHL; // 湿度下限报警值
uchar AlarmHH; // 湿度上限报警值
uint AlarmLG; // 烟雾报警值


/*********************************************************/
// 毫秒级的延时函数,time是要延时的毫秒数
/*********************************************************/
void DelayMs(uint time)
{
uint i,j;
for(i=0;i<time;i++)
for(j=0;j<112;j++);
}


/*********************************************************/
// 10us级延时应用
/*********************************************************/
void Delay10us()
{
_nop_(); // 执行一条指令,延时1微秒
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}


void LcdWriteCmd(uchar cmd)
{
LcdRs_P = 0;
LcdRw_P = 0;
LcdEn_P = 0;
P0=cmd;
DelayMs(2);
LcdEn_P = 1;
DelayMs(2);
LcdEn_P = 0;
}



void LcdWriteData(uchar dat)
{
LcdRs_P = 1;
LcdRw_P = 0;
LcdEn_P = 0;
P0=dat;
DelayMs(2);
LcdEn_P = 1;
DelayMs(2);
LcdEn_P = 0;
}


/*********************************************************/
// 1602液晶初始化函数
/*********************************************************/
void LcdInit()
{
LcdWriteCmd(0x38); // 16*2显示,5*7点阵,8位数据口
LcdWriteCmd(0x0C); // 开表现,不表明光标
LcdWriteCmd(0x06); // 地址加1,当写入数据后光标右移
LcdWriteCmd(0x01); // 清屏
}


/*********************************************************/
// 主函数
/*********************************************************/
void main(void)
{
uchar i; // 循环变量

LcdInit(); // 液晶功能初始化
LcdShowInit(); // 液晶显示初始化
AlarmInit(); // 报警值初始化

while(1)
{
light=Get_ADC0832(); // 读取烟雾强度
light=light/2.5; // 缩小烟雾检测结果(在0-99)
if(light>99) // 如果大于99
light=99; // 则依然保持99
LcdGotoXY(0,9); // 液晶定位到第0行第6列
LcdPrintNum1(light); // 显示测量结果

/*温湿度读取*/
EA=0;
ReadDhtData(); // 检测温湿度数据;
EA=1;
LcdGotoXY(1,2); // 定位到要呈现温度的地方
LcdPrintNum2(temp); // 展示温度值
LcdGotoXY(1,11); // 定位到要显示湿度的地方
LcdPrintNum2(humi); // 显示湿度值

// 报警判断
AlarmJudge();

/*按键扫描和延时*/
for(i=0;i<30;i++)
{
KeyScanf(); // 按键判断
DelayMs(10);
}
}
}


void UartInt(void) interrupt 4
{
uchar VoutH,VoutL;

if(RI==1)
{
RI=0;
if(SBUF==0xAA) // 起始位
{
while(!RI);
VoutH=SBUF; // Vout(H)
RI=0;
while(!RI);
VoutL=SBUF; // Vout(L)
RI=0;
while(!RI); // Vref(H)
RI=0;
while(!RI); // Vref(L)
RI=0;
while(!RI); // 校验位
RI=0;
while(!RI); // 停止位
RI=0;

Value[gIndex]=VoutH*256+VoutL;

gIndex++;
if(gIndex==20)
gIndex=0;
}
}
}

五、实验现象

演示视频:

posted @ 2025-10-14 15:17  yxysuanfa  阅读(70)  评论(0)    收藏  举报