|
本帖最后由 凌净清河 于 2019-2-26 19:27 编辑
本帖子中DHT11的驱动函数和我另一个设计中的函数相同,直接copy过来的。
http://www.51hei.com/bbs/dpj-127755-1.html
DHT11温湿计模块是广大毕设者相当熟悉的了,最近有朋友需要,随手做了一个最简单的温湿计。
设计采用176X220 2.2寸TFT屏、STC12C5A60S2核心板以及DHT11等组成。
设计使用的TFT样式如下所示:
由于核心板上提供这款TFT的直插接口,故只需要连接DHT11到任一未占用的IO上即可。就像这样:
需要注意的是,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);//%
- }
- }
复制代码
欢迎进群:873434536,虽人数暂时较少,但群内氛围很好,有任何关于51学习中的问题,来一起讨论吧~!
资料下载:
【程序】
基于DHT11和2.2寸液晶屏的温湿计设计 凌净清河.zip
(70.42 KB, 下载次数: 104)
【DHT11资料】
DHT11中文数据手册.pdf
(677.52 KB, 下载次数: 56)
【屏幕资料(来自淘宝)】
QDtech_2.2寸SPI串口176X220_9225模块.zip
(13.48 MB, 下载次数: 76)
请注意,为了方便黑币较少的人也能够下载附件,回复本帖,任何时候我看到,均会给出最高评分作为黑布补贴!
|
评分
-
查看全部评分
|