目录
简要
最近大学课程里的单片机实训选了题目为DHT11温湿度检测系统,在本论坛看了很多大佬的资料后,自己简单写了一下能够完成任务的程序,主要使用了STC89C52单片机、LCD1602显示屏以及DHT11模块。模块的详细略过,直接贴代码。
单片机P0为1602的传输端;
RS,RW,EN自便
DHT11的DATA为P3^0;
晶振为11.0592Mhz。
最后1602屏幕的显示应该是
K为开警报,变成G为关警报。
湿度下限为70,上限为95
温度下限为25,上限为95
上行 “Wise:00|D70|U95K”
下行 “Temp:00|D25|U95K”
问题:
DHT11对数据的传输很严格,数据线的优劣影响数据传输的成功跟速度,所以数据DATA线要连接好,不要松动。
主函数
#include<intrins.h> //延时函数
#include<string.h>
#include"delay.h"
#include"DHT11.h"
#include"LED1602.h"
#include"init_frist.h"
#include"keyadd.h"
#include"K1_K4.h"
#define Uint unsigned int //预定义
#define Uchar unsigned char
Uchar buff_wise[]="Wise:00|D00|U00K"; //D=Down 下限 U=up 上限
Uchar buff_temp[]="Temp:00|D00|U00K";
Uchar RH=0,RL=0,TH=0,TL=0;
Uchar data_byte;
Uint A_OPEN=0,W0,W00=70,W11=99,T00=25,T11=99,d_wh=0,d_th=0,Y=0,t2=0;
void CLOCK_DHT11() interrupt 1 //定时器配置函数。
{
//static修饰的变量在程序运行的时候分配一次内存,以后不再分配
static int count=0;
//重装初值,计数器再次从初值开始算50000次。
TH0 = (65536-5000)/256; //高8位。16位定时器 00000000 00000000
TL0 = (65536-5000)%256; //低8位。
count++; //每10ms加1次。
if(count == 50) //到达50次就是250ms。
{
count = 0;
A_OPEN = ~A_OPEN;
}
}
void main() //主程序。
{
init_frist();
}
DHT11模块代码
#include<DHT11.h>
#include<delay.h>
//************************************检测模块*************************************
void DHT11RstAndCheck() //这为DHT11的复位程序和响应程序。
{
DHT11 = 1;
delay22us(); //首先拉高一个高电平。
DHT11 = 0;
delay(25); // 主机把总线拉低必须大于18ms,保证DHT11能检测到起始信号。 此为22us。
DHT11 = 1; //发送开始信号结束后拉高电平延时20-40us
delay22us();