找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2532|回复: 1
收起左侧

stc12c5a60s2单片机简单实现DHT11源程序

[复制链接]
ID:698703 发表于 2020-2-29 13:58 | 显示全部楼层 |阅读模式
网络上有很多实现DHT11的程序,单大多都是89c52的。而有关stc12c5a60s2的很少。
本人是新手一枚,在写关于stc12串口接收dht11数据时,发现接收到的都是0。
这是为什么呢?在网上查了一堆资料后,明白是时序的原因。
stc12系列的处理速度比89c52的速度快,且我们写的延时函数所延时的时间与参数不成正比。需要示波器。

硬件:芯片:stc12c5a60s2
          晶振:110592mhz

部分代码:
main.c中:
    DHT11数据读取  串口发送 波特率9600  STC12C5A60S2
/**************************************************/
#include <reg51.h>
#include "UART.H"
#include  "DELAY.H"
#include  "stdio.h"
#include  <INTRINS.H>  
//-------相关参数定义区-----------

sbit TRH = P2^0;//温湿度传感器DHT11数据接入
//char str1[]={"   "};
//char str2[]={"   "};
int TH_temp,TL_temp,RH_temp,RL_temp,CK_temp,respond,com_data,temp;


//-------声明函数区--------------
void delay(unsigned int i);
void delay_ms(unsigned int i);
void Delay10u();
void Delay18ms();                //@11.0592MHz
char DHT11_rec_byte();
void DHT11_receive();


//-------主函数区----------
void main(void)
{
        Uart1Init();    //初始化串口9600
        DHT11_receive();   //温湿度读取
        delay(100);   

        while(1)
        {               
//                     DHT11_receive();   //温湿度读取        
//                                delay_ms(120);
//                                delay_ms(120);
                                 DHT11_receive();
//                                delay_ms(1000);
//                                delay_ms(120);

                printf("wendu:%d\n",(int)TH_temp);
                printf("shidu:%d\n",(int)RH_temp);
                        
                 delay(800);   
        }
}
//-------dht11函数区---------
char DHT11_rec_byte()
{   
          char i;
          com_data=0;
          for(i=0;i<=7;i++)   
         {
                    respond=2;
                    while((!TRH)&&respond++);
            Delay10u();
                                                     Delay10u();
                                                     Delay10u();
                    if(TRH)
                    {
                              temp=1;
                              respond=2;
                              while((TRH)&&respond++);
                    }
                    else
                              temp=0;
                    com_data<<=1;
                    com_data|=temp;   
          }
          return(com_data);  
}

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

        }                                                                        
}


delay.c中:
#include  <INTRINS.H>  
//---------延时函数区----------
void delay(unsigned int i)
{
        while(i--);
}
void delay_ms(unsigned int i)
{
        while(i--)
                delay(90);
}

//---------DHT11函数区----------
void Delay10u()
{
        unsigned char i;
        _nop_();
        _nop_();
        _nop_();               
        i = 24;
        while (--i);
}

void Delay18ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        _nop_();
        _nop_();
        i = 1;
        j = 194;
        k = 159;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}



//实测可以运行,并接收到温湿度整数部分。
//本人新手,写的不好请轻喷
OP~C7}6R[)$(TDZTDA`BNRE.png

DHT11模块化.zip

36.26 KB, 下载次数: 139, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:315244 发表于 2020-8-8 20:14 | 显示全部楼层
太感谢了,我搞了一天怎么搞也没有数据。用了此程序数据来了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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