一、實驗內容 用一個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顯示溫度-濕度值.png (138.32 KB, 下載次數: 41)
下載附件
C51單片機:Proteus仿真DHT11溫度/濕度傳感器、LCD1602顯示溫度/濕度值
2023-5-28 14:58 上傳
四、Keil C51編程
Keil μVision5創建項目(Project)步驟: 1.建立項目文件 2.選擇單片機型號 3.添加源程序文件到項目中 4.設置項目配置選項 5.編譯項目,生成hex文件
C51代碼:
- #include <reg52.h>
- #define uchar unsigned char
- sbit rs = P2 ^ 0;
- sbit rw = P2 ^ 1;
- sbit en = P2 ^ 2;
- sbit io = P2 ^ 3;
- uchar t, h;
- unsigned long int temp;
- //延時約xms
- void delay(unsigned int x) {
- uchar i;
- while (x--)
- for (i = 0; i < 125; i++);
- }
- //檢查LCD忙狀態
- void lcdbusy() {
- rs = 0;
- rw = 1;
- do {
- en = 0;
- P0 = 0xff;
- en = 1;
- delay(1);
- } while (P0 & 0x80);
- en = 0;
- }
- //寫LCD命令或數據
- void w_lcd( bit cd, uchar dat) {
- lcdbusy();
- rs = cd;
- rw = 0;
- delay(1);
- P0 = dat;
- en = 1;
- delay(1);
- en = 0;
- }
- //顯示字符串
- void w_str(uchar *s) {
- while (*s)
- w_lcd(1, *s++);
- }
- //初始化LCD
- void init() {
- w_lcd(0, 0x38);
- w_lcd(0, 6);
- w_lcd(0, 0xc);
- w_lcd(0, 1);
- }
- //讀DHT11的32 位濕度和溫度
- void r_dht11() {
- uchar i;
- temp = 0;
- io = 0;
- delay(60);
- io = 1;
- while (io);
- while (~io);
- while (io);
- //讀32位數據(8位濕度整數+8位濕度小數+8位溫度整數+8位溫度小數)
- for (i = 0; i < 32; i++) {
- while (~io);
- TL0 = 0;
- TR0 = 1;
- while (io);
- TR0 = 0;
- if (TL0 > 40)
- temp = (temp << 1) | 1; //讀出的數據為1
- else
- temp = temp << 1; //讀出的數據為0
- }
- }
- void main() {
- delay(500);//延時使DHT11 工作穩定
- init();
- w_lcd(0, 0x85);
- w_str("T=");
- w_lcd(0, 0xC5);
- w_str("H=");
- TMOD = 1; //定時器T0方式1,根據定時時間判斷從DHT11讀出的是0或1
- TH0 = 0;
- while (1) {
- r_dht11();//讀溫度和濕度
- t = temp >> 8; //取溫度的整數值
- h = temp >> 24; //取濕度的整數值
- w_lcd(0, 0x87);
- w_lcd(1, t / 10 | 0x30); //顯示溫度
- w_lcd(1, t % 10 | 0x30);
- w_lcd(1, 0xdf);
- w_lcd(1, 'C');
- w_lcd(0, 0xc7);
- w_lcd(1, h / 10 | 0x30); //顯示濕度
- w_lcd(1, h % 10 | 0x30);
- w_lcd(1, '%');
- delay(200);//實物可能需要更長的延時時間
- }
- }
復制代碼
五、實驗結果
C51單片機:Proteus仿真DHT11溫度-濕度傳感器、LCD1602顯示溫度-濕度值2.png (137.97 KB, 下載次數: 59)
下載附件
C51單片機:Proteus仿真DHT11溫度/濕度傳感器、LCD1602顯示溫度/濕度值
2023-5-28 14:59 上傳
|