ImageVerifierCode 换一换
格式:DOCX , 页数:59 ,大小:40.91KB ,
资源ID:722740      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-722740.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于at89s51的多路温度巡检仪.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

基于at89s51的多路温度巡检仪.docx

1、基于at89s51的多路温度巡检仪目 录1.设计任务 2 1.1设计题目21.2设计目的 2 1.3设计任务 22.总体方案设计与方案论证 4 2.1总体方案设计与论证4 2.2温度采集、计算的方案设计与论证53.系统总框图及总体软件设计说明 64.系统资源分配图 75.局部程序设计说明 85.1显示更新子程序 85.2温度采集存储子程序95.3PB口消抖和冻结子程序 115.4 自动巡显和手动切换子程序 125.5转换成温度内码的子程序 135.6温度内码转化为BCD码的子程序155.7键盘扫描和节拍设定的子程序175.8改进后设定温度上下限的子程序195.9改进后实时钟调整的子程序206.

2、系统功能及其操作说明-217.调试记录及调试结果- 218.课程设计总结- 22附录一:源程序清单 23附录二:改进后的程序 381.设计任务1.1设计题目多路温度巡检仪1.1设计目的通过小型微机应用产品的设计与调试过程,运用微机原理及接口技术课程所学的基本知识,在设计中加以应用,进而得到理解、巩固和提高,通过实践的过程学习与掌握分析与解决实际问题的方法与手段,提高设计、编程与调试的实际动手能力,作为工程技术工作的一次基本训练。1.2设计任务设计一个以单片机为核心的多路温度巡回检测显示仪表系统。通过多选一电子模拟开关及A/D转换器巡回采集各路温度传感及变送器的数据,进行信号处理及标度变换,以一

3、定的节拍时间依序显示各检测回路的序号及温度值,并可通过按钮开关操控作冻结或切换显示,在单片机实验板台上模拟调试实现。(一) 基本设计要求1、开机单片机实验板上的8位数码管、LED灯、蜂鸣器等设备进行自检自检。2、八位LED 7段数码管显示当前检测回路的序号、温度值及温度单位“oC”或其他界面信息,温度显示单位为oC,保留一位小数。C84.3-1例如:3、八路温度按节拍巡回检测显示,温度测量范围-50.0C+50.0C。4、设选用的温度传感变送器将检测的-50C+50C温度变换为05V电压信号,综合误差为0.5C。5、应采取数字滤波技术提高测量的稳定性采用每一路的AD信号采集4次滚动存放保存的4

4、次的温度值都是最新的温度值然后对这4次的温度值求平均值。6、设置一个“冻结”按钮开关以操控进入与退出当前回路的冻结显示方式,冻结显示期间每0.5S更新一次温度值,冻结的时候只是路数不再改变只是显示当前路的温度值。7、设置一个“切换”按钮开关以操控强行切换显示下一检测回路号及温度值。8、对开关量输入进行软件消抖动处理比如冻结的按键进行键盘消抖动处理。(二) 扩展功能(选做)1、键盘设定巡回节拍范围为0.5S5.0 S,设定过程为按下功能键F后在选择一个操作的数值比如F1,先返回当前的节拍值,再进行按照数字键进行设定节拍在这个状态下按下S键保存新的节拍值且保持此节拍值1S后返回到巡显的状态,按下C

5、键的时候直接返回到巡显状态。2、F键按下无操作时间超过10分钟后自动恢复为基本的温度巡显方式。3、超上限告警功能,键盘设定温度上限值范围为-50 .0C+50 .0C,监测到某回路温度超上限时有相应的显示闪烁提示、LED指示、讯响告警及继电器触点输出控制功能。4、实现带有回差的超上限告警功能,通过键盘设定回差值的范围为0 .1C5 .0C。5、增加温度超下限告警处理功能。6、每巡回显示一遍,穿插一个节拍显示实时钟,通过键盘设定时间。7、其他功能扩展。2.总体方案设计与方案论证2.1总体方案设计与论证本次课程设计的要求是8路温度巡显仪,要正常显示、进行参数设置等多个工作状态故系统工作的标志位是程

