📄 syq.asm
字号:
;-----------内存分配---------
;3FH *滴速设限状态(0-设上限,1-设下限,2-完成设限)
;40H--47H *液滴时间队列,保留4个液滴时间,先进先出
;48H *液滴时间队列计数器,从0计到3为队列满可用
;49H--4FH *除法子程序工作区,计算滴速用
;50H--5AH *放音数据区
;5BH *放音数据区指针
;5CH *滴速超限计次单元
;5DH *分机号
;5EH *液位故障计次单元
;5FH *液瓶空计次单元
;60H *滴速下限(16进制).允许值20--60(14H--3CH)
;61H *滴速上限(16进制).允许值60--120(3CH--78H)
;62H *当前滴速值(16进制)
;63H *设限定时(每秒自动加1),5秒无键操作退出设限
;64H *报警间隔定时器(每秒自动加1)
;65H--69H
;6AH *液位检测间隔定时器,每秒自动加1.(液位4秒测1次)
;6BH
;6CH *液位检测累加次数计数单元(多次累加求平均值)
;6DH--6FH *液位检测累加和单元
;70H--77H *显示数据区(存放显示段码)
;78H *当前扫描位号(00H--07H)
;79H *输入键号(只有 00,01 二个有效键)
;7AH--7BH *液瓶空伐值,自检时自动算出(7AH)低(7BH)高
;7CH *系统计时单元,每4毫秒加1累计出0.5秒,1秒
;7DH *系统“秒”单元
;7EH *系统“分”单元
;7FH *系统“时”单元
;
;-----------位标志分配------
;00H---闪动标志,每0.5秒交替变0,1
;01H---未释放键标志,有键按下未松开时为1
;02H---未处理键标志,有键按下未处理时为1
;03H---
;04H---允许滴速计算标志
;05H---堵液标志
;06H---时间刷新标志,"分"进位时置位,刷新输液时间显示
;07H---滴液标志,第1滴液滴出现时置位,其后可测计液滴间隔
;08H---滴速上/下限标志(仅用于BDS子程序)
;09H---滴速快慢标志."快"-0,"慢"-1
;0AH---滴速超限标志.超限时置1
;0BH---音段正在放音标志.触发音段放音时置位,音段结束复位
;0CH---滴速显示加"."标志.0CH=1时加"."
;0DH---滴速快慢报警开关
;0EH---P1.2口状态映像位
;0FH---语句放音标志.设置语句音段数据时置位,放完自动复位
;10H---液位检测故障标志
;11H---自检/常态标志."自检"-0,"常态"-1
;12H---滴速设限时数值变化快慢控制12H=0(0.5秒)12H=1(0.25秒)
;13H---滴速十位0值标志.供BDS(报滴速)子程序放音语句调整用
;14H---交替显示标志.由4MS中断每秒交替置0/1.供超限交替显示用
ORG 0000H
LJMP ZCX ;主程序
ORG 0003H
LJMP EEX0 ;外部中断0,滴速测量
ORG 000BH
LJMP T4MS ;定时器T0,4ms定时中断
ORG 0013H
LJMP EEX1 ;外部中断1,放音RECLED检测
ORG 0023H
LJMP TX ;串口通讯
ORG 0028H
T4MS: PUSH PSW ;保护现场
PUSH ACC
PUSH R0
CLR TR0 ;停止T0计时
MOV A,#37H ;置4ms定时常数.为保证定时精度
ADD A,TL0 ;对时间常数进行效正,消除因中
MOV TL0,A ;断响应延迟产生的影响
MOV A,#0F8H
ADDC A,TH0
MOV TH0,A
SETB TR0 ;启动T0定时
INC 7CH ;时间计数单元加一(加4ms)
INC DPTR ;滴速计时器加一(加4ms)
JB P3.6,T4MS1 ;查液位测量是否结束
CLR TR1 ;已结束,停液位检测计数
T4MS1: MOV A,7CH ;秒单元(7CH)=#7DH?
CJNE A,#7DH,T4MS2 ;(即够0.5秒吗?)
CLR 00H ;闪动标志位 00H=0
SJMP T4MS5
T4MS2: CJNE A,#0FAH,T4MS5 ;(7CH)=#FAH?(够1秒?)
SETB 00H ;闪动标志位 00H=1
MOV 7CH,#00H ;秒单元清零
CPL 14H
JB P3.6,T4MS3 ;查液位测量是否结束
CLR TR1 ;已结束,停液位检测计数
T4MS3: INC 63H ;滴速设限定时单元加1秒
INC 64H ;报警间隔定时单元加1秒
INC 6AH ;液位检测间隔定时单元加1秒
INC 7DH ;秒单元(7DH)加一秒
MOV A,7DH
CJNE A,#3CH,T4MS5 ;秒单元(7DH)=60秒?
MOV 7DH,#00H ;是,秒单元清零
SETB 06H ;置时间刷新标志位 06H=1
JB P3.6,T4MS4 ;查液位测量是否结束
CLR TR1 ;已结束,停液位检测计数
T4MS4: INC 7EH ;分单元(7EH)加一分
MOV A,7EH
CJNE A,#3CH,T4MS5 ;分单元(7EH)=60分?
MOV 7EH,#00H ;是,分单元清零
INC 7FH ;时单元(7FH)加一小时
T4MS5: JB P3.6,T4MS6 ;查液位测量是否结束
CLR TR1 ;已结束,停液位检测计数
T4MS6: ACALL JX ;调“键显”程序
ACALL FY ;调“放音”程序
POP R0 ;恢复现场
POP ACC
POP PSW
RETI
JX: MOV A,77H ;取指示灯显示状态值
ANL A,#0FCH ;予置D1D0=00H(:灯灭)
JNB 00H,JX1 ;若闪动标志位 00H=1
ORL A,#03H ;则置D1D0=11H(:灯亮)
JX1: MOV 77H,A ;刷新指示灯显示单元
MOV A,78H ;取当前扫描位号
ADD A,#70H ;计算当前显示数据地址
MOV R0,A
MOV A,@R0 ;取当前显示位数据
JB P3.6,JX2 ;查液位测量是否结束
CLR TR1 ;已结束,停液位检测计数
JX2: ACALL CBZHA ;串/并转换,显示数串出送显
JB P3.6,JX3 ;查液位测量是否结束
CLR TR1 ;已结束,停液位检测计数
JX3: MOV A,78H ;取当前扫描位号
ORL A,#0F8H ;位号高5位置1
SWAP A ;高,低4位交换
JB 0EH,JX4 ;0EH是P1.2的映象,是为保证
CLR ACC.2 ;向P1口输出时P1.2不受影响
JX4: MOV P1,A ;从P1.6/5/4输出扫描位号
JB P3.6,JX5 ;查液位测量是否结束
CLR TR1 ;已结束,停液位检测计数
JX5: JB 01H,JX6 ;01H=1 有未释放键,转
JB 02H,JX8 ;02H=1 有未处理键,转
JB P3.5,JX8 ;P3.5=1 无键输入,转
MOV 79H,78H ;有键输入,存键号到(79H)
SETB 01H ;置未释放键标志 01H=1
SJMP JX7
JX6: MOV A,79H ;取原输入键号
CJNE A,78H,JX7 ;是否已扫描到该键号
JNB P3.5,JX7 ;是,但仍未释放
CLR 01H ;是且已释放,清未释放键标志
SETB 02H ;置未处理键标志 02H=1
JX7: JB P3.6,JX8 ;查液位测量是否结束
CLR TR1 ;已结束,停液位检测计数
JX8: INC 78H ;扫描位号加一
ANL 78H,#07H ;保留扫描位号低3位
RET
CBZHA: SETB P3.4 ;P3.4=1 向显示口串出送数
SJMP CBZH
CBZHB: CLR P3.4 ;P3.4=0 向放音口串出送数
CBZH: MOV R0,#08H ;指定串出8位(一字节)
CBZH1: RLC A ;字节左移1位,将待送出的1位
JC CBZH2 ;数移到CY,在相应置到P1.3
CLR P1.3 ;(P1.3是串出数据口线)
SJMP CBZH3 ;
CBZH2: SETB P1.3 ;
CBZH3: NOP ;使P1.3数据稳定
CLR P1.7 ;P1.7是时钟输出,向CD4094
NOP ;提供串并转换时钟
SETB P1.7
JB P3.6,CBZH4 ;查液位测量是否结束
CLR TR1 ;已结束,停液位检测计数
CBZH4: DJNZ R0,CBZH1 ;完成8位串并转换
SETB P1.3 ;P1.3常态保持高电平
RET
FY: JNB 0FH,FY1 ;0FH=0 无放音请求,退出
JNB 0BH,FY2 ;0BH=0 无正进行的放音,转
FY1: RET ;去放音,否则退出
FY2: MOV R0,5BH ;R0=放音数据区首地址
MOV A,@R0 ;取1个音码
CJNE A,#0FFH,FY3 ;不是结束码FFH 转
CLR 0FH ;否则放音结束 清请求标志
RET
FY3: ACALL CBZHB ;串并转换 置音片的音段地址
CLR P3.7 ;置音片PLAYE=0 触发放音
SETB 0BH ;置正在放音标志 0BH=1
INC 5BH ;指向下一个音码数据
SETB P3.7 ;放音已触发 恢复PLAYE=1
RET
EEX1: CLR 0BH ;外部中断1响应音片的音段放
RETI ;音结束RECLED信号 清除正在
NOP ;放音标志
DMZH: INC A ;段码转换 将显示值查表转换
MOVC A,@A+PC ;成显示段码
RET
DB 7EH,30H,6DH,79H ;段码表,依次对应0H--0FH的段码
DB 33H,5BH,5FH,70H ;段号---字节位号关系:
DB 7FH,7BH,77H,1FH ;".abcdefg"--d7d6d5d4d3d2d1d0
DB 4EH,3DH,4FH,47H
SJSX: JB 06H,SJSX1 ;时间刷新标志06H=1 转去刷新
RET ;时间程序在“分”有变化时置
NOP ;06H=1
SJSX1: CLR 06H ;清时间刷新标志
MOV R0,#70H ;R0指向时间显示单元首址
MOV A,7FH ;A=当前“时”数(十六进制)
ACALL SJSX2 ;转换后送显示单元
MOV A,7EH ;A=当前“分”数(十六进制)
ACALL SJSX2 ;转换后送显示单元
RET
SJSX2: MOV B,#0AH ;"时"或"分"/10得十位值
DIV AB
ACALL DMZH ;段码转换
MOV @R0,A ;送显
INC R0
XCH A,B ;取余数(个位值)
ACALL DMZH ;段码转换
MOV @R0,A ;送显
INC R0
RET
DFJH: ACALL DFJH2 ;读一次分机号(从CD4021)
DFJH1: MOV 5DH,A ;存入(5DH)
ACALL DFJH2 ;再读一次分机号
CJNE A,5DH,DFJH1 ;二次不一至则继续读 直到一至
RET ;为止
DFJH2: CLR P3.4
MOV R0,#08H
DFJH3: MOV C,P3.5
RLC A
CLR P1.7
NOP
SETB P1.7
DJNZ R0,DFJH3
SETB P3.4
RET
ZJ: CLR 11H ;置为自检态(仅供YWJC识别)
ACALL YWJC2 ;测64次液位平均值
JB 10H,ZJ ;检测有故障 重测.(若连续二
NOP ;次有故障YWJC程序会自动报警)
CLR C
MOV A,6EH ;将检测值与一设定下限比较,
SUBB A,#36H ;(下限高字节值=36H)
JC ZJ1 ;测值<下限 转报警
MOV A,6EH ;将检测值与一设定上限比较,
SUBB A,#50H ;(上限高字节值=50H)
JC ZJ2
ZJ1: AJMP YWJC15 ;测值>上限 转报警
ZJ2: MOV R0,#01H ;用R0指定测值右移运算1次
ACALL YWJC9 ;调右移运算(除2)
MOV 7AH,6DH ;得测值的1/2存入(7BH)[高]
MOV 7BH,6EH ;(7AH)[低]
MOV R0,#01H ;用R0指定测值右移运算1次
ACALL YWJC9 ;调右移运算(除2,得测值的1/4)
MOV A,7AH
ADD A,6DH
MOV 7AH,A
MOV A,7BH
ADDC A,6EH
MOV 7BH,A ;(7BH)(7AH)=(1/2+1/4)测值
MOV R0,#02H ;用R0指定测值右移运算2次
ACALL YWJC9 ;调右移运算(除4,得测值的1/16)
MOV A,7AH
ADD A,6DH ;(7BH)(7AH)=(1/2+1/4+1/16)测值
MOV 7AH,A ;即液位平均值的 81.25% 用其
MOV A,7BH ;作为液瓶空的比较判别值
ADDC A,6EH
MOV 7BH,A
SETB IT0 ;置外部中断0为后沿触发
SETB EX0 ;允许中断(液滴信号触发中断)
CLR 07H ;清滴液标志(第1个液滴后07H=1)
MOV DPTR,#0000H ;置滴速计时器为0(每秒自动加1)
ZJ3: JB 07H,ZJ6 ;有液滴出现,正常,转
MOV A,DPH ;无液滴出现,查看计时器是否经
CLR C ;历 > 10秒(DPH=0AH),不到10秒
SUBB A,#0AH ;继续等待液滴信号
JC ZJ3
MOV A,#80H ;计时>10秒则判为滴速电路故障
MOV R0,#70H ;置显示全为“.......”
ZJ4: MOV @R0,A ;(“.”的段码是 80H)
INC R0
CJNE R0,#77H,ZJ4
ZJ5: JB 0FH,ZJ5 ;连续不断报警“请检查滴速”
MOV 50H,#1AH
MOV 51H,#2CH
MOV 52H,#34H
MOV 53H,#0FFH
MOV 5BH,#50H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -