单片机温湿度-光照-DHT11-烟雾气体检测控制系统-proteus仿真-源程序

一、系统方案

本设计采用52单片机作为主控器,液晶1602显示,DHT11温湿度,光照、烟雾气体检测,按键设置报警阀值,蜂鸣器报警。

二、硬件设计

原理图如下:

三、单片机软件设计

1、首先是系统初始化

//
// 1602液晶初始化
/
/

void LcdInit()

{

LcdWriteCmd(0x38); // 162显示,5 7点阵,8位数据口

LcdWriteCmd(0x0C); // 开显示,不显示光标

LcdWriteCmd(0x06); // 地址加1,当写入数据后光标右移

LcdWriteCmd(0x01); // 清屏

}

2、液晶显示程序

//
// 1602液晶写命令函数,cmd就是要写入的命令
/
/

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;

}

//
// 1602液晶写数据函数,dat就是要写入的数据
/
/

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;

}

3、按键程序

//
// 按键扫描
/
/

void KeyScanf()

{

if(KeySet_P0) // 判断是否有按键按下
{
DelayMs(10); // 消除按键按下的抖动
if(KeySet_P0)

{

while(!KeySet_P); // 等待按键释放

menu_1++;

if(menu_15)
menu_1=0;
}
}
while(menu_1!=0)
{
if(KeySet_P0) // 判断是否有按键按下

{

DelayMs(10); // 消除按键按下的抖动

if(KeySet_P0)
{
while(!KeySet_P); // 等待按键释放
menu_1++;
if(menu_19)

menu_1=0;

}

}

if(menu_11)
{
LcdGotoXY(0,0); // 液晶恢复测量时的内容显示
LcdPrintStr("Temp_Min set ");
LcdGotoXY(1,0); // 定位到第0行第7列
LcdPrintTHD(Set_Value[0][0]); // 显示当前下限
LcdGotoXY(1,3);
LcdPrintStr("C ");
if(KeyDown_P0) // 报警值减的处理

{

DelayMs(10); // 消除按键按下的抖动

if(KeyDown_P0)
{
while(!KeyDown_P); // 等待按键释放
Set_Value[0][0]--;
}
}
if(KeyUp_P0) // 报警值加处理

{

DelayMs(10); // 消除按键按下的抖动

if(KeyUp_P0)
{
while(!KeyUp_P); // 等待按键释放
Set_Value[0][0]++;
}
}
}
if(menu_12)

{

LcdGotoXY(0,0); // 液晶恢复测量时的内容显示

LcdPrintStr("Temp_MAX set ");

LcdGotoXY(1,0); // 定位到第0行第7列

LcdPrintTHD(Set_Value[0][1]); // 显示当前下限

LcdGotoXY(1,3);

LcdPrintStr("C ");

if(KeyDown_P0) // 报警值减的处理
{
DelayMs(10); // 消除按键按下的抖动
if(KeyDown_P0)

{

while(!KeyDown_P);// 等待按键释放

Set_Value[0][1]--;

}

}

if(KeyUp_P0) // 报警值加处理
{
DelayMs(10);
if(KeyUp_P0)

{

while(!KeyUp_P);

Set_Value[0][1]++;

}

}

}

if(menu_13)
{
LcdGotoXY(0,0); // 液晶恢复测量时的内容显示
LcdPrintStr("Humi_Min set ");
LcdGotoXY(1,0); // 定位到第0行第7列
LcdPrintTHD(Set_Value[1][0]); // 显示当前下限
LcdGotoXY(1,3);
LcdPrintStr("%RH ");
if(KeyDown_P0) // 报警值减的处理

{

DelayMs(10); // 消除按键按下的抖动

if(KeyDown_P0)
{
while(!KeyDown_P);// 等待按键释放
Set_Value[1][0]--;
}
}
if(KeyUp_P0) // 报警值加处理

{

DelayMs(10);

if(KeyUp_P0)
{
while(!KeyUp_P);
Set_Value[1][0]++;
}
}
}
if(menu_14)

{

LcdGotoXY(0,0); // 液晶恢复测量时的内容显示

LcdPrintStr("Humi_MAX set ");

LcdGotoXY(1,0); // 定位到第0行第7列

LcdPrintTHD(Set_Value[1][1]); // 显示当前上限

LcdGotoXY(1,3);

LcdPrintStr("%RH ");

if(KeyDown_P0) // 报警值减的处理
{
DelayMs(10); // 消除按键按下的抖动
if(KeyDown_P0)

{

while(!KeyDown_P);// 等待按键释放

Set_Value[1][1]--;

}

}

if(KeyUp_P0) // 报警值加处理
{
DelayMs(10);
if(KeyUp_P0)

{

while(!KeyUp_P);

Set_Value[1][1]++;

}

}

}

if(menu_15)
{
LcdGotoXY(0,0); // 液晶恢复测量时的内容显示
LcdPrintStr("Light_Min set ");
LcdGotoXY(1,0); // 定位到第0行第7列
LcdPrintTHD(Set_Value[2][0]); // 显示当前下限
LcdGotoXY(1,3);
LcdPrintStr(" ");
if(KeyDown_P0) // 报警值减的处理

{

DelayMs(10); // 消除按键按下的抖动

if(KeyDown_P0)
{
while(!KeyDown_P);// 等待按键释放
Set_Value[2][0]--;
}
}
if(KeyUp_P0) // 报警值加处理

{

DelayMs(10);

if(KeyUp_P0)
{
while(!KeyUp_P);
Set_Value[2][0]++;
}
}
}
if(menu_16)

{

LcdGotoXY(0,0); // 液晶恢复测量时的内容显示

LcdPrintStr("Light_MAX set ");

LcdGotoXY(1,0); // 定位到第0行第7列

LcdPrintTHD(Set_Value[2][1]); // 显示当前上限

LcdGotoXY(1,3);

LcdPrintStr(" ");

if(KeyDown_P0) // 报警值减的处理
{
DelayMs(10); // 消除按键按下的抖动
if(KeyDown_P0)

{

while(!KeyDown_P);// 等待按键释放

Set_Value[2][1]--;

}

}

if(KeyUp_P0) // 报警值加处理
{
DelayMs(10);
if(KeyUp_P0)

{

while(!KeyUp_P);

Set_Value[2][1]++;

}

}

}

if(menu_17)
{
LcdGotoXY(0,0); // 液晶恢复测量时的内容显示
LcdPrintStr(" YW_Min set ");
LcdGotoXY(1,0); // 定位到第0行第7列
LcdPrintTHD(Set_Value[3][0]); // 显示当前下限
LcdGotoXY(1,3);
LcdPrintStr("ppm ");
if(KeyDown_P0) // 报警值减的处理

{

DelayMs(10); // 消除按键按下的抖动

if(KeyDown_P0)
{
while(!KeyDown_P);// 等待按键释放
Set_Value[3][0]--;
}
}
if(KeyUp_P0) // 报警值加处理

{

DelayMs(10);

if(KeyUp_P0)
{
while(!KeyUp_P);
Set_Value[3][0]++;
}
}
}
if(menu_18)

{

LcdGotoXY(0,0); // 液晶恢复测量时的内容显示

LcdPrintStr(" YW_MAX set ");

LcdGotoXY(1,0); // 定位到第0行第7列

LcdPrintTHD(Set_Value[3][1]); // 显示当前上限

LcdGotoXY(1,3);

LcdPrintStr("ppm ");

if(KeyDown_P0) // 报警值减的处理
{
DelayMs(10); // 消除按键按下的抖动
if(KeyDown_P0)

{

while(!KeyDown_P);// 等待按键释放

Set_Value[3][1]--;

}

}

if(KeyUp_P0) // 报警值加处理
{
DelayMs(10);
if(KeyUp_P0)

{

while(!KeyUp_P);

Set_Value[3][1]++;

}

}

}

}

}

