找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6058|回复: 0
收起左侧

基于单片机的温度测量仪的课程设计

[复制链接]
ID:358941 发表于 2018-6-26 02:35 | 显示全部楼层 |阅读模式
机电一体化课程设计

(2017年)


课程设计名称:机电一体化》课程设计_______________

设 计 名 称 基于单片机的温度测量仪的设计

生 姓 名朱*

学     院:  机械工程学院 业 班 级机电143   

指 导 教 师 :   韩*  专业技术职务:   讲师      




摘  要

本课题用一种基于单片机的数据采集系统方案,该方案根据热敏电阻随温度变化而变化的特性,采用串联分压电路。单片机采集热敏电阻的电压,通过A/D转换将模拟量电压信号转换成数字量电压信号,经过查表转换得到温度值,控制液晶屏实时显示温度值。本系统中所用到的器件是STC89C52单片机、NTC热敏电阻和LCD1602液晶显示屏。

1 绪论
1.1课题背景及意义
1.2国内外研究现状
1.3 课题研究的内容及意义
2 总体方案设计
2.1方案设计
2.1.1温度传感器的选择
2.1.2 调理模块
2.1.3 温度核心模块
2.1.4 显示模块
2.2 系统简介
3 硬件电路设计
3.1温度采集模块电路设计
3.2 A/D转换模块电路设计
3.3 MCU控制器模块电路设计
3.3.1 核心部件的介绍
3.3.2复位电路的设计
3.4 显示模块电路设计
4 软件程序设计
4.1系统整体软件设计的环境
4.2软件设计流程图
4.2.1 A/D转换模块原理及程序
4.2.2热敏电阻阻值和温度的非线性对性模块原理及程序
4.2.3温度显示模块程序
5 系统仿真
6 设计心得
参考文献
附 录 一
系统整体原理图
PCB版图
附 录 二
软件程序代码
    1



1 绪论
1.1课题背景及意义

在人类的生活环境中,温度扮演着极其重要的角色。无论你生活在哪里,从事什么工作,无时无刻不在与温度打着交道。自18世纪工业革命以来,工业发展对是否能掌握温度有着绝对的联系。在冶金、钢铁、石化、水泥、玻璃、医药等等行业,可以说几乎80%的工业部门都不得不考虑着温度的因素。温度对于工业如此重要,由此推进了温度传感器的发展。进入21世纪后,温度传感器正朝着高精度、多功能、总线标准化、高可靠性及安全性、开发虚拟传感器和网络传感器、研制单片测温系统等高科技的方向迅速发展。

在工农业生产中,温度检测及其控制占有举足轻重的地位,随着现代信息技术的飞速发展和传统工业改造的逐步实现 ,能够独立工作的温度检测和显示系统已经应用于诸多领域。要达到较高的测量精度需要很好的解决引线误差补偿问题、多点测量切换误差问题和放大电路零点漂移误差等问题,使温度检测复杂化。模拟信号在长距离传输过程中,抗电磁干扰时令设计者伤脑筋的问题,对于多点温度检测的场合,各被检测点到监测装置之间引线距离往往不同,此外,各敏感元件参数的不一致,这些都是造成误差的原因,并且难以完全清除。

单片机以其功能强、体积小、可靠性高、造价低和开发周期短等优点,成为自动化和各个测控领域中必不可少且广泛应用的器件,尤其在日常生活中也发挥越来越大的作用。采用单片机对温度采集进行控制,不仅具有控制方便、组态简单和灵活性大等优点,而且可以大幅度提高被控数据的技术指标,从而能够大大提高产品的质量和数量。

由于科学技术的飞速发展,特别是微电子加工技术,计算机技术及信息处理技术的发展,人们对信息资源的需求日益增长,作为提供信息的传感技术及传感器愈来愈引起人们的重视,而综合各种技术的传感器技术也进入到一个飞速的发展阶段。要及时正确地获取各种信息,解决工程、生产及科研中遇到的各种具体的检查问题,就必须合理选择和善于应用各种传感器及传感技术。如最简单的温度的测量,有热电偶、光纤温度传感器等等。但是,热敏电阻是开发早、种类多、发展较成熟的敏感元器。热敏电阻由半导体陶瓷材料组成,利用的原理是温度引起电阻变化。热敏电阻器是敏感元件的一类,按照温度系数不同分为正温度系数热敏电阻器(PTC)和负温度系数热敏电阻器(NTC)。热敏电阻器的典型特点是对温度敏感,不同的温度下表现出不同的电阻值。正温度系数热敏电阻器(PTC)在温度越高时电阻值越大,负温度系数热敏电阻器(NTC)在温度越高时电阻值越低,它们同属于半导体器件。随着半导体技术的不断发展,热敏电阻作为一种新型感温元件应用越来越广泛。他具有体积小、灵敏度高、重量轻、热惯性小、寿命长以及价格便宜等优点,最重要的是作为温度传感器的热敏电阻的灵敏度非常高,这是其他测温传感器所不能比拟的。

