DHT11通用驱动
DHT11數(shù)據(jù)結(jié)構(gòu)
DHT11數(shù)字濕溫度傳感器采用單總線數(shù)據(jù)格式。即,單個(gè)數(shù)據(jù)引腳端口完成輸 入輸出雙向傳輸。其數(shù)據(jù)包由5Byte(40Bit)組成。數(shù)據(jù)分小數(shù)部分和整數(shù)部分,具 體格式在下面說明。 一次完整的數(shù)據(jù)傳輸為40bit,高位先出。 數(shù)據(jù)格式:8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù) +8bit溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù) +8bit校驗(yàn)和 校驗(yàn)和數(shù)據(jù)為前四個(gè)字節(jié)相加。 傳感器數(shù)據(jù)輸出的是未編碼的二進(jìn)制數(shù)據(jù)。數(shù)據(jù)(濕度、溫度、整數(shù)、小數(shù))之間 應(yīng)該分開處理。如果,某次從傳感器中讀取如下5Byte數(shù)據(jù): byte4 byte3 byte2 byte1 byte0 00101101 00000000 00011100 00000000 01001001 整數(shù) 小數(shù) 整數(shù) 小數(shù) 校驗(yàn)和 濕度 溫度 校驗(yàn)和
由以上數(shù)據(jù)就可得到濕度和溫度的值,計(jì)算方法: humi (濕度)= byte4 . byte3=45.0 (%RH) temp (溫度)= byte2 . byte1=28.0 ( ℃) jiaoyan(校驗(yàn))= byte4+ byte3+ byte2+ byte1=73(=humi+temp)(校驗(yàn)正確) 注意:DHT11一次通訊時(shí)間最大3ms,主機(jī)連續(xù)采樣間隔建議不小于100ms。
DHT11時(shí)序
主機(jī)復(fù)位信號(hào)和 DHT11 響應(yīng)信號(hào)
?
數(shù)字‘0’信號(hào)表示方法
?數(shù)字‘1’信號(hào)表示方法
?
驅(qū)動(dòng)代碼:
#include "DHT11.h" #include <iOcc2530.h> #define data P0_6void delayMs(uint16_t nMs) {uint16_t i, j;uint16_t loop1Ms;loop1Ms = 1070;for(i = 0; i < nMs; i++)for(j = 0; j < loop1Ms; j++); }void Dht1Init() {delayMs(1000);P0DIR|=0X40;//設(shè)置為輸出模式(可以修改為自己板子上引腳設(shè)置為輸出的方法)data=0;delayMs(20);//延時(shí)20msdata = 1;delayus(30);//延時(shí)30us } uint8_t check() {uint8_t flag=0;P0DIR &=~0X40;//設(shè)置為輸入模式(可以修改為自己板子上引腳設(shè)置為輸入的方法)while(data && flag<100)//等待DHT11拉低40-50us{flag++;delayus(1);};if(flag>=100)return 1;else flag=0;while(!data && flag<100)//等待DHT11拉高40-50us{flag++;delayus(1);};if(flag>=100) return 1;return 0; }uint8_t DHT11_Readbit() {uint8_t flag =0;while(data && flag<100)//等待拉低{flag++;delayus(1);}flag=0;while(!data && flag<100)//等待拉高{flag++;delayus(1);}delayus(40);if(data){return 1;}return 0; } uint8_t DHT11_ReadByte() {uint8_t i,Data=0x00;for(i=0;i<8;i++){if(DHT11_Readbit())//數(shù)據(jù)從高位傳送,若是0則直接跳過Data |=0x80>>i;}return Data; }uint8_t DHT11_ReadDate(uint8_t *temp,uint8_t *humi) {Dht1Init();uint8_t i,str[5]={0};if(check()==0){for(i=0;i<5;i++) {str[i]= DHT11_ReadByte();}if(str[0]+str[1]+str[2]+str[3]==str[4]){*humi=str[0];*temp=str[2];}}else return 1;return 0; }總結(jié)
- 上一篇: 英汉词典c语言实验报告,大学课程英汉电子
- 下一篇: 【服务器存储设备数据恢复】EMC存储PO