一、实验内容 用一个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
四、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);//实物可能需要更长的延时时间
- }
- }
复制代码
五、实验结果
|