1.2国内外研究现状

近百年来,温度传感器的发展大概经历了以下三个阶段:传统的分立式温度传感器(含敏感元件)、模拟集成温度传感器/控制器、智能温度传感器。目前,国际上新型温度传感器正从模拟式向数字式、由集成化向智能化、网络化的方向发展。智能温度传感器(亦称数字温度传感器)是在二十一世纪九十年代中期闯世的,它是微电子技术、计算机技术和自动测试技术的结晶。目前,国际上已开发出多种智能温度传感器系列产品。智能温度传感器内部都包含温度传感器、A/D转换器、信号处理器、存储器和接口电路。有的产品还带多路选择器、中央处理器、随机存储器和只读存储器。智能温度传感器的特点是输出温度数据及相关的温度控制量,适配各种微控制器。并且它是在硬件的基础上通过软件来实现测试功能的,其智能化程度也取决于软件的开发水平。进入二十一世纪后智能温度传感器正朝着高精度、多功能、总线标准化、高可靠性及安全性、开发基于传感器硬件和计算机平台、并通过软件开发而成的,利用软件可完成传感器的标定及校准,以实现最佳性能指标的虚拟传感器和包含数字传感器、网络接口和处理单元的网络传感器、研制单片测温系统等高科技的方向发展。

1.3 课题研究的内容及意义

在人类的生活环境中,温度扮演着极其重要的角色。温度是工业生产中常见的工艺参数之一,任何物理变化和化学反应过程都与温度密切相关,因此温度控制是生产自动化的重要任务。对于不同生产情况和工艺要求下的温度控制,所采用的加热方式,燃料,控制方案也有所不同。无论你生活在哪里,从事什么工作,无时无刻不在与温度打着交道。自18世纪工业革命以来,工业发展对是否能掌握温度有着绝对的联系。在冶金、钢铁、石化、水泥、玻璃、医药等等行业,可以说几乎80%的工业部门都不得不考虑着温度的因素。

单片微型计算机是随着超大规模集成电路技术的发展而诞生的,由于它具有体积小、功能强、性价比高等特点,所以广泛应用于电子仪表、家用电器、节能装置、军事装置、机器人、工业控制等诸多领域,使产品小型化、智能化,既提高了产品的功能和质量,又降低了成本,简化了设计。本文主要介绍单片机在温度控制中的应用。

在现代化的工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要被控参数。例如:在冶金工业、化工生产、电力工程、造纸行业、机械制造和食品加工等诸多领域中,人们都需要对各类加热炉、热处理炉、反应炉和锅炉中的温度进行检测和控制。采用MCS-51单片机来对温度进行控制,不仅具有控制方便、组态简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而能够大大提高产品的质量和数量。因此,单片机对温度的控制问题是一个工业生产中经常会遇到的问题。

随着社会的进步和工业技术的发展,人们越来越重视温度对产品的影响, 许多产品对温度范围要求严格,目前市场上普遍存在的问题有温度信息传递不及时、精度不够的缺点,不利于工业控制者根据温度变化及时做出决定。在这样的形式下,开发一种实时性高、精度高的温度采集系统就很有必要。

2 总体方案设计
2.1方案设计
2.1.1温度传感器的选择

测量温度的关键是温度传感器,因此需要灵敏度高、测温范围宽、稳定性好,同时还要考虑成本和实际情况。

方案一:

DS18B20数字式温度传感器,使用集成芯片,采用单总线技术,其能够有效的减小外界的干扰,提高测量的精度,同时,它可以直接将被测温度转化成串行数字信号供微机处理,接口简单,使数据传输和处理简单化。部分功能电路的集成,使总体硬件设计更简洁,能有效地降低成本,搭建电路和焊接电路时更快,调试也更方便简单化,但是这个温度传感器适用于精密温度测量系统中。

