单片机温湿度测试报告Word格式.docx
- 文档编号:19531841
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:23
- 大小:1.16MB
单片机温湿度测试报告Word格式.docx
《单片机温湿度测试报告Word格式.docx》由会员分享,可在线阅读,更多相关《单片机温湿度测试报告Word格式.docx(23页珍藏版)》请在冰豆网上搜索。
设计及调试。
星期二:
星期三:
调试、写说明书。
星期四--星期五上午:
写说明书、完成电子版并打印成稿星期五下午:
答辩。
参考文献
[1]王迎旭等•单片机原理及及应用[M]机械工业出版社.2012年
[2]康华光等.模拟电子技术第五版[M]高等教育出版社2011年
[3]杜树春等.单片机C语言[M]北京航空航天大学出版社
第1章概述6...
1.1设计任务与要求6..
1.2设计方案6...
第2章硬件设计7...
2.1时钟电路和复位电路7..
2.2温湿度测量电路设计8..
2.3显示电路8...
2.4按键电路9...
第3章软件设计1..1.
3.1主函数设计1..1.
3.2按键查询1..2.
3.3温、湿度传感器通信函数1..2
3.4函数整合与联调1..3
第4章硬件调试与结果分析1..5
第5章总结1..7.
参考文献1..8.
附录一:
系统仿真图1..9
附录二:
源程序2..0.
电气与信息工程系课程设计评分表2.8
第1章概述
1.1设计任务与要求
本课题要求以单片机为核心,采用温湿度传感器DHT11设计一个对环境温度湿度的检测系统,要求用按键控制系统选择分别对温度或湿度的测试、复位、清除功能,用四位LED数码管显示实时温度和温度。
最终硬件调试成功实现。
1.2设计方案
本课题是温湿度测试,通过单片机连接温湿度模块、显示模块将温度、湿度同时显示。
本报告所关联的温度模块独立成项,利用DHT11自动采集环境温湿度并显示于数码管,系统设计框图如图1.1所示。
图1.1程序设计框图
第2章硬件设计
2.1时钟电路和复位电路
MCS-51单片机内部有一个用于构成振荡器的高增益反放大器,引脚XTAL1和XTAL2分别是反相放大器的输入端和输出端。
本课题由片外晶体振荡器(12M与两个匹配电容(30pF)一起构成了一个内部时钟振荡电路,为单片机提供时钟源。
本设计复位电路采用按键复位,在电容两端并联一个电阻和开关。
当开关断开时,与上电自动复位电路相同;
当开关闭合时,电容通过并联的电阻迅速放电,然后,RC电路充电,能够保证RST端能够维持一段时间的高电平。
如图2.1所示。
C1
31
19
图2.1时钟及复位电路
2.2温湿度测量电路设计
根据本课题要求,采用DHT11数字温湿度传感器,本传感器是一款含有已校准数字信号输出的温湿度复合传感器。
它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。
传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。
每个DHT11传感器都在极为精确的湿度校验室中进行校准。
产品为4针单排引脚封装。
连接方便,特殊封装形式可根据用户需求而提供。
本电路数据端接P1.7(接受温湿度数据),上拉电阻5K。
如图2.2所示。
图2.2温湿度测量电路
2.3显示电路
单片机系统中常用的是七段数码管,它由八个发光二极管构成,通过不同的组合可以显示数字1〜9,字符A〜F、H、L、P、U符号“一”及小数点“•”
根据发光二极管物理连接的不同,七段数码管可以分为共阴极和共阳极两种结构。
本电路由四位一体共阳极数码管显示,采用9015三极管做位驱动。
其中P0端口为段选,P2.0〜P2.3为位选,如图2.3所示
2.4按键电路
单片机设计中按键可分为独立式按键和矩阵式按键,本系统由于按键较少,故采用四个独立按键,上拉电阻为1K。
其中,四个按键功能分别是显示温度、显示湿度、实时监控显示温湿度、测试温湿度。
如图2.4c
vcc
A
.aft
R
■
&
R.
a
5
:
k
IK
Ik
P3」
I(
P3!
$
P3(
P3
1
图2.4按键电路
S2
気-pF
第3章软件设计
本设计是硬件电路和软件编程相结合的设计方案,选择合适的编程语言是一个重要的环节。
c语言是编译型程序设计语言,兼顾高级语言的特点,并具备汇编语言的功能。
C语言是一种结构化程序设计语言,它支持当前程序设计中广泛采用的由顶向下结构化程序设计技术。
基于C语言的众多优点本设计选择此语言来编程。
3.1主函数设计
在本设计主函数中,先对定时器TO进行初始化、将其设计为方式1,定时50ms(计满20次为1秒),关闭数码管的位选。
接着进行一个死循环,其中包括显示函数和扫描按键函数。
中断发生时,进入中断服务程序处理中断。
如图3.1所示。
图3.1主程序流程图
3.2按键查询
由于本设计按键较少,故采用的独立按键,在扫描按键函数中,每按下不同按键会返回一个不同的数值,在主函数中有按键查询函数判断为那个按键按下,随后进入不同的子函数,子函数有测试子函数、显示温度子函数、显示湿度子函数与实时测试子函数。
如图3.2所示。
图3.2查询按键处理
3.3温、湿度传感器通信函数
由于单片机与DHT11之间的通讯和同步采用单总线数据格式,所以必须严格按照DHT11的通信要求建立于单片机的通信。
根据要求总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。
DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,延时等待20-40us后,读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉高。
接着DHT11开始向外输出40位数据。
如图3.3所示。
开始
单片机拉低总线大于18ms
释放总线等待相应信号
等待总线拉咼
循环40次
图3.3DHT11通信时序图
3.4函数整合与联调
在编写此程序时,与DHT11的通信程序和取数程序最为难写,在此前我并未接触过单总线的通信时序图。
通过查阅资料和参考现有的程序,不懂的地方和本组的其他组员谈论,终于明白这是怎么一回事,而在测量函数中,刚开始每次都没有测得数据,在这我设置了一个全局变量,一步一步跟踪每一步并显示在P1的LED灯上,一步一步跟踪,完善了DTH11的通信与取数函数。
由于之前的单片机课程实验中已经完善了按键与现实的函数,所以在此直接调用即可。
但在通信与取数函数与按键函数衔接时,总是有一定的概率测不到数据,慢慢的调试我发现我的通信与取数函数要连续调用两次才能每次正确的读取数据,在此,我设置了一个全局变量作为一个标志位,每次按下测量键是将该标志位设置为2,使通信与取数函数循环两次,这样保证了每次按下测试按键后就能与DHT11正确的通信从而保证得到正确的数据。
在实时监控这个模块中,为了保证温、湿度能循环显示、按键后能只显示温度(湿度)。
由于按键有限,所以一下设置了很多的标志位。
因为标志位太多,而没有将所有的环节考虑进去,一下程序有调试了很久才正确的实现要求的功能。
第4章硬件调试与结果分析
当按下此按键时,单片机开始与DHT11通信并开始测试温、湿度。
图
4.1示为测量温、湿度成功。
图4.1初始化
当按下此按键时,数码管显示此时或实时监控的环境湿度。
其中最前端的“C”表示此时显示的事环节温度,如图4.2。
图4.2显示湿度
当按下此按键时,数码管显示此时或实时监控的环境温度。
其中最前端的“H'
表示此时显示的是环境湿度,如图4.3。
图4.3显示温度
第5章总结
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。
因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。
回顾起此次单片机课程设计,我仍感慨颇多。
的确,从选题到定稿,从理论到实践,在接近两个星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
本次课题所用到的温、湿度传感器DHT11是采用单总线的数据传输模式,所以必须要掌握看时序图写程序的能力,而我却是第一次接触这个领域,刚刚开始探索的过程很是艰难,不断的在失败,不断的在犯着不同的错误。
但经过这两个星期的学习,我对于看时序图写程序有了一点小小的了解,学到了很多书本上没有的知识,总的来说,这两个星期的课程设计让我学到了许多知识。
[1]王迎旭等.单片机原理及及应用[M]机械工业出版社.2012年
[2]龚建伟、熊光明等.Visual.c.Tubor.c串口通信[M]
[3]康华光等.模拟电子技术第五版[M]高等教育出版社2011年
[4]杜树春等.单片机C语言[M]北京航空航天大学出版社
[5]
系统仿真图
源程序
#include<
reg51.h>
bitflag2,flag3,flag5;
sbitdhtll=P1A7;
#defineNUMBER20//防止在与硬件通信时发生死循环的计数范围
#defineSIZE5
#defineOK1
#defineERROR0//函数的返回值表示读取数据是否成功OK表示成功ERROR表示失败
voidDHT11_Delay_10us(void);
//延时10us
voidceshiwenshidu(void);
voidxianshishidu(void);
voidxianshiwendu(void);
unsignedcharReadValue(void);
unsignedcharDHT11_ReadTempAndHumi(void);
voiddelay_1_002s(void);
voiddelay(unsignedchari);
//延时程序
voiddisplay(unsignedcharled0,led1,led2,led3);
//动态扫描显示程序
unsignedcharkeyscan(void);
//键盘扫描
unsignedcharstatus;
//#defineucharunsignedchar
//#defineuintunsignedintunsignedcharflag1,flag4;
unsignedcharled_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x89};
/*共阳字型段码
表,"
0"
--"
F"
"
-"
,
“H”*/
unsignedcharled0,led1,led2,led3;
unsignedcharvalue_array[5];
//存放五字节数据的数组
unsignedcharvalue_temp,value_humi;
voidDHT11_Delay_10us(void)
unsignedchari;
i--;
}/*读一个字节的数据*/
unsignedcharDHT11_ReadValue(void){
unsignedcharcount,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;
//设定错误标志return0;
//函数执行过程发生错误就退出函数
}
//26-28us的高电平表示该位是0,为70us高电平表该位1DHT11_Delay_10us();
DHT11_Delay_10us();
//延时30us后检测数据线是否还是高电平
if(dht11!
=0)
//进入这里表示该位是1value++;
//等待剩余(约40us)的高电平结束
while((dht11!
=0)&
NUMBER)){
dht11=1;
}if(count>
=NUMBER){
//设定错误标志
return0;
}return(value);
//读温度和湿度函数,读一次的数据,共五字节,读出成功函数返回OK,错误返回ERRORunsignedcharDHT11_ReadTempAndHumi(void)
{unsignedchari=0,check_value=0,count=0;
display(led0,led1,led2,led3);
dht11=0;
//拉低数据线大
于18ms发送开始信号
display(led0,led1,led2,led3);
//需大于18毫秒
//释放数据线,用
于检测低电平的应答信号
//延时20-40us,等待一段时间后检测应答信号,应答信号是从机拉低数据线80usDHT11_Delay_10us();
=0)//检测应答信号,
应答信号是低电平
{//没应答信号
returnERROR;
else
while((dht11==0)&
(count++<
信号结束
=NUMBER)否超过了设定的范围
{dht11=1;
returnERROR;
}count=0;
dht11=1;
有一个80us的高电平,等待高电平结束
if(count>
度值
for(i=0;
i<
SIZE;
i++)
{value_array[i]=DHT11_ReadValue();
if(status==ERROR)
ReadValue(读数据出错会设定status为ERROR
后一个值是校验值不需加上去if(i!
=SIZE-1){
//有应答信号
//等待应答//检测计数器是
//读数据出错,退
//释放数据线//应答信号后会
//退出函数
//读出湿.温
//调用
//读出的最
//读出的五
字节数据中的前四字节数据和等于第五字节数据表示成功check_value+=value_array[i];
数调用失败时进行校验
if(check_value==value_array[SIZE-1]){
value_humi=value_array[0];
value_temp=value_array[2];
returnOK;
出dht11输出的数据
出错
voiddelay_1_002s(void)
unsignedcharz,b,c;
for(z=0;
z<
10;
z++)
{for(b=0;
b<
160;
b++)
{for(c=0;
c<
207;
c++);
voiddelay(unsignedcharx)
unsignedchari,j;
for(i=0;
i<
x;
i++)for(j=0;
j<
120;
j++);
//endfor
//在没用发生函
//正确的读
//校验数据
voiddisplay(unsignedcharled0,led1,led2,led3)
P2=0xfe;
P0=led_code[led0];
delay(5);
P2=0xfd;
P0=led_code[led1];
P2=0xfb;
P0=led_code[led2]&
0x7f;
P2=0xf7;
P0=led_code[led3];
P2=0xff;
unsignedcharkeyscan(void)
unsignedcharcord_l;
cord_l=P3&
0xf0;
if(cord_l!
=0xf0)
{display(led0,led1,led2,led3);
if(cord_l!
while(P3!
//等待按键释放
P3=0xf0;
return(cord_l);
return(0xf0);
voidceshiwenshidu(void)
unsignedchard;
for(;
flag4>
0;
flag4--)
{d=DHT11_ReadTempAndHumi();
if(flag3==0)
if(d==1)
{led0=16;
led1=16;
led2=16;
led3=16;
flag4=1;
voidxianshishidu(void)
led0=17;
led1=value_humi/10;
led2=value_humi%10;
led3=0;
voidxianshiwendu(void)
led0=12;
led1=value_temp/10;
led2=value_temp%10;
voidmain()
unsignedcharkey;
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET0=1;
TR0=0;
delay_1_002s();
while
(1)
key=keyscan();
if(flag1==10)
{ceshiwenshidu();
switch(key)
case0xe0:
flag4=2,ceshiwenshidu();
break;
//开始测试温湿度
case0xd0:
xianshishidu(),flag5=1,flag2=0;
//显示湿度
case0xb0:
xianshiwendu(),flag5=1,flag2=1;
//显示温度
case0x70:
flag4=1,TR0=~TR0,flag3=~flag3,flag5=0;
}
voidshishiceshi_T0(void)interrupt1
{TH0=0x3c;
TL0=0xb0;
flag1++;
if(flag1==NUMBER)
flag1=0;
if(flag5==0)
{flag2=~flag2;
}if(flag2==0)
{xianshishidu();
{xianshiwendu();
电气与信息工程系课程设计评分表
项目
评价
优
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 温湿度 测试报告
![提示](https://static.bdocx.com/images/bang_tan.gif)