4、核心算法程序

//
// 主函数
/
/

void main()

{

LcdInit(); // 执行液晶初始化 "

DelayMs(500);

DelayMs(500);

while(1)

{

KeyScanf();

ADC_Processing();

LcdPrint_A0(1,0,ADC_Value[0]); // 光强

LcdPrint_A1(1,8,ADC_Value[1]); //

复制代码
	DHT11_receive();                 // 读取温湿度
	LcdPrint_RH(0,8,humi_value);     // 显示当前湿度
	LcdPrint_TH(0,0,temp_value);    // 显示当前温度
	
	AlarmJudge();								// 判断一下是否需要报警,是的话则报警
}

}

四、 proteus仿真设计

Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。

相关推荐
Dev_XH22 分钟前
【成品设计】STM32和UCOS-II的项目
stm32·单片机·嵌入式硬件
Dev_XH31 分钟前
【成品设计】基于 STM32 的智能鞋柜系统
stm32·单片机·嵌入式硬件
LeonDL1684 小时前
YOLOv8 在单片机上的几种部署方案
人工智能·python·单片机·嵌入式硬件·深度学习·yolo·yolov8 在单片机上的部署
LeonDL1684 小时前
YOLOv8 在单片机上部署的缺点和应对方案
python·单片机·嵌入式硬件·深度学习·yolo·yolov8在单片机上的缺点·yolov8 在单片机上的优化
尚久龙4 小时前
STM32实现RS485通讯
stm32·单片机·嵌入式硬件
嵌入式Linux,4 小时前
ESP32和STM32 就不应该放在一起比,
stm32·单片机·嵌入式硬件
硬件智障4 小时前
51单片机实现流水灯
单片机·嵌入式硬件·51单片机
暮雪倾风5 小时前
【STM32】ST-Link V2.1制作
stm32·单片机·嵌入式硬件
yuanpan5 小时前
支持python的单片机有哪些
开发语言·python·单片机
MaoXian_n6 小时前
[IMX] 05.串口 - UART
汇编·arm开发·驱动开发·单片机·嵌入式硬件