|
- void DHT11_start() // 主機(jī)控制DHT11開始工作
- {
- // DATA=1; // 主線空閑狀態(tài)
- // _nop_();
- // _nop_();
- DATA=0; // 主機(jī)發(fā)送開始工作信號
- Delay20ms(); //延時18ms以上
- DATA=1; // 拉高并延時等待DHT11響應(yīng)
- Delay30us();
- }
- /*********************************************************************************************
- 函數(shù)名:DHT11讀數(shù)據(jù)函數(shù)
- 調(diào) 用:? = DHT11_rec_byte();
- 參 數(shù):無
- 返回值:
- 結(jié) 果:讀DHT11數(shù)據(jù)并保存到dat
- 備 注:
- **********************************************************************************************/
- uchar DHT11_rec_byte() //接收一個字節(jié)
- {
- uchar i,dat=0;
- for(i=0;i<8;i++) //從高到低依次接收8位數(shù)據(jù)
- {
- while(!DATA); ////等待50us低電平過去
- Delay30us();
- Delay30us(); //延時60us,如果還為高則數(shù)據(jù)為1,否則為0
- dat<<=1; //左移位使正確接收8位數(shù)據(jù),數(shù)據(jù)為0時直接移位
- if(DATA==1) //數(shù)據(jù)為1時,使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(); //拉高后延時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(); //接收校正位
- // Delay30us(); //結(jié)束
- 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);
- }
- }
復(fù)制代碼
這是我測試時用的代碼,我實(shí)在找不出和我寫的有啥區(qū)別,可是我的程序就是讀不出數(shù)據(jù),dat_r是個全局變量
|
|