6、序工作的主要的线索,每个功能模块在判断后系统的标志位再去执行相应的功能。见如下的框图所示。设置节拍 1号键按下了F键 参数设定态 为2设置报警限值 2号键系统的标志位 判 断 进入冻结态 F0=1 显示温度态 为1正常巡显态 F0=0 图1-系统软件设计的整体思路框图2.2温度采集、计算的方案设计与论证方案一 采用ADC0809芯片把经过每一路温度传感变送器变换为05V电压信号转化为数字量采用滚存最新的4次温度值进行求平均值并且每个工作大循环调用一次,把这个平均值扩大到01000的温度内码存储起来这样一来可以使-50C、0C、50C分别变换成0、500、1000的温度内码,要显示的时候读出温度

7、内码转化为BCD码送入8位7段数码管显示,8路温度信号采用巡回动态显示。通过按键操作进行修改系统程序的的标志位,程序中通过判断这些标志位来修改显示的节拍和温度报警的上下限。方案二 也是采用ADC0809用每调用一次温度采集子程序就把8路的温度每一路采集四次存放到存储单元中,这样每调用一次就要算32次,每次AD转化最少要100US要是稍微延时1MS的时候,每次调用就要32MS。如果显示的时候采用静态显示的时候要很多条I/O线。综上所述,选用方案一,要是选用方案二的时候每次调用时太久不利于系统工作,会影响后面的程序调用。每个大循环调用1路四次的AD转化且滚存到存储区中,把AD值转化成温度内码,再把

8、温度内码转化成BCD码。2.3显示查表的方案设计与论证方案一 把带小数点的断码也写进断码表,显示个位的时候直接查找有带符号位的断码。 方案二 显示过程中先判断显示到了个位没有,如果到了就把个位的数据的最高位清零按键调整节拍8路温度变送器 图2-系统设计的硬件系统的框图3.系统总框图及总体软件设计说明 初始化包括芯片初始化和工作初始化初始化 自检包括对蜂鸣器、LED、每个数码管的自检系统自检 包括是要显示温度或者是显示实时钟显示更新子程序 把显示缓存区30H37H单元的内容通过查表进行显示查表显示子程序 每个流程调用一次进行一次采集并采用数据滚存数据采集子程序 对PB口输入的键盘进行消抖动保存到

9、2EH和2FH键盘消抖子程序 判别是否PB0的冻结按键如果按下把标志位F0求反判别冻结子程序 系统在状态1下按一定节拍进行正常的温度巡检自动巡显子程序 如果切换键按下的时候路数+1显示当前路的温度值手动切换子程序 利用键反转法先读出键的状态在进行查表查出键码键盘扫描子程序 判断是否按下了F键,是进入2态进行对参数的设定 节拍设置子程序 把AD转换出来的数据经过放大到0-1000的温度内码 AD转化温度内码 把温度内码进行处理转化成BCD码显示到数码管上内码转化成BCD码 图3-系统软件设计的总流程图并解释4.系统资源分配表硬件资源分配片内数据存储空间的分配名称实现的功能字节地址用 途PB0冻结

10、按键00H-07H工作寄存器R0R7PB1手动切换按键10H-1FH8路温度内码的存储单元PB2小时校准按键20H进程标志位PB2分钟校准按键21H设置温度上下限的保存单元PB2秒钟校准按键22H温度的十位的临时存储单元K0K9数字09输入按键23HF态设置的过程的无操作中断次数K10功能键F24HF态无操作跳出的时间设定单元K11确定键S29H-2FHPB口消抖动的暂时存储单元K12取消操作键C30H-37H数码管显示缓存区L0灯超过上限温度报警38H-3CH分别为200us、10ms、1s、1分1小时存储单元P3.2蜂鸣器超温报警3EH节拍计时的中断次数记录P0口数据地址/数据总线复用3F

