基于at89s51的多路温度巡检仪.docx
《基于at89s51的多路温度巡检仪.docx》由会员分享,可在线阅读,更多相关《基于at89s51的多路温度巡检仪.docx(59页珍藏版)》请在冰点文库上搜索。
基于at89s51的多路温度巡检仪
目录
1.设计任务……………………………………………………………………2
1.1设计题目………………………………………………………………2
1.2设计目的……………………………………………………………2
1.3设计任务……………………………………………………………2
2.总体方案设计与方案论证………………………………………………4
2.1总体方案设计与论证…………………………………………………4
2.2温度采集、计算的方案设计与论证…………………………………5
3.系统总框图及总体软件设计说明………………………………………6
4.系统资源分配图…………………………………………………………7
5.局部程序设计说明………………………………………………………8
5.1显示更新子程序…………………………………………………………8
5.2温度采集存储子程序………………………………………………………9
5.3PB口消抖和冻结子程序…………………………………………………11
5.4自动巡显和手动切换子程序……………………………………………12
5.5转换成温度内码的子程序………………………………………………13
5.6温度内码转化为BCD码的子程序………………………………………15
5.7键盘扫描和节拍设定的子程序……………………………………………17
5.8改进后设定温度上下限的子程序…………………………………………19
5.9改进后实时钟调整的子程序………………………………………………20
6.系统功能及其操作说明-……………………………………………………21
7.调试记录及调试结果-………………………………………………………21
8.课程设计总结-……………………………………………………………22
附录一:
源程序清单…………………………………………………………23
附录二:
改进后的程序………………………………………………………38
1.设计任务
1.1设计题目
多路温度巡检仪
1.1设计目的
通过小型微机应用产品的设计与调试过程,运用《微机原理及接口技术》课程所学的基本知识,在设计中加以应用,进而得到理解、巩固和提高,通过实践的过程学习与掌握分析与解决实际问题的方法与手段,提高设计、编程与调试的实际动手能力,作为工程技术工作的一次基本训练。
1.2设计任务
设计一个以单片机为核心的多路温度巡回检测显示仪表系统。
通过多选一电子模拟开关及A/D转换器巡回采集各路温度传感及变送器的数据,进行信号处理及标度变换,以一定的节拍时间依序显示各检测回路的序号及温度值,并可通过按钮开关操控作冻结或切换显示,在单片机实验板台上模拟调试实现。
(一)基本设计要求
1、开机单片机实验板上的8位数码管、LED灯、蜂鸣器等设备进行自检自检。
2、八位LED7段数码管显示当前检测回路的序号、温度值及温度单位“oC”或其他界面信息,温度显示单位为oC,保留一位小数。
C
°
8
4.
3
---
1
例如:
3、八路温度按节拍巡回检测显示,温度测量范围-50.0°C~+50.0°C。
4、设选用的温度传感变送器将检测的-50°C~+50°C温度变换为0~5V电压信号,综合误差为±0.5°C。
5、应采取数字滤波技术提高测量的稳定性采用每一路的AD信号采集4次滚动存放保存的4次的温度值都是最新的温度值然后对这4次的温度值求平均值。
6、设置一个“冻结”按钮开关以操控进入与退出当前回路的冻结显示方式,冻结显示期间每0.5S更新一次温度值,冻结的时候只是路数不再改变只是显示当前路的温度值。
7、设置一个“切换”按钮开关以操控强行切换显示下一检测回路号及温度值。
8、对开关量输入进行软件消抖动处理比如冻结的按键进行键盘消抖动处理。
(二)扩展功能(选做)
1、键盘设定巡回节拍范围为0.5S~5.0S,设定过程为按下功能键F后在选择一个操作的数值比如F1,先返回当前的节拍值,再进行按照数字键进行设定节拍在这个状态下按下S键保存新的节拍值且保持此节拍值1S后返回到巡显的状态,按下C键的时候直接返回到巡显状态。
2、F键按下无操作时间超过10分钟后自动恢复为基本的温度巡显方式。
3、超上限告警功能,键盘设定温度上限值范围为-50.0°C~+50.0°C,监测到某回路温度超上限时有相应的显示闪烁提示、LED指示、讯响告警及继电器触点输出控制功能。
4、实现带有回差的超上限告警功能,通过键盘设定回差值的范围为±0.1°C~±5.0°C。
5、增加温度超下限告警处理功能。
6、每巡回显示一遍,穿插一个节拍显示实时钟,通过键盘设定时间。
7、其他功能扩展。
2.总体方案设计与方案论证
2.1总体方案设计与论证
本次课程设计的要求是8路温度巡显仪,要正常显示、进行参数设置等多个工作状态故系统工作的标志位是程序工作的主要的线索,每个功能模块在判断后系统的标志位再去执行相应的功能。
见如下的框图所示。
设置节拍
1号键
按下了F键
参数设定态
为2
设置报警限值
2号键
系统的标志位判断
进入冻结态
F0=1
显示温度态
为1
正常巡显态
F0=0
图1-系统软件设计的整体思路框图
2.2温度采集、计算的方案设计与论证
方案一采用ADC0809芯片把经过每一路温度传感变送器变换为0~5V电压信号转化为数字量采用滚存最新的4次温度值进行求平均值并且每个工作大循环调用一次,把这个平均值扩大到0~1000的温度内码存储起来这样一来可以使-50°C、0°C、50°C分别变换成0、500、1000的温度内码,要显示的时候读出温度内码转化为BCD码送入8位7段数码管显示,8路温度信号采用巡回动态显示。
通过按键操作进行修改系统程序的的标志位,程序中通过判断这些标志位来修改显示的节拍和温度报警的上下限。
方案二也是采用ADC0809用每调用一次温度采集子程序就把8路的温度每一路采集四次存放到存储单元中,这样每调用一次就要算32次,每次AD转化最少要100US要是稍微延时1MS的时候,每次调用就要32MS。
如果显示的时候采用静态显示的时候要很多条I/O线。
综上所述,选用方案一,要是选用方案二的时候每次调用时太久不利于系统工作,会影响后面的程序调用。
每个大循环调用1路四次的AD转化且滚存到存储区中,把AD值转化成温度内码,再把温度内码转化成BCD码。
2.3显示查表的方案设计与论证
方案一把带小数点的断码也写进断码表,显示个位的时候直接查找有带符号位的断码。
方案二显示过程中先判断显示到了个位没有,如果到了就把个位的数据的最高位清零
按键调整节拍
8路温度变送器
图2-系统设计的硬件系统的框图
3.系统总框图及总体软件设计说明
初始化包括芯片初始化和工作初始化
初始化
自检包括对蜂鸣器、LED、每个数码管的自检
系统自检
包括是要显示温度或者是显示实时钟
显示更新子程序
把显示缓存区30H—37H单元的内容通过查表进行显示
查表显示子程序
每个流程调用一次进行一次采集并采用数据滚存
数据采集子程序
对PB口输入的键盘进行消抖动保存到2EH和2FH
键盘消抖子程序
判别是否PB0的冻结按键如果按下把标志位F0求反
判别冻结子程序
系统在状态1下按一定节拍进行正常的温度巡检
自动巡显子程序
如果切换键按下的时候路数+1显示当前路的温度值
手动切换子程序
利用键反转法先读出键的状态在进行查表查出键码
键盘扫描子程序
判断是否按下了F键,是进入2态进行对参数的设定
节拍设置子程序
把AD转换出来的数据经过放大到0-1000的温度内码
AD转化温度内码
把温度内码进行处理转化成BCD码显示到数码管上
内码转化成BCD码
图3-系统软件设计的总流程图并解释
4.系统资源分配表
硬件资源分配
片内数据存储空间的分配
名称
实现的功能
字节地址
用途
PB0
冻结按键
00H-07H
工作寄存器R0—R7
PB1
手动切换按键
10H-1FH
8路温度内码的存储单元
PB2
小时校准按键
20H
进程标志位
PB2
分钟校准按键
21H
设置温度上下限的保存单元
PB2
秒钟校准按键
22H
温度的十位的临时存储单元
K0~K9
数字0~9输入按键
23H
F态设置的过程的无操作中断次数
K10
功能键F
24H
F态无操作跳出的时间设定单元
K11
确定键S
29H-2FH
PB口消抖动的暂时存储单元
K12
取消操作键C
30H-37H
数码管显示缓存区
L0灯
超过上限温度报警
38H-3CH
分别为200us、10ms、1s、1分1小时存储单元
P3.2
蜂鸣器超温报警
3EH
节拍计时的中断次数记录
P0口
数据地址/数据总线复用
3FH
节拍中断次数计数单元
P1口
外部扩展地址总线的高八位
40H-5FH
8路温度每一路采集4次的存储单元
P2口
片外芯片的线选端
68H
最新的AD转换的数据存储单元
P3口
WR、RD片外扩展的读写信号
69H
DPL的存储单元,用来读取和设置AD转化的通道
6AH
用来设置求平均值的循环次数
6BH
温度内码低字节的暂存单元
6CH
温度内码高字节的暂存单元
6DH
路次的存储单元
6EH
进程的状态码
6FH
栈底指针
F0位地址
冻结的标志位
64H-67H
键盘扫描的存储单元
5.局部程序设计说明
5.1显示更新子程序
(一)显示更新子程序的流程图
取当前路数取进程码
是否为1态
N说明为2态
是否9路
Y
调用F态显示程序段
N
Y
调用拆温度子程序
跳到拆时间子程序段段
调用实时钟调整子程序
返回
图4-显示更新子程序流程图
源程序如下:
GENGXIN:
MOVR7,6DH;显示更新送显缓。
取出当前路次值
MOVA,6EH;取当前进程码
CJNEA,#01H,GX1;当前状态是否为常态?
CJNER7,#9,GX;判断是否该显示时间?
LCALLCTIME;调用时间拆字子程序
LCALLSHIZTZ
LJMPGX4;返回
GX:
LCALLCWENDU;否,则调用温度拆字子程序
SJMPGX4;返回
GX1:
CJNEA,#02H,GX4;判断是否为02进程
MOV37H,#15;送F的字符到左边第一个数码管
MOV36H,#16;送--字符所在的字段码表的位置
MOV34H,#19;熄灭34H单元所对应的数码管
MOV31H,#19;熄灭35H单元所对应的数码管
GX4:
RET
(二)拆温度子程序
拆温度子程序包括在左边第一位显示当前路次,最右边两位分别显示“°C”。
通过判断温度的符号的标志位34H.7,可以知道当前温度为正或为负,为负时显示出负号,如果当前的温度十位为零时,要把十位关显示。
源程序如下:
CWENDU:
MOV37H,6DH;温度拆字子程序。
当前路次值放入37H中
MOV30H,#21;温度C显示位
MOV31H,#20;符号°显示位
MOV36H,#19;空格
MOVA,34H;十位参数过滤
JNBACC.7,W1;最高位是否为1?
MOV35H,#10H;是,显示"-"号
LJMPW3
W1:
MOV35H,#19;否,改为灭掉
W3:
CLRACC.7;最高位清零
JNZW2;累加器A非零跳转是否为零十位是否零?
MOV34H,#19;十位为零,灭掉
LJMPW4
W2:
MOV34H,A;回存
W4:
RET
(三)拆时间子程序
原理同TEST0315子程序,把3AH,3BH,3CH中的数据分别把高四位和低四位拆到两个字节的第四位,这两个字节的高四位清零。
把拆出来的两个字节送到显示缓存区显示。
源程序略。
5.2温度采集存储子程序
依据路数设为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滚存的原理示意图
源程序清单如下:
CAIJIWD:
MOVDPH,#0FBH;写外部数据指针高8位采用8路温度滚存;
MOVDPL,69H;读取外部数据指针低八位
MOVXA,@DPTR;读取上一次AD转换的结果
MOV68H,A;暂存结果
MOVA,DPL;数据指针低八位放入累加器中,AD数据存储地址
SUBBA,#0F7H;减去F7H
MOVB,#4;再乘以4
MULAB;
ADDA,#3EH;再加上3EH
MOVR0,A;R0指向写数据的首地址
MOVA,@R0;读取该单元的数据
INCR0;指针加一
MOV@R0,A;在该单元放入前个单元的数据
DECR0;指针连续后退两次
DECR0;
MOVA,@R0;读取该单元的数据
INCR0;指针加一
MOV@R0,A;在该单元放入前个单元的数据
DECR0;指针连续后退两次
DECR0;
MOVA,@R0;读取该单元的数据
INCR0;指针加一
MOV@R0,A;在该单元放入前个单元的数据
DECR0;指针后退一次
MOVA,68H;读取最新的数据
MOV@R0,A;在该单元放入最新的数据
INCDPL;数据指针低八位加一,准备转换下一路
MOVA,DPL;
MOV69H,A;存储数据指针低八位
CJNEA,#00H,AD1;判断八路是否全部转换过?
?
MOVDPL,#0F8H;是,重新从第一路开始
MOV69H,#0F8H;
AD1:
MOVX@DPTR,A;启动AD转换
RET
5.3PB口消抖和冻结子程序
PB口消抖是利用保存最近5次的状态,如果5次的结果一样说明确定按下了按键并且存放到2EH和2FH中详细程序见程序清单,如果没有直接退出。
冻结子程序是判断是否按下了冻结键PB0,如果有按下的时候修改状态标志字当前路数不再变化温度值每1S更新一次,没有按下的时候直接跳出。
源程序如下:
DONGJIE:
JB2FH.0,DONE1;冻结判断子程序。
判PB0下降沿
JNB2EH.0,DONE1
CPLF0;取反标志位
DONE1:
RET
5.4自动巡显和手动切换子程序
开始
开始
是否切换
是否冻结
Y
N
取出当前中断次数
YY
路次+1
和设定相等?
N
是否到9
YN
路次+1,调用温度转化子程序
Y
路次置1
是否到9
N
返回
路次置1
Y
返回
图5—AD自动巡检的流程图图6—AD手动切换的流程图
源程序如下:
ZDXUNX:
JBF0,BACK1;自动巡显节拍控制子程序。
检测当前的冻结位
MOVA,3EH;非冻结状态
CJNEA,3FH,BACK;判断节拍值是否已到?
MOV3EH,#0;已到,中断次数计数单元清零
INC6DH;路次加一
LCALLWDNM;调用AD转化为温度内码的子程序
LCALLNEI2BCD;调用T内码转BCD码子程序
MOVA,6DH;判断是否已到第九路?
?
CJNEA,#10,BACK;
MOV6DH,#1;置为第一路
BACK:
RET;返回
BACK1:
LCALLWDNM;冻结状态。
调用AD值转化为温度内码的子程序
LCALLNEI2BCD;调用T内码转BCD码子程序
RET
5.5转换成温度内码的子程序
此程序该设计的核心的算法之一,主要利用(D1+D2+D3+D4)/4*1000/255这样一来可以把AD转化出来的值放大到0-1000的温度内码,同样等价为:
(D1+D2+D3+D4)*251/256.除以256等价为向右移动8位,也相当于高低字节错位相加得到结果。
取出路次
取出路次
算出AD的地址取出数据
算出AD的起始地址
大于500?
数据累加到A,地址+1
N
标记符号位
是否加4次
NY
内码--500
Y
500--内码
高低字节分别保存
相乘后的结果错位相加
高低字节分别乘以251
用低8位求出十位、个位、小数位
高8位为1?
算出T内码的起始地址
回存T内码
N
给每一位分别加2,5,6
Y
返回
返回
图7—AD转化成T内码的流程图图8—温度内码转化成BCD码的流程图
源程序如下:
WDNM:
MOVA,6DH;取当前路次值A/D数据转化成温度内码子程序
MOVB,#4;B存入地址倍数
MULAB;求得当前路的存储首地址
ADDA,#3CH;
MOVR0,A;R0指针指向存储路数AD值的首地址40H-5FH中的一个
MOVR5,#04H
MOVR2,#00H
MOVR4,#00H
MOVR1,#00H
WDNM5:
MOVA,@R0
WDNM1:
DJNZR5,WDNM2
LJMPWDNM3
WDNM2:
INCR0
ADDA,@R0;把四次A/D值的和的低字节放到累加器A中
JNCWDNM1;计算出温度内码实现的运算(D1+D2+D3+D4)*251/256
CLRC
INCR2;R2用来存放四次A/D值相加的高字节
LJMPWDNM1
WDNM3:
MOVB,#251
MULAB;低字节先乘以251,低字节放到A中
MOVR4,B;相乘后右移8位相当于丢弃低字节,高字节放到R4中
MOVA,R2;
MOVB,#251;相加后的高字节*251
MULAB;相乘后的高字节存放在B中
ADDA,R4;错位相加
JNCWDNMA;没有进位的话跳转到温度回存的程序段
CLRC
INCB;进位到高字节中
WDNMA:
MOV6BH,A;转化出来的温度内码的低字节存放到6B中
MOV6CH,B;高字节放到6CH中
MOVA,6DH;取当前路次值
MOVB,#2;每一路占用两个字节10H-1FH的地址
MULAB;路次值乘以2再加上14即得内码区高字节首地址
ADDA,#0EH;
MOVB,A;
INCB;加一得低字节地址
MOVR1,A;R1和R0分别为高低八位的存储地址指针
MOVR0,B;存储地址指针R1R0格式
MOV@R1,6CH;回存高字节到10H开始的地址中
MOV@R0,6BH;回存低字节
MOV6CH,#0;高字节存储单元清零,供下次使用
MOV6BH,#0;低字节存储单元清零,供下次使用
RET
5.6温度内码转化为BCD码的子程序
把温度内码和500相比较,如果大于500说明温度为正的,用内码-500=T
T/100的商为温度的十位,余数/10的商为温度的个位,此时的余数为温度的小数位。
如果是小于500说明温度为负的,用500-内码=T此时再按照上面的取余数和商的算法算出温度值。
流程图见图8.
源程序如下:
NEI2BCD:
MOVA,6DH;温度内码转BCD码子程序。
取当前路次值
CLRC;清除进借位标志
CJNE@R1,#01H,NEXT6;高八位是否相等?
不相等,转移
CJNE@R0,#0F4H,NEXT4;高八位相等,低八位是否相等?
不相等,转移
MOV32H,#0;高低八位均相等,即为0℃
MOV33H,#0;
MOV34H,#0;
LJMPDONE2;完成
NEXT4:
JCNEXT5;
MOVA,@R0;温度大于0℃
CLRC
SUBBA,#0F4H;转换为BCD码
LCALLJISUAN;
LJMPDONE2;完成
NEXT5:
MOVA,#0F4H;温度小于0℃
CLRC
SUBBA,@R0;
LCALLJISUAN;转换为BCD码
MOVA,34H;"-"号需显示,添加负号标志
ORLA,#80H;
MOV34H,A;回存
LJMPDONE2;完成
NEXT6:
JCNEXT7;判断@R1的内容是否比01H大?
?
DEC@R1;高八位比01H大,@R1减去500的高八位01H
MOVA,@R0;低八位和500的低八位相减
CLRC;清除借位标志位
SUBBA,#0F4H;
MOV20H.1,C;保存借位标志位
JB20H.1,NEXT11;判断相减过程中是否出现借位?
LCALLJISUAN;无出现借位,运算
CJNE@R1,#01H,NEXT12;高八位是否为1?
LCALLBUCHANG;是,补偿一次
NEXT12:
INC@R1;否,恢复初始的@R1值,差即为目标BCD码
LJMPDONE2;返回
NEXT11:
DEC@R1;出现借位,高八位再次减一
LCALLJISUAN;运算
CJNE@R1,#01H,NEXT13;高八位是否还为1?
LCALLBUCHANG;是,补