当前位置: 首页 > news >正文

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

文章目录

    • 实现细节
      • 1.public
      • 2.LCD1602
      • 3.DHT11
      • 4.main

实现细节

1.public

#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

#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 P0void 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

#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高电平值则数据位为 1dat <<= 1;dat |= temp; // 0}DATA = dat;
}void DHT11_Read_Data(void)
{// 主机拉低18msDHT11_DATA = 0;Delay(180);DHT11_DATA = 1;// 总线由上拉电阻拉高 主机延时20usDelay_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

#include <REG51.H>
#include "LCD1602.h"
#include "DHT11.h"void main()
{LCD_Init();while (1){DHT11_Read_Data();Delay(20000);}
}
http://www.dtcms.com/a/615365.html

相关文章:

  • 企业网站的标题关键词系统平台
  • 移动电子商务平台就是手机网站前端培训多少钱
  • 批处理脚本之环境控制、参数处理与数据流
  • 网站 整站 抓取建设的网站属于固定资产么
  • 17网一起做网站广州网站是每年都要付费吗
  • 长沙网站推广服务公司给网站做脚本算违法吗
  • 企业网站视频栏目建设方案做网站费用
  • C++ 折半搜索(Meet-in-the-Middle):突破枚举瓶颈的高效算法
  • 了解一下长城汽车
  • wordpress网站名称中文域名注册官网
  • wordpress可以建哪些网站吗如何用网站模板
  • 网上发布信息的网站怎么做wordpress更新了固定连接文章失效
  • 华为官方网站进入网站背景特效
  • Unity 实现 ScrollBar 值变化控制 Panel 位置的方法
  • 网站建设 南京无需代码制作app软件
  • PCB之包地处理
  • 电解电容使用寿命与纹波电流修正系数
  • 漫画网站php源码网站建设组织架构
  • 帮人做ppt的网站工作服图片大全
  • 数据结构与算法:树的重心
  • JavaScript 中,原型链的**最顶端(终极原型)只有一个——`Object.prototype`
  • 建筑招聘网站哪个好做钢材生意选什么网站
  • 防城港做网站用服务器做网站空间
  • 2025大学生数学竞赛1-2(非数学类)
  • 做类似淘宝的网站要多少钱凡科网站怎么做链接头像logo
  • 做个自己的网站需要多少钱wordpress登录400错误
  • 计算机理论学习Day20(加更)
  • 民治做网站做团购网站需要多少钱
  • arm架构上搭建第一个区块链网络FISCO BCOS
  • MM32F0144芯片ADC电压采样策略详解