一个简单的单片机DHT11温湿度测量系统

 单片机温湿度测量系统3D视图

       前几天做了一个简单的单片机温湿度测量系统,主要是用来测一下房间里面的温度和湿度。整个系统采用STC89C52RC微处理器作为主控系统,硬件电路主要包括STC89C52RC单片机最小系统、DHT11温湿测量模块、1602显示器模块、18650锂电池供电模块。通过单片机读取DHT11温度传感器模块的测量数据,并由LCD1602显示出来,LCD显示实时的温、湿度值。成品如下图所示。

反面视图

正面视图

  1. 系统原理图

    原理图比较简单,主要有单片机最小系统、DHT11测温接口电路、DS18B20测温接口电路、LCD1602显示接口电路,锂电池供电模块。

2.程序代码

/**************************dht11测温驱动程序*************************************/ 

void start()//开始信号 

  io=1; 

  delay1(); 

  io=0; 

  delay(25);// 主机把总线拉低必须大于18ms保证DHT11能检测到起始信号 

  io=1;    //发送开始信号结束后拉高电平延时20-40us 

  delay1();//以下三个延时函数差不多为24us符合要求 

  delay1(); 

  delay1(); 

uchar receive_byte()//接收一个字节// 

  uchar i,temp; 

  for(i=0;i<8;i++)//接收8bit的数据 

  { 

  while(!io);//等待50us的低电平开始信号结束 

  delay1();//开始信号结束之后延时26us-28us以下三个延时函数 

 delay1(); 

  delay1(); 

  temp=0;//时间为26us-28us表示接收的为数据'0' 

  if(io==1) 

 temp=1; //如果26us-28us之后还为高电平则表示接收的数据为'1' 

    while(io);//等待数据信号高电平'0'为26us-28us'1'为70us 

  data_byte<<=1;//接收的数据为高位在前右移 

 data_byte|=temp; 

  } 

  return data_byte; 

    

void receive()//接收数据// 

  uchar T_H,T_L,R_H,R_L,check,num_check,i; 

  start();//开始信号// 

  io=1;   //主机设为输入判断从机DHT11响应信号 

  if(!io)//判断从机是否有低电平响应信号// 

  {  

while(!io);//判断从机发出 80us 的低电平响应信号是否结束// 

while(io);//判断从机发出 80us 的高电平是否结束如结束则主机进入数据接收状态 

R_H=receive_byte();//湿度高位 

  R_L=receive_byte();//湿度低位 

T_H=receive_byte();//温度高位 

T_L=receive_byte();//温度低位 

check=receive_byte();//校验位 

io=0; //当最后一bit数据接完毕后从机拉低电平50us// 

for(i=0;i<7;i++)//差不多50us的延时 

delay1(); 

io=1;//总线由上拉电阻拉高进入空闲状态 

num_check=R_H+R_L+T_H+T_L; 

if(num_check==check)//判断读到的四个数据之和是否与校验位相同 

  { 

   RH=R_H; 

   RL=R_L; 

   TH=T_H; 

   TL=T_L; 

   check=num_check; 

  } 

  } 

3.总结

      本系统控制器采用STC89C52RC,采用LCD1602作为显示设备,2800maH的锂电池供电,持续亮屏工作时间能达到5-6天。目前来看,待机时间有点短,LCD背光功耗比较高,关闭背光源显示又不清晰。后续准备改进,采用STC15W408AS作为主控制器,IIC通信的OLED屏幕,加上光敏传感器电路和声控电路还有小夜灯功能,夜间系统进入睡眠模式,通过声控电路唤醒系统,达到省电目的,希望待机时长可以更久些。本文完整软件工程和电路原理图PCB图可以在公众号回复DHT11获取。

猜你喜欢

转载自blog.csdn.net/chanchairen/article/details/123369979