zhhxpk 发表于 2011-4-30 11:07:13

基于合泰单片机的DHT11的遇到的一些问题

最近用合泰单片机做一个DHT11的湿度计,我用示波器看了波形.时序好像也没什么问题,可是就是出不来数.大神们帮帮看看
PC0读数.pb显示.pa位选数码管
#include <HT46RU232.h>

typedef unsigned char U8;
#pragma vector SEND@ 0x08

int U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;

int U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
const unsigned char Tab1={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
const unsigned char Tab={0x01,0x02,0x04,0x08};

int U8comdata,U8FLAG,U8temp;
unsigned char temp;
unsigned char temp_cnt;
unsigned char std_RH;
unsigned char scrFLG;
char seter;
char outer;
void Init_time(void)//定时器初始化函数
{
        _emi=1;   //总中断允许
   
        _et0i=1;   // 定时器中断允许
        _t0m0=0;        //设为定时模式,内部时钟 8M
        _t0m1=1;
      _tmr0h=0xf0;       
      _tmr0l=0xff;
      _t0on=1;
        ;//启动定时器
}


voidCOM(void)
      {
         
                int i;
       for(i=0;i<8;i++)          
          {
               
                     U8FLAG=2;
                   while((!_pc0)&&U8FLAG++);
            _delay(35);
                          U8temp=0;
             if(_pc0)U8temp=1;
                  U8FLAG=2;
               while((_pc0)&&U8FLAG++);
                   //超时则跳出for循环                  
                  if(U8FLAG==1)break;
                   //判断数据位是0还是1       
                     
                // 如果高电平高过预定0高电平值则数据位为 1
                  
                   U8comdata<<=1;
                      U8comdata|=U8temp;
   
             }
          
        }


void read ()

{      
      int c=0;
      _emi=0;
                 
      _pcc=0x00;
       _pc0=0;
      _delay(20000);                   //主机拉低500us
       _pc0=1;
       _delay(40);
          _pcc=0xff;            //主机设为输入(电平由上拉电阻拉高) 在20~40us后判断从机响应信号
          
    while((_pc0==1)&&(c++<100));          //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
       if(!_pc0)       
           {
           U8FLAG=2;
       
           while((!_pc0)&&U8FLAG++);//判断从机是否发出 80us 的低电平响应信号是否结束       
           U8FLAG=2;
       
           while((_pc0)&&U8FLAG++); //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
                _pcc=1;
           COM();                   //数据接收状态       
           U8RH_data_H_temp=U8comdata;
           COM();
           U8RH_data_L_temp=U8comdata;
           COM();
           U8T_data_H_temp=U8comdata;
           COM();
           U8T_data_L_temp=U8comdata;
           COM();
           U8checkdata_temp=U8comdata;
      

          //数据校验
           U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
           if(U8temp==U8checkdata_temp)
          if(1)
           {
                     U8RH_data_H=U8RH_data_H_temp;
                     U8RH_data_L=U8RH_data_L_temp;
                     U8T_data_H=U8T_data_H_temp;
                     U8T_data_L=U8T_data_L_temp;
                     U8checkdata=U8checkdata_temp;                              
           }
           }
      
      
       _emi=1;
        }
       
       
       
       
        void SEND ()
{
       
      
    _tmr0h=0xf0;       
    _tmr0l=0xff;
      temp=U8RH_data_H/10;      //???可以这样赋值吗?u8哪个数是二进制的..
      temp=U8RH_data_H%10;
      temp=U8T_data_H/10;
      temp=U8T_data_H%10;
       if (scrFLG==1)
      {
        _pb=Tab1];
        _pa=Tab;
        temp_cnt=temp_cnt+1;
        if (temp_cnt==4)
                temp_cnt=0;
         
        }
}
       
void main()
{   _pac=0;//I/O输出
    _pbc=0;//I/O输出
    Init_time ();
   
    _pcc=0;
    _delay(50000);
    _delay(50000);
    _delay(50000);
    _delay(50000);
    _delay(50000);
    while (1)
    {
      read ();
       _delay(50000);
      _delay(50000); _delay(50000); _delay(50000);
      
        }
}
页: [1]
查看完整版本: 基于合泰单片机的DHT11的遇到的一些问题