单片机课程设计报告————温湿度液晶显示院系:物理学与电子科学学院班级专业:2012级微电子学生姓名:***学号:****************指导老师:***摘要 (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主要实现对温度、湿度的检测,将温度湿度信号通过传感器进行信号的采集并转换成数字信号,再运用单片机A T89C58进行数据的分析和处理,为显示和报警电路提供信号,实现对温湿度的控制报警。
报警系统根据设定报警的上下限值实现报警功能,显示部分采用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 DCDout 输出单总线,数据输入/输出引脚NC 空空脚,扩展未用GND 地电源地3.DHT11电源引脚DHT11的供电电压为 3-5.5V。
传感器上电后,要等待1s 以越过不稳定状态在此期间无需发送任何指令。
电源引脚(VDD,GND)之间可增加一个100nF 的电容,用以去耦滤波。
4.串行接口DA TA 用于微处理器与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.单片机AT89C58A TC89C58是一种低功耗、高性能CMOS八位微控制器,具有8K在系统可编程Flash 存储器,使用ATMEL公司高密度非易失性存储器技术制造,与工业80C58产品指令和引脚完全兼容。
片上Flash允许ROM在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使其为众多嵌入式控制应用系统提供灵活的解决方案。
五.系统的硬件设计和连接此次设计的电路部分是由我来设计,电路主要分为时钟电路、复位电路、显示模块等等,再将其连接到一起就组成了温湿度报警器传感器电路图,除此之外我还参与了电路的焊接。
5.1时钟电路A TC89C51内部有一个用于构成振荡器的高增益反相放大器,引脚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);}// 写入指令数据到LCDvoid 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++);}elsetemp=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(){//主机拉低18msTRH=0;delay_ms(18);TRH=1;//DATA总线由上拉电阻拉高主机延时20usdelay_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);}}七.实验心得回顾起此次单片机课程设计,我仍感慨颇多,从理论到实践,在接近一个月期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。