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);
    }
}
相关推荐
阿华hhh1 天前
单片机day4
单片机·嵌入式硬件
TEC_INO1 天前
stm32_13:RFID-RC522项目代码
stm32·单片机·嵌入式硬件
安庆平.Я1 天前
STM32——定时器:高级定时器
stm32·单片机·嵌入式硬件
项目題供诗1 天前
51单片机入门(一)
单片机·嵌入式硬件·51单片机
1621B驱动芯片原厂1 天前
YL1621 芯片成功案例推荐
stm32·单片机·嵌入式硬件·mcu·51单片机
Hello_Embed1 天前
RS485 双串口通信 + LCD 实时显示(DMA+IDLE 空闲中断版)
笔记·单片机·学习·操作系统·嵌入式·freertos
__万波__1 天前
STM32L475基于完全空白的项目,完成时钟树初始化配置并验证
单片机·嵌入式硬件
XINVRY-FPGA1 天前
XC7VX690T-2FFG1761I Xilinx AMD FPGA Virtex-7
arm开发·嵌入式硬件·fpga开发·硬件工程·fpga
良许Linux1 天前
STM32F103每个符号的意思是什么?
stm32·单片机·嵌入式硬件
小痞同学1 天前
【铁头山羊STM32】HAL库 4.时钟系统部分
stm32·单片机·嵌入式硬件