就是 雁凌家的模塊,測好了,弄了很久吧發現是他們家的杜邦線不行,以后買模塊要看杜邦線質量,還是買點好的
太耽誤開發周期了
我們用的模塊是四線 轉三線的(dht11從四線的引腳變成三線的輸出)
線路連接
dht11 有三根線連出來,vcc,gnd,還有一個負責輸入和輸出
所以最后一根線可以連接到沒有被占用的gpio口就能獲得數據
連接到板子的 pb2上面
程序編寫
喚醒dht11 ->檢測dht11是否存在 -> 讀取數據
喚醒dht11
//復位DHT11
void DHT11_Rst(void)
{
DHT11_IO_OUT(); //設置為輸出
DHT11_DQ_OUT=0; //拉低DQ
delay_ms(20); //拉低至少18ms
DHT11_DQ_OUT=1; //DQ=1
delay_us(30); //主機拉高20~40us
}
檢測dht11
喚醒后dht11 會拉低電頻40,80us 拉低后會再次拉高40~80us
讀取數據
讀取一位數據
dht11 會拉低電頻 拉低后會再次拉高,此時就是當時數據位的值,我們進行檢測
u8 DHT11_Read_Byte(void)
{
u8 i,dat;
dat=0;
for (i=0;i<8;i++)
{
dat<<=1;
dat|=DHT11_Read_Bit();
}
return dat;
}
讀取一個byte數據
就是循環讀取八個位
u8 DHT11_Read_Data(u8 *temp,u8 *humi)
{
u8 buf[5];
u8 i;
DHT11_Rst();
if(DHT11_Check()==0)
{
for(i=0;i<5;i++)//讀取40位數據
{
buf[i]=DHT11_Read_Byte();
}
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
{
*humi=buf[0];
*temp=buf[2];
}
}else return 1;
return 0;
}
對所有數據進行拼裝,得到溫度值
從總共的40byte里拿出我們的數據,小數部分就不要了,好像是不支持
u8 DHT11_Read_Data(u8 *temp,u8 *humi)
{
u8 buf[5];
u8 i;
DHT11_Rst();
if(DHT11_Check()==0)
{
for(i=0;i<5;i++)//讀取40位數據
{
buf[i]=DHT11_Read_Byte();
}
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
{
*humi=buf[0];
*temp=buf[2];
}
}else return 1;
return 0;
}
所有代碼
dht11.c
#include "dht11.h"
#include "delay.h"
//
//本程序只供學習使用,未經作者許可,不得用于其它任何用途
//ALIENTEK STM32F429開發板
//DHT11驅動代碼
//正點原子@ALIENTEK
//技術論壇:www.openedv.com
//創建日期:2016/1/16
//版本:V1.0
//版權所有,盜版必究。
//Copyright(C) 廣州市星翼電子科技有限公司 2014-2024
//All rights reserved
//
//復位DHT11
void DHT11_Rst(void)
{
DHT11_IO_OUT(); //設置為輸出
DHT11_DQ_OUT=0; //拉低DQ
delay_ms(20); //拉低至少18ms
DHT11_DQ_OUT=1; //DQ=1
delay_us(30); //主機拉高20~40us
}
//等待DHT11的回應
//返回1:未檢測到DHT11的存在
//返回0:存在
u8 DHT11_Check(void)
{
u8 retry=0;
DHT11_IO_IN(); //設置為輸入
while (DHT11_DQ_IN&&retry<100)//DHT11會拉低40~80us
{
retry++;
delay_us(1);
};
if(retry>=100)return 1;
else retry=0;
while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后會再次拉高40~80us
{
retry++;
delay_us(1);
};
if(retry>=100)return 1;
return 0;
}
//從DHT11讀取一個位
//返回值:1/0
u8 DHT11_Read_Bit(void)
{
u8 retry=0;
while(DHT11_DQ_IN&&retry<100)//等待變為低電平
{
retry++;
delay_us(1);
}
retry=0;
while(!DHT11_DQ_IN&&retry<100)//等待變高電平
{
retry++;
delay_us(1);
}
delay_us(40);//等待40us
if(DHT11_DQ_IN)return 1;
else return 0;
}
//從DHT11讀取一個字節
//返回值:讀到的數據
u8 DHT11_Read_Byte(void)
{
u8 i,dat;
dat=0;
for (i=0;i<8;i++)
{
dat<<=1;
dat|=DHT11_Read_Bit();
}
return dat;
}
//從DHT11讀取一次數據
//temp:溫度值(范圍:0~50°)
//humi:濕度值(范圍:20%~90%)
//返回值:0,正常;1,讀取失敗
u8 DHT11_Read_Data(u8 *temp,u8 *humi)
{
u8 buf[5];
u8 i;
DHT11_Rst();
if(DHT11_Check()==0)
{
for(i=0;i<5;i++)//讀取40位數據
{
buf[i]=DHT11_Read_Byte();
}
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
{
*humi=buf[0];
*temp=buf[2];
}
}else return 1;
return 0;
}
//初始化DHT11的IO口 DQ 同時檢測DHT11的存在
//返回1:不存在
//返回0:存在
u8 DHT11_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOB_CLK_ENABLE(); //開啟GPIOB時鐘
GPIO_Initure.Pin=GPIO_PIN_2; //PB12
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽輸出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOB,&GPIO_Initure); //初始化
DHT11_Rst();
return DHT11_Check();
}
dht11.h
#ifndef __DS18B20_H
#define __DS18B20_H
#include "sys.h"
//IO方向設置
#define DHT11_IO_IN() {GPIOB->MODER&=~(3<<(2*2));GPIOB->MODER|=0<<(2*2);} //PB12輸入模式
#define DHT11_IO_OUT() {GPIOB->MODER&=~(3<<(2*2));GPIOB->MODER|=1<<(2*2);} //PB12輸出模式
IO操作函數
#define DHT11_DQ_OUT PBout(2)//數據端口 PB12
#define DHT11_DQ_IN PBin(2) //數據端口 PB12
u8 DHT11_Init(void);//初始化DHT11
u8 DHT11_Read_Data(u8 *temp,u8 *humi);//讀取溫濕度
u8 DHT11_Read_Byte(void);//讀出一個字節
u8 DHT11_Read_Bit(void);//讀出一個位
u8 DHT11_Check(void);//檢測是否存在DHT11
void DHT11_Rst(void);//復位DHT11
#endif
main.c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "lcd.h"
#include "sdram.h"
#include "dht11.h"
#include "pcf8574.h"
int main(void)
{
u8 t=0;
u8 temperature;
u8 humidity;
HAL_Init(); //初始化HAL庫
Stm32_Clock_Init(360,25,2,8); //設置時鐘,180Mhz
delay_init(180); //初始化延時函數
uart_init(115200); //初始化USART
LED_Init(); //初始化LED
KEY_Init(); //初始化按鍵
SDRAM_Init(); //初始化SDRAM
LCD_Init(); //初始化LCD
PCF8574_Init(); //初始化PCF8574
POINT_COLOR=RED;
LCD_ShowString(30,50,200,16,16,"Apollo STM32F4/F7");
LCD_ShowString(30,70,200,16,16,"DHT11 TEST");
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,110,200,16,16,"2016/1/16");
PCF8574_ReadBit(BEEP_IO); //由于DHT11和PCF8574的中斷引腳共用一個IO,
//所以在初始化DHT11之前要先讀取一次PCF8574的任意一個IO,
//使其釋放掉中斷引腳所占用的IO(PB12引腳),否則初始化DS18B20會出問題
while(DHT11_Init()) //DHT11初始化
{
LCD_ShowString(30,130,200,16,16,"DHT11 Error");
delay_ms(200);
LCD_Fill(30,130,239,130+16,WHITE);
delay_ms(200);
}
LCD_ShowString(30,130,200,16,16,"DHT11 OK");
POINT_COLOR=BLUE;//設置字體為藍色
LCD_ShowString(30,150,200,16,16,"Temp: C");
LCD_ShowString(30,170,200,16,16,"Humi: %");
while(1)
{
if(t%10==0)//每100ms讀取一次
{
PCF8574_ReadBit(BEEP_IO); //讀取一次PCF8574的任意一個IO,使其釋放掉PB12引腳,
//否則讀取DHT11可能會出問題
DHT11_Read_Data(&temperature,&humidity); //讀取溫濕度值
LCD_ShowNum(30+40,150,temperature,2,16); //顯示溫度
LCD_ShowNum(30+40,170,humidity,2,16); //顯示濕度
}
delay_ms(10);
t++;
if(t==20)
{
t=0;
LED0=!LED0;
}
}
}
上一篇:STM32F103C8T6+溫濕度傳感器DHT11實現溫濕度采集
下一篇:STM32驅動dht11溫濕度傳感器
推薦閱讀
史海拾趣
在電子行業中,環保問題日益受到關注。Component Research Co積極響應環保號召,將環保理念融入產品研發和生產過程中。公司采用環保材料、推行節能減排措施、加強廢棄物處理等,努力降低生產過程中的環境污染。這些舉措不僅提升了公司的社會形象,還為公司贏得了更多客戶的青睞。
除了優秀的產品外,Antenova公司還提供一系列專業的服務,包括產品結構確認和指導、主板Gerber文件和PCB堆疊預審和檢查等。這些服務幫助客戶更好地使用Antenova的產品,并提高了客戶的滿意度和忠誠度。通過提供卓越的服務,Antenova贏得了眾多客戶的信賴和支持,為公司的長期發展奠定了堅實基礎。
隨著業務的快速發展,Antenova公司積極拓展全球市場。公司在全球范圍內設立了多個研發中心和銷售網絡,以便更好地服務客戶并拓展市場份額。通過與全球知名企業的合作,Antenova的產品得到了廣泛應用,進一步提升了公司的品牌影響力和市場競爭力。
Antenova公司積極尋求與其他行業領導者的戰略合作,以推動公司的成長和發展。通過與全球知名的芯片制造商、設備生產商等建立合作關系,Antenova得以將其天線產品集成到更廣泛的電子產品中,從而進一步擴大了市場份額。這些戰略合作不僅提升了Antenova的品牌知名度,還為公司的長期發展提供了有力支持。
以上是關于Antenova公司發展起來的五個相關故事,這些故事展示了公司在技術創新、市場拓展、產品推出、專業服務以及戰略合作等方面的努力和成就。這些成就為Antenova在電子行業中的成功奠定了堅實基礎,并為公司未來的持續發展提供了有力保障。
Antenova公司在天線設計領域的創新是其迅速發展的關鍵因素之一。公司專注于研發高效率、低能耗、高可靠性的天線產品,以滿足快速增長的物聯網市場需求。通過不斷的技術創新和產品升級,Antenova成功在智能家居、汽車、可穿戴設備等多個領域取得了顯著的市場份額增長。
Antenova公司在行業內率先推出了第二代GPS射頻天線模塊,這一創新產品為嵌入式GPS應用提供了高性能的解決方案。該產品的推出不僅樹立了行業標桿,還為公司帶來了可觀的收入增長。同時,Antenova還不斷推出其他領先產品,進一步鞏固了公司在天線設計領域的領先地位。
摘要:介紹利用專用于電機控制的16位單片機80C196MC的外設事務服務器PTS在變頻器中實現異步串行通信的方法。重點介紹PTS和普通中斷的差別及程序設計中應注意的問題,同時給出通用變頻器通信協議及程序框圖 關鍵 ...… 查看全部問答∨ |
1 引言 本課題來源于一個無紙記錄儀的項目。在該項目中要求無紙記錄儀中有一路通道將工業現場采集到的頻率信號測量并顯示出來。傳統的測頻系統大多采用單片機加邏輯器件構成,而這類測頻系統存在測頻速度慢、準確度低、可靠性差的缺點,故而使 ...… 查看全部問答∨ |
不太明白 映像文件 Memory map of the Image 中的 Idx列 代表什么意思,在映像文件中又起到了什么作用呢? 懇請高手指教!!… 查看全部問答∨ |
WINCE5.0開機無法識別TF卡,100分求高手分析解決問題,此貼問題解決再結貼! 請教高手: 我們機器現象如下: 生產1K GPS終端機,出貨都配有一張TF卡,有幾十臺機器開機后無法找到TF卡,但是重插撥一次卡就OK了。 開機后連續插撥,反復測試,測試10次偶爾會有一次找不到TF卡。 再把出現問題的機器反復開關機,測試能否檢測 ...… 查看全部問答∨ |
樓主發表于:2009-09-29 19:46:55用的485串口通信,在單位測試已經通過,但是到現場安裝好了之后無論怎樣就是通信不正常了。首先想到通信線路問題,可是換了幾根線還是不行,這會是什么原因哦? http://topic.eeworld.net/u/20090929/19/e366763c- ...… 查看全部問答∨ |
我的客戶是做智能家居的公司 現需要進行wince相關的培訓 目前具體需求還沒有整理出來 基本情況是: 產品為智能家居方面 是在wince平臺做應用開發 現需要一位經驗非常豐富的講師進行短期的授課. 請大家幫幫忙,幫我推薦一下吧~ msn:echo-1010@ ...… 查看全部問答∨ |
拆了一個電表,得到一顆只有兩根線的步進電機,萬分費解,不知這個電機如何驅動 如圖 電機只有兩根線,正反向通電,電機轉動約±30°角。去掉電壓后自動回位。 暫時在網上沒查到相關資料。只知道叫計數器步進電機。 懷疑是通 ...… 查看全部問答∨ |