51单片机--DHT11温湿度传感器实验代码

文章目录

实现细节

1.public

c 复制代码
#ifndef __PUBLIC_H__
#define __PUBLIC_H__
#include <REG51.H>
#include <INTRINS.H>

typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;

void Delay1ms();		//@11.0592MHz


#endif // !__PUBLIC_H__
#include "public.h"

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

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}

2.LCD1602

c 复制代码
#ifndef __LCD1602__H__
#define __LCD1602__H__
#include "public.h"

sbit LCD_E =P2^7;
sbit LCD_RW=P2^5;
sbit LCD_RS=P2^6;

#define LCD_DATA_PORT P0

void LCD_Init();
void LCD_Show_Char(u8 Line,u8 Column,u8 ch);
void LCD_Show_String(u8 Line,u8 Column,u8 *str);
void LCD_ShowNum(u8 Line,u8 Column,u16 num,u8 Length);
void LCD_Show_SigNum(u8 Line, u8 Column, int num, u8 Length);
void LCD_Show_HexNum(u8 Line, u8 Column, u8 num, u8 Length);
void LCD_Show_BinNum(u8 Line,u8 Column,u8 num,u8 Length);
void LCD_Show_FloatNum(u8 Line, u8 Column, float num, u8 Length);
void LCD_Write_CMD(u8 cmd);
void LCD_Write_Dat(u8 dat);

#endif // !__LCD1602__H__

#include "LCD1602.h"

// 写命令 ,因为这是使用了并行传输方式,所以我们不必分开传输数据,一次性就可以写入这个命令
void LCD_Write_CMD(u8 cmd)
{
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_E = 0;
    LCD_DATA_PORT = cmd;
    LCD_E = 1;
    Delay1ms();
    LCD_E = 0;
    Delay1ms();
}
// 写数据
void LCD_Write_Dat(u8 dat)
{
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_E = 0;
    LCD_DATA_PORT = dat;
    LCD_E = 1;
    Delay1ms();
    LCD_E = 0;
    Delay1ms();
}
void LCD_Init()
{
    LCD_Write_CMD(0x38);
    LCD_Write_CMD(0x0C);
    LCD_Write_CMD(0x06);
    LCD_Write_CMD(0x01);
}

void LCD_SetCursor(u8 Line, u8 Column)
{
    if (Line == 1)
    {
        LCD_Write_CMD(0x80 | (Column - 1));
    }
    else if (Line == 2)
    {
        LCD_Write_CMD(0x80 | (Column - 1) + 0x40);
    }
}

void LCD_Show_Char(u8 Line, u8 Column, u8 ch)
{
    LCD_SetCursor(Line, Column);
    LCD_Write_Dat(ch);
}

void LCD_Show_String(u8 Line, u8 Column, u8 *str)
{
    u8 i;

    LCD_SetCursor(Line, Column);

    for (i = 0; str[i] != '\0'; i++)
    {
        LCD_Show_Char(Line, Column + i, str[i]);
    }
}

int POW(int x, int y)
{
    u8 i;
    int res = 1;
    for (i = 0; i < y; i++)
    {
        res *= x;
    }
    return res;
}
void LCD_ShowNum(u8 Line, u8 Column, u16 num, u8 Length)
{

    u8 i;

    LCD_SetCursor(Line, Column);

    for (i = Length; i > 0; i--)
    {
        LCD_Write_Dat('0' + num / POW(10, i - 1) % 10);
    }
}

void LCD_Show_SigNum(u8 Line, u8 Column, int num, u8 Length)
{
    u16 temp_Num;
    u8 i;
    LCD_SetCursor(Line, Column);
    if (num >= 0)
    {
        LCD_Write_Dat('+');
        temp_Num = num;
    }
    else
    {
        LCD_Write_Dat('-');
        temp_Num = -num;
    }

    for (i = Length; i > 0; i--)
    {
        LCD_Write_Dat('0' + temp_Num / POW(10, i - 1) % 10);
    }
}
void LCD_Show_HexNum(u8 Line, u8 Column, u8 num, u8 Length)
{
    u8 i;
    u8 SigNum;
    LCD_SetCursor(Line, Column);
    for (i = Length; i > 0; i--)
    {
        SigNum=num / POW(16, i - 1) % 16;
        if(SigNum<10)
        {
             LCD_Write_Dat('0' +SigNum);
        }
        else
        {
            LCD_Write_Dat('A' +SigNum-10);
        }
    }
}

void LCD_Show_BinNum(u8 Line,u8 Column,u8 num,u8 Length)
{
    u8 i;
    LCD_SetCursor(Line, Column);
    for(i=Length;i>0;i--)
    {
        LCD_Write_Dat('0' + num / POW(2, i - 1) % 2);
    }
}

3.DHT11

c 复制代码
#ifndef __DHT11_H__
#define __DHT11_H__

#include "public.h"
#include "LCD1602.h"

void Delay(u16 j);
void Delay_10us(void);
void DHT11_Read_Byte(void);
void DHT11_Read_Data(void);


