📄 sucelev.asm
字号:
LOLMT EQU 20H ;温度下限存储首址 (20H-27H)
HUCH EQU 2AH ;显示缓冲区首址 (2AH-2FH)
HILMT EQU 30H ;温度上限存储首址 (30H-37H)
SHUJU EQU 38H ;量程转换后的温度数据存储首址 (38H-3FH)
NUMK EQU 40H ;NUMK表示此次优先显示的路数,默认从零开始
NUMN EQU 41H ;一次循环中,NUMN单元存储定时器重赋初值次数
LBZ EQU 42H ;越温度底限标识字节
HBZ EQU 43H ;越温度高限标志字节
ZESH EQU 44H ;故障状态下,增时时间单元(用于显示故障原因)
DOTB EQU 45H ;存放温度数据的小数信息
BACI EQU 46H ;此单元存放同一路的采样次数(用于滤波)
BALU EQU 48H ;同一路采样八次,放到以BALU为首单元中,用于滤波
QLOCK BIT 40H ;请求锁定标志位 (28H)
YLOCK BIT 41H ;已经锁定标志位,只显示某一路 .
QLIM BIT 42H ;请求置上下限标志位 .
TODAO BIT 43H ;设定通道上下限时,表示通道数是否已输入
GADI1 BIT 44H ;高低设置选择标志位1 .
GADI2 BIT 45H ;高低设置选择标志位2 .
XIAN BIT 46H ;设置高低限时,数据输入标志位 .
GEW BIT 47H ;设置高低限时,输入数据的个位 (28H)
SHI BIT 48H ;设置高低限时,输入数据的十位 (29H)
BAI BIT 49H ;设置高低限时,输入数据的百位 .
GUZO BIT 4AH ;故障总位,无论哪路有故障都置1 (29H)
STATE BIT 4BH ;此位表明非正常的数值是超下限,还是越上限
EOC BIT P1.0 ;AD转换完成的标志位
FIX EQU 15 ;锁定某一路的功能键
DING EQU 13 ;设定某一路上下限的功能键
LUSHU EQU 8 ;AD转换的路数
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0_INT
ORG 0030H
MAIN: MOV SP,#50H ;SP置为50H
LCALL INITIAL ;初始化子程序,初始化定时器、8255、默认上下限
LP0: MOV TH0,#3CH ;每次循环前,先要定时
MOV TL0,#080H
MOV NUMN,#10 ;NUMN单元存储定时器重赋初值次数,每次定时100ms,
SETB TR0 ;定时10次即为1s
LCALL ADTRANS ;8路检测程序,并完成量程转换
LCALL LIMCHEC ;越界检查程序,某一路越界后置相应标志位
LCALL ASSUREK ;此子程序可确定此次循环显示哪路
LCALL PREDISP ;调显示之前,先填数据缓冲区
LP3: LCALL DISP ;显示当前路温度值
LCALL JIANSAO ;调用键扫描程序,完成锁定显示与上下限设定功能
MOV A,NUMN ;通过NUMN检查一下定时器是否已经定时完一秒
CJNE A,#0,LP3 ;如果没有定完一秒,继续调显示
JB YLOCK,LP0 ;若已锁定显示某路,继续显示该路
INC NUMK ;路数增1,为下次检测准备
MOV A,NUMK
CJNE A,#LUSHU,LP0
MOV NUMK,#0 ;如果路数加一后为8,则置零
AJMP LP0 ;进行下一次检测并显示
;#################################################################### 主程序终
INITIAL: MOV TMOD,#01H ;初始化定时器
SETB EA
SETB ET0
MOV R3,#LUSHU ;给各路设定默认的高限
MOV A,#99 ;超过99度则报警
MOV R0,#HILMT ;默认温度高限为100摄氏度,低限为20度
NEXT4: MOV @R0,A
INC R0
DJNZ R3,NEXT4
MOV R0,#LOLMT
MOV A,#20 ;给各路设定默认的低限
MOV R3,#LUSHU
LP5: MOV @R0,A
INC R0
DJNZ R3,LP5
MOV ZESH,#20 ;报警时,1秒显示数值,1秒显示故障原因
MOV DPTR,#0FFDBH ;初始化80255
MOV A,#080H
MOVX @DPTR,A
MOV NUMK,#0
MOV LBZ,#0FFH ;初始化各功能单元
MOV HBZ,#0FFH
CLR QLIM ;清请求置上下限标志位
CLR XIAN ;清数据输入标志位
CLR YLOCK ;清已经锁定标志位
CLR QLOCK ;清请求锁定标志位
CLR TODAO
CLR GADI1
CLR GADI2
RET
;############################################################# 初始化子程序终
ADTRANS: MOV R3,#LUSHU ;AD转换的路数送给R3
MOV R0,#SHUJU ;存储数据的单元的地址送给R0
MOV DPTR,#0FFF0H
MOV A,#0
NEXT10: MOV R1,#BALU
MOV BACI,#8
MOV R2,A ;R2中存放此次AD转换的路数
LOP: MOVX @DPTR,A ;给AD送启动信号
JNB EOC,$ ;使用查询方式采集 AD 的信号
MOVX A,@DPTR ;AD转换完后的值送给 A
MOV @R1,A
INC R1
MOV A,R2
DJNZ BACI,LOP ;同一路采样八次
ACALL LVBO ;调用均值滤波程序,出口参数为A
ACALL LCTRANS ;入口参数为A,采集完一路即进行量程转换
MOV A,R5 ;R5是量程转换的整数位,送到存储单元中
MOV @R0,A ;将转化后的数值再送到存储单元中
MOV A,R6 ;R6存储双字节除以单字节后得到的余数
CLR C
SUBB A,#25 ;余数小于25,则使小数位置零,否则置一
MOV A,DOTB ;DOTB里面存储各路转换的小数信息
JC AD1 ;余数小于25,则使小数位置零
SETB ACC.7 ;余数大于25,则使小数位置1
SJMP AD2
AD1: CLR ACC.7
AD2: PUSH ACC ;将ACC用堆栈保护
MOV A,R2 ;将此次AD转换的路数再赋给A
CJNE A,#7,AD3 ;前六路操作完ACC.7后都要让ACC右移一位
POP ACC
SJMP AD4
AD3: POP ACC ;弹出ACC,并右移一位
RR A
AD4: MOV DOTB,A ;八路的小数信息存放在DOTB里面
MOV A,R2 ;准备进行下一路转换
INC A
INC R0
DJNZ R3,NEXT10
RET
;########################################################## AD0809转换子程序终
LVBO: SETB RS0 ;为防止此子程序所用寄存器与其它程序混用,更换
CLR A ;工作区
MOV R2,A ;R2中存放均值的高字节
MOV R3,A ;R3中存放均值的低字节
MOV R1,#8 ;R1中存放数值的个数
MOV A,R1
PUSH ACC
MOV R0,#BALU
FL40: MOV A,@R0
ADD A,R3 ;把八个单元中的数依次加到A中
MOV R3,A ;总和中的低字节放于R3
CLR A
ADDC A,R2 ;总和中的高字节放于R3
MOV R2,A
INC R0
DJNZ R1,FL40
FL41: POP ACC ;双字节移位程序,相当于总和除以8
CLR C
FL42: RRC A
JNC FL43
MOV A,R3 ;出口参数为A
CLR RS0
RET
FL43: PUSH ACC
CLR C
MOV A,R2
RRC A
MOV R2,A
MOV A,R3
RRC A
MOV R3,A
POP ACC
SJMP FL42
;########################################################### 均值滤波子程序终
LCTRANS: MOV B,#25 ;量程转换的方法是采集后的数先乘以25,再除以51
MUL AB
MOV R1,B ;R1里面存放被除数高字节
MOV R5,A ;R5里面存放被除数低字节
MOV R4,#51 ;R4里面存放除数
MOV R7,#08H ;被除数字节长度
ACALL CHU4 ;做一次除法运算
LOOP: RET
CHU4: MOV A,R5
ADD A,R5 ;左移被除数低字节,包括后来的商左移
MOV R5,A
MOV A,R1
ADDC A,R1
MOV R1,A ;左移被除数高字节
JNC CHU4_1 ;被除数高字节移位后判断是否溢出
ACALL DIV256
INC R5 ;有溢出肯定大于单字节除数
SJMP LOOP1 ;商加一
CHU4_1: SUBB A,R4 ;没溢出比较高字节是否够减
JC LOOP1 ;不够减继续移位
MOV R1,A ;够减商加一,余下的移位
INC R5
LOOP1: DJNZ R7,CHU4
RET
DIV256: PUSH ACC
MOV A,#255 ;A中用255减单字节除数够减
CLR C
SUBB A,R4
INC A ;加上进位1
ADD A,R1 ;加上减法后剩下的值,
MOV R1,A ;实际为将高字节扩展为9位与除数做减法
POP ACC
RET
;########################################################### 量程转换子程序终
LIMCHEC: MOV R0,#HILMT ;上限存储首址
MOV R1,#SHUJU ;温度数据存储首址
ACALL CHECK ;高越界检查
MOV HBZ,A ;高越限标志存于HBZ
MOV DPTR,#0FFD8H ;通过8255送LED显示
MOVX @DPTR,A
MOV R0,#LOLMT ;下限存储首址
MOV R1,#SHUJU ;温度数据存储首址
ACALL CHECK ;低越界检查
XRL A,#0FFH ;由于是低值检查,所以要先与0FFH抑或一下
MOV LBZ,A ;低越限标志存于LBZ
MOV DPTR,#0FFD9H ;通过8255送LED显示
MOVX @DPTR,A
RET
;############################################################ 越界检查程序1终
CHECK: MOV R3,#LUSHU ;此程序为越界检测程序的一个子程序
NEXT9: PUSH ACC ;使用前要先进行堆栈保护
MOV A,@R0
CLR C
SUBB A,@R1
POP ACC
JNC OK1
CLR ACC.7 ;比低限高要清零
SJMP OK2
OK1: SETB ACC.7 ;比高限高要置位
OK2: RR A ;检查完一路,就将相应标志位右移一次
INC R1
INC R0
DJNZ R3,NEXT9
RL A ;共右移了7次,多移一次,所以再左移一次
RET
;############################################################ 越界检查程序2终
ASSUREK: MOV A,LBZ ;将低值标识字节赋予A
CJNE A,#0FFH,NEXT0 ;若转移,则表明8路至少有一路超低限
MOV A,HBZ ;将高值标识字节赋予A
CJNE A,#0FFH,NEXT0 ;若转移,则表明8路至少有一路超高限
CLR GUZO ;各路无故障,清故障总位
RET ;若返回,表明各路无故障
NEXT0:SETB GUZO ;有异常,置状态总位
JNB YLOCK,ASSU ;若已锁定某路,置故障总位后不必再求应显示那路
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -