amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 2319|回复: 7

STC12C5A60S2驱动DHT11问题

[复制链接]
发表于 2014-1-6 21:23:46 | 显示全部楼层 |阅读模式
最近用DHT11做了一个温湿度计,但是湿度显示没有问题,温度却不正常,下面是程序,大家帮手看看

#include "STC12C5A60S2.H"
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit io=P3^6;//DHT11数据端
uchar data_byte,count;
uchar RH,RL,TH,TL;
uchar table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
              0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//

/*1m延时函数*/
void delay(uint z)
{
        unsigned char i, j;
        _nop_();
        _nop_();
        i = 12;
        j = 168;
        do
        {
                while (--j);
        }
        while (--i);
}

/*10us延时函数*/
void delay1(   )//延时10us
{
        unsigned char i;
        i = 21;
        while (--i);
}
/*初始化*/
void init( )
        {
                TMOD=1;//(0x01)//定时器0模式1
                TH0=0X3C;        //65536-50000=15536(十进制)=3CB0(十六进制)
                TL0=0XB0;       //50毫秒
                ET0=1;                         //开定时器0中断
                TR0=1;                         //启动定时器0
                EA=1;             //开总中断            
        }

void start(  )//开始信号
        {
            //delay(1000);
                io=1;
                delay1();
                delay1(); //10US
                io=0;
                delay(20);//>18ms
                io=1;
                delay1();//20-40us
                delay1();
                delay1();
                delay1();
                delay1();
        }
uchar receive_byte()
{
        uchar i,temp,count;
        for(i=0;i<8;i++)
        {
                count=2;
                while((!io)&&count++)//等待50us低电平结束
                temp=0;
                delay1();
                delay1();
                delay1();
                delay1();
                delay1();// 40us
                if(io==1)temp=1;
                count=2;
                while((io)&&count++);//等待50us低电平结束
                if(count==1)break;
                data_byte<<=1;       
                data_byte|=temp;
        }
        return data_byte;
}

void receive()
{
        uchar T_H,T_L,R_H,R_L,check,num_check;
        uchar count;
        start();//开始信号
        io=1;
        if(!io)//读取DHT11响应信号
        {
        count=2;
        while((!io)&&count++);//DHT11高电平80us是否结束
        count=2;
        while((io)&&count++);
        //R_H=receive_byte();
        //R_L=receive_byte();
        T_H=receive_byte();
        T_L=receive_byte();
        R_H=receive_byte();
        R_L=receive_byte();
        check=receive_byte();
        io=0;//拉低延时50us
        delay1();
        delay1();
        delay1();
        delay1();
        delay1();
        delay1();
        io=1;
        num_check=R_H+R_L+T_H+T_L;
        if(num_check=check)
                {
                        //RH=R_H;
                        //RL=R_L;
                        TH=T_H;
                        TL=T_L;
                        RH=R_H;
                        RL=R_L;
                        check=num_check;
                }
        }
}

void main()
{   
    //delay(500);
    init( );
        while(1)
        {
                receive(  );
           if(count>=0&&count<=20)
                {
                P0=table[TH/10];//十位分离
                P2=0xfe;
                delay(500);
                P2=0xff;
       
                P0=table[TH%10];//十位分离
                P2=0xfd;
            delay(500);
                P2=0xff;
               
                P0=0x39;//显示“C”
                P2=0xfb;
            delay(500);//时间稍短//5
            P2=0xff; //很关键的一步
                }
                 if(count>20&&count<=40)
                {
                P0=0X76;//H
                P2=0xfd;
                delay(500); //5
                P2=0xff;
               
                P0=table[RH/10];//十位分离
                P2=0xfb;
                delay(500);
                P2=0xff;
               
                P0=table[RH%10];//十位分离
                P2=0xf7;
                delay(500);
                P2=0xff; //很关键的一步
                }
        }
         //delay(500);
}

void timer0(  ) interrupt 1  //定时器0(中断1)
{
    TH0=0X3C;
        TL0=0XB0;       //重装定时器初值//
        count++ ;
        if(count==40)            
          {
                  count=0;               
          }       
}
发表于 2014-1-6 21:31:15 | 显示全部楼层
我的程序(也是网上找了一个改了一下):
DHT11.C
#include <reg52.h>
#include <HX711.h>

unsigned long HX711_read_count(void)
{
        unsigned long count;
        unsigned char i;
        ADDO = 1;
        ADSK = 0;
        count = 0;
       
        while(ADDO);
       
       for(i=0;i<24;i++)
        {
                ADSK=1;
                count=count<<1;
                ADSK=0;
                  if(ADDO)count++;
        }
        ADSK=1;

        ADSK=0;         
        if((count & 0x800000) == 0x800000)
        {
                count = ~(count - 1);
        }                  
        return(count);
}

//------------------------------------------------------------------------------------------------------------------------------------
DHT11.H
#ifndef  __HX711_H__
#define  __HX711_H__


sbit ADDO=P3^6;   
sbit ADSK=P3^7;   
  

extern unsigned long HX711_read_count(void);

#endif
发表于 2014-1-6 21:31:57 | 显示全部楼层
eva015401 发表于 2014-1-6 21:31
我的程序(也是网上找了一个改了一下):
DHT11.C
#include

我这个是可以用的   芯片STC12C5A,晶振12M
 楼主| 发表于 2014-1-6 23:57:10 | 显示全部楼层
