AT89C52单片机作为数据处理器,DHT11采集温湿度数据,按键调整温湿度报警阈值,LCD12864来进行显示温湿度实时数据和报警阈值,当DHT11检测到的温度高于报警阈值的时候,电阻丝进行模拟加热,当检测到的温度低于报警阈值的时候,风扇开始进行降温;当检测到的DHT11湿度低于报警阈值的时候,水泵进行模拟加湿,当检测到的DHT11湿度高于报警阈值的时候,蜂鸣器进行鸣叫
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
#include "config.h"
#include "lcd12864.h"
#include "dht11.h"
#include "stdio.h"
#include "intrins.h"
#include "math.h"
#include "uart.h"
#include "key.h"
uint t = 20;
uint z = 40;
unsigned char tempH,tempL,humiH,humiL;
/*******************************************************************************
* 函 数 名 : Display
* 函数功能 : 显示温湿度阈值
*******************************************************************************/
void Display(void)
{
uchar t_Buffer[3];
uchar z_Buffer[3];
delay_ms(100);
t_Buffer[0] = t/10+0x30;
t_Buffer[1] = t%10+0x30;
t_Buffer[2] = '\0';
Write_String(2,72,0,t_Buffer);
delay_ms(100);
z_Buffer[0] = z/10+0x30;
z_Buffer[1] = z%10+0x30;
z_Buffer[2] = '\0';
Write_String(6,72,0,z_Buffer);
}
/*******************************************************************************
* 函 数 名 : key_press
* 函数功能 : 检测独立按键是否按下,按下则返回对应键值
* 输 入 : mode=0:单次扫描按键
mode=1:连续扫描按键
* 输 出 :
KEY1_PRESS:K1按下温度阈值加1
KEY2_PRESS:K2按下温度阈值减1
KEY3_PRESS:K3按下湿度阈值加1
KEY4_PRESS:K4按下湿度阈值减1
KEY_UNPRESS:未有按键按下
*******************************************************************************/
void key_press()
{
uchar key = 0;
key = key_scan(1);
if (key==KEY1_PRESS)
{
if(t<100)
t++;
}
else if (key==KEY2_PRESS)
{
if (t>0)
t--;
}
if (key==KEY3_PRESS)
{
if(z<100)
z++;
}
else if (key==KEY4_PRESS)
{
if (z>0)
z--;
}
}
void baojing(void)
{
{
if (tempH > t)
{
Fengsan = 0;
Relay = 1;
}
else
{
Fengsan = 1;
Relay = 0;
}
}
{
if (humiH > z)
{
Suibeng = 1;
Beep = 1;
}
else
{
Suibeng = 0;
Beep = 0;
}
}
}
/*******************************************************************************
* 函 数 名 : 主函数
*******************************************************************************/
void main()
{
uchar temp_buf[3],humi_buf[3];
UartInit();
dht11_rst();
if(dht11_check()<0)
{
printf("DHT11 ERROR!\r\n");
}
else
{
printf("DHT11 OK\r\n");
}
// EA = 1;
Init_12864();
Qin();
Write_String(0,0,0,"温度");
Write_String(0,32,0,":");
Write_String(0,60,0,"℃");
Write_String(2,0,0,"温度阈值");
Write_String(2,64,0,":");
Write_String(2,90,0,"℃");
Write_String(4,0,0,"湿度");
Write_String(4,32,0,":");
Write_String(4,60,0,"%RH");
Write_String(6,0,0,"湿度阈值");
Write_String(6,64,0,":");
Write_String(6,90,0,"%RH");
while(1)
{
Display();
key_press();
dht11_Read_Data(&tempH,&tempL,&humiH,&humiL);
delay_ms(500);
// Write_String(2,40,0,"&tempH");
temp_buf[0]=tempH/10+0x30;
temp_buf[1]=tempH%10+0x30;
humi_buf[0]=humiH/10+0x30;
humi_buf[1]=humiH%10+0x30;
Write_String(0,40,0,temp_buf);
Write_String(4,40,0,humi_buf);
baojing();
// printf("TEMP:%bu.%bu HUMI:%bu.%bu",tempH,tempL,humiH,humiL);
// printf ("\r\n");
printf(" 当前温度:%bu.%bu",tempH,tempL);
delay_ms(5);
printf ("\r\n");
delay_ms(5);
printf(" 当前湿度:%bu.%bu",humiH,humiL);
delay_ms(5);
printf ("\r\n");
delay_ms(5);
}
}
Keil5代码与Proteus8.13仿真下载:
温湿度检测(12864).zip
(173.46 KB, 下载次数: 89)
|