找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2913|回复: 3
打印 上一主题 下一主题
收起左侧

DHT11为什么仿真出不来,一直卡在接收一个字节数据的那部分,一直没搞清原因啊

[复制链接]
跳转到指定楼层
楼主
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char

uchar code seg[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38};

sbit date=P3^7;
sbit lcd_rs=P1^0;
sbit lcd_rw=P1^1;
sbit lcd_en=P1^2;
sbit led=P1^4;

uchar RH,RL,TH,TL,check;

void delayms(uint m)                //@12.000MHz
{
        unsigned char i, j;
while(m--)
{
        i = 2;
        j = 239;
        do
        {
                while (--j);
        } while (--i);
}
}

void delayus(uint n)                //@12.000MHz
{
        while(n--)
                _nop_();
       
}

void write_com(uint com)//lcd1602写命令函数
{
        lcd_rs=0;
        P2=com;
        delayms(2);
        lcd_en=1;
        delayms(2);
        lcd_en=0;
}

void write_date(uint date)//lcd1602写数据函数
{

        lcd_rs=1;
        P2=date;
        delayms(2);
        lcd_en=1;
        delayms(2);
        lcd_en=0;

}
void init()//lcd1602初始化,设置显示方式
{

        lcd_rw=0;
        lcd_en=0;
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);


}
uchar recive_byte(void)//一个字节接受函数
{
       
        uchar i,dat;
        dat=0;
        for(i=0;i<8;i++)
                {
                        //while(date);//等待DHT11拉低.输出的数据总是从低电平开始的
                        while(date==0);//等待DHT11拉高
                        delayus(40);
                        dat=dat<<1;
                        if(date==1)
                        {       
                                dat=dat+1;
                        }
                        while(date);//等待高电平结束
                        led=0;
                }
                //led=0;
                return dat;        //将接受到的数据返回       
       
}

void read_DHT11()
{
       
        delayms(5000);//调试用,将此函数放入主循环,实现5S执行一次
       
        //发送起始信号
        date= 0;
        delayms(20);
        date= 1;
        while(date);//这里是等待DHT11将总线拉低
        while(date==0);//等待DHT11拉高总线
        while(date);//等待数据拉低,然后可以接受数据
        //开始接收数据
        RH= recive_byte();
        RL= recive_byte();
        TH= recive_byte();
        TL= recive_byte();
        check= recive_byte();
        //接收 DHT11 输出的结束信号
        delayus(54);//延迟后,总线会是高电平。实际上这个高电平是由DHT11输出的
}

void main()
{
        init();
        //delayms(1000)        ;//开机等待1秒
        while(1)
{
        read_DHT11();
        write_com(0x80);       
        write_date('T');
        write_date('E');
        write_date('M');
        write_date('P');
        write_com(0x80+0x05);
        write_date(seg[RH/10]);
        write_date(seg[RH%10]);
        write_date('.');
        write_date(seg[RL%10]);
}
       
}

捕获.PNG (87.43 KB, 下载次数: 12)

捕获.PNG
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:303240 发表于 2018-12-24 23:56 | 只看该作者
不用的代码已经被我注释掉了
回复

使用道具 举报

板凳
ID:164602 发表于 2018-12-25 08:28 | 只看该作者
卖苹果的乔布斯 发表于 2018-12-24 23:56
不用的代码已经被我注释掉了

好像程序有问题,没细看,给一个我一直用到的程序你试试。
单片机STC89C52RC ,晶振12M,P2.0口为通讯口连接DHT11

        //----温度高8位== U8T_data_H------
        //----温度低8位== U8T_data_L------
        //----湿度高8位== U8RH_data_H-----
        //----湿度低8位== U8RH_data_L-----
        //----校验 8位 == U8checkdata-----


unsigned char  U8FLAG;
unsigned char  U8temp;
unsigned char  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
unsigned char  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
unsigned char  U8comdata;

void Delay(unsigned int j)//延时888.1725us
{
        unsigned char i;
        for(;j>0;j--)
        {        
                for(i=0;i<27;i++);
        }
}

void delay(void)//延时35.5us
{               
        unsigned char i=10;
        while(i--);
}

void  Delay_10us(void)
{
        unsigned char i;
        i--;
        i--;
        i--;
        i--;
        i--;
        i--;
}

void COM (void)//读数据
{
        unsigned char i;
        for(i=0;i<8;i++)          
        {
                U8FLAG=2;       
                while((!P2_0)&&U8FLAG++);
                Delay_10us();
                Delay_10us();                               
                Delay_10us();
                U8temp=0;
                if(P2_0)U8temp=1;
                U8FLAG=2;
                while((P2_0)&&U8FLAG++);
                if(U8FLAG==1)break;
                U8comdata<<=1;
                U8comdata|=U8temp;        //0
        }//rof
}

void RH (void)
{       
        P2_0=0;
        Delay(180);
        P2_0=1;
        Delay_10us();
        Delay_10us();
        Delay_10us();
        Delay_10us();            
        P2_0=1;
        if(!P2_0)                 //T !          
        {
                U8FLAG=2;
                while((!P2_0)&&U8FLAG++);
                U8FLAG=2;
                while((P2_0)&&U8FLAG++);
                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;
                P2_0=1;
                U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
                if(U8temp==U8checkdata_temp)
                {
                        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;
                }//fi
        }//fi
}
回复

使用道具 举报

地板
ID:303240 发表于 2018-12-25 12:09 来自手机 | 只看该作者
HC6800-ES-V2.0 发表于 2018-12-25 08:28
好像程序有问题,没细看,给一个我一直用到的程序你试试。
单片机STC89C52RC ,晶振12M,P2.0口为通讯口 ...

能帮我看下我的是哪里出问题吗

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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