找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4157|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

C51單片機(jī):Proteus仿真DHT11溫度/濕度傳感器、LCD1602顯示溫度/濕度值

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
一、實(shí)驗(yàn)內(nèi)容
用一個(gè)DHT11溫度/濕度傳感器與單片機(jī)相連,測(cè)量環(huán)境溫度與濕度,并在LCD1602顯示溫度、濕度值,確保調(diào)節(jié)DHT11的溫度與濕度值時(shí),其值會(huì)相應(yīng)變化。

如:T=43°C
  H=75%

DHT11中一次完整的數(shù)據(jù)為40 bit,即“8 bit濕度整數(shù)”+“8 bit濕度小數(shù)”+“8 bit溫度整數(shù)”+“8 bit溫度小數(shù)”+“8 bit校驗(yàn)和”,從高位開(kāi)始輸出。

DHT11的測(cè)量范圍:溫度0~50 °C,精度為±2 °C,濕度20%~90%,精度為±5%。在實(shí)際應(yīng)用中,溫度、濕度一般取整數(shù)部分就可以了。

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

三、Proteus 虛擬仿真
(1)在Proteus環(huán)境中完成電路圖的設(shè)計(jì)文件。
(2)在Keil μVision下編寫(xiě)C51程序,經(jīng)過(guò)調(diào)試、編譯,最終生成“.hex”可執(zhí)行文件。
(3)在Proteus中,將“.hex”文件加載到虛擬單片機(jī)中。
(4)在Proteus中,進(jìn)行軟硬件調(diào)試仿真。

具體步驟:
1.在Proteus中創(chuàng)建項(xiàng)目
2.設(shè)計(jì)原理圖
3.源代碼編輯(在Keil C51完成)
4.系統(tǒng)仿真調(diào)試
5.電路與源代碼聯(lián)

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


四、Keil C51編程

Keil μVision5創(chuàng)建項(xiàng)目(Project)步驟:
1.建立項(xiàng)目文件
2.選擇單片機(jī)型號(hào)
3.添加源程序文件到項(xiàng)目中
4.設(shè)置項(xiàng)目配置選項(xiàng)
5.編譯項(xiàng)目,生成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. //延時(shí)約xms
  10. void delay(unsigned int x) {
  11.         uchar i;
  12.         while (x--)
  13.                 for (i = 0; i < 125; i++);
  14. }

  15. //檢查L(zhǎng)CD忙狀態(tài)
  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. //寫(xiě)LCD命令或數(shù)據(jù)
  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位數(shù)據(jù)(8位濕度整數(shù)+8位濕度小數(shù)+8位溫度整數(shù)+8位溫度小數(shù))
  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; //讀出的數(shù)據(jù)為1
  69.                 else
  70.                         temp = temp << 1; //讀出的數(shù)據(jù)為0
  71.         }
  72. }

  73. void main() {
  74.         delay(500);//延時(shí)使DHT11 工作穩(wěn)定
  75.         init();
  76.         w_lcd(0, 0x85);
  77.         w_str("T=");
  78.         w_lcd(0, 0xC5);
  79.         w_str("H=");

  80.         TMOD = 1; //定時(shí)器T0方式1,根據(jù)定時(shí)時(shí)間判斷從DHT11讀出的是0或1
  81.         TH0 = 0;
  82.         while (1) {
  83.                 r_dht11();//讀溫度和濕度
  84.                 t = temp >> 8; //取溫度的整數(shù)值
  85.                 h = temp >> 24; //取濕度的整數(shù)值
  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);//實(shí)物可能需要更長(zhǎng)的延時(shí)時(shí)間
  96.         }
  97. }
復(fù)制代碼



五、實(shí)驗(yàn)結(jié)果


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:332444 發(fā)表于 2023-6-19 17:18 | 只看該作者
controller received command whilst busy
回復(fù)

使用道具 舉報(bào)

板凳
ID:166284 發(fā)表于 2023-8-22 13:34 | 只看該作者
為什么我的STC8A8K64 的OLED數(shù)字  顯示  沒(méi)反應(yīng)?  之前的OLED的顯示測(cè)試的沒(méi)問(wèn)題
回復(fù)

使用道具 舉報(bào)

地板
ID:1064915 發(fā)表于 2023-8-22 14:15 | 只看該作者
RESPACK-8是作什么用途
回復(fù)

使用道具 舉報(bào)

5#
ID:1052915 發(fā)表于 2023-8-30 16:09 | 只看該作者
謝謝大佬的分析
回復(fù)

使用道具 舉報(bào)

6#
ID:438586 發(fā)表于 2023-11-23 15:08 | 只看該作者
joyb 發(fā)表于 2023-8-22 14:15
RESPACK-8是作什么用途

RESPACK-8那個(gè)是九腳的排阻
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表