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