11、H节拍中断次数计数单元P1口外部扩展地址总线的高八位40H-5FH8路温度每一路采集4次的存储单元P2口片外芯片的线选端68H最新的AD转换的数据存储单元P3口WR、RD片外扩展的读写信号69HDPL的存储单元,用来读取和设置AD转化的通道6AH用来设置求平均值的循环次数6BH温度内码低字节的暂存单元6CH温度内码高字节的暂存单元6DH路次的存储单元6EH进程的状态码6FH栈底指针F0位地址冻结的标志位64H-67H键盘扫描的存储单元5.局部程序设计说明5.1显示更新子程序(一)显示更新子程序的流程图取当前路数 取进程码是否为1态 N 说明为2态 是否9路 Y调用F态显示程序段 N Y调用拆温

12、度子程序跳到拆时间子程序段段调用实时钟调整子程序返回图4-显示更新子程序流程图源程序如下:GENGXIN:MOV R7,6DH ;显示更新送显缓。取出当前路次值 MOV A,6EH ;取当前进程码 CJNE A,#01H,GX1 ;当前状态是否为常态? CJNE R7,#9,GX ;判断是否该显示时间? LCALL CTIME ;调用时间拆字子程序 LCALL SHIZTZ LJMP GX4 ;返回 GX:LCALL CWENDU ;否,则调用温度拆字子程序 SJMP GX4 ;返回 GX1:CJNE A,#02H,GX4 ;判断是否为02进程 MOV 37H,#15 ;送F的字符到左边第一个

13、数码管 MOV 36H,#16 ;送-字符所在的字段码表的位置 MOV 34H,#19 ;熄灭34H单元所对应的数码管 MOV 31H,#19 ;熄灭35H单元所对应的数码管 GX4:RET(二)拆温度子程序 拆温度子程序包括在左边第一位显示当前路次,最右边两位分别显示“C”。通过判断温度的符号的标志位34H.7,可以知道当前温度为正或为负,为负时显示出负号,如果当前的温度十位为零时,要把十位关显示。源程序如下: CWENDU:MOV 37H,6DH ;温度拆字子程序。当前路次值放入37H中 MOV 30H,#21 ;温度C显示位 MOV 31H,#20 ;符号显示位 MOV 36H,#19

14、;空格 MOV A,34H ;十位参数过滤 JNB ACC.7,W1 ;最高位是否为1? MOV 35H,#10H ;是,显示-号 LJMP W3 W1:MOV 35H,#19 ;否,改为灭掉 W3:CLR ACC.7 ;最高位清零 JNZ W2 ;累加器A非零跳转是否为零十位是否零? MOV 34H,#19 ;十位为零,灭掉 LJMP W4 W2:MOV 34H,A ;回存 W4:RET(三)拆时间子程序原理同TEST0315子程序,把3AH,3BH,3CH中的数据分别把高四位和低四位拆到两个字节的第四位,这两个字节的高四位清零。把拆出来的两个字节送到显示缓存区显示。源程序略。5.2温度采集

15、存储子程序依据路数设为N通过:N*4+3EH可以算出第N路温度存储的首地址通过滚动存放到连续的四个单元中。滚存的示意图如下:例如第一路1*4H+3EH=42H 40H 首先读出42H中的内容到A中41H 指针加1指向43H,把A(42H)放入43H 42H 起始地址 指针减去2指向41H单元,且读到A中 43H 指针加1指向42H,把A(41H)放入42H 44H 指针减去2指向40H,且读到A中 45H 指针加1指向41H,把A(40H)放如41H . 读出AD信号到40H . DPL+1指向下一个通道的AD转换 . 子程序返回5FH 图5-AD滚存的原理示意图源程序清单如下: CAIJIW

16、D:MOV DPH,#0FBH ;写外部数据指针高8位采用8路温度滚存; MOV DPL,69H ;读取外部数据指针低八位 MOVX A,DPTR ;读取上一次AD转换的结果 MOV 68H,A ;暂存结果 MOV A,DPL ;数据指针低八位放入累加器中,AD数据存储地址 SUBB A,#0F7H ;减去F7H MOV B,#4 ;再乘以4 MUL AB ; ADD A,#3EH ;再加上3EH MOV R0,A ;R0指向写数据的首地址 MOV A,R0 ;读取该单元的数据 INC R0 ;指针加一 MOV R0,A ;在该单元放入前个单元的数据 DEC R0 ;指针连续后退两次 DEC

