——文档转载自电子发烧友
在通常情况下,要进行温湿度的检测是要借助带有MCU开发板的,因迪文智能屏的独特设计,故可以舍去开发板这一环节,而直接驱动相应的温湿度传感器来进行检测。
1. 温湿度检测
这里所用的温湿度传感器为dht22,它是一款数字式传感器并以单总线的方式进行数据交换,该功能模块如图1所示。
除2个电源引脚外,它的另一个引脚既用于输入,又用于输出来使用,该引脚与转接板的连接关系为:DAT--- P1.0
值得指出的是,用于转接板只提供了一组电源引脚,故但使用多个外围器件时需要对电源引脚加以扩展,连接RTC模块与DHT22的方式如图3所示。
在DHT22的使用上,需注意以下几个问题。 (1)对RTC引脚的定义 sbit DAT =P1^0; (2)对DHT22的初始化 DHT22的初始化函数为: uchar DHT22_Init(void) { DHT22_IO_OUT(); DHT22_Rst(); return DHT22_Check(); }
(3)DHT22的位读取 位读取的函数如下: uchar DHT22_Read_Bit(void) { uchar retry=0; while(DAT&&retry<100) { retry++; delay_us(1); } retry=0; while(!DAT&&retry<100) { retry++; delay_us(1); } delay_us(40); IF(DAT) return 1; else return 0; }
从还函数,可以看到DHT22对实现的应该要求,它并非是靠时钟信号来拾取数据的状态,而是依照时序的长短来区分数据的状态。 (4)DHT22的字节读取 字节读取的函数是依赖位读取函数来完成一个字节的8位信号读取,其函数为: uchar DHT22_Read_Byte(void) { uchar i,dat; dat=0; for (i=0;i<8;i++) { dat<<=1; dat|=DHT22_Read_Bit(); } return dat; }
(5)温湿度的读取 温湿度的值被封装在5个字节数据中,其中第1、2字节是存放温度值,第3、4字节是存放湿度值,第5字节则是校验码。 温湿度的读取函数为: uchar DHT22_Read_Data(uint *temp,uint *humi) { uchar buf[5]; uchar i; DHT22_Rst(); if(DHT22_Check()==0) { for(i=0;i<5;i++) { buf=DHT22_Read_Byte(); } if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]) { *humi=buf[0]*256+buf[1]; *temp=buf[2]*256+buf[3]; } } else return 1; return 0; }
(6)测试主程序 测试主程序为: void main(void) { uint temperature; uint humidity; InitCPU(); Starttimer(1,500); delay_ms(500); DHT22_Init(); while(1) { DHT22_Read_Data(&temperature,&humidity); printf("t=%dC,h=%d%\r\n",temperature,humidity); delay_ms(1000); } }
经程序的编译,即可生成HEX格式的目标文件,再由专用的格式转换工具处理即可生成BIN格式的下载文件,见图4所示。
在下载后,即可见到图5所示的检测效果,由于DHT22的检测精度比较高,故它的检测值中带有1位小数值。为便于后续的处理,这里是包含小数值一同输出的,故检测的温度值为21.8度,湿度为78.6。
|