初级会员 
  
	- 积分
 - 100
 
        - 金钱
 - 100 
 
       - 注册时间
 - 2019-8-28
 
      - 在线时间
 - 11 小时
 
 
 
 | 
 
1金钱 
问题描述:STC89C52RC单片机开机能读取DHT12数据,之后不能读取数据,请教是什么原因?请帮忙分析参考时序图。谢谢!IIC部分程序: 
void delay(uint z) 
{ 
        uint x,y; 
        for(x=z;x>0;x--) 
                for(y=25;y>0;y--); 
} 
void delay1() 
{ 
  _nop_(); 
        _nop_(); 
        _nop_(); 
        _nop_(); 
        _nop_(); 
        _nop_(); 
} 
void start() 
{ 
        sda=1; 
        delay1(); 
        scl=1; 
        delay1(); 
        sda=0; 
        delay1(); 
} 
void stop() 
{ 
        sda=0; 
        delay1(); 
        scl=1; 
        delay1(); 
        sda=1; 
        delay1(); 
} 
void respons() 
{ 
        char i; 
        scl=1; 
        delay1(); 
        while((sda==1)&&(i<250))i++; 
        scl=0; 
        delay1(); 
} 
void write_byte(uchar date) 
{ 
        uchar i,temp; 
        temp=date; 
        for(i=0;i<8;i++) 
        { 
                temp=temp<<1; 
                scl=0; 
          delay1(); 
                sda=CY; 
                delay1(); 
                scl=1; 
                delay1(); 
        } 
        scl=0; 
        delay1(); 
        sda=1; 
        delay1(); 
} 
uchar read_byte() 
{ 
        uchar i,k; 
        scl=0; 
        delay(5); 
        sda=1; 
        delay(5); 
        for(i=0;i<8;i++) 
        { 
                scl=1; 
                delay(5);         
                k=(k<<1)|sda; 
                scl=0; 
                delay(5);         
        } 
        sda=0; 
        return k; 
} 
 
uchar dht12read(uchar address) 
{ 
        uchar date; 
        start(); 
        write_byte(0xb8); 
        respons(); 
        write_byte(address); 
        respons(); 
        start(); 
        write_byte(0xb9); 
        respons(); 
        date=read_byte(); 
        stop(); 
        return date; 
} 
 
 
 
5字节读取函数: 
void read5byte() 
{ 
        uchar a; 
        dat[0]=dht12read(0x00); 
        dat[1]=dht12read(0x01); 
        dat[2]=dht12read(0x02); 
        dat[3]=dht12read(0x03); 
        dat[4]=dht12read(0x04); 
        a=dat[0]+dat[1]+dat[2]+dat[3]; 
        if(a==dat[4]) 
                { 
                        return; 
                } 
} 
 
 
 |   
 
 
 
- 
 
 
 
 
 
 
 
 |