方案二:

热敏电阻的主要特点是:①灵敏度较高,其电阻温度系数要比金属大10~100倍以上,能检测出10-6℃的温度变化;②工作温度范围宽,常温器件适用于-55℃~315℃,高温器件适用温度高于315℃(目前最高可达到2000℃),低温器件适用于-273℃~55℃;③体积小,能够测量其他温度计无法测量的空隙、腔体及生物体内血管的温度;④使用方便,电阻值可在0.1~100kΩ间任意选择;⑤易加工成复杂的形状,可大批量生产;⑥稳定性好、过载能力强.

方案三:

热电偶传感器的灵敏度,线性和温度范围是和所用的金属有关。多年来,已经有几种热电偶成为标准,在美国,NIST公布了八种热电偶,让字母代码来识别的毫伏~温度表。其中五种J、K、T、G和N是由碱金属合金制成,有不同的温度范围和用途,灵敏度一般是每摄氏度几十毫伏,其中三种R、S和B是用的金属白金制成的,但是这种热电偶价格昂贵,最常用于高温工作,不适合常温的测量,而且灵敏度很低。

对比之后,根据实际的应用需求,本设计采用方案二热敏电阻传感器。

2.1.2 调理模块

方案一:

如图2-1所示是由集成运算放大器和铂热电阻构成的自动温度补偿电路。该电路可分为阻抗变换和温度补偿两级,阻抗变换器A1是一个电压跟随器,它的作用是把来自传感器送来的与温度成比例变化的,温度补偿器A2是一个同相电压放大器,电路元件可根据同相电压放大器基本原则进行选取,这一级的作用是将阻抗变换级送来的电压信号进行放大,同时吸取来自铂热Rt送来的与温度成比例变化的电阻信号,这个电阻信号去改变放大器的灵敏度,使放大器的输入电压V0与温度无关。但是此电路比较复杂,元器件较多,可能导致精度不够。

              

图2-1为自动温度补偿电路

方案二:

温度补偿还可以采用简单的查表法从电压值中查出相应的温度值。预先将一系列温度与电压对应值存贮到STC89C52微控制器程序存储器中的一个表内,当给定任意一个在测量范围中的电压值时,即可通过查表得出所对应的温度值。

本设计所采用的NTC热敏电阻所对应温度补偿表如表2-1;

所以本设计的温度补偿选用方案二,将再软件中体现。

2.1.3 温度核心模块
方案一:
S08AW60拥有62KB片上在线可编程FLASH存储器和2KB片上RAM,具有模块保护与安全选项功能,支持2.7~5.5V电源。片内总线时钟最高可达20MHz,可选择宽范围的时钟频率。其内部集成了高性能模/数转换器(ADC)和串行通信模块,具有很宽的工作温度范围(-40℃~+125℃),可适应各类恶劣环境。该芯片还可以通过BDM在计算机与微控制器进行在线编程及后台调试,避免频繁的插拔单片机,编译软件调试功能强大。
方案二:
STC89C52是一种低功耗、高性能8位微控制器,具有8K系统可编程FLASH存储器和256字节ROM,可实现0Hz~33Hz的全静态操作,支持4.0V~5.5V电源。使用Atmel公司高密度非易失性存储器技术制造,与MCS-51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。其内部没有A/D转换模块,需要外部扩展模数转换芯片。
对比之后,根据实际的应用需求,本设计选用方案二STC89C52,因为具有ISP功能,可直接通过串口下载用户程序,方便调试程序,内部8 KB的FLASH E2PROM使用户编制的程序及需要显示的字母、数字、汉字和图形都可以存储在里面,免去了扩展外部存储器的麻烦,因此以STC89C52单片机为核心的控制系统电路更简单,十分适用于液晶显示,在智能仪器、仪表和低功耗电子产品中被广泛选用。
2.1.4 显示模块

方案一:

LED数码管显示器可分为两种显示方式:静态显示和动态显示。

LED数码管静态显示,多片七段译码器驱动显示,这不仅增加了成本,还需要占用单片机多个I/O口,也给电路的焊接带来一定的困难,因此不选用这种方案作为显示模块,所以排除此方案。

方案二:

