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);
    }
}
相关推荐
CoderBob4 小时前
【EmbeddedGUI】简易Page开发模式
c语言·图像处理·单片机
法号:行颠5 小时前
Chaos-nano:Arduino Pro Mini 轻量级操作系统解析与实战应用
单片机·mcu·系统架构
Aldrich_3212 小时前
蓝桥杯嵌入式赛道—-软件篇(GPIO输出模式配置)
c语言·vscode·stm32·单片机·嵌入式硬件·蓝桥杯
Kisorge12 小时前
【电机控制】基于STM32F103C8T6的二轮平衡车设计——LQR线性二次线控制器(算法篇)
stm32·嵌入式硬件·算法
范纹杉想快点毕业14 小时前
《嵌入式开发硬核指南:91问一次讲透底层到架构》
java·开发语言·数据库·单片机·嵌入式硬件·mongodb
p666666666814 小时前
STM32-bootloader引导程序跳转机制笔记
笔记·stm32·嵌入式硬件
飞睿科技15 小时前
【芯片选型指南】乐鑫ESP32-C61核心能力解析:为何它在Wi-Fi 6物联网赛道中优势独具?
科技·嵌入式硬件·物联网·智能家居
一叶知秋0615 小时前
英集芯-IP5385 IIC通信异常原因深入分析及解决方案 21
单片机·嵌入式硬件
亿道电子Emdoor16 小时前
【Arm】Encountered an improper argument
arm开发·stm32·单片机