DHT11温湿度通过串口显示

#include <REGX52.H>
#include "intrins.h"
sfr AUXR = 0x8E;
sbit DHT = P3^3;
char dates[5];                    //8位为一个数据 8+8+8+8+8
void Delay30ms(void)    //@11.0592MHz
{
    unsigned char data i, j;

    i = 54;
    j = 199;
    do
    {
        while (--j);
    } while (--i);
}
void Delay40us(void)    //@11.0592MHz
{
    unsigned char data i;

    _nop_();
    i = 15;
    while (--i);
}
void Delay60us(void)    //@11.0592MHz
{
    unsigned char data i;

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

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

    _nop_();
    i = 8;
    j = 1;
    k = 243;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

void Uart1_Init()                        //串口初始化
{    AUXR = 0x01;                    //让波特率更加稳定,防止掉帧
    SCON = 0x50;                    //配置串口工作模式,REN为1则接收数据
    TMOD &= 0x0F;
    TMOD |= 0x20;                    //配置定时器为8位自动重装模式
    TL1 = 0xFD;
    TH1 = 0xFD;                        //8位自动重装模式TH1存放的值自动存入TL1
    TR1 = 1;                            //启动定时器
}
void senddate(char date)                //串口发出一个个数据函数
{
    SBUF = date;
    while(!TI);                                //直到等于1时发送成功,TI为0时变1发送成功;为1变0时不循环
        TI = 0;                                    //无时差                                            
}
void sendstring(char* str)           //传入字符串
{
    while(*str != '\0')
    {
        senddate(*str);                    //将字符串打印出来
        str++;                                    //地址偏移
    }
    
}串口部分

void check_DHT_start()                       //DHT信号
{
    DHT = 1;
    DHT = 0;
    Delay30ms();
    DHT = 1;
    Delay60us();
    while(DHT);                                    //DHT拉低时才会往下走
    while(!DHT);
    while(DHT);                                    //到f点了
    
}


void Read_date_form()
{    
    char flag;                                    //标志位
    char tmp;                                        //数据  40bit 8位 需要5次
    int i,j;
        check_DHT_start();                    //送出数据前发出信号
    while(!DHT);                            //卡g点
            DHT = 1;                                        //拉高
            Delay40us();                                
        for(i=0;i<5;i++)
    {
            for(j=0;j<8;j++)
        {
            if(DHT == 1)
            {
                flag = 1;
                while(DHT);                            //如果是1先卡一会
            }else{
                flag = 0;
            }tmp = tmp << 1;                    //8个bit为一个数据,每次左移更新数据
            tmp |= flag;                            //有1则1
        }dates[i] = tmp;                        //8+8+8+8+8
    }
}

DHT11读数据


void main()
{
    LED1 = 1;
    Uart1_Init();
    Delay1000ms();
    Delay1000ms();                                                            //上电先抖至少1s
    while(1)
    {    Delay1000ms();
        Read_date_form();                                                    //一下40bit
        sendstring("H:");                                                //目的将来自DHT传感器dates显示在串口
        senddate(dates[0]/10+0x30);                                //字符与ASCll相差30
        senddate(dates[0]%10+0x30);                                //列如43
        senddate('.');
        senddate(dates[1]/10+0x30);
        senddate(dates[1]%10+0x30);
        sendstring("\r\n");
        sendstring("T:");
        senddate(dates[2]/10+0x30);
        senddate(dates[2]%10+0x30);    
        senddate('.');
        senddate(dates[3]/10+0x30);
        senddate(dates[3]%10+0x30);                    //手册湿度整数+小数,温度整数+小数,效验和
        sendstring("\r\n");        
    }
}

附图:

DHT11时序图


 

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值