89 C 51チップマシンDHT 11データを読み出し、デジタルチューブで表示する

2394 ワード

先日arduinoがdht 11を読み取る文章「arduinoがDHT 11の温度、湿度データを読み取りシリアル表示する」を出しましたが、DHT 11の通信プロトコルについて説明しましたので、ここでは省略して、プログラムを貼りましょう.使用可能なものをテストしました.
結晶振動11.0592 Mhz.
   
#include "reg52.h"
unsigned char num[10]={0xde,0x82,0xec,0xe6,0xb2,0x76,0x7e,0xc2,0xfe,0xf6};//     
unsigned char a[5]={0,0,0,0,0};//    、       ,   0
unsigned char i,j,t;//for     
sbit out=P0^4;//DHT11   io  
void delay(unsigned char x)// 1 ms     
{
    unsigned char i,j;
    for(i=0;i
        for(j=0;j< 110;j++);
}


void display(unsigned char a,unsigned char c) //       
{
    unsigned char i,b,d;
    b=a%10;//      
    a=a/10;//     
    d=c%10;//    
    c=c/10;//     
    for(i=0;i< 200;i++)
            {
            P2=num[a];//    
            P0=0xfe;//        
            delay(3);//  
            P2=num[b];//    
            P0=0xfd;//        
            delay(3);//  
            P2=num[c];//。。。。    
            P0=0xfb;
            delay(3);
            P2=num[d];
            P0=0xf7;
            delay(3);
            }
}

void begin()//DHT11    
{
  out=1;
  out=0;//     
  delay(32);  //    28ms
    out=1;//  
}

void read1()//   、      
{
    for(t=0;t< 3;t++);//    30us
    if(out==0)//  DHT11    
    {
        while(out==0);//  80us      
        for(t=0;t< 2;t++);//    us
        while(out==1);//  80us      
        for(i=0;i< 5;i++)//  、    、             
        {
            for(j=0;j< 8;j++)//8     
            {  
                                while(out==0);//  50us      
                                a[i]=a[i]<<1;//    1 
                                for(t=0;t< 4;t++);//    30us  70us   ,              
                                if(out==1)//           
                {
                    a[i]=a[i]|0x01;//     1
                                        while(out==1);//            
                                }
                        }
                }
    }
    else    //  DHT11   ,     0
    {
        for(i=0;i< 5;i++)  
        {
         a[i]=0; 
        }
     }
        if(a[0]+a[2]!=a[4])//       ,      8888(          0,           )
        {
            for(i=0;i< 5;i++)  
        {
         a[i]=88; 
        }
        }
}

void main()//   
{
    while(1)
    {
        begin();
        read1();
        out=1;
        display(a[2],a[0]);//          0,           
    }
}