当前位置:文档之家› 温湿度传感器_课程设计报告

温湿度传感器_课程设计报告

温湿度传感器_课程设计报告湖南工程学院课程设计课程名称单片机原理与应用课题名称环境温、湿度检测系统设计专业自动化班级1191学号20姓名指导教师李晓秀王迎旭2013 年12 月12 日湖南工程学院课程设计任务书课程名称单片机原理与应用课题环境温、湿度检测系统设计专业班级自动化学生姓名学号2011指导老师李晓秀审批任务书下达日期2013 年12 月 1 日任务完成日期2013 年12 月13 日目录第1章概述 (7)1、1 设计任务与要求 (7)1、2 设计方案 (7)第2章硬件设计 (8)2、1 时钟电路与复位电路 (8)2、2 温湿度测量电路设计 (9)2、3按键电路 (10)第3章软件设计 (11)3、1主函数设计 (11)3、2按键查询 (11)3、3 实时监控与测试流程图 (13)第4章硬件调试与结果分析 (13)4、1调试过程 (13)4、2 硬件调试 (14)第5章总结 (16)参考文献 (16)附录一:系统仿真图 (17)附录二:源程序 (17)电气与信息工程系课程设计评分表 (29)第1章概述1、1 设计任务与要求本课题以单片机为核心,用智能集成温温度传感器DHT11主要实现检测温度、湿度的检测,将温度湿度信号通过传感器进行信号的采集并转换成数字信号,再运用单片机进行数据的分析与处理,在数码管上显示当前温湿度。

要求用按键控制系统选择分别对温度或湿度的测试、复位、清除功能,完成硬件调试。

1、2 设计方案本课题的温湿度测试,通过单片机STC-89C51连接温湿度模块、显示模块将温度、湿度同时显示。

单片机发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,如果没有接收到单片机发送来的信号,DHT11不会主动进行温度采集,采集数据后转换到低速模式。

系统设计框图如图1、1所示。

图1、1 程序设计框图 第2章 硬件设计 2、时钟电路与复位电路 MCS-51单片机内部有一个用于构成振荡器的高增益反放大器,引脚XTAL1与XTAL2分别就是反相放大器的输入端与输出端。

通常,经由片外晶体振荡器或陶瓷谐振器与两个匹配电容一起构成一个自激振荡电路。

本课题由片外晶体振荡器与两个匹配电容一起构成了一个内部时钟振荡电路,为单片机提供时钟源。

本设计复位电路采用按键复位,当开关断开时,与上电自动复位电路相同;当开关闭合时,电容通过并联的电阻迅速放电,然后,RC 电路充电,能够保证RST 端能够维持一段时间的高电平。

如图2、1所示。

图2、1 时钟及复位电路单片机 按键电路 显 示电 路 DHT11 温度采集电路 时钟复位电 路2、2 温湿度测量电路设计DHT11的供电电压为3-5、5V,传感器上电后,要等待1s以越过不稳定状态在此期间无需发送任何指令。

电源引脚(VDD,GND)之间可增加一个100nF的电容,用以去耦滤波。

数据用于微处理器与DHT11之间的通讯与同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分与整数部分。

如图2、2所示,本电路上拉电阻为5K,数据端接P1、7(接受温湿度数据)。

图2、2 温湿度测量电路2、3 显示电路本电路由四位一体共阳极数码管显示,采用9015三极管做位驱动。

根据发光二极管物理连接的不同,七段数码管可以分为共阴极与共阳极两种结构。

其中P0端口为段选,P2、0~P2、3为位选,如图2、3所示。

图2、3 显示电路2、4按键电路单片机设计中按键可分为独立式按键与矩阵式按键,本系统由于按键较少,故采用四个独立按键,上拉电阻为1K。

其中,四个按键功能分别就是显示温度、显示湿度、实时监控显示温湿度、测试温湿度。

如图2、4。

图2、4 按键电路第3章软件设计本软件设计主要就是对距离进行测量、显示。

因此,整个软件可分为按照硬件电路对单片机位定义;温湿度设置子程序;温湿度接收子程序;显示子程序;延时子程序等。

由于本设计方案要求硬件电路与软件编程相结合,所以选择合适的编程语言十分重要。

C语言执行效率没有汇编语言高,但语言简洁,使用方便灵活,运算丰富,表达化类型多样化,程序设计自由度大,很好的可重用性,可移植性等特点基于C语言的众多优点本设计选择此语言来编程。

3、1主函数设计软件分为两部分,主程序与中断服务程序。

主程序完成初始化工作、温湿度数据接收处理控制。

外部中断服务子程序主要完成时间值的读取、结果的输出等工作,如图3、1所示。

3、2按键查询独立式按键接口采用直接读入方式工作,直读式键盘接口就是一个输入接口,输入接口主要功能就是解决数据输入的缓冲(选通)问题。