LED数码管显示器动态显示方式下,将所有位的段选线并联在起,由位选线控制哪位接收字段码。采用动态扫描显示,也就是在显示过中,轮流向各位送出字形码和相应的字位选择,同一时刻只有一位显示,其他各位熄灭。但是此显示方案稳定性较差,并且还需要焊接外围电路,所以不采用此方案。

方案三:

LCD液晶显示,由单片机驱动.它主要用来显示大量数据、文字、图形,能够显示的位数多,显示得清晰多样、美观,同时液晶显示器的编写程序简单,价格便宜,故采用此种方案。

LCD类型繁多,价格不等。根据本设计需要显示的信息量小的特点,选用价格便宜的LCD1602液晶屏。其特点如下:

液晶显示屏是以16列×2行=32个5×10或5×7点阵块组成的显示字符群,每个点阵为一个字符,字符间距和行距都为一个点的宽度;具有字符发生器ROM,可以显示192种字符;具有64字节的自定义字符RAM,可自定义8个5×7或4个5×10点阵字符;具有80字节的RAM;结构紧凑、轻巧、装配容易;单+5V电源供电,低功耗,长寿命,高可靠性。

2.2 系统简介

温度采集系统的硬件部分是由温度采集模块、MCU控制器模块、温度显示模块组成。具体框图如图2-1所示:

                           图2-1 系统硬件框图

热敏电阻的阻值会随着温度的变化而改变,这种变化不是线性的,但是每一种热敏电阻传感器都有一个阻值和温度对应的表格,可以通过查表得到温度值,当然也可以通过非线性公式计算出温度值。具体工作原理: 单片机通过AD芯片对电阻两端的电压进行采样,电阻变化时其两端的电压会变化,这种变化是线性的,单片机可以通过计算得到电阻值,然后通过查表得到温度值,再通过计算得到显示温度值。 原理图中的电源部分也可以直接换成3节1.5V电池,这样更简单一点。

3 硬件电路设计
3.1温度采集模块电路设计

该模块是根据热敏电阻阻值随温度变化而变化的特性,利用串联分压的特点,将热敏电阻所分的电压送到ADC0832的模拟量输入端。具体电路原理如图3-2所示:

图3-1温度采集模块电路原理图

该电路中RT1为热敏电阻,其电压传输到ADC0832的模拟量输入端,即CH0,芯片的2脚。

3.2 A/D转换模块电路设计

本设计采用的AD转换芯片是ADC0832:该芯片为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。芯片转换时间仅为32μS,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。通过DI 数据输入端,可以轻易的实现通道功能的选择。

正常情况下ADC0832 与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。但由于DO端与DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将DO和DI 并联在一根数据线上使用。本课题AD芯片的CS端与P1.0口连接;CLK端与P1.1口连接;D0与D1并联并与P1.2口相连。当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK 和DO/DI 的电平可任意。当要进行A/D转换时,须先将CS使能端置于低电平并且保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK 输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。在第1 个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号。在第2、3个脉冲下沉之前DI端应输入2 位数据用于选择通道功能:当此2 位数据为“1”、“0”时,只对CH0 进行单通道转换。当2位数据为“1”、“1”时,只对CH1进行单通道转换。当2 位数据为“0”、“0”时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入。当2 位数据为“0”、“1”时,将CH0作为负输入端IN-,CH1 作为正输入端IN+进行输入。到第3 个脉冲的下沉之后DI端的输入电平就失去输入作用,此后DO/DI端则开始利用数据输出DO进行转换数据的读取。从第4个脉冲下沉开始由DO端输出转换数据最高位DATA7,随后每一个脉冲下沉DO端输出下一位数据。直到第11个脉冲时发出最低位数据DATA0,一个字节的数据输出完成。也正是从此位开始输出下一个相反字节的数据,即从第11个字节的下沉输出DATA0。随后输出8位数据,到第19 个脉冲时数据输出完成,也标志着一次A/D转换的结束。最后将CS置高电平禁用芯片,直接将转换后的数据进行处理就可以了。

作为单通道模拟信号输入时ADC0832的输入电压是0~5V且8位分辨率时的电压精度为19.53mV。如果作为由IN+与IN-输入的输入时,可是将电压值设定在某一个较大范围之内,从而提高转换的宽度。但值得注意的是,在进行IN+与IN-的输入时,如果IN-的电压大于IN+的电压则转换后的数据结果始终为00H。

3.3 MCU控制器模块电路设计

STC89C52的最小系统电路设计如图3-2所示

