【摘要】本系统针对所使用的ATS52单片机的性能和发展情况做了比较详细的介绍,对本系统使用的温度芯片DS18B20和湿度芯片HS1101做了性能方面的简单说明。对各部分的电路一一进行了介绍,最终实现了该系统的硬件设计,绘制了电路原理图、印制电路板图。在软件设计方面完成了各功能模块的流程图,并根据设计要求对需要实现的功能经过反复的模拟运行、调试、修改简化,最后得出一套完整的软件系统。课题主要任务是完成环境温湿度检测,并可以通过按键设定最适宜温度,当环境温度与设定温度相差4℃以上时,报警系统发光二极管(红色)与蜂鸣器即启动,设计后的系统具有操作方便,控制灵活等优点。
目录
1.绪论.......................................................................3
1.1课题背景.............................................................1 1.2温湿度采集技术现状 ..................................................1 1.3预期目标..............................................3 1.4方案比较...................................................3 1.4.1温度传感器的选择.............................................................4 1.4.2湿度传感器的选择.............................................................4 1.4.3显示模块...............................................................4 1.4.4系统总体方框图 .....................................................3
2.器件介绍................................................................4
2.1温度传感器DS18B20介绍............................................................4 2.2湿度传感器HS1101介绍 ..............................................10 2.3 单片机ATS52介绍 ................................................13 2.3.1 内部结构、资源 ................................................13 2.3.2 ............................................14
3硬件设计.................................................................14
3.1总电路图 .............................................................14 3.2 温度测量电路 .........................................................15 3.3湿度测量电路 ........................................................15 3.4数码管显示电路..........................................................16 3.5 系统的PCB图..........................................................16
4软件设计...........................................................................17
4.14.24.34.4
主程序流程图.............................................................17 按键扫描子程序流程图......................................................18 温度程序流程图..........................................................19 湿度程序流程图..........................................................21
5调试结果与总结 ...............................................................21
6致谢..............................................................................22 参考文献.....................................................................23 程序清单.......................................................................24
1.绪论
1.1课题背景
温湿度是衡量温室大棚的重要指标,它直接影响到栽培作物的的生长和产量,为了能给作物提供一个合适的生长环境,首要问题是加强温室内的温湿度的检测, 但传统的方法是用与湿度表、毛发湿度表、双金属式测量计和湿度试纸等测试器材,通过人工进行检测,对不符合温度和湿度要求的库房进行通风、去湿和降温等工作。这种人工测试方法费时费力、效率低,且测试的温度及湿度误差大,随机性大。因此我们需要一种造价低廉、使用方便且测量准确的温湿度测量仪。该设计即是针对这一问题,设计出了能够实现温湿度自动检测,显示,上下限报警等多功能的温湿度监测控制系统。
1.2温湿度采集技术现状
在传统的温度测量系统设计中,往往采用模拟技术进行设计。传感器一般采用热电阻、热电偶等模拟器件,需要额外加补偿电路,安装复杂,成本较高。而且必须经过A/D转换后才可以被微处理器识别和处理。这样就不可避免地遇到诸如引线误差补偿、多点测量中的切换误差和信号调理电路的误差等问题;而其中某一环节处理不当,就可能造成整个系统性能的下降。而DS1820新型单总线数字温度传感器,采用3脚(或8脚)封装,从DS1820读出或写入数据仅需要一根I/O口线,而且测量精度达到12位,
[1]
最低精确到小数点后4位有效数字。用这种智能化数字式传感器的优胜显而易见。
现代湿度测量方案最主要的有两种:干湿球测湿法,电子式湿度传感器测湿法。下面对这两种方案进行比较:
干湿球湿度计的特点:
干湿球湿度计的准确度只有5%一7%RH。 干湿球测湿法采用间接测量方法,通过测量干球、湿球的温度经过计算得到湿度值,因此对使用温度没有严格,在高温环境下测湿不会对传感器造成损坏。干湿球测湿法的维护相当简单,在实际使用中,只需定期给湿球加水及更换湿球纱布即可。与电子式湿度传感器相比,干湿球测湿法不会产生老化,精度下降等问题。所以干湿球测湿方法更适合于在高温及恶劣环境的场合使用。 电子式湿度传感器的特点:
电子式湿度传感器的准确度可以达到2%一3%RH。电子式湿度传感器的精度水平要结合其长期稳定性去判断,一般说来,电子式湿度传感器的长期稳定性和使用寿命不如干湿球湿度传感器。湿度传感
[2]
器是采用半导体技术,因此对使用的环境温度有要求,超过其规定的使用温度将对传感器造成损坏。所以电子式湿度传感器测湿方法更适合于在洁净及常温的场合使用。
1.3预期目标
系统完成后可以通过温度传感器DB18B20和湿度传感器HS1101对大棚温室内的温湿度进行测量,通过单片机ATS52对采集到的数据进行处理,用LED显示出当前环境的温湿度状况,其中温度可以有操作人员根据不同作物所需的最适宜温度进行调节,当环境温度和设置的最适宜温度之差大于4℃时,报警装置即会启动,报警指示有蜂鸣器和发光二极管(红绿各一)构成。
1.4方案比较
当将单片机用作测控系统时,系统总要有被测信号懂得输入通道,由计算机拾取必要的输入信息。对于测量系统而言,如何准确获得被测信号是其核心任务;而对测控系统来讲,对被控对象状态的测试
1
和对控制条件的监察也是不可缺少的环节。
传感器是实现测量与控制的首要环节,是测控系统的关键部件,如果没有传感器对原始被测信号进行准确可靠的捕捉和转换,一切准确的测量和控制都将无法实现。工业生产过程的自动化测量和控制,几乎主要依靠各种传感器来检测和控制生产过程中的各种参量,使设备和系统正常运行在最佳状态,从而保证生产的高效率和高质量。
1.4.1温度传感器的选择
方案一:采用热电阻温度传感器。
热电阻是利用导体的电阻随温度变化的特性制成的测温元件。现应用较多的有铂、铜、镍等热电阻。其主要的特点为精度高、测量范围大、便于远距离测量。
铂的物理、化学性能极稳定,耐氧化能力强,易提纯,复制性好,工业性好,电阻率较高,因此,铂电阻用于工业检测中高精密测温和温度标准。缺点是价格贵,温度系数小,受到磁场影响大,在还原介质中易被玷污变脆。按IEC标准测温范围-200~650℃,百度电阻比W(100)=1.3850时,R0为100Ω和10Ω,其允许的测量误差A级为±(0.15℃+0.002 |t|),B级为±(0.3℃+0.005 |t|)。
铜电阻的温度系数比铂电阻大,价格低,也易于提纯和加工;但其电阻率小,在腐蚀性介质中使用稳定性差。在工业中用于-50~180℃测温。
方案二:采用DS18B20作为温度传感器。
DS18B20是由Dallas半导体公司生产的“一线总线”接口的温度传感器。一线总线结构具有简洁且经济的特点,可使用户轻松地组建传感器网络,从而为测量系统的构建引入全新概念,DS18B20的测温范围为-55℃~+125℃,在-10℃~+85℃范围内,精度为±0.0625℃,现场温度可直接通过“一线总线”以数字方式传输,大大提高了系统的抗干扰性。DS18B20适合于恶劣环境的现场温度测量,如环境控制、设备或过程控制、测温类消费电子产品等。它工作在3V~5.5V的电压范围,采用多种封装形式,从而使
[3]
系统设计更灵活、方便,设定分辨率及用户设定的报警温度存储在EEPROM中,掉电后依然保存。综合比较方案一与方案二,方案二更为适合于本设计系统对于温度传感器的选择。
1.4.2 湿度传感器的选择
测量空气湿度的方式很多,其原理是根据某种物质从其周围的空气吸收水分后引起的物理或化学性质的变化,间接地获得该物质的吸水量及周围空气的湿度。电容式、电阻式和湿涨式湿敏原件分别是根据其高分子材料吸湿后的介电常数、电阻率和体积随之发生变化而进行湿度测量的。
方案一:采用HOS-201湿敏传感器。
HOS-201湿敏传感器为高湿度开关传感器,它的工作电压为交流1V以下,频率为50HZ~1KHZ,测量湿度范围为0~100%RH,工作温度范围为0~50℃,阻抗在75%RH(25℃)时为1MΩ。这种传感器原是用于开关的传感器,不能在宽频带范围内检测湿度,因此,主要用于判断规定值以上或以下的湿度电平。然而,这种传感器只限于一定范围内使用时具有良好的线性,可有效地利用其线性特性。
方案二:采用HS1100/HS1101湿度传感器。
HS1100/HS1101电容传感器,在电路构成中等效于一个电容器件,其电容量随着所测空气湿度的增大而增大。不需校准的完全互换性,高可靠性和长期稳定性,快速响应时间,专利设计的固态聚合物结构,由顶端接触(HS1100)和侧面接触(HS1101)两种封装产品,适用于线性电压输出和频率输出两种电路,适宜于制造流水线上的自动插件和自动装配过程等。相对湿度在1%---100%RH范围内;电容量
[4]
由16pF变到200pF,其误差不大于±2%RH;响应时间小于5S;温度系数为0.04 pF/℃。可见精度是较高的。
综合比较方案一与方案二,方案一虽然满足精度及测量湿度范围的要求,但其只限于一定范围内使用时具有良好的线性,可有效地利用其线性特性。而且还不具备在本设计系统中对温度-30~50℃的要
2
求,因此,我们选择方案二来作为本设计的湿度传感器。
1.4.3显示模块
方案一:采用LCD液晶显示器显示。
它可视面积大,画面好,抗干扰能力强,可以节省软件中断资源,其缺点是显示内容需要存储字摸信息,需要一定存储空间。
方案二:采用LED数码管显示。
用发光二极管(简称LED)组成的字形来显示数字,七个条形发光二极管排列成七段组合字型,便构成了半导体数码管。半导体数码光分共阳极数码管和共阴极数码管,此次设计采用了共阴极数码管显示,即七个发光二极管的阴极连在一起接地。当共阴极数码管的某一阳极接高电平时,相应的二极管发
[5]
光,根据字形使某几段二极管发光,所以共阴极数码管需要输出高电平有效的译码器来驱动。基于以上所述,本设计采用方案二。图1-1为共阴数码管的内部结构图。
图1-1共阴极数码管内部结构图
1.4.4系统总体方框图
系统硬件设计的原理框图如图1-2所示:
3
湿度模块HS1101 温度模块DS18B20 单片机系统ATS52 显示与报警模块 按 键
图1-2 温度湿度测量系统框图
2.器件介绍
2.1温度传感器DS18B20介绍
测温元件采用新型的温度传感器DS18B20。DS18B20是由Dallas半导体公司生产的“一线总线”接口的温度传感器。一线总线结构具有简洁且经济的特点,可使用户轻松地组建传感器网络,从而为测量系统的构建引入全新概念,DS18B20的测温范围为-55℃~+125℃,在-10℃~+85℃范围内,精度为±0.0625℃,现场温度可直接通过“一线总线”以数字方式传输,大大提高了系统的抗干扰性。DS18B20适合于恶劣环境的现场温度测量,如环境控制、设备或过程控制、测温类消费电子产品等。它工作在3V~5.5V的电压范围,采用多种封装形式,从而使系统设计更灵活、方便,设定分辨率及用户设定的报
[3]
警温度存储在EEPROM中,掉电后依然保存。DS18B20的内部结构如图2-1所示:
预置 斜率累加器 计数比较器 低温度系数振荡器 减法计数器 预置 减至0 温度寄存器 高温度系数振荡器
减法计数器 4
减至0
图2-1 DS18B20内部结构图
温度测量原理电路如图2-2所示:
I/O VD1 内部 C VDD VD2 电源 检测 位ROM与单线 接口 暂存寄存器 寄存器与逻辑控制 温度传感器 高温触发器 低温触发器 8位CRC发生器
图2-2 温度测量原理电路
DS18B20主要由4部分组成:位ROM、温度传感器、非易失性温度报警触发器TH和TL、配置寄[5]
存器。DS18B20的封装形式及引脚排列如图2-3所示:
图2-3 DS18B20的引脚排列图
DS18B20有4个主要的数据部件:
(1)光刻ROM中的位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。
(2)DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制
5
补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。其中DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端(采用寄生电源供电方式时接地)。
表2-1 DS18B20温度数据表
TEMPERATURE DIGITAL OUTPUT (Binary) +125℃ +85℃ +25.0625℃ +10.125 +0.5℃ 0℃ -0.5℃ -10.125℃ -25.0625℃ -55℃ 0000 0111 1101 0000 0000 0101 0101 0000 0000 0001 1001 0001 0000 0000 1010 0010 0000 0000 0000 1000 0000 0000 0000 0000 1111 1111 1111 1000 1111 1111 0101 1110 1111 1110 0110 1111 1111 1100 1001 0000 DIGITAL OUTPUT (Hex) 07D0h 0550h 0191h 00A2h 0008h 0000h FFF8h FF5Eh FF6Eh FC90h
(3)DS18B20温度传感器的存储器
DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的EEPRAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。
(4)配置寄存器
该字节各位的意义如下:
表2-2 配置寄存器结构
TM R1 R0 1 1 1 1 1
低五位一直都是1,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出厂时该位被设置为0,用户不要去改动。R1和R0用来设置分辨率,如下表所示(DS18B20出厂时被设置为12位):
表2-3 分辨率设置
R1 0
R0 0 分辨率 9位 6
温度最大转换时间 93.75ms 0 1 1 1 0 1 10位 11位 12位 187.5ms 375ms 750ms
DSl8B20工作过程中的协议如下:
初始化:ROM操作命令;存储器操作命令;处理数据。 初始化
单总线上的所有处理均从初始化开始。 ROM操作命令
总线主机检测到DSl820的存在,便可以发出ROM操作命令之一,这些命令如
指令 代码 Read ROM(读ROM) [33H] Match ROM(匹配ROM) [55H] Skip ROM(跳过ROM] [CCH] Search ROM(搜索ROM) [F0H] Alarm search(告警搜索) [ECH] 存储器操作命令
指令 代码 Write Scratchpad(写暂存存储器) [4EH] Read Scratchpad(读暂存存储器) [BEH] Copy Scratchpad(复制暂存存储器) [48H] Convert Temperature(温度变换) [44H] Recall EPROM(重新调出) [B8H] Read Power supply(读电源) [B4H] 时 序
主机使用时间隙(time slots)来读写DSl820的数据位和写命令字的位 (1)初始化
时序见图2-4。主机总线to时刻发送一复位脉冲(最短为480us的低电平信号),接着在tl时刻释放总线并进入接收状态,DSl8B20在检测到总线的上升沿之后,等待15-60us,接着DSl8B20在t2时刻发出存在脉冲(低电平持续60-240us),如图中虚线所示。
[6]
15us-60us 480us 480us-950us 60us-240us
7 T0 tl t2 t3 t4
图2-4 主机读时序
(2)写时间隙
当主机总线to时刻从高拉至低电平时,就产生写时间隙,见图2.5、图2.6,从to时刻开始15us之内应将所需写的位送到总线上,DSl8B20在t0后15-60us间对总线采样。若低电平,写入的位是0,见图2-5;若高电平,写入的位是1,见图2-6。连续写2位间的间隙应大于1us。
T0 t1 t0 t1 >60us >1us >60us >1us 15us15us-60us 15us 45us
图2-5 DS18B20写0 图2-6 DS18B20写1
(3)读时间隙
见图2-7,主机总线to时刻从高拉至低电平时,总线只须保持低电平t0一t1。之后在t1时刻将总线拉高,产生读时间隙,读时间隙在t1时刻后t2时刻前有效。t2距to为15us,也就是说t2时刻前主机必须完成读位,并在to后的60us一120 us内释放总线。
>60us >1us 15us
主机工作 DS18B20工作 to t1 t2 t3
图2-7 主机读时序
2.2湿度传感器HS1101介绍
测量空气湿度的方式很多,其原理是根据某种物质从其周围的空气吸收水分后引起的物理或化学性质的变化,间接地获得该物质的吸水量及周围空气的湿度。电容式、电阻式和湿涨式湿敏原件分别是根据其高分子材料吸湿后的介电常数、电阻率和体积随之发生变化而进行湿度测量的。下面 介绍HS1101湿度传感器及其应用。
特点是不需校准的完全互换性,高可靠性和长期稳定性,快速响应时间,专利设计的固态聚合物结构,由顶端接触(HS1100)和侧面接触(HS1101)两种封装产品,适用于线性电压输出和频率输出两种
[7]
电路,适宜于制造流水线上的自动插件和自动装配过程等。
图2-8为湿敏电容工作的温、湿度范围。图2-9为湿度-电容响应曲线。
8
10075长期稳定区50250-40-2002040温度 /℃60正常工作区200非正常区19018017016002040608080100
相对湿度/%RH
图2-8湿敏电容工作的温、湿度范围 图2-9湿度-电容响应曲线
相对湿度在1%---100%RH范围内;电容量由16pF变到200pF,其误差不大于±2%RH;响应时间小于5S;温度系数为0.04 pF/℃。可见精度是较高的。
HUMIREL 湿度传感器 HS1101/HS1100基于独特工艺设计的电容元件,这些相对湿度传感器可以大批量生产。可以应用于办公自动化,车厢内空气质量控制,家电,工业控制系统等。在需要湿度补偿的场合他也可以得到很大的应用。 HS1101的外部结构及符号如图2-10所示:
图2-10 HS1101的外部结构及符号
为空气湿度与电压频率的典型值如表2-4所示:
表2-4空气湿度与电压频率的典型值
9
湿度%RH01020304050
频率HZ735172247100697668536728 湿度%RH60708090100频率HZ660068633061686033
HS1101的特性参数如表2-5所示:
表2-5 HS1101的特性参数
HS1100/HS1101电容传感器,在电路构成中等效于一个电容器件,其电容量随着所测空气湿度的增大而增大。如何将电容的变化量准确地转变为计算机易于接受的信号,常有两种方法:一是将该湿敏电容置于运放与阻容组成的桥式振荡电路中,所产生的正弦波电压信号经整流、直流放大、再A/D转换为数字信号;另一种是将该湿敏电容置于555振荡电路中,将电容值的变化转为与之成反比的电压频率信
[8]
号,可直接被计算机所采集。
本系统采用的是将HS1101接入555定时器组成的震荡电路中,输出一定频率的方波信号,这种方法结构简单,使用方便,因此被广泛采用,具体结构图如2-11下:
10
图2-11 HS1101和NE556构成的湿度采集电路
集成定时器NE555一方面可以形成单稳态电路,另一方面可以形成多谐振荡电路,本系统选用的是NE556,它内部含有两个NE555定时器,其中R1,R2,C1,C2和NE556构成多谐振荡器,外接电阻R1,R2和湿敏电容C1构成了对湿敏电容C1的充电回路,7端通过芯片内部的晶体管对地短路又构成了对C1的放电回路,并将2,6端相连引入到片内比较器,。该振荡电路的两个暂稳态过程交替如下:首先是电源Ucc通过R1,R2向C2充电,经T1充电时后,Uc2充至内比较器的高触发电平,约2/3Ucc,此时输入引脚3端由高电平突降为低电平,然后通过R2放电,经T2放电时间后,Uc2下降到比较器的低触发电平,约1/3Ucc,此时输入引脚3端又由低电平跃升为高电平,如此反复,形成方波输出,其中充放电时间为:
T1=C1(R1+R2)ln2 T2=C1R2ln2
因而输出的方波频率为:f=1/(t1+t2)=1/C1(R1+2R2)ln2=50HZ 只要改变定时元件R1和R2就可以改变脉冲的频率,从多谐振荡器出来的信号又接入到单稳态触发器,单稳态触发器它有两个触发状态,一个稳定状态,一个暂稳定状态,在外来触发脉冲作用下,能够由稳定状态翻转到暂稳定状态,而暂稳定状态维持一段时间后,再自动的返回到稳定状态,且暂稳定状态持续时间长短取决与电路本身参数,图中,R3,C3和传感器HS1101是外接地定时元件,触发脉冲Ui由5端输出,由8端输入,下降沿有效,从9端输出一个幅度,宽度都一定的矩形波信号,输出的脉冲宽度Tp为:
Tp=R3(C2+Cx)ln3
虽然从NE556输出的是标准的脉冲信号,为了减少外界对信号的干扰,设计中采用低通滤波器,过滤掉高频信号的干扰,然后直接用单片机的定时计数器T0来测量Tp的脉宽,通过脉宽值,我们可以得到相应的传感器电容值,知道了传感器的电容值,我们就可以分析电容与湿度的关系,下图为HS1101的典型输出曲线,相对湿度在1%-99%RH之间,电容量由163pf变化到202pf,其误差不大于±2%RH,响应时间小于5S,温度系数为0.04pf/℃。HS1101的典型输出曲线如图2-12所示:
11
图2-12 HS1101的典型输出曲线
根据HS1101的典型输出曲线,以及传感器的相关资料,我们可以得到电容值与湿度值的近似关系为:RH≈(Cx-163)/0.39
我们可以根据前面测量出的NE556输出的脉宽值,求出相应的电容值,再根据上式,我们就可以由相应的电容值求出湿度值。
2.3 单片机ATS52介绍 2.3.1 内部结构、资源
ATS52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得ATS52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。其内部主要由CPU、RAM、ROM、通用I/O及总线构成,内部结构图如2-13所示:
程序存储器 8051 数据存储器 定时计数器 数据 总线 地址 总线 控制 总线 时钟 并行I/O口 串行通信口 中断系统 图2-13 内部结构
12
CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器; RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据; ROM:用以存放程序、一些原始数据和表格;
ATS52具有以下标准功能: 8k字节Flash,256字节RAM,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,ATS52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,
[9]
单片机一切工作停止,直到下一个中断或硬件复位为止。
2.3.2 机器周期和指令周期
(1) 振荡周期: 也称时钟周期, 是指为单片机提供时钟脉冲信号的振荡源的周期。 (2) 状态周期: 每个状态周期为时钟周期的 2 倍, 是振荡周期经二分频后得到的。
(3) 机器周期: 一个机器周期包含 6 个状态周期S1~S6, 也就是 12 个时钟周期。在一个机器周期
内, CPU可以完成一个的操作。
(4) 指令周期: 它是指CPU完成一条操作所需的全部时间。 每条指令执行时间都是有一个或几个机
器周期组成。MCS - 51 系统中, 有单周期指令、双周期指令和四周期指令。
3硬件设计
3.1总电路图
总电路图如图3-1所示:
图3-1 总电路原理图
3.2 温度测量电路
温度测量采用DS18B20,它是单线传输器件,不需校正温宿,接口接的是P2.0,具体的温度测量电
13
路如图3-2所示:
图3-2 温度测量电路
3.3湿度测量电路
湿度测量用的是HS1101电容式器件,他与NE556组成一方波发生电路,湿度改变对应频率的变化,用单片机采集频率值进行转化得出湿度值,具体的湿度测量电路如图3-3所示:
图3-3 湿度测量电路
3.4数码管显示电路
八位数码管采用动态显示方式,动态显示可节省端口,方便连接,由于每个数码管处于轮流导通的状态,因此,每次只有一个数码管点亮,比静态数码管可省电。数码管显示电路如图3-4所示:
14
图3-4 数码管显示电路
3.5 系统的PCB图
系统总的PCB图如图3-5所示:
图3-5 系统的PCB图
4软件设计
4.1主程序流程图
系统主程序流程图如图4-1所示:
15
开始 初始化单片机 读取温度数据 初始化DS18B20 读取湿度数据 初始化HS1101 初始化LED 图4-1 系统主程序流程图
4.2按键扫描子程序流程图
按键扫描子程序流程图如图4-2所示:
16
显示 返回
KEY1键按下Y 设定温度值加1 N KEY2键按下 Y 设定温度值减1 N 检测到温度在正常范围 Y 正常工作指示灯工作 N 检测到温度不在正常范围 Y 异常指示灯工作蜂鸣器报警 N 图4-2 按键扫描子程序流程图
4.3温度程序流程图
17
温度报警程序流程图如图4-2所示:
开始
总线复位 跳过ROM 所有ds18b20 开始温度转换 延时1秒
设置匹配ROM
发送ROM编号
开始温度转换
Y 是否超
温度?
N
显示温度 报警
N 所有读取完毕 ?
Y
图4-2 温度报警流程图
[10]
温度显示模块程序流程图如图4-3所示[11]:
18
开始 初始化DS18B20 读DS18B20的序列号 Y 检测DS18B20存在? N 发送跳过ROM指令 温度转换 I=1,等待 DS18B20复位 发送DS18B20编码 读取温度数据 图4-3 温度显示程序流程图
19
4.4湿度程序流程图
湿度测量部分程序流程图如图4-4所示
[12]
:
湿度处理函数 定时器0、1初始化 定时器设置50mS定时,启动定时器中断 N 是否中断60次,即3S? Y 读取定时器计数值 对计数值求算法得出湿度值,保存,以便显示调用 重新设置定时器,计数从头来过,等待3S后下一次结果 函数返回
图4-4 湿度测量部分程序流程图
5调试结果与总结
经过反复调试,温湿度能够正常显示当前值,而且最佳适宜温度值可以有操作人员根据不同作物
的需求进行设定,在当前温度偏离所设定的适宜温度±3℃时,报警装置发光二极管和蜂鸣器即会启动,
20
该系统基本实现了对温湿度的测量与显示,操作人员可以根据显示指示,来判断当前温湿度是否对作物生长有利。
该系统的不足之处在于没能够实现温湿度的自动调节,由于时间仓促和本人知识有限,在设计原理图时,没考虑清楚显示位数,以至该系统无法显示设定湿度,该系统可以进一步加入温湿度自动调节电路,在当前温湿度超出作物所需的最适宜条件时,启动温湿度调节装置,就可以真正的实现温湿度的自动控制。
为了验证本系统的准确性,条件有限以至于湿度测量无法验证其准确性,在调试时只对环境温度做了十次测量,时间间隔为一个小时,并与温度计所测量的温度值做了比较。记录如表5-1所示:
表5-1 温度测量比较表
测量次数 1 2 3 4 5 6 7 8 9 10 测量值(℃) 27.0 26.5 26.8 25.5 26.9 25.2 25.8 27.0 26.5 25.2 温度计显示值(℃) 27.2 26.4 26.9 25.8 27.0 25.0 26.2 26.7 26.4 25.0 相对误差(℃) 0.2 0.1 0.1 0.3 0.1 0.2 0.4 0.3 0.1 0.2 引起误差的原因,一方面可能是由于受到其他电路的干扰,另一方面可能就是读数估读造成的误差。
程序清单
/***************************************************/ #include \"reg52.h\"
#include \"intrins.h\" //_nop_();延时函数用 #define Disdata P1 //段码输出口 #define uchar unsigned char #define uint unsigned int unsigned int S,G,TH,RS;
unsigned char B1,B2,B3;//定义数的各位数,分别为百,十,个位 uint number;
unsigned char num=0;
sbit DQ=P2^0; //温度输入口 sbit DIN=P1^7; //LED小数点控制 sbit LED1=P2^5; sbit LED2=P2^7;
sbit BEEP=P2^1; sbit key1=P2^2; sbit key2=P2^3; sbit S1=P0^0; sbit S2=P0^1; sbit S3=P0^2;
21
sbit S4=P0^3; sbit S5=P0^4; sbit S6=P0^5; sbit S7=P0^6; sbit S8=P0^7; uint h,T; uint temp;
//**************温度小数部分用查表法***********// uchar code ditab[16]=
{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}; //
uchar code dis_7[ ]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阳LED段码表 \"0\" \"1\" \"2\" \"3\" \"4\" \"5\" \"6\" \"7\" \"8\" \"9\" uchar data temp_data[2]={0x00,0x00}; //读出温度暂放
uchar data display[4]={0x00,0x00,0x00,0x00}; //显示单元数据,共3个数据和一个运算暂用 /*****************11us延时函数*************************/ void del10ms() {
uint a,b;
for(a=40;a!=0;a--) for(b=248;b!=0;b--); }
void delay(uint t) {
for (;t>0;t--); }
/*******************************************************/
void timer0()interrupt 1 {
TH0=0x3C;
TL0=0xB0;//定时50ms
num++;//记到20就直接停止 }
/*******************************************************/
void scankey() {
if ( key1==0) {
del10ms(); if(key1==0)
22
{ TH++; } }
if (key2==0) {
del10ms(); if(key2==0) { TH--; } }
T=display[2]*10+display[1];
if ((TH-3) if((T /****************显示扫描函数***************************/ scan() { S=TH/10; G=TH%10; S8=1;S7=1;S6=1;S5=0;S4=1;S3=1;S2=1;S1=1; Disdata=dis_7[display[2]]; delay(200); Disdata=0x00; S8=1;S7=1;S6=0;S5=1;S4=1;S3=1;S2=1;S1=1; Disdata=dis_7[display[1]]; DIN=1; delay(200); Disdata=0x00; 23 S8=1;S7=0;S6=1;S5=1;S4=1;S3=1;S2=1;S1=1; Disdata=dis_7[display[0]]; delay(200); Disdata=0x00; S8=0;S7=1;S6=1;S5=1;S4=1;S3=1;S2=1;S1=1; Disdata=dis_7[S]; delay(200); Disdata=0x00; S8=1;S7=1;S6=1;S5=1;S4=1;S3=1;S2=1;S1=0; Disdata=dis_7[G]; delay(200); Disdata=0x00; S8=1;S7=1;S6=1;S5=1;S4=1;S3=1;S2=0;S1=1; Disdata=dis_7[B1]; delay(200); Disdata=0x00; S8=1;S7=1;S6=1;S5=1;S4=1;S3=0;S2=1;S1=1; Disdata=dis_7[B2]; DIN=1; delay(200); Disdata=0x00; S8=1;S7=1;S6=1;S5=1;S4=0;S3=1;S2=1;S1=1; Disdata=dis_7[B3]; delay(200); Disdata=0x00; } /****************DS18B20复位函数************************/ ow_reset(void) { char presence=1; while(presence) { while(presence) { DQ=1;_nop_();_nop_();//从高拉倒低 DQ=0; delay(50); //550 us DQ=1; delay(6); //66 us presence=DQ; //presence=0 复位成功,继续下一步 } delay(45); //延时500 us presence=~DQ; } 24 DQ=1; //拉高电平 } /****************DS18B20写命令函数************************/ //向1-WIRE 总线上写1个字节 void write_byte(uchar val) { uchar i; for(i=8;i>0;i--) { DQ=1;_nop_();_nop_(); //从高拉倒低 DQ=0;_nop_();_nop_();_nop_();_nop_(); //5 us DQ=val&0x01; //最低位移出 delay(6); //66 us val=val/2; //右移1位 } DQ=1; delay(1); } /****************DS18B20读1字节函数************************/ //从总线上取1个字节 uchar read_byte(void) { uchar i; uchar value=0; for(i=8;i>0;i--) { DQ=1;_nop_();_nop_(); value>>=1; DQ=0;_nop_();_nop_();_nop_();_nop_(); //4 us DQ=1;_nop_();_nop_();_nop_();_nop_(); //4 us if(DQ)value|=0x80; delay(6); //66 us } DQ=1; return(value); } /****************读出温度函数************************/ // read_temp() { ow_reset(); //总线复位 delay(200); write_byte(0xcc); //发命令 25 write_byte(0x4e); write_byte(TH); //发命令 write_byte(RS); delay(200); ow_reset(); write_byte(0xcc); //发命令 write_byte(0x44); delay(200); ow_reset(); write_byte(0xcc); //发命令 write_byte(0xbe); temp_data[0]=read_byte(); //读温度值的第字节 temp_data[1]=read_byte(); //读温度值的高字节 temp=temp_data[1]; temp<<=8; temp=temp|temp_data[0]; // 两字节合成一个整型变量。 return temp; //返回温度值 } // /****************温度数据处理函数************************/ //二进制高字节的低半字节和低字节的高半字节组成一字节,这个 //字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩 //下的低字节的低半字节转化成十进制后,就是温度值的小数部分 /********************************************************/ work_temp(uint tem) { if(tem>6348) // 温度值正负判断 {tem=65536-tem;} // 负温度求补码,标志位置1 display[3]=tem&0x0f; // 取小数部分的值 display[0]=ditab[display[3]]; // 存入小数部分显示值 display[3]=tem>>4; // 取中间八位,即整数部分的值 display[2]=display[3]%100/10; // 取十位数据暂存 display[1]=display[3]%100%10; } /****************主函数************************/ main() { Disdata=0x00; //初始化端口 TH=24; BEEP=1; LED1=1; LED2=1; TMOD=0x51;//T0 记时 T1计数 26 TH0=0x3c;//定时50ms TL0=0xB0; TH1=0x00;//计数 TL1=0x00; TR0=1; //开T0 TR1=1;//开T1 ET0=1;//开中断 EA=1;//打开总中断 ow_reset(); //开机先转换一次 write_byte(0xcc); //Skip ROM write_byte(0x44); //发转换命令 while(1) { if(num>=60) {//记满一秒 number=TH1*256+TL1; number=25000/(number-500); B1=number%1000/100;//百位 B2=number%100/10;//十位 B3=number%100%10;//个位 num=0; TMOD=0x51;//T0 记时 T1计数 TH0=0x3c;//定时50ms TL0=0xB0; TH1=0x00;//计数 TL1=0x00; TR0=1; //开T0 TR1=1;//开T1 ET0=1;//开中断 EA=1;//打开总中断 } work_temp(read_temp()); //处理温度数据 scankey(); scan(); //显示温度值 } } // //***********************结束**************************// 27 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务