多路温度巡检控制仪Word文件下载.docx
《多路温度巡检控制仪Word文件下载.docx》由会员分享,可在线阅读,更多相关《多路温度巡检控制仪Word文件下载.docx(41页珍藏版)》请在冰点文库上搜索。
![多路温度巡检控制仪Word文件下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/1/62486d7e-7fdb-4b4d-bf48-8769f36bdbdd/62486d7e-7fdb-4b4d-bf48-8769f36bdbdd1.gif)
定时器工作在方式2时,为8位计数器,TL0为常数缓冲器,当TL0计数溢出时,在溢出标志TF0置“1”的同时,还自动将TH0中的处置送至TL0,使TL0从初值开始重新计数。
方式0和方式1的最大特点是计数溢出后,计数器为全0,因此在循环定时计数时或循环计数应用时就存在用指令反复装入计数初值的问题,这不仅影响定时精度,而且也会给程序设计但来麻烦。
而工作方式2可以省去用户软件中重装初值的指令执行时间,简化定时初值的计算方法,以相当精确的确定定时时间。
通过三种方案的比较,最终选择了方式为定时器0的工作方式,这样就可以做到精确的按节拍来巡回显示8路温度值了。
2.LED数码管显示方式
LED数码管为常用的输出外设,8路温度值通过它来巡回显示,实验板上的LED数码管为是8段共阳极的。
(1LED静态显示方式
LED显示器工作于静态显示方式时,各位的共阳极连接在一起并接+5V,每位的段码线分别与一个8位的锁存器输出相连。
静态显示方式虽然接口编程容易,但是占用口线较多,如果要增加显示器的位数,则需要增加I/O口的数目,而该设计中需要用到8个LED数码管,单片机的I/O口又是有限的,所以静态显示方式不能采用。
(2LED动态显示方式
将所有显示位的段码线的相应段并联在一起,由一个8位I/O口控制,而各位的共阳极由相应的I/O线控制,形成各位的分时选通,即为LED动态显示方式。
采用这种方式虽然牺牲了单片机的时间,但是换取了I/O端口的减少。
3.A/D转换器选择
(1A/D转换器的类型
A/D转换器的作用就是把模拟量转换成数字量,以便于单片机进行数据处理。
此次设计中需要用到A/D转换器来采集各路的数据给单片机处理。
目前使用较广泛的A/D转换器有:
逐次比较型A/D转换器、双积分式转换器、ε-∆式转换器等。
逐次比较式:
精度、速度和价格都适中,是最常用的A/D转换器件。
双积分式:
精度高、抗干扰性好、价格低廉,但转换速度慢,得到广泛应用。
ε-∆式:
具有积分式和逐次比较式ADC的双重优点。
对工业现场的串模干扰具有较强的抑制能力,不亚于双积分ADC,它比双积分ADC速度快,与逐次比较式ADC相比,有较高的信噪比,分辨率高,线性度好,不需要采样保持电路。
(2A/D转换器的选择
此次设计需要至少有8位的模拟量输入,对于转换速率的要求也比较适中,因此可以采用逐次比较式ADC0809。
它具有8路选1的模拟开关,完成一次转换的时间约为100us左右,并且具有输出TTL三态锁存缓冲器,可直接连接到AT89S51单片机的数据总线上,可对0~5v的模拟信号进行转换。
三、总框图及总体软件设计说明
主程序
6
1.延迟等到芯片均退出复位
单片机和各芯片上电复位到开始工作是需要一点时间的,所以要延迟1S来等待单片机和所有的芯片上电复位结束,以确保能够正常工作。
2.芯片初始化
在上电复位结束之后,需要对各芯片按照设计需要进行初始化,如8255等。
3.自检子程序
在使用单片机系统之前,要对蜂鸣器、LED灯和LED数码管进行自检,达到确认它们都可以正常工作的目的。
4.工作初始化
在单片机进入主程序之前需要给单片机用到的标志位、变量赋予初始值,以及引脚的分配,配置寄存器写入需要的值,像时钟的选择等。
5.开关量输入消抖动子程序
在按键按下或者是释放的时候都会出现一个不稳定的抖动时间,那么如果不处理好这个抖动时间,我们就无法处理好按键编码了。
在设计中会用到两个PB按键分别实现切换和冻结功能,所以要进行开关量输入消抖动处理,从而使这两个按键能够准确实现切换和冻结功能。
6.节拍控制子程序
通过定时器中断方式计时2S,在该子程序中判断是否计满2S,时间到达则使数码管显示下一检测回路的温度值,从而使8路温度按该节拍巡回显示。
7.数据采集子程序
在节拍时间到达之后,对温度值模拟量进行A/D转换,并存入单片机数据存储器相应单元。
为了提高测量稳定性,采取了数字滤波技术。
对于每一路温度检测回路都用四个单元来存放该路最新的的A/D转换获取的数字量,因此在进行A/D转换之前,首先要进行3次数据的滚存,然后再获取最新的温度数字量存入四个单元的首地址,最后为下一路的温度采集做好准备。
7
8.数据处理子程序
在这个子程序中,需要把采集获取的温度数字量进行处理,转换成相应的温度内码,并存放在数据存储器相应单元中。
设计要求温度测量范围为-50℃-+50℃,采用了十进制0-1000作为温度内码与这个测量范围一一对应,而一个字节的二进制数00H-0FFH与温度内码一一对应,所以温度内码的计算公式为
T内=
25510004
⨯∑D
=255⨯∑D≈256⨯∑D(19.温度内码转换成BCD码
在这个子程序中,需要把温度内码转换成可以被数码管显示的BCD码,并存放在数据存储器的相应单元中。
由于采用了十进制数0-1000与温度测量范围-50℃-+50℃一一对应,因此可以通过把内码除以100求得BCD码的十位,再把余数除以10求得BCD码的个位,最后的余数即为BCD码的小数位。
10.冻结子程序
在初始化程序段,设置一个冻结标志位,当冻结键按下时,则对该标志位进行求反,当标志位与初值相反则使节拍计时停止,当标志位与初值形同时,则不做任何处理,跳出该子程序,返回主程序。
11.切换子程序
当切换按键有效时,对温度路次加1,然后调用温度采集、温度处理和温度内码转换成BCD码子程序,强制数码管显示下一温度检测回路的温度值。
12.拆字子程序
把转换获得的BCD码送到相应的显缓单元。
13.显示更新子程序
把显缓单元里面的相应字段通过查表和动态显示方式显示在数码管上。
温度计算模块冻结切换模块
四、系统资源分配说明
AT89S51片内存储单元分配
8
2.20H-22H单元为当前路次温度BCD码存储单元
4.24H和25H为内码存储中转单元,在计算BCD码时,温度内码存放在这
2EH.0和2FH.0为手动切换判键位地址。
2EH.1和2FH.1为冻结判键位地址。
6.30H-37H单元为显示更新内容缓冲区
9.40H-5FH单元为A/D
转换数据存储单元,每一路温度数字量占用四个存
11.F0为冻结标志位,初始化为“1”。
AT89S51片上I/O端口分配:
P0口:
P0.0-P0.7作为扩展外面数据存储器82C55片选低八位地址P1口:
P1.0-P1.7驱动L0-L7灯(自检
P2口:
P2.0为82C55A(U3片选信号输入端
P2.1为82C55A(U5片选信号输入端
P2.2为ADC0809芯片片选信号输入端
9
P3口:
P3.2为自检蜂鸣器检测端
P3.6、P3.7分别为外部数据存储器写和读选通信号五、局部程序设计说明
1.芯片初始化和自检
MOVSP,#6FH;
总初始化。
设定栈底指针
LCALLD1S;
稍加延时(12mS,等待各芯片均上电复位结束CLRP3.2;
蜂鸣器响一秒
LCALLD1S
SETBP3.2;
关蜂鸣器
通过P3口的P3.2检查蜂鸣器正常与否
MOVP1,#0;
P1口驱动L0-7灯全亮一秒
MOVP1,#0FFH;
灭L0-7灯
通过P1口检查灯L0-7是否正常
MOVA,#89H;
数码管显示与矩阵键盘接口8255A(U3初始化MOVDPTR,#0FEFFH;
8255A(U3
MOVX@DPTR,A;
A、B口输出驱动字段、字位,C口输入
初始化8255(U3,这一片8255用来控制数码管的动态显示MOVDPTR,#0FEFDH;
DPTR指向U3-A口
MOVA,#00H
关显示(字位驱动全'
0'
MOVA,#8BH
MOVDPTR,#0FDFFH
MOVX@DPTR,A
初始化8255(U5,这一片8255用来做PB按键控制
MOVA,#0;
8255A口驱动灯L8-15全亮一秒
MOVDPTR,#0FDFCH
MOVA,#0FFH;
灭灯L8-15
通过8255(U5检查灯L8-15
LCALLZJSMG;
调用自检数码管子程序
ZJSMG:
MOVR2,#0FEH;
自检数码管子程序。
字段码初值
寄存器R2存放数码管所显示字段,初值为数码管的a段
MOVR3,#01H;
字位码初值
10
ZJSMG4:
MOVA,R3
MOVDPTR,#0FEFDH;
8255B口
输出当前字位码
MOVA,R2
MOVDPTR,#0FEFCH;
8255A口
输出字段码
LCALLD120MS;
保持显示120毫秒
每个数码管显示该字段120ms
MOVA,R3;
取出字位码
JBACC.7,ZJSMG1;
判断是否已显示到最左边一位RLA;
未完,字位码左移一位
MOVR3,A;
回存新字位码
移到下一数码管显示该字段
LJMPZJSMG4;
转下一位的显示驱动ZJSMG1:
MOVA,R2;
取出字段码
CJNEA,#7FH,ZJSMG2;
判断是否已检查到最后一个字段LJMPZJSMG3
ZJSMG2:
RLA;
未完,产生新的字段码
MOVR2,A;
回存新字段
旧字段已经显示结束,获取下一个显示字段
字位码置为初值
从第一个数码管显示新字段
LJMPZJSMG4
ZJSMG3:
RET
END
2.工作初始化
MOVTMOD,#02H;
初始化T0为定时方式2
MOVTL0,#48H;
定时约为200us
MOVTH0,#48H
用定时器0方式2计时0.1s.,TM=12⨯0592
.us。
00H-48H=184,184⨯TM≈200us
SETBEA;
开总中断允许
SETBET0;
开T0中断
SETBTR0;
启动T0定时工作
MOV10H,#03H;
10H-1FH为温度内码存储单元
MOV11H,#0E8H
MOV12H,#01H
MOV13H,#0F4H
MOV14H,#02H
MOV15H,#26H
MOV16H,#00H
MOV17H,#00H
MOV18H,#01H
MOV19H,#0C2H
MOV1AH,#02HMOV1BH,#58H
MOV1CH,#01H
MOV1DH,#90H
MOV1EH,#02H
MOV1FH,#0BCH
MOV20H,#08H;
BCD码小数位
MOV21H,#04H;
BCD码个位
MOV22H,#83H;
BCD码十位
MOV24H,#00H;
24H-25H放内码
MOV25H,#00H
MOV23H,#01H;
路次
MOV30H,#0CH;
30H-37H为显示缓冲单元,初始置‘5-4.8c’
MOV31H,#0BH
MOV32H,#08H
MOV33H,#04H
MOV34H,#03H
MOV35H,#11H
MOV36H,#11H
MOV37H,#05H
MOV38H,#00H;
38H、39H为时钟200uS、20mS计数单元,清0
MOV39H,#00H
38H计时满10ms,39H计时满0.1s
MOV3AH,#00H;
秒单元
MOV3BH,#00H;
分单元
MOV3CH,#00H;
时单元
MOV3DH,#00H;
节拍计时单元
定时器计时满0.1s按BCD码加1,直到满20清零
MOV3EH,#20H;
节拍设定值
MOV63H,#00H;
温度采集控制
用来控制A/D转换采集的是哪一路的数据
SETBF0;
冻结标志位
3.主程序
LOOP:
LCALLXDPB;
调用消抖子程序
LCALLJPKZ;
调用节拍控制子程序
LCALLSHUJUCAIJI;
调用数据采集子程序
LCALLSHUJUCHULI;
调用数据处理子程序
LCALLDONGJIE;
调用冻结子程序
LCALLNZBCD;
调用内码转BCD码子程序
LCALLSDQH;
调用手动切换子程序
LCALLCZ;
调用拆字子程序
LCALLDISP;
调用显示更新子程序
SJMPLOOP;
反复循环主流程
4.温度内码转换BCD码子程序
NZBCD:
MOVR0,#10H;
内码转BCD码子程序。
R0指向第一路温度内码高字节地址
MOVR3,#00H;
R3存放BCD码个位值
MOVR2,#00H;
R2存放BCD码十位值
MOV35H,#11H;
灭符号位
MOVA,23H;
R0指向当前路次内码高字节地址DECA
MOVB,#02H
MULAB
ADDA,R0
MOVR0,A
第一路的高字节地址为10H,10H=(1-1+10H
第二路的高字节地址为12H,12H=(2-1⨯2+10H
第三路的高字节地址为14H,14H=(3-1⨯2+10H
据此可得每一路高字节地址为(@23H-1⨯2+10H。
MOV25H,@R0;
25H单元放入内码高字节内容
INCR0
MOV24H,@R0;
24H单元放入内码低字节内容
MOVA,25H
高字节和低字节温度内码分别中转存储在25H和24H。
CJNEA,#01H,NZBCD1;
与500做比较,高字节不等于01H则跳走MOVA,24H
CJNEA,#0F4H,NZBCD2;
低字节不等于0F4H则跳走
500的十六进制为01F4H,共两个字节,温度内码高字节先与01H比
较,若相等则低字节温度内码与0F4H比较。
MOV20H,#00H;
等于500,向BCD码存放单元送0MOV21H,#00H
MOV22H,#00H
温度内码等于500,BCD码则等于0。
SJMPNZBCD4;
BCD码转换结束
NZBCD1:
JCXY;
C为1则跳走
有借位,则温度内码小于500
LJMPDY;
转向大于500进行减500
无借位,则温度内码大于500
NZBCD2:
XY:
CLRC;
内码小于500
MOV35H,#10H
符号位为“-”
MOVA,#0F4H
SUBBA,24H
MOV24H,A
MOVA,#01H
SUBBA,25H
MOV25H,A
500减去温度内码,先用0F4H减去温度内码低字节,然后再用01H减去温度内码高字节,减完之后仍分别放在24H和25H单元。
SJMPLP3
DY:
内码大于500
MOVA,24H
SUBBA,#0F4H
SUBBA,#01H
温度内码减去500,先用温度内码低字节减去0F4H,然后再用温度内码高字节减去01H,减完之后仍分别放在24H和25H单元。
LP3:
计算BCD码十位
SUBBA,#64H
SUBBA,#00H
JCLP4
INCR2
MOV22H,R2;
存十位
用循环减去100代替除以100。
先用24H单元内容减去64H,然后再用25H带借位减去00H,每减一次,R2加1,直到小于100一百。
LP4:
MOVA,24H;
恢复原值
ADDA,#64H
CLRC
由于多减一次100,所以要把一百加回去,恢复原值。
LP6:
SUBBA,#0AH;
计算BCD码个位
JCNZBCD3
INCR3
MOV21H,R3;
存个位
SJMPLP6
用循环减10代替除以10。
用24H单元内容减去0AH,每减一次,R3加1,直到小于10为止。
NZBCD3:
ADDA,#0AH
由于多减一次10,所以要把10加回去,恢复小数位的值。
MOV20H,A;
存小数位
NZBCD4:
5.数据采集子程序
SHUJUCAIJI:
MOVR0,#40H;
数据采集子程序。
指向第一路A/D转换数据存储首单元
MOVR1,#03H;
滚存次数
MOVA,63H
MOVB,#04H
ADDA,R0;
指向当前路首单元
ADDA,#03H
MOVR0,A;
R0指向当前采集路的末尾单元SHUJUCAIJI1:
DECR0;
开始滚存
MOVA,@R0
MOV@R0,A
DECR0
DJNZR1,SHUJUCAIJI1;
滚存是否结束
MOVDPTR,#0FBF8H;
DPTR指向当前路对应转换通道MOVA,63H
ADDA,DPL
MOVDPL,A
MOVXA,@DPTR;
读取A/D转换结果值
MOV@R0,A;
A/D转换结果存入首单元
INC63H;
转到下一采集路次
CJNEA,#08H,SHUJUCAIJI5;
判断是否已采集到最后一路MOV63H,#00H
SHUJUCAIJI5:
DPTR指向当前路对应通道
启动A/D转换
6.数据处理子程序
SHUJUCHULI:
数据处理子程序。
R0指向第一路A/D转换单元首地