本设计按键较少,采用的独立按键。

3、3 实时监控与测试流程图本系统设计分为实时监控与测试模块,图3、3示为测试模块。

上电就是数码管显示四个零,当按下测试按键后,系统开始测量环境温、湿度。

当数码管显示四个“—”时,表示成功测量温、湿度。

当按下温度(湿度)显示按键,该模块显示测试时的温度(湿度)。

当要进行下一次测量时,必须按下测试按键。

4踪,量键就是将该标志位设置为2,使通信与取数函数循环两次,这样保证了每次按下测试按键后就能与DHT11正确的通信从而保证得到正确的数据。

在实时监控这个模块中,为了保证温、湿度能循环显示、按键后能只显示温度(湿度)。

由于按键有限,所以一下设置了很多的标志位。

因为标志位太多,而没有将所有的环节考虑进去,一下程序有调试了很久才正确的实现要求的功能。

4、2 硬件调试如图4、1所示,按下左下角按键时,单片机开始与DHT11通信并开始测试温、湿度。

图示为测量温、湿度成功。

图4、1 初始化当按下图示按键时,数码管显示此时或实时监控的环境湿度。

其中最前端的“C”表示此时显示的事环节温度,如图4、2。

图4、2 显示湿度当按下此按键时,数码管显示此时或实时监控的环境温度。

其中最前端的“H”表示此时显示的就是环境湿度,如图4、3。

图4、3 显示温度第5章总结这次单片机课程设计不仅巩固了以前学过的知识,而且学到了很多书本上没有没到的知识,掌握了一种系统的研究方法,可以进行一些简单的编程,通过这次课程设计我们明白理论与实际相结合就是很重要的,只有理论知识还不够,理论实践相结合才能提高实际动手能力与独立思考的能力。

同样,在学习中也发现了自己的不足之处,例如对以前所学过的知识理解不够深刻,掌握不够牢固。

课程设计就是培养学生综合运用所学知识,发现、提出、分析与解决实际问题,锻炼实践能力的重要环节,就是对学生实际工作能力的具体训练与考察过程。

随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得就是无处不在。

因此作为二十一世纪的大学来说掌握单片机的开发技术就是十分重要的。

回顾起此次单片机课程设计,我仍感慨颇多。

的确,从选题到定稿,从理论到实践,在接近两个星期的日子里,可以说得就是苦多于甜,在设计的过程中遇到问题,可以说得就是困难重重,难免会遇到过各种各样的问题,通过这次课程设计之后,一定把以前所学过的知识重新温故。