17、R0 ; MOV A,R0 ;读取该单元的数据 INC R0 ;指针加一 MOV R0,A ;在该单元放入前个单元的数据 DEC R0 ;指针连续后退两次 DEC R0 ; MOV A,R0 ;读取该单元的数据 INC R0 ;指针加一 MOV R0,A ;在该单元放入前个单元的数据 DEC R0 ;指针后退一次 MOV A,68H ;读取最新的数据 MOV R0,A ;在该单元放入最新的数据 INC DPL ;数据指针低八位加一,准备转换下一路 MOV A,DPL ; MOV 69H,A ;存储数据指针低八位 CJNE A,#00H,AD1 ;判断八路是否全部转换过? MOV DPL,#0F

18、8H ;是,重新从第一路开始 MOV 69H,#0F8H ; AD1:MOVX DPTR,A ;启动AD转换 RET5.3 PB口消抖和冻结子程序PB口消抖是利用保存最近5次的状态,如果5次的结果一样说明确定按下了按键并且存放到2EH和2FH中详细程序见程序清单,如果没有直接退出。冻结子程序是判断是否按下了冻结键PB0,如果有按下的时候修改状态标志字当前路数不再变化温度值每1S更新一次,没有按下的时候直接跳出。 源程序如下: DONGJIE:JB 2FH.0,DONE1 ;冻结判断子程序。判PB0下降沿 JNB 2EH.0,DONE1 CPL F0 ;取反标志位 DONE1:RET5.4 自动

19、巡显和手动切换子程序开始开始是否切换是否冻结 Y N取出当前中断次数 Y Y路次+1 和设定相等? N是否到9 Y N路次+1,调用温度转化子程序 Y路次置1 是否到9 N 返回 路次置1 Y 返回 图5AD自动巡检的流程图 图6AD手动切换的流程图 源程序如下:ZDXUNX:JB F0,BACK1 ;自动巡显节拍控制子程序。检测当前的冻结位 MOV A,3EH ;非冻结状态 CJNE A,3FH,BACK ;判断节拍值是否已到? MOV 3EH,#0 ;已到,中断次数计数单元清零 INC 6DH ;路次加一 LCALL WDNM ;调用AD转化为温度内码的子程序 LCALL NEI2BCD

20、;调用T内码转BCD码子程序 MOV A,6DH ;判断是否已到第九路? CJNE A,#10,BACK ; MOV 6DH,#1 ;置为第一路 BACK:RET ;返回 BACK1:LCALL WDNM ;冻结状态。调用AD值转化为温度内码的子程序 LCALL NEI2BCD ;调用T内码转BCD码子程序 RET5.5 转换成温度内码的子程序 此程序该设计的核心的算法之一,主要利用(D1+D2+D3+D4)/4*1000/255这样一来可以把AD转化出来的值放大到0-1000的温度内码,同样等价为:(D1+D2+D3+D4)*251/256.除以256等价为向右移动8位,也相当于高低字节错位

21、相加得到结果。取出路次取出路次算出AD的地址取出数据算出AD的起始地址 大于500?数据累加到A,地址+1 N 标记符号位是否加4次 N Y 内码-500 Y 500-内码高低字节分别保存 相乘后的结果错位相加高低字节分别乘以251 用低8位求出十位、个位、小数位 高8位为1? 算出T内码的起始地址回存T内码 N 给每一位分别加2,5,6 Y 返回 返回 图7AD转化成T内码的流程图 图8温度内码转化成BCD码的流程图源程序如下:WDNM:MOV A,6DH ;取当前路次值A/D数据转化成温度内码子程序 MOV B,#4 ;B存入地址倍数 MUL AB ;求得当前路的存储首地址 ADD A,#

