单片机控制dht11液晶显示课程设计报告

更新时间:2023-08-27 05:55:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

单片机课程设计报告

————温湿度液晶显示

院 系:物理学与电子科学学院 班级专业:2012级微电子

学生姓名:徐壮

学 号:2012221105240021 指导老师:卢仕

摘要 ............................................................................................................. 3 一.实验目的............................................................................................. 3 二.实验内容............................................................................................. 3 三.实验器材............................................................................................. 3 四.实验资料............................................................................................. 3 1.DHT11产品概述 .............................................................................. 3 2.DHT11引脚说明 .............................................................................. 4 3.DHT11电源引脚 .............................................................................. 4 4.串行接口............................................................................................ 4 5.单片机AT89C58 ............................................................................... 5 五.系统的硬件设计和连接 .................................................................... 5 5.1时钟电路 ........................................................................................ 6 5.2显示模块 ........................................................................................ 6 5.3传感器模块 .................................................................................... 7 5.4电路原理图 .................................................................................... 7 六.程序设计............................................................................................. 7 七.实验心得........................................................................................... 14

液晶显示实验

摘要:

温湿度是生活生产中的重要的参数。本设计为基于单片机的温湿度检测与控制系统,采用模块化、层次化设计。用新型的智能温湿度传感器DHT11主要实现对温度、湿度的检测,将温度湿度信号通过传感器进行信号的采集并转换成数字信号,再运用单片机AT89C58进行数据的分析和处理,为显示和报警电路提供信号,实现对温湿度的控制报警。报警系统根据设定报警的上下限值实现报警功能,显示部分采用LCD1602液晶显示所测温湿度值。系统电路简单、集成度高、工作稳定、调试方便、检测精度高,具有一定的实用价值。

一.实验目的

1.通过本实验了解液晶显示的基本原理、掌握如何用单片机来控制液晶显示模块的内容。 2.学会使用DS18B20温度传感器模块进行温度测量。

二.实验内容

1.首先利用LCD显示自己的学号后3位+姓名拼音,比如“No:888 Name:WangNima” 2.过3秒钟后,LCD显示当前温度,比如“Temp: 20 ℃” 3.过3秒钟后,LCD显示姓名学号 4.依次循环

三.实验器材

1.AT89C58单片机实验板

2.DHT11温度湿度传感器模块 3.LCD1602模块

四.实验资料

1.DHT11产品概述

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳

定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为 4 针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。

2.DHT11引脚说明

引脚名称 类型 引脚说明 VCC 电源 正电源输入,3V-5.5V DC Dout 输出 单总线,数据输入/输出引脚 NC 空 空脚,扩展未用 GND 地 电源地

3.DHT11电源引脚

DHT11的供电电压为 3-5.5V。传感器上电后,要等待 1s 以越过不稳定状态在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF 的电容,用以去耦滤波。

4.串行接口

DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下:一次完整的数据传输为40bit,高位先出。数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和数据传送正确时校验和数据等于“ 8bit 湿度整数数据 +8bit 湿度小数数据+8bi 温度整数数据 +8bit 温度小数数据 ”所得结果的末8位。用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。

通讯过程如图1所示

总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,延时等待20-40us后, 读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可, 总线由上拉电阻拉高。

数字温湿度传感器 DHT11 总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1.格式见下面图示.如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常.当最后一bit数据传送完毕后,DHT11拉低总线0us,随后总线由上拉电阻拉高进入空闲状态。

5.单片机AT89C58

ATC89C58是一种低功耗、高性能CMOS八位微控制器,具有8K在系统可编程Flash存储器,使用ATMEL公司高密度非易失性存储器技术制造,与工业80C58产品指令和引脚完全兼容。片上Flash允许ROM在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使其为众多嵌入式控制应用系统提供灵活的解决方案。

五.系统的硬件设计和连接

此次设计的电路部分是由我来设计,电路主要分为时钟电路、复位电路、显示模块等等,

