温湿度检测.docx
《温湿度检测.docx》由会员分享,可在线阅读,更多相关《温湿度检测.docx(21页珍藏版)》请在冰点文库上搜索。
温湿度检测
设计题目:
基于单片机的整点温湿度记录仪
学生姓名
课程名称
专业班级
地点
\
起止时间
设计内容及要求
设计基于单片机的整点温度记录仪。
温度记录仪是测温仪器类型的其中之一,广泛应用于医药、食品、电子、农业等领域。
本课题的主要任务是基于单片机技术设计一种整点温度记录仪,能够实现精准测温、整点存储、温度显示、温度查询等功能。
要求完成以下功能:
1.检测的温度范围:
0-70℃,检测分辨率±1℃;湿度范围60%-80%RH;
2.可整点存储温度值、湿度值;
3.通过键盘查询、显示温度值、湿度值;
4能够存储、显示、查询温度.
RH设计
参数
进度
要求
1.布置仪表设计任务、方案设计(1天)
2.硬件设计、制作、调试(1.5天)
3.软件设计、调试(4.5天)
4.综合调试(1天)
5.成果展示、答辩(1天)
详见进度安排表
参考资料
1.程德福.智能仪器.机械工业出版社.2009.9
2.胡文金.单片机系统实训教程.重庆:
重庆大学出版社,2005
3.梁森.自动检测技术及应用.北京:
机械工业出版社,2012
其它
说明
1.本表应在每次实施前一周由负责教师填写二份,院系审批后交院系办备案,一份由负责教师留用。
2.若填写内容较多可另纸附后。
3.一题多名学生共用的,在设计内容、参数、要求等方面应有所区别。
目录
一系统总体方案设计5
1.1系统设计方案总体思路5
1.2系统总体方案框图5
二硬件设计5
2.1STC89C52简介5
2.2晶振电路6
2.3复位电路7
2.4共阴极数码管显示电路7
2.5键盘电路8
2.6DHT11传感器电路9
三软件设计与说明10
3.1主程序设计10
3.2显示程序设计10
第4章调试结果与说明12
4.1系统调试说明12
4.2调试结果12
五总结12
参考文献13
附录B系统程序清单16
一系统总体方案设计
1.1系统设计方案总体思路
根据课题,设计整点温湿度检测记录电路,采用单片机STC89C52为控制芯片。
根据设计要求所需的实现要求,电路分为单片机时钟电路、复位电路、数码管显示电路、DHT11传感器电路、DS1302时钟电路、AT24C02储存电路、LED闪烁报警电路几个模块。
在本系统中复位电路中给给RST引脚连续输入2个机器周期(即24个时钟振荡周期)以上高电平,就可完成初始化操作;显示电路与单片机I/O相连,采用4段7位共阴极LED显示管显示温湿度。
1.2系统总体方案框图
根据设计思路确定的总体方案如图1-2所示。
图1-2系统总体框图
二硬件设计
2.1STC89C52简介
STC89C52是STC公司生产的一种低功耗高性能CMOS8位微控制器,具有8K在系统可编程FLASH存储器。
STC89C52使用经典的MCS-51内核,但做了很多改进使得芯片具有传统51单片机不具备的功能。
拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
图2-1STC89C52
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.4-P2.7控制。
显示电路如图:
图2-4显示电路
2.5键盘电路
单片机板子上自带有四个按键,为MODE键.UP键.DOWN键和ENT键,分别与单片机的P20.P21.P22和P32相连。
本次课程设计使用了三个按键,用来设置温湿度的上下限及显示工作
键盘电路如图:
图2-5显示电路
2.6DHT11传感器电路
DHT11是一种能对环境的温湿度参数进行采样的传感器,用于微处理器与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的测量分辨率分别为8bit(温度)、8bit(湿度)。
DHT11传感器电路如下:
图2-6DHT11传感器电路
三软件设计与说明
此次系统设计是通过C语言编程,其中包括数码管显示部分、时钟电路、传感器采样温湿度部分,总线部分。
3.1主程序设计
主程序初始化,显示温湿度值,循环扫描是否有键按下,如有键按下则做出相应的功能处理,若无键按下则继续执行显示函数。
3.2显示程序设计
显示采用4位共阴极数码管,段码在程序数据区定义,根据需要查表取得,再送往P0口,以控制数码管显示不同字符数字。
位码由P2.4—P2.7口分别控制晶体数码管的位控位W4—W1,以控制各个数码管显示。
N
Y
图3-4显示程序流程图
四调试结果与说明
4.1系统调试说明
本系统调试过程中采用直接硬件调试的方法,对整体的系统程序进行分解排故,首先对四位八段显像管进行数字显示测试,然后对键盘进行按键响应测试,当测试都得到正确结果时,将键盘与显示结合起来,并给予恰当的字型码,最后加入中断程序,给出正确的脉冲信号和频率。
按键出现按下一键响应多次的情况,后查出由于键位抬起子程序书写不当,造成键盘多次响应,并加上了松手去抖程序后问题得以顺利解决。
4.2调试结果
接上温湿度传感器DHT11后和电源后,将程序下载到板子上,按下按键启动,执行程序,数码管上显示了温湿度整数部分的参数。
由于程序编写的不是很成功,虽然显示了温湿度,但是数值不是很准确,而且不能储存温湿度,只能实时显示,有一定的缺陷.
五总结
经过两周的单片机课程设计,终于完成了单片机环境温湿度检测系统的设计,虽然遇到了很多问题,最后也不是很成功,但是也收获许多,但是付出了许多精力和时间,所以实践能力的到了一定的提高。
虽然学习单片机已经不短时间,我对单片机还有不少的问题,透过此次课程设计,我又学到了很多知识与技巧。
这次设计让我有了长足的进步,使我对单片机硬件与软件的兼顾与融会贯通有了更进一步。
参考文献
[1]王迎旭.单片机原理与应用[M].北京:
机械工业出版社,2004.
[2]陈海宴.51单片机原理及应用[M].北京:
北京航空航天大学出版社,2010.
[3]胡汉才.单片机原理及其接口技术[M].北京:
清华大学出版社,2010.
[4]李全利.单片机原理及应用技术[M].北京:
高等教育出版社,2004.
[5]陈光东.单片微型计算机原理及接口技术[M].华中科技大学出版社,2001.
[6]何立民.51系列单片机应用与实践教程[M].北航出版社,.
附录B系统程序清单
#include"I2C.h"
#include"I2C_2.h"
#include"Temperature.h"
#include"DS1302_2.h"
#definePCF85910x90//PCF8591地址
#defineTHCO0xF8//11.0592MHZ晶振
#defineTLCO0xCD//定时2ms时间
#defineTHC10xB8//定时20ms时间
#defineTLC10x00
floatt,t1,ave;
bitDisPlay;//按键刷新显示标志位
intRoom_Temperature=0;//室温
unsignedintAin3_Voltage=0;//通道3电压
unsignedintcount1S=0;
unsignedcharMenu=0;
unsignedcharKey_Add_Flag=0;
unsignedcharKey_Sub_Flag=0;
unsignedcharmin=0x0,sec=0x0,hour=0x0;
ucharDataBufW[]={2,0,0,0};
bitsave_flag;//保存标志位
unsignedcharTemperature_Param[5]={28,29,30,31,32};//存储5个温度值
unsignedcharHumidity_Param[5]={50,60,70,80,90};//存储5个湿度值
unsignedchardat[6]={0};//五次计算值
unsignedcharData_Buffer[4]={1,2,3,4};//数码管显示缓冲区
unsignedcharcodeDuan[]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x40};//0~9,'-'
voidInit(void);//定时器配置初始化
voidTemperature(void);//采集温度
voidHumidity(void);//采集湿度
voidDisp_Update(void);//数据更新
voidKey_Deal(void);//按键处理,主要是模式,加键,减键标志位的加减运算
voidmain(void)
{
unsignedchari=0;
Init();//定时器配置初始化
Temperature();//温度采集初始化
Humidity();//湿度采集初始化
Disp_Update();
while
(1)
{
if(DisPlay==1)//按键按下或者1S时间到刷新数据
{
DisPlay=0;
if(Menu==0)//1S刷新温度**Timer1
{
Temperature();
}
if(Menu==1)//1S一次刷新湿度**Timer0
{
Humidity();
LED1=!
LED1;
}
if(Menu==2)//DS1302
{
min=ReadMin();
sec=ReadSec();
LED2=!
LED2;
}
Disp_Update();
}
if(save_flag==1)//存储
{
for(i=5;i>0;i--)//存储5次温度值
{
Temperature_Param[i]=Room_Temperature;
WrToROM(Temperature_Param,1,4);//把5个温度参数写进EPROM
}
for(i=5;i>0;i--)//存储5次湿度值
{
Humidity_Param[i]=Ain3_Voltage;
WrToROM(Humidity_Param,1,4);//把5个湿度参数写进EPROM
}
save_flag=0;
}
}
}
voidTimer0()interrupt1using1
{
staticunsignedcharBit=0;//数码管位选
staticunsignedcharKey_Delay;//按键延时消抖
TH0=THCO;//定时2ms
TL0=TLCO;
count1S++;
if(count1S==500)//1S到,
{
count1S=0;//清零
DisPlay=1;//刷新标志位置
}
/**按键扫描**/
if(Key_Mode==0||Key_Add==0||Key_Sub==0)//按键扫描
{
if(++Key_Delay>40)//此处延时80ms
{
Key_Delay=0;
Key_Deal();//按键处理
DisPlay=1;
}
elseDisPlay=0;//不显示
}
else//不显示
{
Key_Delay=0;
}
/**数码管扫描**/
Bit++;
Bit&=0x03;
P2|=0xf0;//先关位码
P0=Duan[Data_Buffer[Bit]];//开段码,段码送数据
if(Menu==2&&Bit==1)//时间显示小数点
P0|=0x80;
switch(Bit)//送位码
{
case0:
P24=0;break;
case1:
P25=0;break;
case2:
P26=0;break;
case3:
P27=0;break;
default:
break;
}
}
/**定时20ms;刷新温湿度;**/
voidTimer1()interrupt3using3
{
TH1=THC1;//重装初值
TL1=TLC1;
}
voidInit(void)
{
TMOD=0x11;//设置定时器0工作模式,16位计数模式
TH0=THCO;
TL0=TLCO;
TH1=THC1;
TL1=TLC1;
TR0=1;//启动定时器0
ET0=1;//使能定时器中断0
EA=1;//开总中断
DisableWP();//禁止写保护
WriteControl(0xa6);//向慢速充电控制寄存器写入控制字节
WriteSec(sec);//向DS1302中写入秒字节
WriteMin(min);//向DS1302中写入分字节
}
voidTemperature(void)//室温采集模块,2s采集一次
{
unsignedinti;
floatmax1,min1,sum;
unsignedintmax,min,mid;
unsignedintv;
ISendByte(PCF8591,0x40);
dat[0]=IRcvByte(PCF8591);//得到第一次NTC的电
max1=min1=dat[0];
sum=0;
for(i=0;i<5;i++)//数据处理
{
ISendByte(PCF8591,0x40);
dat[i+1]=IRcvByte(PCF8591);//得到NTC的电压,连续采集5次
if(dat[i]>max1)max1=dat[i];//搜寻最大值
elseif(dat[i]sum=sum+dat[i];
}
ave=(float)((sum-max1-min1)/3.0);//算3次平均值
t=ave*19.6;//255*5000;//5/256
t1=t/1000;//t1为电压值
t1=(5000-t)/t1;
v=(unsignedint)t1*10;//计算得电阻值
Room_Temperature=v;
max=97;
min=0;
while
(1)//查表,得到温度值
{
mid=(max+min)/2;
if(Table[mid]max=mid;
else
min=mid;
if((max-min)<=1)
break;
}
Room_Temperature=max;
}