#endif //  __DHT11_H__

#include "DHT11.h"

sbit DHT11_DATA = P2 ^ 0;
u8 Flag;
u8 temp;
u8 H_Temp, L_Temp, H_Humi, L_Humi, Check_Sum;
u8 H_Temp_temp, L_Temp_temp, H_Humi_temp, L_Humi_temp, Check_Sum_temp;

u8 DATA;



void Delay(u16 j)
{
    u8 i;
    for (; j > 0; j--)
    {
        for (i = 0; i < 27; i++)
            ;
    }
}
void Delay_10us(void)
{
    u8 i;
    i--;
    i--;
    i--;
    i--;
    i--;
    i--;
}
void DHT11_Read_Byte(void)
{

    u8 i;
    u8 dat=0;

    for (i = 0; i < 8; i++)
    {

        Flag = 2;
        while ((!DHT11_DATA) && Flag++);
        Delay_10us();
        Delay_10us();
        Delay_10us();
        temp = 0;
        if (DHT11_DATA)
            temp = 1;
        Flag = 2;
        while ((DHT11_DATA) && Flag++);
        // 超时则跳出for循环
        if (Flag == 1)
            break;
        // 判断数据位是0还是1
        // 如果高电平高过预定0高电平值则数据位为 1

        dat <<= 1;
        dat |= temp; // 0
    }
    DATA = dat;
}

void DHT11_Read_Data(void)
{
    // 主机拉低18ms
    DHT11_DATA = 0;
    Delay(180);
    DHT11_DATA = 1;
    // 总线由上拉电阻拉高 主机延时20us
    Delay_10us();
    Delay_10us();
    Delay_10us();
    Delay_10us();
    // 主机设为输入 判断从机响应信号
    DHT11_DATA = 1;
    // 判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
    if (!DHT11_DATA)// 判断从机是否响应
    {
        Flag = 2;
        // 判断从机是否发出 80us 的低电平响应信号是否结束
        while ((!DHT11_DATA) && Flag++);
        Flag = 2;
        // 判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
        while ((DHT11_DATA) && Flag++);
        // 数据接收状态
        DHT11_Read_Byte();
        H_Humi_temp = DATA;
        DHT11_Read_Byte();
        L_Humi_temp = DATA;
        DHT11_Read_Byte();
        H_Temp_temp = DATA;
        DHT11_Read_Byte();
        L_Temp_temp = DATA;
        DHT11_Read_Byte();
        Check_Sum_temp = DATA;
        DHT11_DATA = 1;
        // 数据校验

        temp = (H_Temp_temp + L_Temp_temp + H_Humi_temp + L_Humi_temp);
        if (temp == Check_Sum_temp)
        {
            H_Humi = H_Humi_temp;
            L_Humi = L_Humi_temp;
            H_Temp = H_Temp_temp;
            L_Temp = L_Temp_temp;
            Check_Sum = Check_Sum_temp;
        }
    }
    LCD_Show_String(1, 1, "Humi:");
    LCD_ShowNum(1, 7, H_Humi, 2);
    LCD_Write_Dat(0x25);

    LCD_Show_String(2, 1, "Temp:");
    LCD_ShowNum(2, 7, H_Temp, 2);
    LCD_Write_Dat(0xDF);
    LCD_Write_Dat(0x43);

}

4.main

c 复制代码
#include <REG51.H>
#include "LCD1602.h"
#include "DHT11.h"


void main()
{
    LCD_Init();

    while (1)
    {
        DHT11_Read_Data();
        Delay(20000);
    }
}
相关推荐
小龙报1 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
范纹杉想快点毕业1 小时前
嵌入式与单片机开发核心学习指南——从思维转变到第一性原理的深度实践
单片机·嵌入式硬件
Industio_触觉智能1 小时前
瑞芯微RK3566开发板规格书,详细参数配置,型号EVB3566-V1,基于RK3566核心板SOM3566邮票孔封装
嵌入式硬件·开发板·rk3568·rk3566·核心板·瑞芯微
czwxkn1 小时前
4STM32(stdl)TIM定时器
stm32·单片机·嵌入式硬件
Love Song残响1 小时前
NVIDIA显卡终极优化指南
stm32·单片机·嵌入式硬件
qq_672592752 小时前
电源芯片为什么发热
单片机·嵌入式硬件
天天爱吃肉82182 小时前
【跨界封神|周杰伦×王传福(陶晶莹主持):音乐创作与新能源NVH测试,底层逻辑竟完全同源!(新人必看入行指南)】
python·嵌入式硬件·算法·汽车
国科安芯2 小时前
抗辐照MCU在精密时频系统中的单粒子效应评估与可靠性验证
单片机·嵌入式硬件·架构·制造·安全性测试
森焱森2 小时前
嵌入式硬件工程师应知 白银快速分析报告
linux·c语言·arm开发·嵌入式硬件·去中心化
czhaii3 小时前
单片机最佳入门多线程示例讲解
c语言·单片机