再将其连接到一起就组成了温湿度报警器传感器电路图,除此之外我还参与了电路的焊接。 5.1

时钟电路

ATC89C51内部有一个用于构成振荡器的高增益反相放大器,引脚RXD和TXD分别是此放大器的输入端和输出端。时钟可以由内部方式产生或外部方式产生。 如下:

5.2显示模块

5.3传感器模块

5.4电路原理图

六.程序设计

#include <reg52.h> #include <intrins.h>

typedef unsigned char uchar; typedef unsigned int unint; unsigned char str1[8]={""}; unsigned char str2[8]={""};

unsigned char code dis1[8] = {" Temp : "}; unsigned char code dis2[8] = {" Humi : "};

unsigned char code dis3[]={"Number:021 "}; unsigned char code dis4[]={"2012221105240021"}; unsigned char code dis5[]={"xuehao: "}; unsigned char code dis6[]={"Name :XuZhuang "}; sbit TRH = P2^0;//温湿度传感器DHT11数据接入 sbit LCD_RS = P3^5; sbit LCD_RW = P3^7; sbit LCD_EN = P3^6;

uchar TH_data,TL_data,RH_data,RL_data,CK_data; uchar TH_temp,TL_temp,RH_temp,RL_temp,CK_temp; uchar com_data,untemp,temp; uchar respond; void delayNOP() { _nop_(); _nop_(); _nop_(); _nop_(); }

// 毫秒级延时子程序

void delay_ms(unsigned char ms) { unsigned char i; while(ms--) { for(i = 0; i< 150; i++) { _nop_(); _nop_(); _nop_(); _nop_(); } } }

//5us级延时程序 void delay_us()

{ uchar i; i--; i--; i--; i--; i--; i--; }

// 测试LCD忙碌状态

//lcd_busy()为1时,忙,等待。lcd_busy()为0时,闲,可写指令与数据。 bit lcd_busy() { bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delayNOP(); result = (bit)(P0&0x80); LCD_EN = 0; return(result); }

// 写入指令数据到LCD

void lcd_wcmd(unsigned char cmd) { while(lcd_busy()); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; }

//写显示数据到LCD

//RS=高电平,RW=低电平,E=高脉冲,D0-D7=数据。 void lcd_wdata(unsigned char dat)

{ while(lcd_busy()); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; }

//LCD初始化设定 void lcd_init() { delay_ms(15); lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据 delay_ms(5); lcd_wcmd(0x38); delay_ms(5); lcd_wcmd(0x38); delay_ms(5); lcd_wcmd(0x0c); //显示开,关光标 delay_ms(5); lcd_wcmd(0x06); //移动光标 delay_ms(5); //lcd_wcmd(0x01); //清除LCD的显示内容,如果屏幕过暗,可将这俩句删除 //delay_ms(5); }

//设定LCD显示位置

void lcd_dis_pos(unsigned char pos) { lcd_wcmd(pos | 0x80); //数据指针=80+地址变量 }

//收发信号检测,数据读取 char receive() { uchar i;

com_data=0;

for(i=0;i<=7;i++) { respond=2; while((!TRH)&&respond++); delay_us(); delay_us();

delay_us(); if(TRH) { temp=1; respond=2; while((TRH)&&respond++); } else temp=0; com_data<<=1; com_data|=temp; }

return(com_data); }

//湿度读取子程序

//温度高8位== TL_data //温度低8位== TH_data //湿度高8位== RH_data //湿度低8位== RH_data //校验 8位 == CK_data

//调用的程序有 delay();, Delay_5us();,RECEIVE(); void read_TRH() {

//主机拉低18ms TRH=0;

delay_ms(18); TRH=1;

//DATA总线由上拉电阻拉高 主机延时20us delay_us(); delay_us(); delay_us(); delay_us(); //delay_us();

//delay_us();delay_us();delay_us();delay_us(); //主机设为输入 判断从机响应信号 TRH=1;