VCC是STC89C52的电源引脚,GND为STC89C52的接地引脚,工作电压范围是4.0V~5.5V,在该电路中提供的是5V电压。利用芯片内部振荡电路,在XTAL1和XTAL2的引脚上外接定时元件,内部振荡器便能产生自激振荡,用示波器便可以观察到XATL2输出的正弦波,定时元件可以采用石英晶体和电容组成的并联振荡电路,晶体可以在1.2~12MHz之间选择,电容可以在20~60pF之间选择,通常选为30pF左右,电容C8~C9的大小对振荡频率有微小影响,可起频率微调作用。在芯片的9脚,即RST/Vpd接按键及电阻构成复位信号。

图3-2STC89C52最小系统电路设计

该电路为STC89C52控制器电路,其中,P0.5、P0.6、P0.7口分别与LCD1602的RS、R/W、E引脚连接;P2.0~P2.7口与LCD1602的DB0~DB7引脚连接;P1.2是模拟量输入端,用于输入热敏电阻传感器的电压。

3.3.1 核心部件的介绍

STC89C52是整个课题的核心部件,P0口是开漏双向可以写为1使其状态为悬浮用作高阻输入。P0口也可以在外部程序存储器时作地址的低字节,在访问外部数据存储器时作数据总线,此时通过内部强上拉输出1。在本课题中P0口外接10K排阻使输出为1来接LCD1602的RS、RW、E端。P1口可作为准双向I/O接口使用。对于MCS—52子系列单片机,P1.0和P1.1还有第2功能:P1.0口用作定时器/计数器2的计数脉冲输入端T2;P1.1用作定时器/计数器2的外部控制端T2EX。对于EPROM编程和进行程序校验时,P1口接收输入的低8位地址。在本课题中P1.2来接收AD转换模块送过来的数字量;P1.0与AD芯片的复位端相连;P1.1与AD芯片的CLK端相连。P2口2口是带内部上拉的双向I/O,口向P2口写入1时,P2口被内部上拉为高电平,可用作输入口当作为输入脚时,被外部拉低的P2口会因为内部上拉而输出电流(见DC电气特性)。在访问外部程序存储器和外部数据时分别作为地址高位字节和16位地址(MOVX @DPTR),此时通过内部强上拉传送1。当使用8位寻址方式(MOV@Ri)访问外部数据存储器时,P2口发送P2特殊功能寄存器的内容。本课题的P2口作为输出口使用,把信号输送给LCD1602。P3口是带内部上拉的双向I/O口,向P3口写入1时,P3口被内部上拉为高电平,可用作输入口,当作为输入脚时,被外部拉低的P3口会因为内部上拉而输出电流(见DC电气特性)。它为双功能口,可以作为一般的准双向I/O接口,也可以将每1位用于第2功能,而且P3口的每一条引脚均可独立定义为第1功能的输入输出或第2功能。本课题没有用到P3口。

综上所述,STC89C52系列单片机纳为以下两点:

1) 单片机功能多,引脚数少,因而许多引脚具有第2功能;

2) 单片机对外呈3总线形式,由P0、P2口组成16位地址总线;由P0口分时复用作为数据总线。

3.3.2复位电路的设计

STC89C52的复位方式可以是图3-4的上电复位,也可以是图3-5的手动复位。此外,RESET/V还是一复用脚,V掉电期间,此脚可接上备用电源,以保证单片机内部RAM的数据不丢失。

                    

图3-3上电复位                           图3-4手动复位

1.上电复位:上电自动复位电路是一种简单的复位电路,只要在RST复位引脚接一个电容到VCC,接一个电阻到地就可以了。上电复位是指在给系统上电时,复位电路通过电容加到RST复位引脚一个短暂的高电平信号,这个复位信号随着VCC对电容的充电过程而回落,所以RST引脚复位的高电平维持时间取决于电容的充电时间。为了保证系统安全可靠的复位,RST引脚的高电平信号必须维持足够长的时间。上电自动复位是通过外部复位电路的电容充电来实现的。只要VCC的上升时间不超过1ms,就可以实现自动上电复位。

2.手动复位:开关复位,只要按下开关按钮,倒相器即输出高电平,复位有效。手动复位和快捷,方便,所以此次设计采用手动复位方式。

3.4 显示模块电路设计

