非接触式的红外测温系
统设计方案
1红外测温系统的设计背景
随着现代科学技术的发展,传统的接触式测温方式以不能满足现代一些领域的测温需求,对非接触、远距离测温技术的需求越来越大。本红外测温系统设计的出发点也正是基于此。
1.1单片机发展历程
,是因为它最早被用在工业控制领域。单片机也被称为微控制器(Microcontroller)
单片机由芯片内仅有CPU的专用处理器发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。INTEL的Z80是最早按照这种思想设计出的处理器,从此以后,单
早期的单片机都是8 位或4位的。其中最成功的是INTEL的8031,因为简单可靠而片机和专用处理器的发展便分道扬镳。
产品大发展,单片机技术得到了巨大提高。随着INTELi960 系列特别是后来的ARM 系
列的广泛应用,32位单片机迅速取代16位单片机的高端地位,并且进入主流市场。而传统的8位单片机的性能也得到了飞速提高,处理能力比起80年代提高了数百倍。目前,高端的32位单片机主频已经超过300MHz,性能直追90年代中期的专用处理器,而普通的型号出厂价格跌落至1美元,最高端的型号也只有10美元。当代单片机系统已大量专用的嵌入式操作系统被广泛应用在全系列的经不再只在裸机环境下开发和使用,单片机上。而在作为掌上电脑和手机核心处理的高端单片机甚至可以直接使用专用的Windows和Linux操作系统。
单片机比专用处理器更适合应用于嵌入式系统,因此它得到了最多的应用。事实上单片机是世界上数量最多的计算机。现代人类生活中所用的几乎每件电子和机械产品中都会集成有单片机。手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电脑配件中都配有1-2部单片机。而个人电脑中也会有为数不少的单片机在工作。汽车上一般配备40多部单片机,复杂的工业控制系统上甚至可能有数百台单片机在同时工作!单片机的数量不仅远超过PC机和其他计算的总和,甚至比人类的数量还要多。
单片机是一种在线式实时控制计算机,在线式就是现场控制,需要的是有较强的抗干扰能力,较低的成本,这也是和离线式计算机的(比如家用PC)的主要区别。单片机芯片单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,这是别的器件需要费很大力气才能做到的,有些则是花大力气也很难做到的。一个不是很复杂的功能要是用美国50年代开发的74系列,或者60年代的CD4000系列这些纯硬件来搞定的话,电路一定是一块大PCB板!但是如果要是用美国70年代成功投放市场的系列单片机,结果就会有天壤之别!只因为单片机的通过你编写的程序可以实现高智能,高效率,以及高可靠性!
1.2体温计的发展历程
体温计又称“医用温度计”。体温计的工作物质是水银。它的液泡容积比上面细管的容积大的多。泡里的水银由于受到体温的影响,产生微小的变化,水银体积的膨胀,使管内水银柱的长度发生明显的变化。人体温度的变化一般在35℃到42℃之间,所以体温计的刻度通常是35℃到42℃,而且每度的范围又分成为10份,因此体温计可精确到1/10度。体温计是一种最高温度计,它可以记录这温度计所曾测定的最高温度。用后的体温计应“回表”,即拿着体温计的上部用力往下猛甩,可使已升入管内的水银,
区别。第一个体温计是伽利略在16世纪时发明的。但直到300年后才设计出使用方便、
重新回到液泡里。其它温度计绝对不能甩动,这是体温计与其他液体温度计的一个主要
性能可靠的体温计。
得用力甩动体温计,使水银回到水银球内。
体温计是在温度计的基础上研制成功的。1714年,德国物理学家华伦海特研制了在水的冰点和人的体温范围内设定刻度的水银体温计。1742年又发明了0~100°的摄氏温标,从此实现了体温计的刻度标准化。1714年,加布里埃尔•华伦海特1868年,文德利希这位德国教授出版了《疾病与体温》一书,书中记载了2.5万例病人的体温变化,而他所使用的体温计的大小是奥尔伯特体温计的两倍,每次要花20分钟的时间来记录体温!
1980年前后,发明了会说话的体温计。膜状液晶体温计在体温正常时呈现绿色,低烧呈现黄色,高烧呈现红色。
特点是储存水银的细管里1865年,英国的阿尔伯特发明了一种很有特色的体温计,
有一狭道,当体温计接触人体后,水银很快升到人体实际体温处,取出后水银柱不下降,而是在狭道处断开,使狭道以上部分始终保持体温度数。这种温度计受到了临床的欢迎和普及应用。
1988 年,出现了电子呼吸脉搏体温计,可以进行遥测。
到了现代,开始流行使用电子体温计。电子体温计分为实测式电子温度计和预测式电子体温计两种,可通过数字观看,比较方便。
红外线体温计在“非典”流行期间曾广泛使用,分为耳式红外线体温计和红外线前额测温仪,测定时间为1-3秒,快速、安全。
液晶体温计是21世纪新产品,利用液晶制成的温度计,测腋窝仅用4-5秒,准确、安全,但价位高。
2 红外测温技术简介
红外测温技术在生产过程中,在产品质量控制和监测,设备在线故障诊断和安全保护以及节约能源等方面发挥了着重要作用。
2.1温度测量技术的概述
普通温度测量技术经过相当长时间的发展已近于成熟。目前,随着经济的发展日益需要的是在特殊条件(如高温、强腐蚀、强电磁场条件下或较远距离)下的温度测量技术。因此,当前研究的重点也在于此。
非接触式红外测温也叫辐射测温,一般使用热电型或光电探测器作为检测元件。此
量;可以是便携式,也可以是固定式,并且使用方便;它的制造工艺简单,成木较低,测温时不接触被测物体,具有响应时间短、不干扰被测温场、使用寿命长、操作方便等
温度测量系统比较简单,可以实现大面积的测温,也可以是被测物体上某一点的温度测
蒸气等外界因素的影响,其测量误差较大。量中要使用红外温度传感器,大面积温度测量也可使用红外温度传感器。本设计正是采用红外温度传感器这种温度测量技术,它具有温度分辨率高、响应速度快、不扰动被测目标温度分布场、测量精度高和稳定性好等优点;另外红外温度传感器的种类较多,发展非常快,技术比较成熟,这也是本设计采用红外温度传感器设计非接触温度测量系统的主要原因之一。
2.2红外测温原理
红外测温仪的测温原理是黑体辐射定律,众所周知,自然界中一切高于绝对零度的物体都在不停向外辐射能量,物体的向外辐射能量的大小及其按波长的分布与它的表面温度有着十分密切的联系,物体的温度越高,所发出的红外辐射能力越强。
黑体的光谱辐射出射度由普朗克公式确定,即:
M | | | C 1 | | | | 1 | | |
| | | | | e | C 2 / | | | 1 |
在不同温度下的黑体光谱辐射度如图2.1。
(2-1)
图2.1不同温度下的黑体光谱辐射度
从图2.1可以看出黑体辐射具有几个特征:
(1)在任何温度下,黑体的光谱辐射度都随着波长连续变化,每条曲线只有一个极大值;
(2)随着温度的升高,与光谱辐射度极大值对应的波长减小。这表明随着温度的升高,黑体辐射中的短波长辐射所占比例增加;
(3)随着温度的升高,黑体辐射曲线全面提高,即在任一指定波长处,与较高温度相应的光谱辐射度也较大,反之亦然。
通过测量物体在一定波长下的单色辐射亮度来确定它的亮度温度的称为亮度测温法;通通过测量辐射物体的全波长的热辐射来确定物体的辐射温度的称为全辐射测温法;
2.3红外测温的方法
必须选择适当波段,使波段的发射率相差不大。本文选用全辐射测温法来计算被测量物体的温度,全辐射测温法是根据所有波长范围内的总辐射而定温,得到的是物体的辐射温度。选用这种方法是因为中低温物体的波长较大,辐射信号很弱,而且结构简单,成本较低。
由普朗克公式可推导出辐射体温度与检测电压之间的关系式:
V=RaεσT4=KT4(2-2)式中K=Raεσ,由实验确定,定标时ε取1
T—被测物体的绝对温度
R——探测器的灵敏度
a——与大气衰减距离有关的常数
ε——辐射率
σ——斯蒂芬—玻耳兹曼常数
因此,可以通过检测电压而确定被测物体的温度,上式表明探测器输出信号与目标温度呈非线性关系,V与T的四次方成正比,所以要进行线性化处理。线性化处理后得到物体的表观温度,需进行辐射率修正为真实温度,其校正式为:
T | | 4 | Tr | (2-3) |
( ) |
式中Tr——辐射温度(表观温度)
ε(T)——辐射率,取0.1~0.9
由于调制片辐射信号的影响,辐射率修正后的真实温度为高于环境的温度,还必须作环温补偿,即真实温度加上环温才能最终得到被测物体的实际温度。
3红外测温系统的总体方案选择
本设计是软硬件的综合体,每一个模块的选择都会对整个系统产生影响,选择的硬件模块好坏决定了本设计所能达到的高度,所以对比较重要的模块必须要通过对比选择,扬长避短。
3.1重要模块的方案对比与选择
3.1.1温度传感器的选择
号处理电路以及环境温度补偿电路的多用途红外温度测量系统,它属于工业测温传感器。 方案一:采用红外线温度传感器IRTP。IRTP系列红外测温系统是一种集成专用信
来的一种新型高灵敏度探测元件。化,并将其转换成电压信号输出。但这个电压信号需要加以放大和加驱动控制电路。硬不能用作人体测温,故不选用此方案。
件上的复杂性决定了它的稳定性不高,且容易出故障,故也不选此方案。
方案三:采用凌阳公司生产的型号为TN9红外温度传感器,它是一种集成的红外探测器,内部有温度补偿电路和线性处理电路,输出数字信号,它的响应速度快、精度高、稳定性好,故选择此方案。
3.1.2无线传输模块选择
方案一:采用PT2262/2272加无编码的发射与接收头,该电路采用超再声发射电路,采用315MHZ的发射频率,虽然发射距离远,但要求供电电压高更多的是适合在遥控方面,而在传输数据时却容易出错。故不选择此方案。
方案二:低功耗CC1100E是一款Sub-GHz高性能射频收发器,提供对数据包处理、数据缓冲、突发传输、空闲信道评估、链路质量指示以及无线唤醒的广泛硬件支持。具有高灵敏度、低电流消耗、支持频率下高达+10dBm的可编程输出功率、1.2到500kBaud的可编程数据速率等特点,非常合适中短距离的数据传输,所以选择此方案。3.1.3显示模块的选择
方案一:使用数码管显示。数码管具有耗能低、电压低、寿命长、对外界环境要求低,易于维护等优点,其电路复杂,占用资源较多,显示信息少,不宜显示大量信息。
方案二:我们设计的系统需要显示的信息直观,所以应选用显示功能更好的液晶显示,要求能显示更多的数据,增加显示信息的可读性,看起来更方便。而液晶LCD1602有明显的优点:微功耗,尺寸小,超薄轻巧,显示信息量大,字迹美观,视觉舒适,而且容易控制。所以选择方案二。
3.2芯片和组态王介绍
综合了各个方案的对比,我得出了本系统的最终方案,在主从处理器方面选择STC89C51单片机,红外模组TN_9作为测温模块,用LCD1602为本系统的显示部分,通过CC1100E无线收发模块把测得的温度值传到从处理器并通过从处理器串口经RS232电平转换模块传到上微机软件组态王Kingview做各种数据的后台处理。
3.2.1主从控制器STC89C51
单片机作为红外测温系统的核心处理部件,它关系到整个系统的性能指标。因此它的选择是非常重要的。本测温系统选择的STC89C51RC单片机,下面是STC89C51RC单片机相关资料信息:
8051 单片机,指令代码完全兼容传统8051单片机,12 时钟/机器周期和6时钟/机器周期可任意选择,最新的D版本内部集成MAX810专用复位电路。STC89C51RC系列单片机
STC89C51RC单片机是宏晶科技推出的新一代超强抗干扰/高速/低功耗的新一代
在用户的目标系统上将程序直接下载进单片机看运行结果,故无须仿真器,图3.1为此单片机的引脚图。
图3.1STC89C51RC 单片机引脚图
STC89C51RC 单片机的特点:
(1)增强型6时钟/机器周期,12时钟/机器周期8051CPU;
(2)工作电压:5.5v-3.8v; (3)工作频率范围:0-40MHz,相当于普通8051的0~80M,实际工作频率可达
48MHz;
(6)ISP/IAP,无须专用编程器/仿真器;
(7)通用I/O口,复位后:P1/P2/P3/P4是准双向口/弱上拉,P0口开漏输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时需加上拉电阻;
(8)EEPROM功能;
(9)看门狗;
(10)内部集成MAX810专用复位电路(外部晶体20M以下时,可省复位电路)。 (11)共3个16 位定时器/计数器,定时器0还可以当成2 个8位定时器使用; (12)外部中断4路,下降沿中断或低电平触发中断,PowerDown模式可由外部中断低电平触发中断方式唤醒;
(13)超低功耗,正常工作模式,典型功耗2mA;掉电模式,典型功耗0.5uA,可由外部中断唤醒,中断返回后,继续执行原程序;
(14)2个数据指针;
(15)通用异步串行口(UATR),还可用定时器软件实现多个UATR;
(16)工作温度范围:0-75℃/-40~+85℃;
(17)封装形式:PDIP-40/PLCC-44/PQFP-44。
STC89C51各引脚的功能描述如下:
(1)电源和晶振:VCC、VSS——运行和程序校验时加的电压;
XTAL1——输入到振荡器的反向放大器;
XTAL2——反向放大器输出,输入到内部时钟发生器(2)RST:单片机的上电复位或掉电保护端;
(3)ALE:地址锁存有效信号输出端;
(4) | PSEN | :片外程序存储器读选通信号输出端。 |
3.2.2红外模组TN_9
面对目前众多的红外检测器件产品,在设计中选择合适的红外检测器已成为一个重要问题。在设计过程中选择红外线检测器件时,首先考虑的是器件的以下性能因素:光谱响应范围、响应速度、有效检测面积、元件数量、制冷方式和检测目标的温度。
凌阳公司生产的型号为TN9的红外探测器作为测温模块,它是一种集成的红外探测器,内部有温度补偿电路和线性处理电路,因此简化了本系统的设计。
它的测量距离大约为30米,测量回应时间大约为0.5秒。而且它具备SPI接口,
可以很方便地与单片机(MCU)传输数据。其引脚如图3.2。
脚;A 为测温启动信号引脚,低电平有效。
TN_9红外测温模块的时序如图3.3所示,在CLOCK的下降沿时接收数据。(例:如果一次温度测量需接收5个字节的数据,这5个字节中:Item为0x4c表示测量目标温度,为0x6c表示测量环境温度;MSB为接收温度的高八位数据;LSB为接收温度的低八位数据;Sum为验证码,接收正确时Sum=Item+MSB+LSB;CR为结束标志,当CR为0xodH时表示完成一次温度数据接收。)
图3.3TN_9 模块的时序图
红外测温模块温度值的计算:
以上面的例子:无论测量环境温度还是目标温度,只要检测到Item为0x4cH或者0x66H同时检测到CR为0x0dH,他们的温度的计算方法都相同。
计算公式:目标温度/环境温度=Temp/16-273.15 (3-1)
得的温度值为5162/16-273.15=39.475℃. 3.2.3 无线收发CC1100E
CC1100E是一款Sub-GHz高性能射频收发器,设计旨在用于极低功耗RF应用。其主要针对工业、科研和医疗(ISM)以及470-510MHz和950-960MHz频带的短距离无线通信设备(SRD)。CC1100E特别适合于那些针对日本ARIBSTD-T96标准和中国470-510MHz短距离通信设备的无线应用。
CC1100E主要的应用范围有:
(1)运行于470/950MHzISM/SRD 频带的超低功耗无线应用;(2)无线传感网络;
(3)家庭和楼宇自动化;
(4)高级抄表架构(AMI);
(5)无线计量;
(6)无线告警和安全系统;
图3.4CC1100E的简化结构图
CC1100E具有一个低功耗IF接收机。在图3.4中,低噪声放大器(LNA)将接收到的RF信号放大,并在求积分(I和Q)过程中被降压转换至中频(IF)。在IF下,I/Q信号被ADC数字化。自动增益控制(AGC)、精确信道滤波和调制解调位/数据包同步均以数字方式完成。
CC1100E的发送器部分基于RF频率的直接合成。频率合成器包括一个完全片上LCVCO和一个90度相位转换器,以在接收模式下向降压转换混频器生成I和QLO信号。将一个晶
据包处理以及数据缓冲的支持。
图3.5CC1100E的复位时序
在图3.5中,CC1100E全局复位方法使用SRES指令选通脉冲。通过发出这种选通脉冲,所有内部寄存器和状态均被设置为默认值,即IDLE状态。
(1)设置SCLK=1和SI=0,以避免引脚控制模式下潜在的问题。
(2)选通脉冲CSn低电平/高电平。
(3)保持CSn为低电平,随后为高电平,保持CSn为高电平至少持续40μs。
(4)拉低CSn,等待SO变低(CHIP_RDYn)。
(5)通过SI线发送SRES选通脉冲。
(6)当SO再次变低时,复位完成,芯片处于IDLE状态。
图3.8配置寄存器的读写操作
如图3.8所示,CC1100E通过一个简单的4-线SPI兼容接口(SI、SO、SCLK和CSn)便可对CC1100E进行配置,此时CC1100E为从属器件。该接口还可以用于读取和写入缓冲数据。SPI接口上的所有数据传输均以最高位开始。SPI接口上的所有事务均以一个报头
(A5–A0)。在SPI总线上传输数据期间,CSn引脚必须保持低电平。在传输报头字节或读
字节作为开始,该字节包含一个R/W;¯bit,一个突发存取位(B),以及一个6位地址
/写寄存器期间,如果CSn电平升高,那么传输就会被取消。图3-7显示了SPI接口上地址
状态,否则SO引脚总会在CSn变为低电平以后立即变为低电平。3.2.4 电平转换芯片MAX232
MAX232C是RS232与TTL电平之间进行电平转换的工具芯片,它是MAXIM公司生产、包括两路接收器和驱动器的IC芯片,适用于各种EIA-232C和V.28/V.24的通信接口。MAX232C芯片内部有一个电压变换器,
可以把输入的+5V电源电压变换成为RS232所输出电平所需的电压。所以,采用此芯片的串行通信系统只需单一的+5V电源就可以了,如图3.9。
图3.9MAX232引脚图
MAX232C内部结构:
(1)电荷泵电路。由1、2、3、4、5、6脚和4只电容构成。功能是产生+12v和-12v两个电源,提供给RS-232串口电平的需要。
(2)数据转换通道。由7、8、9、10、11、12、13、14脚构成两个数据通道。其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通 TTL/CMOS数据从T1IN、T2IN输入转换成RS-232数据从T1OUT、T2OUT送到电脑DB9道。
插头;DB9插头的RS-232数据从R1IN、R2IN输入转换成TTL/CMOS数据后从R1OUT、R2OUT输出。
(3)供电。15脚GND、16脚VCC(+5v)。
MAX232C主要特点:
(1)单5V电源工作
(2)LinBiCMOSTM工艺技术
(3)两个驱动器及两个接收器
(5)低电源电流:典型值是8Ma(6)符合甚至优于ANSI标准EIA/TIA-232-E及ITU推荐标准V.28(4)±30V输入电平
3.2.5 液晶1602背光的厚,是否带背光在应用中并无差别。它的主要技术参数如表3.1,图3.10,图3.11所示。
(1)显示容量:16×2个字符
(2)芯片工作电压:4.5—5.5V
(3)工作电流:2.0mA(5.0V)
(4)模块最佳工作电压:5.0V
表3.1 1602内部控制指令
序号 | 指令 | RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
1 | 清显示 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
2 | 光标返回 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | * |
3 | 置输入模式 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | I/D | S |
4 | 显示开/关控制 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | D | C | B |
5 | 光标或字符移位 | 0 | 0 | 0 | 0 | 0 | 1 | 下 | 载 | 高 | 清 |
6 | 置功能 | 0 | 0 | 0 | 0 | 1 | DL | N | F | * | * |
7 | 置字符发生存贮器地址 | 0 | 0 | 0 | 1 | 字符发生存贮器地址 |
8 | 置数据存贮器地址 | 0 | 0 | 1 | 显示数据存贮器地址 |
9 | 读忙标志或地址 | 0 | 1 | BF | 计数器地址 |
10 | 写数到CGRAM 或DDRAM) | 1 | 0 | 要写的数据内容 | |
11 | 从CGRAM 或DDRAM 读数 | 1 | 1 | 读出的数据内容 |
图3.10 LCD1602读操作时序
图3.11LCD1602写操作时序
3.2.6稳压芯片LM2576
HYM2576系列调节器是单片集成电路,它可以提供降压转换器(Buck)的功能,它同时具有驱动3A负载电流,且有着极好的线性和负载调节特性。HYM2576系列器件包括固定输出的3.3V、5V、12V、15V以及可调输出版本,它内部已经集成频率补偿和一个固定频率振荡器。HYM2576系列高效率的特性完全可以替代常用的三端线性调节器。它的高效率可以最大限度的减小散热片的尺寸,在某些情况下可以不加散热片。在特定输入和输出负载的条件下,HYM2576的输出可以保证±4%的精度容差,以及±10%的内部振荡频率容差。HYM2576同时具有外部的关断引脚,50μA(典型)的备用电流。HYM2596
还具有循环限流和过温关断功能,如图3.12所示。
图3.12LM2576 应用电路
3.2.7组态王Kingview
北京亚控公司的工业组态软件Kingview是新型的工业自动控制系统,它以标准的工业计算机软、硬件平台构成的集成系统取代传统的封闭式系统。它是一个集成的工业组态软件,它包含几千种智能仪表和智能模块和大多数的单片机的地层通信协议,对于单片机它提供了两种可以修改的通信协议,可以方便的实现单片机和PC机之间的通信。Kingview更是提供了强大的人机界面的制作,可以很好的将采集到的数据进行处
(1)全中文界面,可以运行在Windows环境下,包括Windows98P2000PNT等。 (2)先进的图形、动画功能,丰富的图库,开发简便,周期短,界面美观、友好。
理显示记录,利用自带的动画制作工具可以实现现场模拟。
(6)对于典型数据库的支持,使得数据的操作很容易实现。
(7)强大的报表功能。
(8)具有一定网络支持功能。
(9)具有动态数据交换功能(DDE),这使得它可以和Windows环境下的大部软件或开发平台进行数据传递。
通讯口设置如表3.2。
(1)通讯方式:RS-232,RS-485,RS-422均可。
(2)波特率:由单片机决定(2400,4800,9600and19200bps)。
表3.2 组态王字节数据格式
起始位 | 数据位 | 校验位 | 停止位 |
在组态王中定义设备地址的格式 |
|
(1)格式:##.# 前面的两个字符是设备地址,范围为0-255,此地址为单
片机的地址,由单片机中的程序决定;后面的一个字符是用户设定是否打包,“0”为不打包、“1”为打包,用户一旦在定义设备时确定了打包,组态王将处理读下位机变量时数据打包的工作。
表3.3 组态王中定义的寄存器格式
寄存器名称 | dd 上限 | dd 下限 | 数据类型 |
Xdd | 65535 | 0 | FLOAT/BYTE/UINT |
表3.3中,斜体字dd代表数据地址,此地址与单片机的数据地址相对应。(2)组态王与单片机通讯的命令格式如表3.4所示。
表3.4 读写格式
字头 | 设备地址 | 标志 | 数据地址 | 数据字节数 | 数据… | 异或 | CR |
说明;
字头:1字节1个ASCII码,40H
设备地址:1字节2个ASCII码,0—255(即0---0x0ffH)标志:1字节2个ASCII码,bit0~bit7,
bit0=0:读,bit0=1:写。
bit3bit2 = 00,数据类型为字节。bit1=0:不打包。
数据字节数:1 字节2个ASCII 码,1—100,实际读写的数据的字节数。
数据…:为实际的数据转换为ASCII码,个数为字节数乘2。异或:异或从设备地址到异或字节前,异或值转换成2个ASCII码CR:0x0d。
3.3系统硬件总体设计方案
确定系统的硬件由单片机主控模块、单片机从控模块、TN_9红外模组、液晶显示模块、声光报警模块、无线收发CC1100E模块、键盘模块、RS232电平转换模块、声光报警模块、电源模块、上位机模块。硬件的流程是主控制器通过不断的扫描键盘,当扫描到键值要求开始测温时,判断是测量环境温度还是目标温度,然后发送开始允许测温指令给TN_9,TN_9执行测温任务并把测量结果送往主控制器,主控制器处理温度后实时显示到LCD1602模块上,同时,主控制器将是实时温度值与设定的温度上限值比较,如果满
足报警条件,则开启声光报警,同时,主控制器不断地扫描键盘,当发现有键值允许开启无线传输模块,则将实时温度值传至从处理器,从处理器通过串口将温度经RS232电平转换模块传到组态王软件,在组态王里面实现数据接收、数据显示、数据存储、数据查询、生成曲线报表等多项功能。
TN_9 | 液晶显示 | 电源模块 |
STC89C51
STC89C51 | 无 | 无 | 从控制器 |
线 | |||
主控制器 | 线 | ||
收 | |||
收 | |||
发 | |||
发 |
RS232
串口模块
电源模块 键盘 模块KingView 组态王
图3.13 红外测温系统的硬件方案设计框图
盘模块可以方便地控制测温及无线传输;RS232转换电路模块可以使从控制器方便地同
组态王进行串口通信,并可以同时接收或传送外部送来的资料;LCD显示模块把测量的温度值直观地显示给观测者;电源模块负责整个测温系统的电源供应。
3.4系统软件设计方案
按照系统的设计功能要求,本红外测温系统的设计采用单片机软件系统实现,用单片机的自动控制能力配合按键控制,来控制温度的检测、显示、报警、传输;并用上位机软件界面实现温度的存储、查询、曲线报表等功能。所以本测温系统的软件设计同样采用模块化的设计思想,它把整个系统分成若干模块分别予以解决,它包括主从控制器的主程序模块,红外测温模块,键盘扫描模块、声光报警模块、液晶显示模块、无线传输模块和组态王通信模块。
|
4 红外测温系统的硬件设计
基于STC89C51单片机的红外测温系统的硬件设计采用目前使用比较广泛的模块化设计思想,将整个系统分成七大模块:主从单片机处理模块、红外测温模块、无线传输模块、LCD液晶显示和声光报警模块、键盘模块、RS232转换电路模块、电源模块。通过划分模块的方法,可以把一个复杂的问题分割成几个相对容易解决的问题,分别予以解决,大大简化了设计的难度。
4.1主从单片机处理模块
该红外测温系统是以STC89C51单片机为核心器件,此单片机模块的工作原理是:加载相应程序的STC89C51单片机把红外测温模块传来的数据加以处理,送LCD液晶显示和无线传输,必要时进行声光报警。
图4.1 单片机处理模块电路图
其复位电路如图4.1左边上部分,本单片机处理模块是通过开关手动复位的,只要在RST引脚出现大于10ms的高电平,单片机就进入复位状态,这样做的目的是便于根据实际情况而选择是否复位温度测量数据。而此仪器的震荡电路选用的是晶体震荡电路,其具体电路如图4.1左边下部分。采用晶体震荡电路的原因是因为它的频率稳定性好,
而这正是本红外测温系统非常重要的技术要求。
4.2TN-9红外测温模块接口设计
红外测温模块采用非接触手段,解决了传统测温中需要接触的问题,具有回应速度快,测量精度高,测量范围广等优点。单片机通过P2.3口发送启动指令给TN_9,TN_9测得温度后,单片机通过检测TN_9的CLK脚的电平变化把温度数据从P2.5口的DATA脚接收到数据,如图4.2所示。
4.3无线收发CC1100E模块接口设计片机发出控制信号到CC1100E编码电路再经过发射电路把温度数据发射出去,再由接收电路把信号接收到另外一块CC1100E解码器进行解码得到温度值,从而达到中短距离控制的目的。
图4.3无线传输模块电路图
在图4.3中,GDO0和GDO2通用数字输出引脚,功能有测试信号,FIFO状态信号,空闲信道指示,时钟输出,从XOSC分频,串行输出RX数据;SI用途数据的输入;SO用于数据的输出;SCK为串行时钟输入;CSN为片选引脚,高电平有效,用于选择是否数据输出。
4.4RS232A电平转换模块
通过RS232转换电路单片机可以方便的同PC机进行串口通信,可以同时接收或传送外部送来的资料。但是进行串行通讯时要满足一定的条件,因为RS232是用正负电压来表示逻辑状态的,而TTL是用高低电平来表示逻辑状态的,因此,为了能够同PC机接口或终端的TTL器件连接,必须在RS232与TTL电平之间进行电平转换。本设计采用MAX232芯片它可完成TTL到EIA双向电平的转换。RS-232C是串行数据接口标准,它规定了连接电缆和机械、电气特性、信号功能及传送过程。RS-232被定义为一种在低速串行通信中增加通信距离的单端标准,它采取非均衡传输方式,即所谓的单端通信。典型的RS-232信号在正负电平之间摆动,发送数据时,发送端驱动器输出正电平+5~+15V,负电平为-15~-5V。无数据传输时,线上为TTL。从开始传送数据到结束,线上电平从TTL电平到RS-232
平与接收电平的差仅为2~3V左右,所以其共模抑制能力差。加上双绞线上的分布电容,其传送距离最大约为15米,最高速度为20Kb/s。
电平,然后返回TTL电平。接收器典型的工作电平为+3~+12V与-12~-3V。由于发送电
图4.4 RS232转换电路
图4.4中,MAX232电路内部很难实现较大电容,所以周围的电容是电源变换的储能电容,它使用电荷泵把5V转换成串口的正负电源,外接的4个电容就是电荷泵电路的一
部分。MAX232内部有两路数据转换通道,单片机通过串口P3.0、P3.1口与第二路连接,
形成了物理通信,RS232的接收数据口RXD,发送数据口TXD与MAX232连接,与上位机通信。
4.5液晶显示和声光报警模块
本系统采用LCD1602液晶显示模块。这种显示最大的优点就是使用口资源比较少,显示位数多,显示比较清晰,界面友好,段码从P0口输出。输出内容为英文提示、实时温度值和无线传输标志位;同时,当实时温度值到达设定的上下限值时发出声光报警,在发声方面,考虑到体积和功耗的因素,本设计使用了PNP三极管驱动蜂鸣器;用红色发光二极管作为发光报警。
图4.5LCD显示和报警电路
在图4.5液晶模块中,RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器;通过单片机的P2.6口控制,R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。由于本设计中只需要对液晶进行写操作,为了节省单片机引脚资源,它直接接为低电平;E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令,通过单片机P2.7口控制。
4.6键盘模块
人机交互对话最通用的方法就是通过键盘和LCD显示进行的,操作者通过键盘向系统发送各种指令或置入必要的数据信息。键盘模块设计的好坏,直接关系到系统的可靠性和稳定性。按键接门可分为独立式按键接口、行列式按键接口和专用芯片式等。行列式按键接口适应于按键数量较多,这种方式的按键接口由行线和列线组成,按键位于行、列的交叉点上。这种方式的优点就是相对于独立接口方式可以节省很多I/O资源;专用 键盘处理芯片一般功能比较完善,芯片本身能完成对按键的编码、扫描、消抖和重键等
问题的处理,但成本较高;考虑到本设计中需要的按键不多,我采用了独立式的接法,通过程序处理消抖,完成键盘的权值设置。
图4.6键盘电路原理图
图4.6中,键盘模块采用动态扫描的方式,采用3个独立式键盘。其工作原理为:单片机通过运行程序不断扫描键盘,检查是否有键按下,当扫描到有键按下时。经过程序处理找出按下的键值,并调用相应键操作程序完成对应的键操作。
稳压电路模块组成。这样做可以减少各模块之间的相互干扰,减小电源噪声。可靠的电源方案是整个硬件电路稳定可靠运行的基础。电源模块由两个相互独立的4.7电源设计模块
线收发模块的共电电压都可为3.3V,源,用于异地供电。经过考虑和测试,本系统的5V采用78L05稳压芯片得到,而3.3V这用LM2576-3.3稳压芯片得到。
图4.7 电源电路原理图
在图4.7LM2576电路中,电感DW2的选择要根据LM2576的输出电压、最大输入电压、最大负载电流等参数选择,首先,依据如下公式计算出电压.微秒常数(E.T):
E.T=(Vin- Vout)×Vout/Vin×1000/f (4-1) 上式中,Vin是LM2576的最大输入电压、Vout是LM2576的输出电压、LM2576的工作振荡频率值(52kHz)。E.T确定之后,根据负载电流曲线来查找所需的电感值。
输入电容C2一般应大于或等于100μF,安装时要求尽量靠近LM2576的输入引脚,其耐压值应与最大输入电压值相匹配。
输出电容C的公式(单位μF):
(4-2)C≥13300Vin/Vout×L
上式中,Vin是LM2576的最大输入电压、Vout是LM2576的输出电压、L是经计算并查表选出的电感L1的值,其单位是μH。电容C铁耐压值应大于额定输出电压的1.5~2倍。对于3.3V电压输出而言,我使用耐压值为100uF的电容器。
稳压二极管D的额定电流值应大于最大负载电流的1.2倍,考虑到负载短路的情况,二极管的额定电流值应大于LM2576的最大电流限制。二极管的反向电压应大于最大输入电压的1.25倍。本设计使用1N582x系列的肖特基二极管。
5红外测温系统的软件设计
本红外测温系统的软件设计采用模块化的设计思想,这样就把一个复杂的软件设计分成几个相对简单的部分分别予以解决。因为本论文完成的功能是测温及上位机的数据处理,所以对温度数据接收及上位机设计做了较详细叙述,而对其它各模块做了相应简要的介绍。
5.1主程序的设计
本设计中,由于使用了无线收发模块,故需要了两个单片机处理器。
5.1.1主控制器的主程序模块
在主控制器方面如图5.1所示,当红外测温系统接通电源时,STC89C51单片机自动复位,开始运行自己的主程序。该程序首先对STC89C51初始化、液晶初始化、无线收发初始化。然后给出开机显示,接着判断是否有键输入,若没有键输入,则继续判断;若有键输入,第一个按键为目标温度测量,第二个按键为环境温度测量,第三个按键为
过计算是否符合声光报警条件,到上位机处理;然后重新循环判断。然后通过第三个按键决定是否要将温度值进行无线传输
数据的无线发送;若是进行红外测温,则接收数据,并将计算的温度值显示出来,并通
开始
各种初始化
扫描键盘
N
是否有键按下
Key1 Key2 Key3
测量目标温度 测量环境温度 数据无线传输
显示温度显示温度
N
声光报警Y
是否达到上限
CpuInit();
POWER_UP_RESET_CC1100();
halRfWriteRfSettings();
halSpiWriteBurstReg(CCxxx0_PATABLE,PaTabel, 8);
while(1)
{
if(key1())TN_ReadData(0x4c);
else if(key2())TN_ReadData(0x66);
elseif(key3())halRfSendPacket(Temperature,7);
if((ReadData[0]==0x4c)&&(ReadData[4]==0x0d))TN_switch();
else if((ReadData[0]==0x66)&&(ReadData[4]==0x0d))TN_switch();
if(key3())halRfSendPacket(Temperature,7); }
主控制器的主程序执行步骤说明:
(1)CpuInit()函数为无线收发模块的SPI初始化程序;
(2)POWER_UP_RESET_CC1100()函数完成对无线收发模块的上电复位操作; (3)halRfWriteRfSettings()函数完成对无线模块内部寄存器的配置工作; (4)halSpiWriteBurstReg()函数完成对无线模块SPI连续写寄存器的配置并对它进行校验,以确保数据发送的准确性;
(5)在循环体里面,通过key1()、key2()、key3()三个键盘函数的不断查询,通过不同的权值决定系统要完成什么功能,
或者测温显示和报警,或者进行无线发送数据。5.1.2从控制器的主程序模块
在从控制器方面如图5.2所示,STC89C51单片机自动复位,开始运行自己的主程序。该程序首先对STC89C51初始化、无线模块初始化和组态王通信初始化;当无线收发模块接收到新的数据时,从控制器把数据传到组态王上处理。
开始
各种初始化
数据传输到组态王
图5.2 从控制器的主程序流程图
部分程序如下描述:
CpuInit();
POWER_UP_RESET_CC1100();
halRfWriteRfSettings();
halSpiWriteBurstReg(CCxxx0_PATABLE,PaTabel, 8);
T_init();
while(1)
{
if(halRfReceivePacket(RxBuf,&leng));
Send_Process();
}
从控制器的主程序执行步骤说明:
(1)完成对无线模块的各种配置;
(2)T_init()函数是完成对从控制器的串口中断、定时器中断的配置,并对单片机与组态王通信的速率做了定义,使其在波特率为9600的环境下进行数据的通信; (3)在循环体里,halRfReceivePacket()函数是主控制器通过无线收发模块发给从控制器的数据,Send_Process()函数为从控制器得到数据后传给组态王,以便做数据的后台操作。
5.2TN_9 红外测温程序模块
开始
定义数组存放测温数据
Item 为0x4c 或0x66且CR 为
0x0d
Y
计算温度值
返回
测温控制端接P2.3口。它的程序流程图如上图所示,此模块首先定义一个字符型数组图5.3中,红外测温模块的数据输出信号和脉冲信号分别接单片机P2.4,P2.5口,
位传送的。节为0x0d,得到更准确温度,在温度计算里面,对读得的5个温度值求和然后平均,得到的便是人体温度,然后送入单片机进行处理。
部分程序如下描述:
floatTempf[6]={0.00};
for(i=0;i<5;i++)
{
Temp=(ReadData[1]<<8)|ReadData[2]; Tempf[i]=(float)Temp/16.00-273.15; Tempf[5]+=Tempf[i];
}
Tempf[5]=Tempf[5]/5.00;
Temp=Tempf[5]*100.00/0.85; return(Temp);
TN_9 测温程序执行步骤说明:
(1)定义Tempf[6]浮点型数组,用于暂时储存5个初始温度值和一个平均值; (2)TN_9模块一次温度的读取包括5个字符型数据,Item为判断是环境温度还是目标温度,MSB和LSB为接收温度的高、低八位数据,Sum为验证码,CR表示完成一次温度数据接收;
(3)在for循环体里,最对数据的高、低八位进行处理,对所得到的5个温度值进行再和再平均的算法设计,然后返回主函数,等待下一次的测量。
此外,在此红外测温系统的软件设计中,温度值的计算也是一个非常重要的部分,它关系到整个产品的设计精度,因此把它的温度数据读取与计算用单独的程序给出,其流程图如下图所示。因为红外测温模块的数据是一位一位地送入单片机的,所以用双重循环,内循环接收一个字节的数据,外循环接收五个字节的数据。如图5.4所示。
Y
接收一位数据存放在数组中,变量加1
变量等于7? | N |
Y
变量清0,接收下一字节的数据
图5.4读测量数据流程图
Bit BitState=0; for(k=0;k<7;k++) 部分程序如下描述:
BitState= TN_Data;
ReadData[j]=ReadData[j]<<1;
ReadData[j]=ReadData[j]|BitState;
while(!TN_Clk);}
if(ReadData[0]==Flag) k=8;}
TN_ACK=1;}
读测温数据程序执行步骤说明:
(1)BitState是一个位定义,表示TN_9每得到一位数据,便先存储在它里面; (2)在三个嵌入循环体里,第一个for循环表示每次发七帧数据,为的是保证数据的正确性,第二个for循环表示每次读5个字节的数据,刚好为一次测温的数据; (3)第三个for循环表示,当单片机检测到测温信号开始后读一位数据,数据先存入BitState里,然后再存入字符数组ReadData中,经过移位处理保证数据存储顺序
的正确性,然后检测第一位数据的传送完成,如此循环八次便得到一个字节的数据。
5.3无线收发CC1100E程序模块
无线收发数据在微机系统中经常出现,它的优势在于以一定的范围内,可以随时随地搭建网络,不受限于硬件的局限性,而CC1100E是一款Sub-GHz高性能射频收发器,非常适合用于这方面,在200米的范围内,非常有利于传输数据。
5.3.1无线发送程序
开始
写入地址和配置
写入要发送的数据
进入发送模式发送数据
N
等待GDO0置1
N
等待GDO0清0
返回
{
halSpiWriteReg(CCxxx0_TXFIFO, size);
halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size);
halSpiStrobe(CCxxx0_STX);
while (!GDO0);
while (GDO0);
halSpiStrobe(CCxxx0_SFTX);
}
无线发送程序执行步骤说明:
(1)halSpiWriteReg()函数为配置SPI写寄存器的地址和配置,通过单片机控制CSN引脚为低电平,等待MISO输出低电平后,开始写入地址并配置成为相应的模式。
(2)halSpiWriteBurstReg()函数为SPI连续写配置寄存器,通过写入地址、数据缓冲区、和数据个数,其中数据缓冲区为一个指针数组,等待发送模式。
(3)halSpiStrobe()为SPI写命令函数,通过写入STX配置发送模式后开始发
送数据,通过检测无线发送模块的GDO0引脚的高低脉冲来判断数据是否发送完成,当检测到GDO0引脚先来一个高脉冲,然后等待它再来一个低脉冲后,发送完成标志,至此,一次数据的发送就完成了。
5.3.2无线接收程序
开始
N | 等待接收命令 |
Y
判断是否有数据要接受 | N |
Y
读第一字节数据
判断数据长度是否符合要求 N
修改数据长度
接收数据成功并保存数据
发送清洗缓冲区命令
返回
图5.6 无线接收程序流程图
图5.6中,无线接收部分程序如下描述:
halSpiStrobe(CCxxx0_SRX);
while(GDO0);
if((halSpiReadStatus(CCxxx0_RXBYTES)& BYTES_IN_RXFIFO))
{ packetLength =halSpiReadReg(CCxxx0_RXFIFO);
if(packetLength<=*length)
{ halSpiReadBurstReg(CCxxx0_RXFIFO,rxBuffer,packetLength); *length = packetLength;
halSpiReadBurstReg(CCxxx0_RXFIFO,status,2);
halSpiStrobe(CCxxx0_SFRX);
return(status[1] & CRC_OK);}
elsehalSpiStrobe(CCxxx0_SFRX);
elsehalSpiStrobe(CCxxx0_SFRX);
无线接收程序执行步骤说明:
(1)halSpiStrobe()为SPI写命令函数,SRX为无线模块进入接收状态标志,表示无线模块进入接收区;
(2)等待GDO0引脚变为低电平,当GDO0变为低电平后开始接收数据,halSpiReadStatus()为判断该数据的字节数是否为0,若为零,则直接清除接收缓冲区并结束接收状态;
(3)若不为零,halSpiReadBurstReg()为读出第一个字节,此字节为该帧数据长度,如果所要的有效数据长度小于等于接收到的数据包的长度,通过指针的改变读出所有接收到的数据,并把接收数据长度的修改为当前数据的长度。若为零,则直接清除接收缓冲区并结束接收状态;
(4)读出CRC校验位后清洗接收缓冲区并返回主程序。
5.4键盘扫描程序模块
动的暂态过程大约经过5~10ms的时间,这个抖动容易影响到单片机对按键的正确判断。如图5.7所示。 但对高速的CPU来说,由于系统采用由机械触点构成的独立式按键,它存在按键开关的抖动问题,这种抖
为使单片机能够正确地读出键盘的状态,对每一次按键只作一次响应,必须采取措施以消除抖动。本设计采用软件方法消除抖动,它通过延时来躲过暂态抖动过程,执行一段10ms的延时程序后,再读取稳定的键状态。在没有键按下时P2.0口是高电平,在单片机获得P2.0口为低电平的信息后,不立即认定键盘已被按下,执行10毫秒延时函数后再次检测P2.0口,如果仍为低,说明键盘被按下了。这就消除了按键按下时前沿的抖动对单片机正确判断按键造成的影响。如图5.8所示。
开始
判断是否有键按下 | N |
Y
延时10ms
N | 判断是否有键按下 |
Y
扫描键盘,获得键值
根据取得的键值处理相应的子程序
{
if(key_1==0)
{
KEY_delay();
if(key_1==0) KEY_delay();
if(key_1==0) return(1);
}
elsereturn(0);
}
键盘扫描程序执行步骤说明:
(1)本系统设计了三个按键,一个为测量目标温度,一个为测量环境温度,还有一个作为无线发送数据的标志。
(2)key_1==0表示当第一个键按下时,延时一小段时间,即为KEY_delay(),为的是消除抖动,再判断一次key_1,当还是检测为0时,为了保证避免抖动期,在延时
一小段时间,再判断一次key_1,当还检测到0时,键盘函数返回1,并把返回值送入主函数进行相应的处理。
5.5组态王与单片机通信程序模块
组态王与单片机的通信是通过RS232电平转换模块来实现的,在从单片机控制器设 得到波特率9600bps,并定义相关地址等功能。置串口的相关寄存器、定时器、相关中断,
如图5.9所示。
开始
N | 是否有新的数据 |
Y
N
查询RI为1
清RI 清TI
Y
N N
判断接收完毕 判断发送完毕
Y Y
图5.9 组态王与单片机通信流程图
串口部分程序如下描述:
void Uart() interrupt 4 using 1 //串口中断
{ if(RI)
{RI=0;m=SBUF;
if(last==ENQ&&(m==MyAddr ||m=='R' || m=='W'))
{Rbuf[Rptr]=m;Rptr++;}
if(last==EOT)RecvOk=1;
else{……}
串口通信程序执行步骤说明:
(1)不断地检查RI是否置位,若置位,则开始执行接收指令,否则执行发送指令; (2)不管执行发送指令还是接收指令,都要对其标志位清零,然后判断接收的或
者发送的数据是否符合要求,若符合要求,则将数据存储起来并置位标志位;反之则结
束本次数据的发送或者接收。
5.6组态王应用设计
(1)设计要求
能够形象直观的显示当前的温度,历史温度。并且当检测到温度超过事先规定好的温度范围,则进行声光报警,报警温度可以随意调节。
(2)设计思路
由于需要检测当前温度和记录历史温度,决定设计四个画面分别用于显示当前的温度和历史温度。为了达到形象直观的目的,当前温度使用仪表和实时曲线同时显示,历史温度使用历史曲线的方式显示。当温度超出规定的范围,使用声光报警。使用了组态王智能模块中的单片机HEX,通信模式选择串口1,8位数据位,一位停止位,无校验,9600波特率。
(3)具体实现
①实时温度检测部分如图5.10所示。
图5.10实时温度界面
采用了组态王图库中的仪表来作为当前温度显示,该仪表的参数设置如下:目标温度变量名:\\本站点\df0
环境温度变量名:\\本站点\df1
仪表表盘:温度显示仪
仪表量程:0-100,
主刻度数:11
副刻度数:9
同时使用了实时曲线显示当前温度,如图5.11所示。
表达式1:\\本站点\df0 表达式2:\\本站点\df1
标识X轴:时间轴
标识Y轴:数值轴(百分比)
数值轴: 标识数:11 起始值:0 最大值:100
时间轴: 标识数:3 格式:xx分xx 秒
更新频率:1秒
时间长度:20秒
②历史温度报表部分如图5.12所示。
采用了组态王报表来显示和记录温度。具体设置如下: 表达式1:\\本站点\df0
Y 方向:主分线:3 次分线:2
标识X轴:时间轴
标识Y轴:数值轴(百分比)
数值轴: 标识数:11 起始值:0 最大值:100
时间轴: 标识数:3 格式:xx时xx分
时间长度:一小时
③温度报警设置
使用了文字提示、指示灯指示、声音报警三种方式。其中文字提示使用了中英文分别显示,指示灯设置为报警时将变为红色并且闪烁,当温度超出范围时将会发出设定好的报警声音(这个声音可以随意改变)。在历史记录中设计了报警记录,可以将报警的事件、时间、报警值和恢复值记录下来,以便查阅。
(4)设计特点
在各个画面里均设置了各种功能的按钮,可以完成各个画面之间的切换,在任何一个画面里均可以正常退出系统,各个画面中均显示当前时间。
(5)调试过程
① 实时温度检测部分
开始首先使用了组态王中的仪表控件显示接收到单片机传送过来的一个常数 100,没有正确显示。怀疑是协议设置错误,将组态王串口1的通信的偶校验 模式改为无校验后,仪表正确显示100调试成功。说明组态王的仪表控件工作 又加入了组态王的实时趋势曲正常并且组态王和单片机的通信协议正确无误。
线控件,显示接收到的常数发现正常,说明实时趋势曲线控件工作正常。在画面的右上角加入了时钟控件,发现时钟显示和计算机同步,工作正常。
② 历史趋势曲线部分
使用组态王的历史趋势曲线控件将接收到的数据进行显示和记录,运行后观察结果正常。历史趋势曲线控件工作正常。
③ 报警部分
设置好报警条件,运行组态王并使温度超过温度上限。发现灯光闪烁和文字提
使用的声音文件是.WAV格式的,将声音文件由.MP3格式改为.WAV格式后,报警正常。 声音示正常,但是没有报警声音。查阅组态王的命令语言手册发现所给出的例子中
④整体调试
连好硬件和烧录好单片机程序后进行整体调试,发现系统工作正常能够及时正 确的进行温度的显示和记录。在温度超出范围时能够及时的进行声光报警。
6 系统调试和性能分析
return(status[1] & CRC_OK);}
elsehalSpiStrobe(CCxxx0_SFRX);
elsehalSpiStrobe(CCxxx0_SFRX);
无线接收程序执行步骤说明:
(1)halSpiStrobe()为SPI写命令函数,SRX为无线模块进入接收状态标志,表示无线模块进入接收区;
(2)等待GDO0引脚变为低电平,当GDO0变为低电平后开始接收数据,halSpiReadStatus()为判断该数据的字节数是否为0,若为零,则直接清除接收缓冲区并结束接收状态;
(3)若不为零,halSpiReadBurstReg()为读出第一个字节,此字节为该帧数据长度,如果所要的有效数据长度小于等于接收到的数据包的长度,通过指针的改变读出所有接收到的数据,并把接收数据长度的修改为当前数据的长度。若为零,则直接清除接收缓冲区并结束接收状态;
(4)读出CRC校验位后清洗接收缓冲区并返回主程序。
5.4键盘扫描程序模块
由于系统采用由机械触点构成的独立式按键,它存在按键开关的抖动问题,这种抖动的暂态过程大约经过5~10ms的时间,人的肉眼是觉察不到的,但对高速的CPU来说,这个抖动容易影响到单片机对按键的正确判断。如图5.7所示。
]]]ZGUJUIYI 为使单片机能够正确地读出键盘的状态,对每一次按键只作一次响应,必须采取措
施以消除抖动。本设计采用软件方法消除抖动,它通过延时来躲过暂态抖动过程,执行
一段10ms的延时程序后,再读取稳定的键状态。在没有键按下时P2.0口是高电平,在
单片机获得P2.0口为低电平的信息后,不立即认定键盘已被按下,执行10毫秒延时
函数后再次检测P2.0口,如果仍为低,说明键盘被按下了。这就消除了按键按下时前
沿的抖动对单片机正确判断按键造成的影响。如图5.8所示。
;E›Q$5
$Bv5
]]]ZGUJUIYI
谢 辞
通过本次毕业设计,我的理论知识和实践得到了很大的提高,解并学习了时下应用非常广泛的工业控制组态软件,练习了单片机和PC通信以及各种模块的应用,这对我以后的学习工作都有很大的帮助。
最后,衷心感谢陈雷老师和赵学军老师一直以来对我的支持和帮助,在我出现的新困难里提出自己的见解和积极的解决办法,从而让我顺利的完成本次毕业设计。
参考文献
[1] 王汝琳.红外检测技术[M].北京:化学工业出版社,2006
[2] 吴金戌.8051单片机实践与应用[M].北京:清华大学出版社,2006[3] 丁镇生.传感及其遥控遥测技术应用[M].电子工业出版社.2002.5.
[4] 马忠梅,籍顺心,张凯,马岩.单片机的C语言应用程序设计[M].北京:北京航空航 天大学出版社,2003
[5] 何道清.传感器与传感器技术[M]. 北京:科学出版社,2004.
[6] 高鹏.电路设计与制板Protel99入门与提高[M].北京:人民邮电出版社.2001.[7] 戴义保.高精密温度测量的研究与实现[J].上海:自动化仪表第2003,24(3):24-27[8] 谢光忠、蒋亚东.温湿度智能数据采集控制系统的研制[J].哈尔滨:传感器技术2000,19(4), 29-33
[9] Donald A. Neamen Electronic circuit analysis and design [M].TsinghuaUniversity Pressand Springer Verlag.2002.
[10] Mark1.Montrose.PRINTED Circuit Board Design Techniques for EMCcompliance[J].IEE Pressseries.2000.
附 录1.系统整体实物图:
发送部分
接收部分
组态Kingview 主界面
2.源程序清单:
#include<at89x51.h>
#include<intrins.h>
#include"LCD1602.h"
#include"TN_9.h"
#include"KEY.h"
#include"CC1100.h"
ucharPaTabel[8] = {0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60}; ucharTemperature[]={'0','0','.','0','0','C','\0'};
ucharname[]={"This is a TN_9"};
ucharflaggt[]={"Temp:"};
intBuffer2;
voidTN_switch()
{
Buffer2=TN_GetData();
Temperature[0]=Buffer2/1000+48;
Temperature[1]=Buffer2%1000/100+48;
Temperature[3]=Buffer2%100/10+48;
} write_strings(1,6,&Temperature); Temperature[4]=Buffer2%10+48;
{ TN_ACK=1;
write_strings(0,0,&name);
write_strings(1,0,&flaggt);
write_strings(1,6,&Temperature);
CpuInit();
POWER_UP_RESET_CC1100();
halRfWriteRfSettings();
halSpiWriteBurstReg(CCxxx0_PATABLE, PaTabel, 8);
while(1)
{
if(key1())
{
TN_ACK=0;
TN_ReadData(0x4c); }
else if(key2())
//目标温度的第一个字节为0x4c
{
TN_ACK=0;
}
TN_ReadData(0x66);//环境温度的第一个字节为0x66
if((ReadData[0]==0x4c)&&(ReadData[4]==0x0d)) //一个字节为0x0d {
TN_switch();
}
else if((ReadData[0]==0x66)&&(ReadData[4]==0x0d))//最后为0x0d {
TN_switch();
}
if(key3())
{
halRfSendPacket(Temperature,7);
}
}
}
/* //////////////////////LCD_1602 ///////////////////////////////
1602 显示部分
sbit en=P2^7; sbit rs=P2^6;
////////////////////////////////////////////////////////////*/
{ for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void write_dat(uchar dat) //写数据子函数date() {
rs=1;
LCD1602_delay(10);
P0=dat;
LCD1602_delay(10);
en=1;
LCD1602_delay(10);
en=0;
LCD1602_delay(10);
} |
|
void write_com(uchar com) //写命令自函数com() {
rs=0;
LCD1602_delay(10);
P0=com;
LCD1602_delay(10);
en=1;
LCD1602_delay(10);
en=0;
LCD1602_delay(10);
}
voidinit()
{
en=0;
write_com(0x38);//显示设置
write_com(0x0c);//显示开关
write_com(0x06);//屏幕不移动
write_com(0x01);//清屏
}
void write_strings(uchar flag,uchar addr,uchar *p)
if(flag==0) { {
p++;
}
}
if(flag==1)
{
write_com(0x80+0x40+addr);
while(*p!='\0')
{
write_dat(*p);
p++;
}
}
}
/*//////////////////////CC1100E ///////////////////////////////
无线收发部分
////////////////////////////////////////////////////////////*/
voidhalRfSendPacket(uchar *txBuffer, uchar size)
{
halSpiWriteReg(CCxxx0_TXFIFO,size);
halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size);//写入要发送的数据
halSpiStrobe(CCxxx0_STX); while (!GDO0);
while (GDO0);
//进入发送模式发送数据
halSpiStrobe(CCxxx0_SFTX);
}
void setRxMode(void)
{
halSpiStrobe(CCxxx0_SRX); //进入接收状态}
{ uchar status[2]; uchar halRfReceivePacket(uchar *rxBuffer, uchar *length)
while (GDO0)
{
delay(2);
--i;
if(i<1)
return 0;
}
if ((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO))
{
packetLength = halSpiReadReg(CCxxx0_RXFIFO);//节为该帧数据长度
if (packetLength <= *length) //接收到的数据包的长度
{
halSpiReadBurstReg(CCxxx0_RXFIFO, rxBuffer, packetLength);
*length = packetLength; //修改为当前数据的长度
位 | halSpiReadBurstReg(CCxxx0_RXFIFO, status, 2);//读出CRC 校验 |
halSpiStrobe(CCxxx0_SFRX);
return (status[1] & CRC_OK);
//清洗接收缓冲区
//如果校验成功返回接收成功
}
else
{
*length = packetLength;
}
}
else
return 0;
}
/*******************红外测温***********************/
#ifndef _TN_9_H_
#define _TN_9_H_
#define uint unsigned int
#define uchar unsigned char
sbit TN_Data = P2^5;
sbit TN_Clk = P2^4;
sbit TN_ACK = P2^3;
uchar ReadData[5];
{ for(k=0;k<7;k++) //每次发七帧
{
for(j=0;j<5;j++) //每帧五个字节
{
for(i=0;i<8;i++)
{
while(TN_Clk);
BitState= TN_Data;
ReadData[j]=ReadData[j]<<1;
ReadData[j]=ReadData[j]|BitState;
while(!TN_Clk);
}
}
} if(ReadData[0]==Flag) k=8;
TN_ACK=1;
}
intTN_GetData()
{
int Temp,i;
float Tempf[6]={0.00};
for(i=0;i<5;i++)
{
Temp=(ReadData[1]<<8)|ReadData[2]; Tempf[i]=(float)Temp/16.00-273.15; Tempf[5]+=Tempf[i];
}
Tempf[5]=Tempf[5]/5.00;
Temp=Tempf[5]*100.00;
return(Temp);
}
#endif