DHT11温湿计模块是广大毕设者相当熟悉的了,最近有朋友需要,随手做了一个最简单的温湿计。
设计采用176X220 2.2寸TFT屏、STC12C5A60S2核心板以及DHT11等组成。
需要注意的是,DHT11的数据线需要上拉10K电阻,这个电阻我焊在了DHT11的引脚上,并用热缩管罩住了。
显示部分的程序参照淘宝上店家的例程,很方便就能够进行需要的显示,但是我的程序中对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);//% } }
复制代码