找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2549|回复: 5
收起左侧

C51单片机:Proteus仿真DHT11温度/湿度传感器、LCD1602显示温度/湿度值

[复制链接]
ID:1079232 发表于 2023-5-28 15:00 | 显示全部楼层 |阅读模式
一、实验内容
用一个DHT11温度/湿度传感器与单片机相连,测量环境温度与湿度,并在LCD1602显示温度、湿度值,确保调节DHT11的温度与湿度值时,其值会相应变化。

如:T=43°C
  H=75%

DHT11中一次完整的数据为40 bit,即“8 bit湿度整数”+“8 bit湿度小数”+“8 bit温度整数”+“8 bit温度小数”+“8 bit校验和”,从高位开始输出。

DHT11的测量范围:温度0~50 °C,精度为±2 °C,湿度20%~90%,精度为±5%。在实际应用中,温度、湿度一般取整数部分就可以了。

二、软件
1、Keil μVision5
2、Proteus 8.12

三、Proteus 虚拟仿真
(1)在Proteus环境中完成电路图的设计文件。
(2)在Keil μVision下编写C51程序,经过调试、编译,最终生成“.hex”可执行文件。
(3)在Proteus中,将“.hex”文件加载到虚拟单片机中。
(4)在Proteus中,进行软硬件调试仿真。

具体步骤:
1.在Proteus中创建项目
2.设计原理图
3.源代码编辑(在Keil C51完成)
4.系统仿真调试
5.电路与源代码联

Proteus中用到的元件:AT89C52、DHT11、LM016L、RESPACK-8

C51单片机:Proteus仿真DHT11温度/湿度传感器、LCD1602显示温度/湿度值

C51单片机:Proteus仿真DHT11温度/湿度传感器、LCD1602显示温度/湿度值


四、Keil C51编程

Keil μVision5创建项目(Project)步骤:
1.建立项目文件
2.选择单片机型号
3.添加源程序文件到项目中
4.设置项目配置选项
5.编译项目,生成hex文件

C51代码:

  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. sbit rs = P2 ^ 0;
  4. sbit rw = P2 ^ 1;
  5. sbit en = P2 ^ 2;
  6. sbit io = P2 ^ 3;
  7. uchar t, h;
  8. unsigned long int temp;

  9. //延时约xms
  10. void delay(unsigned int x) {
  11.         uchar i;
  12.         while (x--)
  13.                 for (i = 0; i < 125; i++);
  14. }

  15. //检查LCD忙状态
  16. void lcdbusy() {
  17.         rs = 0;
  18.         rw = 1;
  19.         do {
  20.                 en = 0;
  21.                 P0 = 0xff;
  22.                 en = 1;
  23.                 delay(1);
  24.         } while (P0 & 0x80);
  25.         en = 0;
  26. }

  27. //写LCD命令或数据
  28. void w_lcd( bit cd, uchar dat) {
  29.         lcdbusy();
  30.         rs = cd;
  31.         rw = 0;
  32.         delay(1);
  33.         P0 = dat;
  34.         en = 1;
  35.         delay(1);
  36.         en = 0;
  37. }

  38. //显示字符串
  39. void w_str(uchar *s) {
  40.         while (*s)
  41.                 w_lcd(1, *s++);
  42. }

  43. //初始化LCD
  44. void init() {
  45.         w_lcd(0, 0x38);
  46.         w_lcd(0, 6);
  47.         w_lcd(0, 0xc);
  48.         w_lcd(0, 1);
  49. }

  50. //读DHT11的32 位湿度和温度
  51. void r_dht11() {
  52.         uchar i;
  53.         temp = 0;
  54.         io = 0;
  55.         delay(60);
  56.         io = 1;
  57.         while (io);
  58.         while (~io);
  59.         while (io);
  60. //读32位数据(8位湿度整数+8位湿度小数+8位温度整数+8位温度小数)
  61.         for (i = 0; i < 32; i++) {
  62.                 while (~io);
  63.                 TL0 = 0;
  64.                 TR0 = 1;
  65.                 while (io);
  66.                 TR0 = 0;
  67.                 if (TL0 > 40)
  68.                         temp = (temp << 1) | 1; //读出的数据为1
  69.                 else
  70.                         temp = temp << 1; //读出的数据为0
  71.         }
  72. }

  73. void main() {
  74.         delay(500);//延时使DHT11 工作稳定
  75.         init();
  76.         w_lcd(0, 0x85);
  77.         w_str("T=");
  78.         w_lcd(0, 0xC5);
  79.         w_str("H=");

  80.         TMOD = 1; //定时器T0方式1,根据定时时间判断从DHT11读出的是0或1
  81.         TH0 = 0;
  82.         while (1) {
  83.                 r_dht11();//读温度和湿度
  84.                 t = temp >> 8; //取温度的整数值
  85.                 h = temp >> 24; //取湿度的整数值
  86.                 w_lcd(0, 0x87);
  87.                 w_lcd(1, t / 10 | 0x30); //显示温度
  88.                 w_lcd(1, t % 10 | 0x30);
  89.                 w_lcd(1, 0xdf);
  90.                 w_lcd(1, 'C');
  91.                 w_lcd(0, 0xc7);
  92.                 w_lcd(1, h / 10 | 0x30); //显示湿度
  93.                 w_lcd(1, h % 10 | 0x30);
  94.                 w_lcd(1, '%');
  95.                 delay(200);//实物可能需要更长的延时时间
  96.         }
  97. }
复制代码



五、实验结果

C51单片机:Proteus仿真DHT11温度/湿度传感器、LCD1602显示温度/湿度值

C51单片机:Proteus仿真DHT11温度/湿度传感器、LCD1602显示温度/湿度值


回复

使用道具 举报

ID:332444 发表于 2023-6-19 17:18 | 显示全部楼层
controller received command whilst busy
回复

使用道具 举报

ID:166284 发表于 2023-8-22 13:34 | 显示全部楼层
为什么我的STC8A8K64 的OLED数字  显示  没反应?  之前的OLED的显示测试的没问题
回复

使用道具 举报

ID:1064915 发表于 2023-8-22 14:15 | 显示全部楼层
RESPACK-8是作什么用途
回复

使用道具 举报

ID:1052915 发表于 2023-8-30 16:09 | 显示全部楼层
谢谢大佬的分析
回复

使用道具 举报

ID:438586 发表于 2023-11-23 15:08 | 显示全部楼层
joyb 发表于 2023-8-22 14:15
RESPACK-8是作什么用途

RESPACK-8那个是九脚的排阻
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表