本设计由STC89C52单片机电路+DHT11温湿度传感器+水泵控制电路+蜂鸣器报警电路+风扇控制电路+LCD1602液晶显示电路+电源电路。
1、当湿度低于下限值时,打开水泵进行抽水自动灌溉同时报警,当湿度高于上限值时,自动关闭水泵停止灌溉。(湿度上下限可自行决定-代码)
2、当温度高于上限值时,打开风扇进行通风降温同时报警,当温度低于下限值时,自动关闭风扇工作。(温度上下限可自行决定-代码)
3、LCD1602实时显示温度、湿度和温湿度的阈值。
5、温度在30℃以下,液晶显示:Cold。温度在30℃以上,液晶显示:Hot
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include "dht21.h"
#include "1602.h"
sbit buzzer = P1^2;
sbit fan = P1^0;
sbit beng = P3^5;
unsigned long time_20ms=0; //定时变量
unsigned char dis0[16]; //数组暂存
unsigned char read_dht21=0; //定时读取温湿度
void Init_Timer0(void);
void UART_Init(void);
void uartSendByte(unsigned char dat);
void SendStr(unsigned char *s,unsigned char length);
void main (void)
{
Init_Timer0(); //定时器0初始化
UART_Init();
LCD_Init(); //初始化液晶
DelayMs(20); //延时有助于稳定
LCD_Clear(); //清屏
DelayMs(120);
SendStr("ready ok!",9);
while(1) //主循环
{
if(read_dht21==1)
{
read_dht21=0;
ET0 =0; //关闭定时器中断
RH(); //读取模块数据周期不易小于 2S
ET0 =1; //开定时器中断
sprintf(dis0,"T:%02d'C H:%02d%% ",(int)U8T_data_H,(int)U8RH_data_H);
LCD_Write_String(0,0,dis0);//显示时间及温度
if(U8T_data_H < 28)
{
LCD_Write_String(0,1,"st30 sh70 Cold ");//显示时间及温度
}
}
if(U8RH_data_H < 70) beng = 0;//打开水泵
else beng = 1;//关闭水泵
if(U8T_data_H < 30) fan = 1;//关闭风扇
}
}
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=(65536-20000)/256; //重新赋值 20ms
TL0=(65536-20000)%256;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
void Timer0_isr(void) interrupt 1
{
static unsigned long time_20ms;
TH0=(65536-20000)/256; //重新赋值 2ms
TL0=(65536-20000)%256;
time_20ms++;
if(time_20ms % 50 == 0)
read_dht21 = 1 ;
}
void UART_Init(void)
{
SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
TH1 = 0xFD; // TH1: 重装值 9600 波特率 晶振 11.0592MHz
TR1 = 1; // TR1: timer 1 打开
EA = 1; //打开总中断
ES = 1; //打开串口中断
}
void uartSendByte(unsigned char dat)
{
unsigned char time_out;
time_out=0x00;
SBUF = dat;
while((!TI)&&(time_out<10))
{time_out++;DelayUs2x(100);}
TI = 0;
}
void SendStr(unsigned char *s,unsigned char length)
{
unsigned char NUM;
NUM=0x00;
while(NUM<length)
{
uartSendByte(*s);
s++;
NUM++;
}
}
void UART_SER (void) interrupt 4 //串行中断服务程序
{
// unsigned char u_buf;
if(RI) //判断是接收中断产生
{
RI=0; //标志位清零
// u_buf = SBUF;
}
if(TI) //如果是发送标志位,清零
TI=0;
}
资料下载地址