22、3CH ; MOV R0,A ;R0指针指向存储路数AD值的首地址40H-5FH中的一个 MOV R5 ,#04H MOV R2,#00H MOV R4,#00H MOV R1,#00H WDNM5:MOV A ,R0 WDNM1:DJNZ R5 ,WDNM2 LJMP WDNM3 WDNM2:INC R0 ADD A ,R0 ;把四次A/D值的和的低字节放到累加器A中 JNC WDNM1 ;计算出温度内码实现的运算(D1+D2+D3+D4)*251/256 CLR C INC R2 ;R2用来存放四次A/D值相加的高字节 LJMP WDNM1 WDNM3:MOV B ,#251 MUL AB

23、 ;低字节先乘以251,低字节放到A中 MOV R4 ,B ;相乘后右移8位相当于丢弃低字节,高字节放到R4中 MOV A ,R2 ; MOV B ,#251 ;相加后的高字节*251 MUL AB ;相乘后的高字节存放在B中 ADD A ,R4 ;错位相加 JNC WDNMA ;没有进位的话跳转到温度回存的程序段 CLR C INC B ;进位到高字节中 WDNMA:MOV 6BH,A ;转化出来的温度内码的低字节存放到6B中 MOV 6CH,B ;高字节放到6CH中 MOV A,6DH ;取当前路次值 MOV B,#2 ;每一路占用两个字节10H-1FH的地址 MUL AB ;路次值乘以2

24、再加上14即得内码区高字节首地址 ADD A,#0EH ; MOV B,A ; INC B ;加一得低字节地址 MOV R1,A ;R1和R0分别为高低八位的存储地址指针 MOV R0,B ;存储地址指针 R1R0 格式 MOV R1 ,6CH ;回存高字节到10H开始的地址中 MOV R0 ,6BH ;回存低字节 MOV 6CH,#0 ;高字节存储单元清零,供下次使用 MOV 6BH,#0 ;低字节存储单元清零,供下次使用 RET5.6温度内码转化为BCD码的子程序 把温度内码和500相比较,如果大于500说明温度为正的,用 内码-500=TT/100的商为温度的十位,余数/10的商为温度的

25、个位,此时的余数为温度的小数位。如果是小于500说明温度为负的 ,用 500-内码=T此时再按照上面的取余数和商的算法算出温度值。流程图见图8. 源程序如下:NEI2BCD:MOV A,6DH ;温度内码转BCD码子程序。取当前路次值 CLR C ;清除进借位标志 CJNE R1,#01H,NEXT6 ;高八位是否相等?不相等,转移 CJNE R0,#0F4H,NEXT4;高八位相等,低八位是否相等?不相等,转移 MOV 32H,#0 ;高低八位均相等,即为0 MOV 33H,#0 ; MOV 34H,#0 ; LJMP DONE2 ;完成 NEXT4:JC NEXT5 ; MOV A,R0

26、;温度大于0 CLR C SUBB A,#0F4H ;转换为BCD码 LCALL JISUAN ; LJMP DONE2 ;完成 NEXT5:MOV A,#0F4H ;温度小于0 CLR C SUBB A,R0 ; LCALL JISUAN ;转换为BCD码 MOV A,34H ;- 号需显示,添加负号标志 ORL A,#80H ; MOV 34H,A ;回存 LJMP DONE2 ;完成 NEXT6:JC NEXT7 ;判断R1的内容是否比01H大? DEC R1 ;高八位比01H大,R1减去500的高八位01H MOV A,R0 ;低八位和500的低八位相减 CLR C ;清除借位标志位 SUBB A,#0F4H ; MOV 20H.1,C ;保存借位标志位 JB 20H.1,NEXT11 ;判断相减过程中是否出现借位? LCALL JISUAN ;无出现借位,运算 CJNE R1,#01H,NEXT12 ;高八位是否为1? LCALL BUCHANG ;是,补偿一次 NEXT12:INC R1 ;否,恢复初始的R1值,差即为目标BCD码 LJMP DONE2 ;返回 NEXT11:DEC R1 ;出现借位,高八位再次减一 LCALL JISUAN ;运算 CJNE R1,#01H,NEXT13 ;高八位是否还为1? LCALL BUCHANG ;是,补

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2