📄 a1.asm
字号:
;《简易Υ辐射仪》软件清单
BUFSZ EQU 30H ;显示缓冲区首址
BUF1 DATA 30H ;千位显示缓冲区
BUF2 DATA 31H ;百位显示缓冲区
BUF3 DATA 32H ;十位显示缓冲区
BUF4 DATA 33H ;个位显示缓冲区
SEC DATA 34H ;时钟秒级单元(BCD码)
KEYC DATA 38H ;键码
NH DATA 39H ;计数器溢出次数
NOSZ EQU 3AH ;测点序号存放首址
NOH DATA 3AH ;测点序号高字节(BCD码)
NOL DATA 3BH ;测点序号低字节(BCD码)
TJSZ EQU 3CH ;测点定时条件存放首址
TJH DATA 3CH ;测点定时条件高字节(BCD码)
TJL DATA 3DH ;测点定时条件低字节(BCD码)
CPSSZ EQU 3EH ;CPS存放首址
CPSH DATA 3EH ;CPS高字节(BCD码)
CPSL DATA 3FH ;CPS低字节(BCD码)
FLAG DATA 20H ;辅助标志字节
KEYP BIT FLAG.0 ;用于描述已响应按键(1)和未响应按键(0)
DISPLY BIT FLAG.1 ;用于描述已显示(1)和未显示(0)
SETTING BIT FLAG.4 ;用于描述修改(1)和查阅(0)
CONT BIT FLAG.5 ;用于描述连测(1)和点测(0)
DINS BIT FLAG.7 ;用于描述定数测量(1)和定时测量(0)
SECD DATA 22H ;时钟1/16s单元,可用于位寻址确定闪烁时间
SECD8 BIT SECD.5 ;时钟1/16s单元的5位用于控制1/8s的闪烁
SECD2 BIT SECD.7 ;时钟1/16s单元的7位用于控制1/2s的闪烁
SETP DATA 2DH ;修改位置指针(0:千;1:百;2:十;3:个)
SETP0 BIT SETP.0 ;0:千十;1:百个
SETP1 BIT SETP.1 ;0:千百;1;十个
STATEN DATA 2EH ;状态码(次态)
STATE DATA 2FH ;状态码(现态)
LED BIT P1.7 ;LED控制端(0:亮;1;灭)
ORG 0000H
LJMP MAIN ;复位入口
ORG 000BH
LJMP TIME ;定时中断
ORG 001BH
INC NH ;计数溢出中断
RETI
;定时中断子程序:
ORG 0030H
TIME: ORL TL0,#0EEH ;重置时常数
MOV TH0,#85H
PUSH ACC ;保护现场
PUSH PSW
MOV PSW,#8 ;使用1区工作寄存器
MOV A,SECD ;调整时钟
ADD A,#10H
MOV SECD,A
JC TIM1 ;是否到了整1s?
LJMP ENDI
TIM1: MOV A,SEC ;调整秒单元
ADD A,#1
DA A
MOV SEC,A
ANL A,#0FCH ;是否够4s?
JZ ENDI
MOV A,STATE
JNZ TEST
JNB CONT,ENDI ;是否连测休止期
LCALL BEG ;自动启动一次测量
MOV STATE,#1 ;进入测量状态
SJMP ENDI
TEST: CJNE A,#1,ENDI ;是否测量中
JNB DINS,DISI ;测量方式判断
MOV A,TJH ;定数方式,将定数条件换成十六进制
RR A
RR A
CLR C
SUBB A,TH1 ;和比较
JC CPS ;已经够数
MOV A,SEC
SUBB A,#64H
JNC CPS ;实测脉冲数虽然不够数,但时间已经够64s
SJMP ENDI
DISI: MOV A,NH ;定时方式
JNZ CPS ;时间虽然不够,但实测脉冲数超过65536
MOV A,SEC
CJNE A,TJL,ENDI ;测量时间到否?
CPS: CLR TR1 ;停止测量
CLR ET1
MOV R3,NH ;取测量结果
MOV R4,TH1
MOV R5,TL1
MOV A,SEC ;单字节十进制转换为十六进制数
MOV R7,A
ANL A,#0FH
XCH A,R7
ANL A,#0F0H
SWAP A
MOV B,#10
MUL AB
ADD A,R7
MOV R7,A
LCALL DV31 ;计算CPS
MOV A,R4
MOV R6,A
MOV A,R5
MOV R7,A
LCALL HB2 ;双字节十六进制数转换为十进制
MOV A,R3
JZ CPS1
MOV R4,#99H ;CPS封顶
MOV R5,#99H
CPS1: MOV CPSH,R4 ;保存测量结果CPS值
MOV CPSL,R5
MOV A,NOL
ADD A,#1
DA A
MOV NOL,A
MOV A,NOH
ADDC A,#0
DA A
MOV NOH,A
JNC CPSE ;序号超出否?
MOV NOL,#1 ;重新从一号测点开始
CPSE: MOV STATE,#0 ;进入休止期
MOV SEC,#0 ;开始计算休息时间
ENDI: MOV C,14H ;每1/8s申请一次显示
MOV DISPLY,C
POP PSW ;恢复现场
POP ACC
RETI ;定时中断结束
;主程序
MAIN: MOV SP,#67H ;设置系统堆栈区为68~7FH
MOV R0,#20H ;把内存20H~7FH全清零
CLR A
CLRS: MOV @R0,A
INC R0
CJNE R0,#80H,CLRS
;发光二极管自检(闪烁三次);
MOV R2,#3
TES1: CLR LED ;亮
LCALL TIM2 ;延时
SETB LED ;灭
LCALL TIM2 ;延时
DJNZ R2,TES1
;数码管自检(从0000~9999进行显示):
TES2: MOV BUF1,R2 ;设置显示内容(四位显示内容相同)
MOV BUF2,R2
MOV BUF3,R2
MOV BUF4,R2
LCALL SS ;显示
LCALL TIM2 ;延时
INC R2 ;更换显示内容
CJNE R2,#0BH,TES2 ;直到完全熄灭
;开始初始化:
MOV TJL,#4 ;测量条件默认为4s
MOV NOL,#1 ;测点序号默认从第一点开始
MOV TH0,#85H ;时钟定时器(1/16s,6MHz晶体)
MOV TL0,#0EEH
MOV TMOD,#51H ;T0定时,T1计数
SETB PT1 ;计数溢出中断为高级中断
CLR ET1 ;暂时关闭计数器
SETB TR0 ;定时器开始工作
SETB ET0
SETB EA
;主程序进入监控循环:
LOOP: JB DISPLY,LOOP1
LCALL DISP ;调用显示模块
LOOP1: LCALL KIN ;读取键码
JZ KEY0 ;按键否?
MOV KEYC,A ;保存输入键码,用于去抖处理
MOV R4,#20 ;延时去抖动
MOV R5,#0
TIM0: DJNZ R5,TIM0
DJNZ R4,TIM0
LCALL KIN ;再次读取键码
XCH A,KEYC ;保存输入键码
XRL A,KEYC ;与上次按键比较
JZ KEY2 ;相同否?
KEY0: CLR KEYP ;未按键或键码发生变化,清响应标志
SJMP LOOP
KEY2: JB KEYP,LOOP ;按键已经响应,不再响应,防止连击
CLR CONT ;任何按键均结束连测方式
MOV A,STATE ;取当前状态
MOV B,#4
MUL AB
ADD A,KEYC ;结合键码
INC A
MOVC A,@A+PC ;查表
SJMP KEY3
DB 11H,21H,32H,43H ;状态0下K1~K4对应的反应元素
DB 60H,60H,60H,60H ;状态1下K1~K4对应的反应元素
DB 72H,82H,60H,60H ;状态2下K1~K4对应的反应元素
DB 93H,83H,60H,60H ;状态3下K1~K4对应的反应元素
KEY3: MOV B,A
ANL A,#0FH
MOV STATEN,A ;保存次态
MOV A,B
SWAP A
ANL A,#0FH ;取模块号
MOV B,#3
MUL AB
MOV DPTR,#WORK
JMP @A+DPTR ;进入指定模块
WORK: LJMP WK0 ;路标集合
LJMP WK1
LJMP WK2
LJMP WK3
LJMP WK4
LJMP WK5
LJMP WK6
LJMP WK7
LJMP WK8
LJMP WK9
WK0: LJMP WKE ;空操作,返回汇合点
WK1: LCALL BEG ;启动连续测量
SETB CONT ;设立连测标志
LJMP WKE ;返回汇合点
WK2: LCALL BEG ;启动一次测量(点测)
LJMP WKE ;返回汇合点
WK3: CLR SETTING ;进入查询条件状态
MOV SETP,#0
LJMP WKE ;返回汇合点
WK4: CLR SETTING ;进入查询序号状态
MOV SETP,#0
LJMP WKE ;返回汇合点
WK5: LJMP WKE ;返回汇合点
WK6: MOV A,STATE
CJNE A,#1,WK61
MOV CPSH,#0 ;测量中,中止本次测量,CPS清零
MOV CPSL,#0
MOV SEC,#0 ;时钟复位
LJMP WKE ;返回汇合点
WK61: CJNE A,#2,WK6E
MOV A,TJH ;退出条件状态之前,检查新条件的性质
JZ WK64 ;小于100按定时方式进行测量
ADD A,#05H
DA A
JNC WK62
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -