用DHT11与4段数码管显示的温湿度检测系统.docx
- 文档编号:6859884
- 上传时间:2023-01-11
- 格式:DOCX
- 页数:21
- 大小:756.99KB
用DHT11与4段数码管显示的温湿度检测系统.docx
《用DHT11与4段数码管显示的温湿度检测系统.docx》由会员分享,可在线阅读,更多相关《用DHT11与4段数码管显示的温湿度检测系统.docx(21页珍藏版)》请在冰豆网上搜索。
用DHT11与4段数码管显示的温湿度检测系统
等级:
25
湖南工程学院
课程设计
课程名称单片机原理与应用
课题名称温湿度检测系统
专业自动化
班级
学号
姓名
指导教师
2013年6月20日
湖南工程学院
课程设计任务书
课程名称单片机与应用
课题环境温、湿度检测系统设计
专业班级
学生姓名
学号
指导老师
审批
任务书下达日期2013年6月10日
任务完成日期2013年6月21日
设计内容与设计要求
设计内容:
本课题要求以单片机为核心,采用温湿度传感器DHT11设计一个对环境温度湿度的检测系统,要求用按键控制系统选择分别对温度或湿度的测试、复位、清除功能,用四位LED数码管显示实时温度和湿度。
还可由用户设定温度和湿度的上、下限,设计越限报警功能。
设计要求:
1)确定系统设计方案;
2)进行系统的硬件设计;
3)完成必要元器件选择;
4)系统软件设计及调试;
5)系统联调及操作说明
6)按规范要求写设计说明书
主要设计条件
1、PC机及单片机调试软件;
2、开发板1块;
3、系统设计、调试所需的元器件。
说明书格式
1.课程设计任务书
2.目录
3.总体方案确定
4.各单元硬件电路设计及计算方法
5.软件设计与说明(包括流程图)
6.调试结果与必要的调试说明
7.总结
8、参考文献
9、附录
附录A系统原理图
附录B程序清单
10、课程设计成绩评分表。
进度安排
设计时间分为二周
第一周
星期一、上午:
布置课题任务,课题介绍及讲课。
下午:
借阅有关资料,总体方案讨论。
星期二、确定总体方案,学习与设计相关内容。
星期三、各部分方案设计,各部分设计。
星期四、设计及调试。
星期五、设计及调试。
星期六、设计及调试。
第二周
星期一:
设计及调试。
星期二:
设计及调试。
星期三:
调试、写说明书。
星期四--星期五上午:
写说明书、完成电子版并打印成稿。
星期五下午:
答辩。
参考文献
[1]王迎旭等.单片机原理及及应用.机械工业出版社.2012年
第1章系统总体方案设计
1.1系统设计方案总体思路
根据课题,设计温湿度检测系统电路,采用单片机STC89C52为控制芯片。
根据设计要求所需的实现要求,将总电路分为键盘接口电路、单片机时钟电路、复位电路、LED显示电路、DHT11传感器电路、报警电路几个模块。
键盘接口电路为4*4矩阵式键盘,采用查询法,键盘连接到单片机的P2口(P1.0-P1.3列线,P1.4-P1.7行线),在本系统中采用内部时钟电路,由一个石英晶体管振荡器和两个微调电容组成;复位电路中给给RST引脚连续输入2个机器周期(即24个时钟振荡周期)以上高电平,就可完成初始化操作;显示电路与单片机I/O相连,采用4段7位共阳LED显示管显示温湿度。
。
1.2系统总体方案框图
根据设计思路确定的总体方案如图1-2所示。
图1-2系统总体框图
第2章硬件设计
2.1STC89C52简介
STC89C52是STC公司生产的一种低功耗高性能CMOS8位微控制器,具有8K在系统可编程FLASH存储器。
STC89C52使用经典的MCS-51内核,但做了很多改进使得芯片具有传统51单片机不具备的功能。
拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
2.2晶振电路
单片机工作的时间基准是由时钟电路所控制的。
在单片机的XTAL1和XTAL2两个管脚,接一只晶振及两只电容就构成了单片机的时钟电路。
电路中,电容器C1和C2对振荡频率有微调作用,均选用20pF,石英晶体选择12MHZ。
晶振电路如图.
图2-2晶振电路
2.3复位电路
复位电路是保证单片机正常运行的关键因素,所以可靠地复位电路设计是必要的
。
将RST引脚连续输入2个机器周期(即24个时钟振荡期间)以上高电平,即可以完成单片机的初始化操作。
本设计采用按钮复位方式。
复位电路如图:
图2-3复位电路
2.4共阳数码管显示电路
LED数码管采用共阳数码管,采用动态显示方式,减少硬件资源。
动态扫描显示接口是单片机中应用最广泛的一种显示方式。
数码管的dp段以及g-a段依序与P0口的P0.7-P0.0连接。
4位LED的位选线分别由相对应的P2.0-P2.3控制。
显示电路如图:
图2-4显示电路
2.5键盘电路
该系统采用4*4矩阵式键盘电路,在矩阵式键盘中,每条水平线和垂直线交叉处都由一个按钮连接。
键盘的行线与P1口的P1.4-P1.7相连,列线与P1.0-P1.3相连。
本系统采用4个键:
键0:
启动系统,传感器有响应。
键1:
设置温湿度的上下限。
键2:
暂停。
键3:
单片机复位,系统停止工作。
键盘电路如下:
图2-5键盘电路图
2.6DHT11传感器电路
DHT11是一种能对环境的温湿度参数进行采样的传感器。
传感器中的DATA用于微处理器与DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下:
一次完整的数据传输为40bit,高位先出。
数据格式:
8bit湿度整数数据+8bit湿度小数数据。
+8bi温度整数数据+8bit温度小数数据。
+8bit校验和。
DHT11传感器电路如下:
图2-6DHT11传感器电路
2.7报警电路
蜂鸣器是一种一体化的电子通讯响应器。
在本系统中,当温湿度超过其上下线时报警。
图2-7报警电路
第3章软件设计与说明
此次系统设计是通过C语言编程,其中包括数码管显示部分、键盘扫描部分、传感器采样温湿度部分。
3.1主程序设计
主程序初始化,主程序循环扫描是否有键按下,如有键按下则做出相应的功能处理,若无键按下则继续执行显示函数。
3.4显示程序设计
显示采用4位共阳数码管,段码在程序数据区定义,根据需要查表取得,再送往P0口,以控制数码管显示不同字符数字。
位码由P2.0—P2.3口分别控制晶体数码管的位控位W4—W1,以控制各个数码管显示。
N
Y
图3-4显示程序流程图
第4章调试结果与说明
4.1系统调试说明
本系统调试过程中采用直接硬件调试的方法,对整体的系统程序进行分解排故,首先对八段显像管进行数字显示测试,然后对键盘进行按键响应测试,当测试都得到正确结果时,将键盘与显示结合起来,并给予恰当的字型码,最后加入定时器中断程序,给出正确的脉冲信号和频率。
调试过程中,数码管显示的数字闪烁,原因是传感器接触不良,后换了导线,数字不在闪烁。
按键出现按下一键响应多次的情况,后查出由于键位抬起子程序书写不当,造成键盘多次响应,并加上了松手去抖程序后问题得以顺利解决。
4.2调试结果
接上温湿度传感器DHT11后和电源后,将程序下载到板子上,按下0号键启动,执行程序,数码管上显示了环境的温湿度参数。
图5-1显示环境温湿度参数
第5章总结
经过两周的单片机课程设计,终于完成了单片机环境温湿度检测系统的设计,其中收获许多,付出了许多精力和时间,实践能力的到了一定的提高。
刚学完单片机并且经历了考试,我一直以为我对单片机有了不少的了解,课透过此次课程设计,我才看到了自己的诸多不足,也学到了很多知识与技巧。
虽然之前有做过不少课程设计,但以前大多是单独的软件或者硬件设计,这次设计让我有了长足的进步,真正实现了对单片机硬件与软件的兼顾与融会贯通。
单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事。
由于C语言学习较早,很多技巧与方法早就忘得差不多了,上课与做实验,我一直以来都是使用汇编语言来编写程序,可课题的复杂度明显比试验中遇到的要大得多,C语言编程的方便性让我不得不着手C语言开始。
这也让我再次巩固了以前学习的专业知识。
面对大量的参考资料甚至是几乎现成的参考报告,我选择了在学习吸纳的基础上另辟蹊径,虽然遇到困难的时候都想放弃,直接用现成的程序和报告,可看到其他同学和我一样在埋头苦干、老师期盼的眼神,我选择了坚持下来,当然,现在这是我骄傲的资本。
虽然这个课题不算难,但是从硬件电路到最后程序的编写和调试都是自己摸索出来的,这个过程中也遇到了不少困难,更多的是成功后的喜悦,学习永无止境,只有把学习和实践当做一种乐趣那么即便有再大的困难也会是一种享受。
参考文献
[1]王迎旭.单片机原理与应用[M].北京:
机械工业出版社,2004.
[2]陈海宴.51单片机原理及应用[M].北京:
北京航空航天大学出版社,2010.
[3]胡汉才.单片机原理及其接口技术[M].北京:
清华大学出版社,2010.
[4]李全利.单片机原理及应用技术[M].北京:
高等教育出版社,2004.
[5]陈光东.单片微型计算机原理及接口技术[M].华中科技大学出版社,2001.
[6]何立民.51系列单片机应用与实践教程[M].北航出版社,.
附录A系统电路原理图
附录B系统程序清单
//P1.0-P1.7段选a-dp,P2.0-P2.3位选w4-w1,p1口接矩阵键盘列接高四位,横接低四位//
//键盘:
0键启动,1键设置,2键暂停,3键复位
#include
#defineucharunsignedchar
#defineuintunsignedint
unsignedcharcodeled_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};/*共阳字型段码表,"0"--"F","-"*/
ucharled0,led1,led2,led3;
/*------------------------------------------------
函数声明
------------------------------------------------*/
ucharkeyscan(void);//键盘扫描
voiddelay(uinti);//延时程序
voiddisplay(ucharled0,led1,led2,led3);//动态扫描显示程序
/*------------------------------------------------
主函数
------------------------------------------------*/
voidmain()
{
ucharkey;
P1=0xff;/*关所有位显示*/
led0=16;/*显示初始状态“---0”*/
led1=16;
led2=16;
led3=0;
while
(1)
{
display(led0,led1,led2,led3);/*调显示*/
key=keyscan();//调用键盘扫描,
switch(key)
{
case0x7e:
led0=0;break;//0按下相应的键,首位数码管显示相对应的值
case0x7d:
led0=1;break;//1
case0x7b:
led0=2;break;//2
case0x77:
led0=3;break;//3
case0xbe:
led0=4;break;//4
case0xbd:
led0=5;break;//5
case0xbb:
led0=6;break;//6
case0xb7:
led0=7;break;//7
case0xde:
led0=8;break;//8
case0xdd:
led0=9;break;//9
case0xdb:
led0=10;break;//a
case0xd7:
led0=11;break;//b
case0xee:
led0=12;break;//c
case0xed:
led0=13;break;//d
case0xeb:
led0=14;break;//e
case0xe7:
led0=15;break;//f
}
}
}
/*-----------------------------------------------------
键盘扫描程序,P1.0-P1.3列线,P1.4-P1.7行线,
-----------------------------------------------------*/
ucharkeyscan(void)//键盘扫描函数,使用行列反转扫描法
{
ucharcord_h,cord_l;//行列值中间变量
P1=0x0f;//行线输出全为0
cord_h=P1&0x0f;//读入列线值
if(cord_h!
=0x0f)//先检测有无按键按下,cord_h不等于0x0f无键按下
{
display(led0,led1,led2,led3);/*调显示*/
if(cord_h!
=0x0f)
{
cord_h=P1&0x0f;//读入列线值
P1=cord_h|0xf0;//输出当前列线值
cord_l=P1&0xf0;//读入行线值
return(cord_h+cord_l);//键盘最后组合码值
}
}
return(0xff);//无键按下返回值
}
/*-------------------------------------------------------
动态扫描显示程序,P0段控,P2.0-P2.3位控(反向驱动)
-------------------------------------------------------*/
voiddisplay(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];delay(5);
P2=0xf7;P0=led_code[led3];delay(5);
}
/*------------------------------------------------
延时程序
------------------------------------------------*/
voiddelay(intx)
{
inti,j;
for(i=0;i for(j=0;j<120;j++); } //温度传感器采样环境温湿度参数并由数码管显示 #include #include typedefunsignedcharunint8; typedefunsignedcharunint16; unsignedchartable0[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 };//不带小数点 unsignedcharstr1[]={""}; unsignedcharstr2[]={""}; sbitTRH=P3^0;//温湿度传感器DHT11数据接入 sbitLCD_RS=P2^6; sbitLCD_RW=P2^5; sbitLCD_EN=P2^7; voiddisp(unint8str1,unint8str2,unint8str3,unint8str4); unint8TH_data,TL_data,RH_data,RL_data,CK_data; unint8TH_temp,TL_temp,RH_temp,RL_temp,CK_temp; unint8com_data,untemp,temp; unint8respond; voiddelayNOP() {_nop_(); _nop_(); _nop_(); _nop_(); } //毫秒级延时子程序 voiddelay_ms(unsignedcharms) {unsignedchari; while(ms--) { for(i=0;i<150;i++) { _nop_(); _nop_(); _nop_(); _nop_(); } } } //5us级延时程序 voiddelay_us() {unint8i; i--; i--; i--; i--; i--; } charreceive() {unint8i; 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); } voidread_TRH() { //主机拉低18ms TRH=0; delay_ms(18); TRH=1; //DATA总线由上拉电阻拉高主机延时20us 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]=table0[RH_data/10]; str1[1]=table0[RH_data%10];//温度整数部分 str2[0]=table0[TH_data/10]; str2[1]=table0[TH_data%10]; } //主函数 //TH,TL,RH,RL分别代表温湿度的整数和小数部分 voidmain() { delay_us(); TMOD=0X01;//选择定时器工作方式 TH0=(65536-12000)/256; TL0=(65536-12000)%256; EA=1;//开总中断 ET0=1;//开定时器中断 TR0=1;//启动定时器 while (1) { read_TRH(); } } voidT0_timer()interrupt1 { TH0=(65536-20000)/256; TL0=(65536-20000)%256; disp(str1[0],str1[1],str2[0],str2[1]); } voiddisp(unint8str1,unint8str2,unint8str3,unint8str4) { P2=0xfe; P0=str1; delay_ms (1); P2=0xfd; P0=str2; delay_ms (1); //P2=0xfb; //P0=str3; //delay_ms (1); P2=0xfb; P0=str3; delay_ms (1); P2=0xf7; P0=str4; delay_ms (1); //P2=0xdf; //P0=str6; //delay_ms (1); } 电气与信息工程系课程设计评分表 项目 评价 优 良 中 及格 差 设计方案合理性与创造性(10%) 开发板焊接及其调试完成情况*(10%) 硬件设计或软件编程完成情况(20%) 硬件测试或软件调试结果*(10%) 设计说明书质量(20%) 答辩情况(10%) 完成任务情况(10%) 独立工作能力(10%) 出勤情况(10%) 综合评分 指导教师签名: ________________ 日期: ________________ 注: 表中标*号项目是硬件制作或软件编程类课题必填内容; 此表装订在课程设计说明书的最后一页。 课程设计说明书装订顺序: 封面、任务书、目录、正文、评分表、附件(非16K大小的图纸及程序清单)。 (注: 可编辑下载,若有不当之处,请指正,谢谢! )
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DHT11 数码管 显示 温湿度 检测 系统