该模块是利用LCD1602(液晶显示):LCD1602的显示容量很大,为16×2个字符;1602LCD芯片的工作电压为4.5-5.5V,芯片工作电流在5V工作电压的情况下芯片工作电流为2毫安,模块的最佳工作电压为5V,显示字符的尺寸为2.95×4.35(W×H)mm。

1602LCD的第1脚VSS为地电源;第2脚接5V正电源;第3脚VL为液晶显示器对比调整端,接正电源时对比度弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用是可以通过一个10K的电位器调整对比度;第4脚为RS寄存器选择,高电平时选择数据寄存器,低电平时选择指令寄存器;第5脚为R/W读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据;第6脚为使能端,当使能端由高电平跳变为低电平时,液晶模块执行命令;第7~14脚的D0~D7为8位双向数据线;第15脚为背光源正极;第16脚为背光源负极。以上是整个1602LCD的功能介绍。

显示的清晰度是关键,其Vee引脚作用是对比调整,原理是该引脚输入电压不同,调整度不同,所以采用电位器分压作为它的电压输入。Vss及K引脚分别是电源地、LCD背光电源负极,直接接地。Vcc及A引脚分别是电源、LCD背光电源正极,采用+5V电源供电。其电路原理图如图3-5所示:

图3-5显示模块电路原理图
该电路中,LCD1602的RS、R/W、E引脚分别与STC89C52中的P0.5、P0.6、P0.7口连接;DB0~DB7引脚分别与STC89C52的P2.0~P2.7口连接。


4 软件程序设计
4.1系统整体软件设计的环境

Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。

2006年1月30日ARM推出全新的针对各种嵌入式处理器的软件开发工具,集成Keil μVision3的RealView MDK开发环境。RealView MDK开发工具Keil μVision3源自Keil公司。RealView MDK集成了业内领先的技术,包括Keil μVision3集成开发环境与RealView编译器。支持ARM7、ARM9和最新的Cortex-M3核处理器,自动配置启动代码,集成Flash烧写模块,强大的Simulation设备模拟,性能分析等功能,与ARM之前的工具包ADS等相比,RealView编译器的最新版本可将性能改善超过20%。

4.2软件设计流程图

软件系统初始化时把温度数据做成表格存储到ROM中,通过AD对热敏电阻两端的进行测量,然后通过运算将电压值对应于电阻值,通过查表把电阻值对应于温度值,再通过运算把温度数据送到LCD显示,其中程序初始化主要是对AD和LCD进行初始化。它的框图如图4-1:

                  

          图4-1软件总体流程图

4.2.1 A/D转换模块原理及程序

传感器获得的信号由于是模拟信号,而CPU处理的是数字信号,故要经过模数转换,本设计采用芯片ADC0832实现的AD转换。

图4-2 ADC0832的工作时序图

由以上时序图可知单片机对ADC0832的控制,所以进行以下编程。

C语言编写的STC89C52微控制器中A/D转换模块的节选程序代码如下:

uint ADC0832(uchar channel)

