標(biāo)題: 自己寫(xiě)的dht11在51開(kāi)發(fā)板上可以用,但是在51單片機(jī)最小系統(tǒng)用不了,求解 [打印本頁(yè)]

作者: 未來(lái)可期鴨    時(shí)間: 2020-10-5 21:11
標(biāo)題: 自己寫(xiě)的dht11在51開(kāi)發(fā)板上可以用,但是在51單片機(jī)最小系統(tǒng)用不了,求解
#include<intrins.h>
#include<string.h>
#include<stdio.h>
#define _Nop() _nop_()

typedef unsigned char unint8;
typedef unsigned char unint16;

sbit TRH=P3^7;
unsigned char  str1[]={"  /RH"};
unsigned char  str2[]={"  'C"};
extern unsigned char wddata,sddata;


unint8 TH_data,TL_data,RH_data,RL_data,CK_data;
unint8 TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
unint8 com_data,untemp,temp;
unint8 respond;

/*********************************************************************************/

/*********************************************************************************/

/*********************************************************************************/
// 毫秒級(jí)延時(shí)子程序
/*********************************************************************************/
void delay_ms1(unsigned char ms)
{      
          unsigned char i;
          while(ms--)
          {
                    for(i = 0; i< 150; i++)
                    {
                              _nop_();
                              _nop_();
                              _nop_();
                              _nop_();
                    }
          }
}
/*********************************************************************************/
/*********************************************************************************/
//5us級(jí)延時(shí)程序
/*********************************************************************************/
void delay_us_dht11()
{
           unint8 i;
          i--;
          i--;
          i--;
          i--;
          i--;
          i--;
}
/****************************************************************************/
//收發(fā)信號(hào)檢測(cè),數(shù)據(jù)讀取
/****************************************************************************/
char receive()
{   
          unint8 i;
          com_data=0;
          for(i=0;i<=7;i++)   
         {
                    respond=2;
                    while((!TRH)&&respond++);
                    delay_us_dht11();
                    delay_us_dht11();
                    delay_us_dht11();
                    if(TRH)
                    {
                              temp=1;
                              respond=2;
                              while((TRH)&&respond++);
                    }
                    else
                              temp=0;
                    com_data<<=1;
                    com_data|=temp;   
          }
          return(com_data);  
}
/****************************************************************************/

/****************************************************************************/
//濕度讀取子程序
//溫度高8位== TL_data
//溫度低8位== TH_data
//濕度高8位== RH_data
//濕度低8位== RH_data
//校驗(yàn) 8位 == CK_data
//調(diào)用的程序有 delay();, Delay_5us();,RECEIVE();
/***************************************************************************/
void read_TRH()
{
          //主機(jī)拉低18ms
          TRH=0;
         delay_ms1(18);
         TRH=1;
          //DATA總線由上拉電阻拉高 主機(jī)延時(shí)20us
         delay_us_dht11();
         delay_us_dht11();
         delay_us_dht11();
         delay_us_dht11();
          //delay_us_dht11();
          //delay_us_dht11();delay_us_dht11();delay_us_dht11();delay_us();
          //主機(jī)設(shè)為輸入 判斷從機(jī)響應(yīng)信號(hào)
             TRH=1;
          //判斷DHT11是否有低電平響應(yīng)信號(hào) 如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行   
         if(!TRH)   
         {
                  respond=2;
                  //判斷DHT11發(fā)出 80us 的低電平響應(yīng)信號(hào)是否結(jié)束
                  while((!TRH)&& respond++);
                 respond=2;
                 //判斷從機(jī)是否發(fā)出 80us 的高電平,如發(fā)出則進(jìn)入數(shù)據(jù)接收狀態(tài)
                while(TRH && respond++);
               //數(shù)據(jù)接收狀態(tài)   
                RH_temp = receive();
                RL_temp = receive();
                TH_temp = receive();
                TL_temp = receive();
                CK_temp = receive();
                TRH=1;  
                 //數(shù)據(jù)校驗(yàn)
                 untemp=(RH_temp+RL_temp+TH_temp+TL_temp);
                 if(untemp==CK_temp)
                 {
                          RH_data = RH_temp;
                          RL_data = RL_temp;
                          TH_data = TH_temp;
                          TL_data = TL_temp;
                          CK_data = CK_temp;
                }
        }
         //濕度整數(shù)部分
         str1[0] = (char)(0X30+RH_data/10);
         str1[1] = (char)(0X30+RH_data%10);
         //溫度整數(shù)部分
         str2[0] = (char)(0X30+TH_data/10);
         str2[1] = (char)(0X30+TH_data%10);

                 sddata=RH_data;
                 wddata=TH_data;
}


作者: KongQuan    時(shí)間: 2020-10-6 10:36
不同的板,運(yùn)行的速度可能不一樣, 需要調(diào)整延時(shí)函數(shù)
作者: sonicspeed    時(shí)間: 2020-10-6 11:26
單總線協(xié)議靠的是精準(zhǔn)延時(shí),估計(jì)是時(shí)鐘方面的問(wèn)題,仔細(xì)看下延時(shí)的底層原環(huán)境和新環(huán)境有沒(méi)有變化
作者: robinsonlin    時(shí)間: 2020-10-6 16:19
主函數(shù)上設(shè)置一個(gè)腳位電平變化,定時(shí)器里面設(shè)置一個(gè)腳位電平變化,分別測(cè)試一下,看看是單片機(jī)沒(méi)有運(yùn)行起來(lái),還是程序本身有問(wèn)題。   
sbit TEST=P4^1;

test_pin(unint16 val)
{
        const unint16 i = 0;
        if(i<val)
    {
        i++;      
    }
   else
    {
        i = 0;
        TEST = ~TEST;
    }
}
main
{
    test_pin(10);               //依次加大10這個(gè)數(shù)值,看看萬(wàn)用表有沒(méi)有變化
}
作者: 未來(lái)可期鴨    時(shí)間: 2020-10-14 20:37
KongQuan 發(fā)表于 2020-10-6 10:36
不同的板,運(yùn)行的速度可能不一樣, 需要調(diào)整延時(shí)函數(shù)

嗯嗯嗯,調(diào)整了,可以顯示了,謝謝
作者: 未來(lái)可期鴨    時(shí)間: 2020-10-14 20:37
sonicspeed 發(fā)表于 2020-10-6 11:26
單總線協(xié)議靠的是精準(zhǔn)延時(shí),估計(jì)是時(shí)鐘方面的問(wèn)題,仔細(xì)看下延時(shí)的底層原環(huán)境和新環(huán)境有沒(méi)有變化

是延遲函數(shù)的問(wèn)題,解決了,謝謝呀
作者: 未來(lái)可期鴨    時(shí)間: 2020-10-14 20:38
robinsonlin 發(fā)表于 2020-10-6 16:19
主函數(shù)上設(shè)置一個(gè)腳位電平變化,定時(shí)器里面設(shè)置一個(gè)腳位電平變化,分別測(cè)試一下,看看是單片機(jī)沒(méi)有運(yùn)行起來(lái) ...

謝謝啦,解決了
作者: TTQ001    時(shí)間: 2020-10-15 10:04
感謝您及時(shí)更新。 有幫助




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1