|
菜鳥初學(xué)C51單片機(jī),不容易啊,僅與一步一步走來的菜鳥分享,大師們忽視!
今天剛收到某寶快遞來的DHT11,馬上焊接,早上就一直再看規(guī)格書,網(wǎng)上看別人的例程,以為很順利,結(jié)果從下午4點(diǎn)開始,
一直弄到12點(diǎn)多,就是讀不出數(shù)據(jù),網(wǎng)上看了很多例程,就是不行。都快崩潰得想放棄了,最后還是有顯示了
不敢獨(dú)享,分享給很多像我一樣的菜鳥
(參照:http://www.torrancerestoration.com/bbs/dpj-154092-1.html,fumily 發(fā)表于 2019-3-23 18:57)感謝作者fumily
/*****************************************************************************
*MCU 型號(hào):STC15W404AS
*開發(fā)環(huán)境:Keil uVision5
*晶震頻率:11.0592MHZ
*完成日期:2019-08-20
*程序功能:DHT11讀取
/********************定義數(shù)據(jù)*************************/
- #include <STC15F2K60S2.H>
- #include <intrins.h>
- #define uchar unsigned char //無符號(hào)字符型類型數(shù)據(jù)
- #define uint unsigned int //無符號(hào)整型數(shù)據(jù)
- uchar dat_r[4]; //用于存放從DHT11讀取到的數(shù)值
- sbit DATA=P3^3; //定義數(shù)據(jù)線,DHT11的2腳,2腳要上拉5.1K電阻
- /*-------30US延時(shí)---11.0592MHz(Copy自STC-ISP(v6.86).exe)----------------------------*/
- void Delay30us()
- {
- unsigned char i;
- _nop_();
- _nop_();
- i = 80;
- while (--i);
- }
- /*-------20MS延時(shí)----11.0592MHz(Copy自STC-ISP(v6.86).exe)---------------------------*/
- void Delay20ms()
- {
- unsigned char i, j, k;
- _nop_();
- _nop_();
- i = 1;
- j = 216;
- k = 35;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- /*-------1S延時(shí)-----11.0592MHz(Copy自STC-ISP(v6.86).exe)--------------------------*/
- void Delay1s()
- {
- unsigned char i, j, k;
- _nop_();
- _nop_();
- i = 43;
- j = 6;
- k = 203;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- /*********************************************************************************************
- 函數(shù)名:DHT11啟動(dòng)函數(shù)
- 調(diào) 用:無
- 參 數(shù):無
- 返回值:無
- 結(jié) 果:DHT11開始工作
- 備 注:
- **********************************************************************************************/
- void DHT11_start() // 主機(jī)控制DHT11開始工作
- {
- DATA=1; // 主線空閑狀態(tài)
- _nop_();
- _nop_();
- DATA=0; // 主機(jī)發(fā)送開始工作信號(hào)
- Delay20ms(); //延時(shí)18ms以上
- DATA=1; // 拉高并延時(shí)等待DHT11響應(yīng)
- Delay30us();
- }
- /*********************************************************************************************
- 函數(shù)名:DHT11讀數(shù)據(jù)函數(shù)
- 調(diào) 用:? = DHT11_rec_byte();
- 參 數(shù):無
- 返回值:
- 結(jié) 果:讀DHT11數(shù)據(jù)并保存到dat
- 備 注:
- **********************************************************************************************/
- uchar DHT11_rec_byte() //接收一個(gè)字節(jié)
- {
- uchar i,dat=0;
- for(i=0;i<8;i++) //從高到低依次接收8位數(shù)據(jù)
- {
- while(!DATA); //等待50us低電平過去
- Delay30us();
- Delay30us(); //延時(shí)60us,如果還為高則數(shù)據(jù)為1,否則為0
- dat<<=1; //左移位使正確接收8位數(shù)據(jù),數(shù)據(jù)為0時(shí)直接移位
- if(DATA==1) //數(shù)據(jù)為1時(shí),使dat加1來接收數(shù)據(jù)1
- dat+=1;
- while(DATA); //等待數(shù)據(jù)線拉低
- }
- return dat;
- }
- /*********************************************************************************************
- 函數(shù)名:接收DHT11的40位的數(shù)據(jù)并校驗(yàn)
- 調(diào) 用:? = DHT11_receive();
- 參 數(shù):無
- 返回值:無
- 結(jié) 果:結(jié)果保存到dat_r[i]中
- 備 注:
- **********************************************************************************************/
- void DHT11_receive() //接收40位的數(shù)據(jù)
- {
- uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
- DHT11_start(); // 主機(jī)控制DHT11開始工作
- if(DATA==0)
- {
- while(DATA==0); //等待拉高
- Delay30us();
- Delay30us();
- Delay30us(); //拉高后延時(shí)80us
- R_H=DHT11_rec_byte(); //接收濕度高八位
- R_L=DHT11_rec_byte(); //接收濕度低八位
- T_H=DHT11_rec_byte(); //接收溫度高八位
- T_L=DHT11_rec_byte(); //接收溫度低八位
- revise=DHT11_rec_byte(); //接收校正位[/i][/color][/font][/u][i]
- [u][font=宋體][color=#336699] Delay30us(); //結(jié)束[/color][/font][/u]
- [u][font=宋體][color=#336699] if((R_H+R_L+T_H+T_L)==revise) //校正
- {
- RH=R_H;
- RL=R_L;
- TH=T_H;
- TL=T_L;
- }
- /*數(shù)據(jù)處理,方便顯示*/
- dat_r[0]='0'+(RH/10);
- dat_r[1]='0'+(RH%10);
- dat_r[2]='0'+(TH/10);
- dat_r[3]='0'+(TH%10);
- }
- }
- /*========串口初始化函數(shù)=================================================*/
- void UartInit() [url=]//9600bps@11.0592MHz[/url]
- {
- SCON = 0x50; //8位數(shù)據(jù),可變波特率
- AUXR |= 0x04;
- //AUXR |= 0x01; //串口1選擇定時(shí)器2為波特率發(fā)生器
- T2L =0xE0; // 65536-(11059200/4/9600); //設(shè)定定時(shí)初值
- T2H =0xFE; // (65536-(11059200/4/9600))>>8; //設(shè)定定時(shí)初值
- AUXR |= 0x10;
- }
- /*===========串口發(fā)送函數(shù)(字節(jié))=======================================*/
- void Uartsend_1(unsigned char send)
- {
- SBUF=send; //發(fā)送數(shù)據(jù)
- while(!TI); //等待前一幀數(shù)據(jù)發(fā)送完畢
- TI=0; //復(fù)位標(biāo)志位
- }
- //----------串口發(fā)送函數(shù)(字符串)-----------------------------------------
- void PrintString(unsigned char code *puts) //發(fā)送一串字符串
- {
- for (; *puts != 0;
- puts++) Uartsend_1(*puts); //遇到停止符0結(jié)束
- }
- /*********************************************************************************************
- 函數(shù)名:主函數(shù)
- 調(diào) 用:無
- 參 數(shù):無
- 返回值:無
- 結(jié) 果:讀DHT11數(shù)據(jù)并送到1602顯示
- 備 注:
- **********************************************************************************************/
- void main (void)
- {
- UartInit();
- Delay20ms();
- while(1)
- {
- Delay1s(); //經(jīng)測試,兩次連讀要至少延時(shí)80ms
- DHT11_receive();//接受數(shù)據(jù)
- //RH:XX%
- PrintString("RH:");
- Uartsend_1(dat_r[0]);
- Uartsend_1(dat_r[1]);
- PrintString("%; ");
- //TMP:XXC
- PrintString("Tempreture:");
- Uartsend_1(dat_r[2]);
- Uartsend_1(dat_r[3]);
- Uartsend_1(0xdf);
- PrintString("C ");
- Delay1s();
-
-
- }
- }
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|