//判断DHT11是否有低电平响应信号 如不响应则跳出,响应则向下运行 if(!TRH) { respond=2; //判断DHT11发出 80us 的低电平响应信号是否结束 while((!TRH)&& respond++); respond=2; //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态

while(TRH && respond++); //数据接收状态 RH_temp = receive(); RL_temp = receive(); TH_temp = receive(); TL_temp = receive(); CK_temp = receive(); TRH=1; //数据校验 untemp=(RH_temp+RL_temp+TH_temp+TL_temp); if(untemp==CK_temp) { RH_data = RH_temp; RL_data = RL_temp; TH_data = TH_temp; TL_data = TL_temp; CK_data = CK_temp; } } str1[0] = (char)(0X30+RH_data/10); str1[1] = (char)(0X30+RH_data%10); str1[2] = 0x2e; //小数点 str1[3] = (char)(0X30+RL_data/10); str1[4] = 0x20;

str1[5] = 0X25; //"%" str1[6] = 0x20; //"R" str1[7] = 0x20; //"H" str2[0] = (char)(0X30+TH_data/10); str2[1] = (char)(0X30+TH_data%10); str2[2] = 0x2e; //小数点 str2[3] = (char)(0X30+TL_data/10); str2[4] = 0X27; //"'" str2[5] = 0X43; //"C" str2[6] = 0x20; str2[7] = 0x20; }

void delay(unint x) { unint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); }

//湿度整数部分 //湿度小数部分 //温度整数部分 //温度小数部分

//主函数

//TH,TL,RH,RL分别代表温湿度的整数和小数部分 void main() { unsigned char i,t=0x00,n=0x40,m; lcd_init(); delay_us(); while(1) { read_TRH(); for(i=0;i<=7;i++) { lcd_dis_pos(t+i); lcd_wdata(dis1[i]); lcd_dis_pos(n+i); lcd_wdata(dis2[i]); } m=0x08; for(i=0;i<=7;i++) { lcd_dis_pos(m); lcd_wdata(str1[i]); m++; } m=0x48; for(i=0;i<=7;i++) { lcd_dis_pos(m); lcd_wdata(str2[i]); m++; } delay_ms(100) ;//延时 delay(3000); m=0x00; for(i=0;i<=15;i++) { lcd_dis_pos(m); lcd_wdata(dis3[i]); m++; }

//写字符 //显示字符 //显示字符 //写湿度数据 //写温度数据

}

m=0x40;

for(i=0;i<=15;i++) {

lcd_dis_pos(m); lcd_wdata(dis6[i]); m++; }

delay_ms(100) ; delay(3000);

m=0x00; for(i=0;i<=15;i++) { lcd_dis_pos(m); lcd_wdata(dis5[i]); m++; } m=0x40; for(i=0;i<=15;i++) { lcd_dis_pos(m); lcd_wdata(dis4[i]); m++; } delay_ms(100) ; delay(3000); }

七.实验心得

回顾起此次单片机课程设计,我仍感慨颇多,从理论到实践,在接近一个月期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,难免会遇到过各种各样的问题。首先,说说焊接的美观程度,这是我所骄傲的,我焊接的很美观、明了。但在设计的过程中也发现了自己的不足之处,对以前所学过的知识理解得不够深,把硬件焊接出来后,由于编程不熟,导致推迟了对硬件功能的检测,最终在同学的耐心指导下完成所有功能检测,大神同学的耐心指导,使我意识到专业知识的重要性,以后会更加努力! 通过本次设计,使我在学校中所学到的知识真正的运用到了实际当中, 遇到了一些困

难, 也我学到了很多课本上没有的知识, 使我开阔了眼界, 增长了见识, 同时使我对我所学的专业有了更深一步的了解。 从这次的课程设计中,我真真正正的意识到,在以后的学习工作中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。

本文来源:https://www.bwwdw.com/article/fxmi.html

Top