{

             uchar i;

             uint dat=0;

             uchar ndat=0;

             if(channel==0)channel=2;

             if(channel==1)channel=3;

             ADDI=1;

             _nop_();

             _nop_();

             ADCS=0;//拉低CS端

             _nop_();

             _nop_();

             ADCLK=1;//拉高CLK端

             _nop_();

             _nop_();

ADCLK=0;//拉低CLK端,形成下降沿1

             _nop_();

             _nop_();

             ADCLK=1;//拉高CLK端

             ADDI=channel&0x1;

             _nop_();

             _nop_();

             ADCLK=0;//拉低CLK端,形成下降沿2

             _nop_();

             _nop_();

             ADCLK=1;//拉高CLK端

             ADDI=(channel>>1)&0x1;

             _nop_();

             _nop_();

             ADCLK=0;//拉低CLK端,形成下降沿3

             ADDI=1;//控制命令结束

             _nop_();

             _nop_();

             dat=0;

             for(i=0;i<8;i++)

             {

                          dat|=ADDO;//收数据

                            ADCLK=1;

                            _nop_();

                            _nop_();

                            ADCLK=0;//形成一次时钟脉冲

                 _nop_();

                 _nop_();

                 dat<<=1;

                 if(i==7)dat|=ADDO;

}

             for(i=0;i<8;i++)

             {                          

                 ndat>>=1;

                          if(ADDO==1)

                          ndat|=0x80;

                 ADCLK=1;

                 _nop_();

                 _nop_();

                 ADCLK=0;//形成一次时钟脉冲

                 _nop_();

                 _nop_();

             }

             ADCS=1;//拉低CS端

             ADCLK=0;//拉低CLK端

             ADDO=1;//拉高数据端,回到初始状态

    if(dat==ndat)

             {

                return(ndat);

             }

             else

             {

                          return(0x00);

             }         

4.2.2热敏电阻阻值和温度的非线性对性模块原理及程序

热敏电阻的阻值温度特性曲线是一条指数曲线,非线性度较大,因此在使用时要进行线性化处理。可采用简单的查表法从电压值中查出相应的温度值。预先将一系列温度与电压对应值存贮到STC89C52微控制器程序存储器中的一个表内,当给定任意一个电压值时,即可通过查表得出所对应进行补偿过的温度值。

C语言编写的获得温度值的节选程序代码如下:

先对LCD1602进行程序初始化:LCD1602的RS脚置“1”,其意义为:选择数据寄存器;LCD1602的RW脚置“1”,其意义为:进行读操作;

#include<reg52.h>

#include<intrins.h>

#define uchar unsigned char

#define uint unsigned int

sbit rs=P0^5;

sbit rw=P0^6;

sbit e=             P0^7;

对ADC0832进行初始化:

sbit ADCS=P1^0;

sbit ADCLK=P1^1;

sbit ADDI=P1^2;

sbit ADDO=P1^2;

显示屏显示的选择项:

uchar code tab3[]="Low-temperature ";

uchar code tab4[]="Over-temperature";

uchar code tab5[]="     Error      ";

uchar code tab6[]="  Temp:";

uchar code tab7[]="    Normal     ";

uchar code tab1[]="0123456789";

把温度数据存储到ROM中,温度范围为79℃~-20℃:

uchar code tab2[]=

             {79,78,77,76,75,74,73,72,                             //温度补偿表

                71,70,69,68,67,67,66,65,

                64,63,63,62,61,60,60,59,

                58,58,57,56,56,55,54,54,

                53,53,52,52,51,50,50,49,

                49,48,48,47,47,46,46,45,

                45,44,44,43,43,43,42,42,

                41,41,40,40,39,39,39,38,

                38,37,37,36,36,36,35,35,

                34,34,34,33,33,33,32,32,

                31,31,31,30,30,30,29,29,

                28,28,28,27,27,27,26,26,

                26,26,25,25,24,24,23,23,

                23,22,22,22,21,21,21,20,

                20,20,19,19,19,18,18,18,

                17,17,17,16,16,16,15,15,

                15,14,14,13,13,13,12,12,

                12,11,11,11,10,10,10,9,

                9,9,8,8,7,7,7,6,

                6,6,5,5,4,4,4,3,

                3,3,2,2,1,1,1,0,

                0,1,1,2,2,2,3,3,

                4,4,5,5,6,6,7,7,

                8,8,9,9,10,10,11,11,

                12,12,13,14,15,15,16,17,

                17,18,19,19,20};

uint ad,ad1;

延时50us的程序:

void delay_50us(uint t)

{

             uchar j,z;

             for(z=t;z>0;z--)

                          for(j=19;j>0;j--);

}

延时1ms的程序:

void delay(uint z)

{

    uint x,y;

    for(x=z;x>0;x--)

        for(y=110;y>0;y--);

}

写指令程序:

void write_com(uchar com1)

{

             e=0;

             rs=0;

             rw=0;

             P2=com1;

             delay_50us(10);

    e=1;

             delay_50us(20);

             e=0;

}

写数据程序:

void write_data(uchar dat1)

{

    e=0;

    rs=1;

    rw=0;

    P2=dat1;

    delay_50us(10);

    e=1;

    delay_50us(20);

    e=0;            

}

4.2.3温度显示模块程序

LCD1602采用+5V电压驱动,其数据接口和读写控制引脚与STC89C52单片机的I/O口直接相连。ADC0832将采集到的模拟电压值经过A/D转换后送给单片机,单片机查表得到温度值,通过I/O口传输给LCD1602显示。

C语言编写的温度值显示的节选程序代码如下:

void disp()

{

     ad1=ad-29;

             write_com(0x80);

             if(ad<29)

             {

                   uchar i;

                            for(i=0;i<16;i++)

                            {

                                        write_data(tab4);

                            }

                            write_com(0x80+0x40);

                             for(i=0;i<16;i++)

                            {

                                        write_data(tab5);

                            }                          

             }

                          else if(ad>233)

             {

                            uchar i;

                            for(i=0;i<16;i++)

                            {

                                        write_data(tab3);

                            }            

                             write_com(0x80+0x40);

                             for(i=0;i<16;i++)

                            {

                                        write_data(tab5);

                            }                          

             }                          

             else if(ad>=29&&ad<=233)

             {               

                   uchar i;

                            for(i=0;i<16;i++)

                            {

                                        write_data(tab7);

                            }            

                            write_com(0x80+0x40);

                            for(i=0;i<7;i++)

                                         write_data(tab6);                                       

                            if(ad>197)

                            {

                                          write_data('-');

                                         write_data(tab1[(tab2[ad1])/10]);

                                         write_data(tab1[(tab2[ad1])%10]);            

                            }

                            else

                            {

                                         write_data(' ');

                                         write_data(tab1[tab2[ad1]/10]);

                                         write_data(tab1[tab2[ad1]%10]);

                            }

                            write_data(0xdf);                                                    //显示温度符号

                     write_data('C');            

             }

}



5 系统仿真

Proteus是一款功能非常强大的集仿真、原理图设计及PCB设计于一体的软件。该软件非常实用,不需要有硬件电路即可通过仿真单片机的编程。打开软件,选择P进行元器件的摆放。在这里可以通过元器件的名字进行检索。电容电阻等元器件只需要其相应的英文缩写即可。89C52是本次要使用的微控制器单元,在检索行输入89C52,可以看到元件库里出现了我们需要的芯片。选中后就可将其拖入工程界面,可以自己选择合适的位置。依次将原理图中的元件器拖入合适的位置,然后将各个元器件链接起来构成回路。

在桌面右键点击新建一个名为tt的文件夹,打开Keil uVision3软件,点击工程>新建uVision工程选中桌面的tt文件夹,把工程的名字命为test,点击保存选择要用的51单片机型号,本次设计用的是STC89C52,这里选择Atmel的AT89C52,点击确定,点击否,点击新建文件,再点击保存,将文件命名为main.c(如果用的是汇编语言,则命为main.asm)点击保存,点击新建文件,右键点击源代码组1>添加文件到组“源代码组1”,点击main.c,点击Add,点击Close,双击源代码组1,可以看到main.c已被添加进工程。将本次热敏电阻温度检测电路的程序输入工程中,点击编译指令,检查程序中的错误并调试,再次点击编译,待程序中没有错误时,点击工程中options for target命令,选择输出一栏,勾选产生HEX文件,点击确定。再次点击编译,报告输出“创建HEX文件”。最后将tt文件夹下的HEX文件烧入到单片机中。最后在Proteus中进行系统仿真,观察到LCD液晶显示屏上可以显示当前的温度值,改变热敏电阻的阻值,温度随之变化。如图5-1所示。

图5-1 系统仿真图
6 设计心得

本次设计具备一定难度,在这次毕业设计中,我学到了很多知识,也使我的能力得到了提升。

首先,硬件方面。选择硬件,要比较同类产品的稳定性、功耗、体积、价格等,另外还要符合设计的全部要求。在显示方案上,我考虑的时间相对长了一点。利用数码管显示,程序复杂,但是,自己编程比较熟悉,价格便宜。利用LCD1602显示,程序简单,但是以前自己从未使用过。经过比较,我选择LCD1602,这样可以学到新知识,提高自己的知识水平。在硬件电路的设计方面,用Altium Designer Summer绘制电路图时要标明元件的大小,有些封装元件要标明名称和封装。

其次,软件方面。程序的模块化有利于提高编程的效率,也提高了程序的易读性。在本次课程设计中,我主要分两个方面进行编程。一个方面,我在了解了A/D转换模块和各个接口的作用后,首先对其编程。另一个方面,我认真分析了LCD液晶显示屏和数码管显示原理区别。然后对显示模块进行编程,最后经过多次调试,LCD1602终于能正常显示。

总而言之,在韩老师的带领和指导下,我顺利的完成了课程设计,完成了老师交给的任务。



附 录 一系统整体原理图


PCB版图


完整的Word格式文档51黑下载地址:
http://www.51hei.com/bbs/dpj-113223-1.html


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表