本帖子中DHT11的驱动函数和我另一个设计中的函数相同,直接copy过来的。

DHT11温湿计模块是广大毕设者相当熟悉的了,最近有朋友需要,随手做了一个最简单的温湿计。
设计采用176X220 2.2寸TFT屏、STC12C5A60S2核心板以及DHT11等组成。
image.png

image.png

image.png
需要注意的是,DHT11的数据线需要上拉10K电阻,这个电阻我焊在了DHT11的引脚上,并用热缩管罩住了。
image.png
显示部分的程序参照淘宝上店家的例程,很方便就能够进行需要的显示,但是我的程序中对TFT驱动程序还是做了一定程度的精简,没有使用到的功能都删除了,为了节省flash,移植也方便。

程序主函数:
#include<STC12C5A60S2.H>
  • #include "GUI.c"
  • sbit DHT=P2^7;//DHT11模块
  • //运行数组
  • unsigned char disp[5]={0,0,0,0,0};//温度每一位、湿度每一位
  • //运行变量
  • unsigned char Data_Receive[5];
  • /************************************************************
  • 名称:基于2.2寸屏和DHT11的温湿计
  • 平台:STC12C5A60S2核心板
  • 简介:显示采用2.2寸TFT 176X220彩色液晶显示温度和湿度;
  •         测量部分采用DHT11模块,模块信息如下:
  •         ASAIR
  •         -----
  •         NA:DHT11
  •         OC:3.3-5.5V
  •         U1:5-95%RH
  •         U2:-20-60℃
  •         U3:±5%RH±2℃
  •         SN:8180H3985
  • 程序编写:凌净清河
  • 硬件制作:凌净欣羽
  • 文稿排版:凌净欣羽
  • 日期:2019年2月26日
  • 注意:设计仅做正温度处理。
  • 注意:核心板上的晶振频率为11.0592MHz,移植时注意修改延时。
  • 所属:新矿城学习基地#2019
  • ************************************************************/
  • void Delay20ms()                //@11.0592MHz
  • {
  •         unsigned char i, j, k;
  •         i = 1;
  •         j = 216;
  •         k = 35;
  •         do
  •         {
  •                 do
  •                 {
  •                         while (--k);
  •                 } while (--j);
  •         } while (--i);
  • }
  • void Delay30us()                //@11.0592MHz
  • {
  •         unsigned char i;
  •         i = 80;
  •         while (--i);
  • }
  • void sys_init()
  • {
  •         Lcd_Init();
  •         LCD_LED=1;
  •         Lcd_Clear(BLACK);
  • }
  • void DHT_Collect()//温度采集函数
  • {
  •         unsigned char i,j;//for循环变量
  •         unsigned char t;//超时判断
  •         unsigned char dat8=0;//一次读取的8位数据,需要读5次
  •         unsigned int CheckValue=0;//校验和
  •         
  •         DHT=0;//主机发起始信号
  •         Delay20ms();//主机拉低总线至少18ms
  •         DHT=1;//主机拉高总线20~40us
  •         Delay30us();
  •         
  •         t=80;//设置超时等待时间
  •         while(DHT&&t--);//等待DHT11拉低总线
  •         if(t==0)//超时
  •         {
  •                 DHT=1;
  •         }
  •         t=250;//设置超时等待时间
  •         while(!DHT&&t--);//等待DHT11拉高总线
  •         if(t==0)//超时
  •         {
  •                 DHT=1;
  •         }
  •         t=250;//设置超时等待时间
  •         while(DHT&&t--);//等待DHT11拉低总线
  •         if(t==0)//超时
  •         {
  •                 DHT=1;
  •         }
  •         for(j=0;j<5;j++)//5次读取
  •         {
  •                 for(i=0;i<8;i++)//1次8个位
  •                 {
  •         //等待50us开始时隙
  •                         t=150;//设置超时等待时间
  •                         while(!DHT&&t--);//等待DHT11拉高总线
  •                         if(t==0)//超时
  •                         {
  •                                 DHT=1;
  •                         }
  •                         t=0;//记录时间清零
  •                         while(DHT&&++t);//等待并记录高电平持续时间
  •                         dat8<<=1;
  •                         if(t>30)//高电平持续时间较长(70us)
  •                         dat8+=1;//传输值为1
  •                 }
  •                 Data_Receive[j]=dat8;
  •         }
  •         
  •         Delay30us();//等待DHT11拉低50us
  •         Delay30us();
  •         DHT=1;
  •         for(i=0;i<4;i++)
  •         {
  •                 CheckValue+=Data_Receive[i];//计算校验值
  •         }
  •         if((unsigned char)CheckValue==Data_Receive[4])//比对
  •         {
  •                 disp[0]=Data_Receive[2]/10;
  •                 disp[1]=Data_Receive[2]%10;
  •                 disp[2]=Data_Receive[3]%10;
  •                 disp[3]=Data_Receive[0]/10;
  •                 disp[4]=Data_Receive[0]%10;
  •         }
  • }
  • void main()
  • {
  •         sys_init();
  •         GUI_BOX_K(0,0,219,175,GRAY0);
  •         GUI_BOX_K(4,4,215,171,BLUE);
  •         Gui_DrawFont_GBK24(39,8,YELLOW,BLACK,"无线温湿度计");
  •         Gui_DrawLine(35,34,185,34,BLUE);
  •         Gui_DrawFont_GBK16(5,36,WHITE,BLACK,"    本作品使用DHT11模块和");
  •         Gui_DrawFont_GBK16(5,54,WHITE,BLACK,"彩色液晶模块,完成温湿度采");
  •         Gui_DrawFont_GBK16(5,72,WHITE,BLACK,"集和显示。");
  •         GUI_BOX_K(8,90,211,167,BLUE);
  •         
  •         Gui_DrawFont_GBK24(10,100,YELLOW,BLACK,"温度");
  •         GUI_Char24(58,100,YELLOW,BLACK,CChar4);//:
  •         
  •         Gui_DrawFont_GBK24(10,130,YELLOW,BLACK,"湿度");
  •         GUI_Char24(58,130,YELLOW,BLACK,CChar4);//:
  •         while(1)
  •         {
  •                 DHT_Collect();
  •                
  •                 GUI_Num24(82,100,GREEN,BLACK,disp[0]);
  •                 GUI_Num24(106,100,GREEN,BLACK,disp[1]);
  •                 GUI_Char24(130,100,GREEN,BLACK,CChar2);//.
  •                 GUI_Num24(154,100,GREEN,BLACK,disp[2]);
  •                 GUI_Char24(178,100,YELLOW,BLACK,CChar1);//℃
  •                
  •                 GUI_Char24(82,130,YELLOW,BLACK,CChar0);//空格
  •                 GUI_Num24(106,130,GREEN,BLACK,disp[3]);
  •                 GUI_Num24(130,130,GREEN,BLACK,disp[4]);
  •                 GUI_Char24(154,130,YELLOW,BLACK,CChar0);//空格
  •                 GUI_Char24(178,130,YELLOW,BLACK,CChar3);//%
  •         }
  • }
  • 复制代码