|
自測(cè)可用
單片機(jī)源程序如下:
- #include "stm32f10x.h"
- #include "DHT11.h"
- #include "Delay.h"
- #include "bsp_usart.h"
- #include "oled.h"
- DHT11_Data DHT11;
- void DHT11_GPIO_IN(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
-
- GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設(shè)置浮空輸入
- GPIO_Init(DHT11_PORT,&GPIO_InitStructure);
- }
- /********************************************************
- 函數(shù):DHT11_GPIO_OUT
- 描述:設(shè)置GPIO口為輸出狀態(tài)
- 參數(shù):無(wú)
- 返回:無(wú)
- ********************************************************/
- void DHT11_GPIO_OUT(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
-
- GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //設(shè)置推挽輸出
- GPIO_Init(DHT11_PORT,&GPIO_InitStructure);
- }
- /********************************************************
- 函數(shù):DHT11WriteStart
- 描述:發(fā)起開(kāi)始信號(hào)
- 參數(shù):無(wú)
- 返回:無(wú)
- ********************************************************/
- void DHT11WriteStart(void)//開(kāi)始標(biāo)志
- {
- DHT11_GPIO_OUT(); //設(shè)置io為輸出模式
- DHT11_DATA_OUT(1); //拉高
- DHT11_DATA_OUT(0); //拉低
- Delay_Ms(20); //主機(jī)拉低總線必須大于18ms
- DHT11_DATA_OUT(1); //拉高
- Delay_Us(30); //主機(jī)發(fā)送開(kāi)始信號(hào)結(jié)束后延時(shí)等待20-40us
- DHT11_GPIO_IN(); //啟動(dòng)信號(hào)開(kāi)始后,為如數(shù)據(jù)將io設(shè)置設(shè)置為輸入模式
- }
- /********************************************************
- 函數(shù):DHT11ReadByte
- 描述:從DHT11中讀取一位數(shù)據(jù)
- 參數(shù):無(wú)
- 返回:返回讀出來(lái)的數(shù)據(jù)
- ********************************************************/
- u8 DHT11ReadByte(void)
- {
- u8 temp=0,i;
- for(i=0;i<8;i++)//讀取8位數(shù)據(jù)
- {
- while(DHT11_DATA_IN()==0);//等待變高電平[DHT在單片機(jī)采集DATA引腳輸出低電平時(shí),從低功耗模式轉(zhuǎn)至高速模式,等待DATA引腳變?yōu)楦唠娖絔
- /*DHT11 以26us~28us的高電平表示“0”,以70us的高電平表示“1”
- 每一bit數(shù)據(jù)都以50us低電平時(shí)隙開(kāi)始,當(dāng)檢測(cè)到60us后的電平區(qū)別狀態(tài)*/
- Delay_Us(60);//1.DHT輸出 60us低電平 作為應(yīng)答信號(hào)2.DHT輸出 80us高電平 通知微處理器準(zhǔn)備接受數(shù)據(jù)
- if(DHT11_DATA_IN()==1) //60us后還是高電平則是“1”
- {
- while(DHT11_DATA_IN()==1);
- temp|=(u8)(0x01<<(7-i));
- }
- else //否則是“0”
- {
- temp&=(u8)~(0x01<<(7-i));
- }
- }
- return temp;
- }
- /********************************************************
- 函數(shù):DHT11Read
- 描述:采樣當(dāng)前溫濕度值
- 參數(shù):
- RH:濕度值的整數(shù)部分
- RL: 濕度值的小數(shù)部分
- TH: 溫度值的整數(shù)部分
- TL: 溫度值的小數(shù)部分
- 返回:
- ********************************************************/
- char a[5];
- int temp;
- void DHT11Read(void)
- {
- DHT11WriteStart(); //發(fā)起開(kāi)始信號(hào)
- if(DHT11_DATA_IN()==0)
- {
- while(DHT11_DATA_IN()==0);
- while(DHT11_DATA_IN()==1);
- DHT11.RH= DHT11ReadByte(); //濕度高8位
- DHT11.RL= DHT11ReadByte(); //濕度低8位
- DHT11.TH= DHT11ReadByte(); //溫度高8位
- DHT11.TL= DHT11ReadByte(); //溫度低8位
- DHT11.sum= DHT11ReadByte(); //校驗(yàn)和
- DHT11_GPIO_OUT(); //采樣結(jié)束后設(shè)置io口為輸出,等待下一次開(kāi)始信號(hào)
- DHT11_DATA_OUT(1); //設(shè)置總線空閑狀態(tài)為高電平
- }
- if(DHT11.sum== DHT11.RH+DHT11.RL+DHT11.TH+DHT11.TL) //校驗(yàn)和與計(jì)算出的數(shù)據(jù)相等
- {
- // OLED_ShowString(6,6,"c");
- // printf("當(dāng)前環(huán)境濕度為%d.%d﹪,當(dāng)前環(huán)境溫度為%d.%d℃\r\n",DHT11.RH,DHT11.RL,DHT11.TH,DHT11.TL);
- // DHT11.TL=2;
-
- OLED_16x16CNStr(0,0,"23");
- OLED_ShowChar(32,0,':');
-
- temp=(int)DHT11.RH;
- sprintf(a,"%d",temp);
- OLED_ShowString(48,0,a);
-
- OLED_ShowChar(64,0,'.');
-
- temp=(int)DHT11.RL;
- sprintf(a,"%d",temp);
- OLED_ShowString(72,0,a);
- OLED_ShowChar(80,0,'%');
-
- OLED_16x16CNStr(0,2,"45");
- OLED_ShowChar(32,2,':');
-
- temp=(int)DHT11.TH;
- sprintf(a,"%d",temp);
- OLED_ShowString(48,2,a);
-
- OLED_ShowChar(64,2,'.');
-
- temp=(int)DHT11.TL;
- sprintf(a,"%d",temp);
- OLED_ShowString(72,2,a);
- OLED_16x16CNStr(80,2,"6");
-
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
DHT11.rar
(47.18 KB, 下載次數(shù): 46)
2018-7-20 05:05 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|