sbit ADDO=P3^6;   
sbit ADSK=P3^7;   
为什么有两个IO口
发表于 2014-1-7 19:29:05 | 显示全部楼层
传错了


main.c里的使用

        if(key_hum == 0)//显示温湿度,按一次显示温湿度
        {
                _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
                if(key_hum == 0)
                {
                        while(1)
                        {
                                temp_num = DHT11_Hum();
                                LCD12864_Putchar(3,4,temp_num/10%10,temp_num%10);
                                temp_num = DHT11_Tem();
                                LCD12864_Putchar(3,3,(temp_num/10)%10,temp_num%10);       
                                Delay100ms();Delay100ms();Delay100ms();Delay100ms();Delay100ms();
                                if(key_hum == 0)
                                {break;}
                        }
                        Show_main();
                        Show_unit(flag_Unit_of_weight);
                        Show_a_price(Unit_price_conversion());
                        Delay100ms();Delay100ms();Delay100ms();Delay100ms();Delay100ms();Delay100ms();
                }
        }



#include "DHT11.h"
/**********************************************/
/*             变  量  定  义                 */
/**********************************************/
uchar RH,RL,TH,TL;
uchar data_byte;
uchar Tem_Z,Tem_X,Hum_Z,Hum_X,Check;


void delays19ms()//@12.000MHz               
{
        unsigned char i, j, k;

        i = 1;
        j = 222;
        k = 197;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}


//延时ius
void delay10us()
{
        unsigned char i;

        i = 27;
        while (--i);
}

/********主机发出开始信号*******/
void DHT11_Start()  
{
  DHT=1;
  delay10us();
  DHT=0;
  delays19ms();               //保持电平时间大于18ms,延时20ms
  DHT=1;
  delay10us();            //延迟等待20-40us,延时20us
  delay10us();
  delay10us();
  delay10us();
  DHT=1;                  //拉高等待DHT11响应

}
//DHT11接收一个字节数据
uchar receive_data()
{
  uchar i,temp,count;
  data_byte=0;
  for(i=0;i<8;i++)
   {
   count=2;
   while((!DHT)&&count++);           //等待50us低电平结束
   delay10us();                      //等待40us高电平,后判断电平高低,高:DHT为1,低:DHT为0
   delay10us();
   delay10us();  
   delay10us();
   temp=0;
   if(DHT==1)    temp=1;             //DHT为高:1,位为1
   count=2;
   while((DHT)&&count++);            //等待DHT高电平结束     
   if(count==1)      break;          //DHT为低:0,位为0
   data_byte<<=1;                    //字节左移
   data_byte|=temp;
   }
  return data_byte;                  //返回读取值
}

//DHT11接收数据
void Rec_DHT()//声明Rec_DHT,DHT11接收数据函数
{
       
        uchar flag;
        uchar T_H,T_L,H_H,H_L,check,num_check;   //定义采集参数中间变量
  DHT11_Start();                          //主机发出开始信号
if(!DHT)                                 //等待从机响应信号输出低电平
  {
  flag = 2;
  while((!DHT) && flag++);    //判断从机是否发出 80us 的低电平响应信号是否结束
  flag = 2;
  while(DHT && flag++);       //判断从机是否发出 80us 的高电平,若发出则开始采集数据
  H_H=receive_data();         //采集湿度整数部分
  H_L=receive_data();         //采集湿度小数部分
  T_H=receive_data();         //采集温度整数部分
  T_L=receive_data();         //采集温度小数部分
  check=receive_data();       //采集校验位
  DHT = 1;
  num_check=H_H+H_L+T_H+T_L;
  if(num_check=check)         //进行校核
   {
                        Hum_Z = H_H;
                        Hum_X = H_L;                  
                        Tem_Z = T_H;
                        Tem_X = T_L;                 
   }
}



}

unsigned char DHT11_Hum()//返回湿度整数
{
        unsigned char Get_back_num;
        Rec_DHT();
  Get_back_num = Hum_Z ;
        return Get_back_num;
}

unsigned char DHT11_Tem()//返回温度整数
{
        unsigned char Get_back_num;
        Rec_DHT();
  Get_back_num = Tem_Z ;
        return Get_back_num;
}







#ifndef _DHT11_h_
#define _DHT11_h
#include <reg52.h>
//#include<intrins.h>


/**********************************************/
/*             引  脚  定  义                 */
/**********************************************/
sbit   DHT = P2^6;   //管脚定义,DHT11总线输入输出;

/**********************************************/
/*               宏  定  义                   */
/**********************************************/
#define uint unsigned int
#define uchar unsigned char

/**********************************************/
/*             函  数  声  明                 */
/**********************************************/

extern unsigned char DHT11_Tem();//返回温度
extern unsigned char DHT11_Hum();//返回湿度



void DHT11_Start() ;/********主机发出开始信号*******/
uchar receive_data();//DHT11接收一个字节数据
extern void Rec_DHT();   //DHT11接收数据
void delays19ms();//STC12@12.000MHz               
void delay10us();//STC12@12.000MHz       






#endif
发表于 2014-3-12 20:52:54 | 显示全部楼层

移植成功了哈哈哈哈哈
发表于 2015-1-23 00:11:00 | 显示全部楼层
MARKMARKMARK
发表于 2015-2-5 22:30:28 | 显示全部楼层
我有几个DHT11,以后试一下.
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2019-6-19 14:15

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表