参考文献[1]王迎旭等、单片机原理及及应用[M]机械工业出版社、2012年[2]龚建伟、熊光明等、Visual、c、Tubor、c串口通信[M][3]康华光等、模拟电子技术第五版[M]高等教育出版社2011年[4]杜树春等、单片机C语言[M]北京航空航天大学出版社附录一:系统仿真图附录二:源程序#include <reg51、h>bit flag2,flag3,flag5;sbit dht11 = P1^7;#define NUMBER 20//防止在与硬件通信时发生死循环的计数范围#define SIZE 5#define OK 1#define ERROR 0//函数的返回值表示读取数据就是否成功OK 表示成功ERROR 表示失败void DHT11_Delay_10us(void);//延时10usvoid ceshiwenshidu(void);void xianshishidu(void);void xianshiwendu(void);unsigned char ReadValue(void);unsigned char DHT11_ReadTempAndHumi(void);void delay_1_002s(void);void delay(unsigned char i);//延时程序void display(unsigned char led0,led1,led2,led3);//动态扫描显示程序unsigned char keyscan(void);//键盘扫描unsigned char status;//#define uchar unsigned char//#define uint unsigned intunsigned char flag1,flag4;unsigned char led_code[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x89}; /*共阳字型段码表,"0"--"F","-",“H”*/unsigned char led0,led1,led2,led3;unsigned char value_array[5];//存放五字节数据的数组unsigned char value_temp, value_humi;void DHT11_Delay_10us(void){unsigned char i;i--;i--;i--;i--;i--;i--;}/*读一个字节的数据*/unsigned char DHT11_ReadValue(void){unsigned char count, value = 0, i;status = OK;//设定标志为正常状态for(i = 8; i > 0; i--){//高位在先value <<= 1;count = 0;//每一位数据前会有一个50us 的低电平时间、等待50us 低电平结束while((dht11 == 0) && (count++ < NUMBER));if(count >= NUMBER){status = ERROR;//设定错误标志return 0;//函数执行过程发生错误就退出函数}//26-28us 的高电平表示该位就是0,为70us 高电平表该位1 DHT11_Delay_10us();DHT11_Delay_10us();DHT11_Delay_10us();//延时30us 后检测数据线就是否还就是高电平if(dht11 != 0){//进入这里表示该位就是1value++;//等待剩余(约40us)的高电平结束while((dht11 != 0) && (count++ < NUMBER)){dht11 = 1;}if(count >= NUMBER){status = ERROR;//设定错误标志return 0;}}}return (value);}//读温度与湿度函数,读一次的数据,共五字节,读出成功函数返回OK, 错误返回ERROR unsigned char DHT11_ReadTempAndHumi(void){unsigned char i = 0, check_value = 0,count = 0;display(led0,led1,led2,led3);// EA = 0;dht11 = 0; //拉低数据线大于18ms 发送开始信号display(led0,led1,led2,led3); //需大于18 毫秒dht11 = 1; //释放数据线,用于检测低电平的应答信号//延时20-40us,等待一段时间后检测应答信号,应答信号就是从机拉低数据线80us DHT11_Delay_10us();DHT11_Delay_10us();DHT11_Delay_10us();DHT11_Delay_10us();if(dht11 != 0) //检测应答信号,应答信号就是低电平{ //没应答信号return ERROR;}{ //有应答信号while((dht11 == 0)&&(count++ < NUMBER)); //等待应答信号结束if(count >= NUMBER) //检测计数器就是否超过了设定的范围{dht11 = 1;return ERROR; //读数据出错,退出函数}count = 0;dht11 = 1; //释放数据线//应答信号后会有一个80us 的高电平,等待高电平结束while((dht11 != 0) && (count++ < NUMBER));if(count >= NUMBER){dht11 = 1;return ERROR; //退出函数//读出湿、温度值for(i = 0; i < SIZE; i++){value_array[i]=DHT11_ReadValue();if(status == ERROR) //调用ReadValue()读数据出错会设定status 为ERROR{dht11 = 1;return ERROR;}//读出的最后一个值就是校验值不需加上去if(i != SIZE - 1){ //读出的五字节数据中的前四字节数据与等于第五字节数据表示成功check_value += value_array[i];}} //end fordisplay(led0,led1,led2,led3);//在没用发生函数调用失败进行校验if(check_value == value_array[SIZE - 1]){value_humi = value_array[0];value_temp = value_array[2];dht11 = 1;return OK; //正确的读出dht11 输出的数据}else{return ERROR; //校验数据错}}}void delay_1_002s(void){unsigned char z,b,c;for(z=0;z<10;z++){for(b=0;b<160;b++){for(c=0;c<207;c++);}}}void delay(unsigned char x){unsigned char i,j;for(i=0;i<x;i++)for(j=0;j<120;j++);}void display(unsigned char led0,led1,led2,led3) {P2=0xfe;P0=led_code[led0];delay(5);P2=0xfd;P0=led_code[led1];delay(5);P2=0xfb;P0=led_code[led2]&0x7f;delay(5);P2=0xf7;P0=led_code[led3];delay(5);P2=0xff;}unsigned char keyscan(void){unsigned char cord_l;cord_l=P3&0xf0;if(cord_l!=0xf0){display(led0,led1,led2,led3);if(cord_l!=0xf0){while(P3!=0xf0){P3=0xf0; //等待按键释放}return(cord_l);}return(0xf0);}}void ceshiwenshidu(void){unsigned char d;for(;flag4>0;flag4--){d=DHT11_ReadTempAndHumi();display(led0,led1,led2,led3);if(flag3==0){if(d==1){led0=16;led1=16;led2=16;led3=16;}}}flag4=1;}void xianshishidu(void){led0=17;led1=value_humi/10;led2=value_humi%10;led3=0;}void xianshiwendu(void){led0=12;led1=value_temp/10;led2=value_temp%10;led3=0;}void main(){unsigned char key;P3=0xf0;TMOD=0x01;TH0=0x3c;TL0=0xb0;EA=1;ET0=1;TR0=0;delay_1_002s();display(led0,led1,led2,led3);while(1){display(led0,led1,led2,led3);key=keyscan();if(flag1==10){ceshiwenshidu();display(led0,led1,led2,led3);}switch(key){case 0xe0: flag4=2,ceshiwenshidu();break;//开始测试温湿度case 0xd0: xianshishidu(),flag5=1,flag2=0;break; //显示湿度case 0xb0: xianshiwendu(),flag5=1,flag2=1;break; //显示温度case 0x70: flag4=1,TR0=~TR0,flag3=~flag3,flag5=0;break;}}}void shishiceshi_T0(void) interrupt 1{TH0=0x3c;TL0=0xb0;flag1++;if(flag1==NUMBER){flag1=0;if(flag5==0){flag2=~flag2;}if(flag2==0){xianshishidu();}else{xianshiwendu();}}}电气与信息工程系课程设计评分表指导教师签名:________________日期:________________注:①表中标*号项目就是硬件制作或软件编程类课题必填内容;②此表装订在课程设计说明书的最后一页。

相关主题