找回密码
 立即注册

QQ登录

只需一步,快速开始

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

自己写的dht11在51开发板上可以用,但是在51单片机最小系统用不了,求解

[复制链接]
跳转到指定楼层
楼主
ID:635913 发表于 2020-10-5 21:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<intrins.h>
#include<string.h>
#include<stdio.h>
#define _Nop() _nop_()

typedef unsigned char unint8;
typedef unsigned char unint16;

sbit TRH=P3^7;
unsigned char  str1[]={"  /RH"};
unsigned char  str2[]={"  'C"};
extern unsigned char wddata,sddata;


unint8 TH_data,TL_data,RH_data,RL_data,CK_data;
unint8 TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
unint8 com_data,untemp,temp;
unint8 respond;

/*********************************************************************************/

/*********************************************************************************/

/*********************************************************************************/
// 毫秒级延时子程序
/*********************************************************************************/
void delay_ms1(unsigned char ms)
{      
          unsigned char i;
          while(ms--)
          {
                    for(i = 0; i< 150; i++)
                    {
                              _nop_();
                              _nop_();
                              _nop_();
                              _nop_();
                    }
          }
}
/*********************************************************************************/
/*********************************************************************************/
//5us级延时程序
/*********************************************************************************/
void delay_us_dht11()
{
           unint8 i;
          i--;
          i--;
          i--;
          i--;
          i--;
          i--;
}
/****************************************************************************/
//收发信号检测,数据读取
/****************************************************************************/
char receive()
{   
          unint8 i;
          com_data=0;
          for(i=0;i<=7;i++)   
         {
                    respond=2;
                    while((!TRH)&&respond++);
                    delay_us_dht11();
                    delay_us_dht11();
                    delay_us_dht11();
                    if(TRH)
                    {
                              temp=1;
                              respond=2;
                              while((TRH)&&respond++);
                    }
                    else
                              temp=0;
                    com_data<<=1;
                    com_data|=temp;   
          }
          return(com_data);  
}
/****************************************************************************/

/****************************************************************************/
//湿度读取子程序
//温度高8位== TL_data
//温度低8位== TH_data
//湿度高8位== RH_data
//湿度低8位== RH_data
//校验 8位 == CK_data
//调用的程序有 delay();, Delay_5us();,RECEIVE();
/***************************************************************************/
void read_TRH()
{
          //主机拉低18ms
          TRH=0;
         delay_ms1(18);
         TRH=1;
          //DATA总线由上拉电阻拉高 主机延时20us
         delay_us_dht11();
         delay_us_dht11();
         delay_us_dht11();
         delay_us_dht11();
          //delay_us_dht11();
          //delay_us_dht11();delay_us_dht11();delay_us_dht11();delay_us();
          //主机设为输入 判断从机响应信号
             TRH=1;
          //判断DHT11是否有低电平响应信号 如不响应则跳出,响应则向下运行   
         if(!TRH)   
         {
                  respond=2;
                  //判断DHT11发出 80us 的低电平响应信号是否结束
                  while((!TRH)&& respond++);
                 respond=2;
                 //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
                while(TRH && respond++);
               //数据接收状态   
                RH_temp = receive();
                RL_temp = receive();
                TH_temp = receive();
                TL_temp = receive();
                CK_temp = receive();
                TRH=1;  
                 //数据校验
                 untemp=(RH_temp+RL_temp+TH_temp+TL_temp);
                 if(untemp==CK_temp)
                 {
                          RH_data = RH_temp;
                          RL_data = RL_temp;
                          TH_data = TH_temp;
                          TL_data = TL_temp;
                          CK_data = CK_temp;
                }
        }
         //湿度整数部分
         str1[0] = (char)(0X30+RH_data/10);
         str1[1] = (char)(0X30+RH_data%10);
         //温度整数部分
         str2[0] = (char)(0X30+TH_data/10);
         str2[1] = (char)(0X30+TH_data%10);

                 sddata=RH_data;
                 wddata=TH_data;
}

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

使用道具 举报

沙发
ID:822755 发表于 2020-10-6 10:36 | 只看该作者
不同的板,运行的速度可能不一样, 需要调整延时函数
回复

使用道具 举报

板凳
ID:826203 发表于 2020-10-6 11:26 | 只看该作者
单总线协议靠的是精准延时,估计是时钟方面的问题,仔细看下延时的底层原环境和新环境有没有变化
回复

使用道具 举报

地板
ID:451718 发表于 2020-10-6 16:19 | 只看该作者
主函数上设置一个脚位电平变化,定时器里面设置一个脚位电平变化,分别测试一下,看看是单片机没有运行起来,还是程序本身有问题。   
sbit TEST=P4^1;

test_pin(unint16 val)
{
        const unint16 i = 0;
        if(i<val)
    {
        i++;      
    }
   else
    {
        i = 0;
        TEST = ~TEST;
    }
}
main
{
    test_pin(10);               //依次加大10这个数值,看看万用表有没有变化
}
回复

使用道具 举报

5#
ID:635913 发表于 2020-10-14 20:37 | 只看该作者
KongQuan 发表于 2020-10-6 10:36
不同的板,运行的速度可能不一样, 需要调整延时函数

嗯嗯嗯,调整了,可以显示了,谢谢
回复

使用道具 举报

6#
ID:635913 发表于 2020-10-14 20:37 | 只看该作者
sonicspeed 发表于 2020-10-6 11:26
单总线协议靠的是精准延时,估计是时钟方面的问题,仔细看下延时的底层原环境和新环境有没有变化

是延迟函数的问题,解决了,谢谢呀
回复

使用道具 举报

7#
ID:635913 发表于 2020-10-14 20:38 | 只看该作者
robinsonlin 发表于 2020-10-6 16:19
主函数上设置一个脚位电平变化,定时器里面设置一个脚位电平变化,分别测试一下,看看是单片机没有运行起来 ...

谢谢啦,解决了
回复

使用道具 举报

8#
ID:420836 发表于 2020-10-15 10:04 | 只看该作者
感谢您及时更新。 有帮助
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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