单片机温湿度-光照-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仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。

相关推荐
LCMICRO-133108477462 小时前
国产长芯微LDC5141完全P2P替代DAC80501,数模转换器 (DAC)
单片机·嵌入式硬件·fpga开发·硬件工程·dsp开发·数模转换器 dac
普中科技3 小时前
【普中 51-Ai8051 开发攻略】-- 第 9 章 按键控制实验
单片机·嵌入式硬件·开发板·keil·按键·普中科技·ai8051u
曼亿点4 小时前
STM32HAL驱动L298N电机驱动模块(PWM调速+双电机控制)保姆级教程
stm32·单片机·嵌入式硬件
独小乐6 小时前
012.整体框架适配SDRAM|千篇笔记实现嵌入式全栈/裸机篇
c语言·汇编·笔记·单片机·嵌入式硬件·arm·gnu
不吃鱼的羊6 小时前
ADC扫描组Scan Group
单片机
爬山算法6 小时前
MongoDB(86)如何使用MongoDB存储大文件?
数据库·mongodb
LCMICRO-133108477467 小时前
长芯微LPC556D1完全P2P替代DAC8830,是引脚兼容的16位数模转换器,该系列产品为单通道、低功耗、缓冲电压输出型DAC
stm32·单片机·嵌入式硬件·fpga开发·硬件工程·电压输出型dac
charlie1145141917 小时前
嵌入式C++教程实战之Linux下的单片机编程(9):HAL时钟使能 —— 不开时钟,外设就是一坨睡死的硅
linux·开发语言·c++·单片机·嵌入式硬件·c
钿驰科技7 小时前
水泵无刷电机驱动板如何实现恒压控制?
单片机·嵌入式硬件
xingzhemengyou18 小时前
STM32 DMA
stm32·单片机·嵌入式硬件