📄 syq.asm
字号:
SETB 0FH
AJMP BJ
ZJ6: SETB 11H ;结束自检,置为常态 11H=1
RET
YWJC: MOV A,6AH ;取检测间隔定时器
CJNE A,#04H,YWJC1 ;不到4秒,退出
SJMP YWJC2
YWJC1: RET
YWJC2: MOV TMOD,#11H ;置T1为16位定时(保持T0不变)
CLR REN ;禁止串口接收
CLR ES ;禁止串口中断
CLR A ;液位检测工作单元清零
MOV 6CH,A
MOV 6DH,A
MOV 6EH,A
MOV 6FH,A
MOV 6AH,A ;清检测间隔定时器
YWJC3: MOV R0,#10H ;延时约8毫秒
YWJC4: MOV R1,#0FFH
YWJC5: DJNZ R1,YWJC5
DJNZ R0,YWJC4
CLR A ;A/D单元(即T1的计时器)清零
MOV TH1,A
MOV TL1,A
SETB TR1 ;启动T1开始A/D计数
CLR 0EH ;关放电管 检测电容开始充电
CLR P1.2 ;0EH映像P1.2的设定状态
YWJC6: JNB P3.6,YWJC7 ;P3.6=0 A/D结束 转
MOV A,TH1
JNB ACC.7,YWJC6 ;A/D正进行 且TH1<80H 则继续
CLR TR1 ;A/D没结束但TH1>=80H 为A/D电
SETB 0EH ;路故障,则停止T1,打开检测
SETB P1.2 ;电容放电开关(即P1.2=1),并
SETB 10H ;置液位电路故障标志 10H=1
AJMP YWJC14
YWJC7: CLR TR1 ;A/D正常结束 停止T1计数
SETB 0EH ;检测电容放电 准备下次检测
SETB P1.2
MOV A,TL1 ;检测值(A/D值)累加到工作单元
ADD A,6DH
MOV 6DH,A
MOV A,TH1
ADDC A,6EH
MOV 6EH,A
CLR A
ADDC A,6FH
MOV 6FH,A
INC 6CH ;检测次数加1
MOV A,6CH
JB 11H,YWJC8 ;11H=1不是自检态 转
CJNE A,#40H,YWJC3 ;自检 但累加测值不够64次 继续
MOV R0,#06H ;R0指定对累加值除64(右移6次)
SJMP YWJC9 ;转去求平均值运算
YWJC8: CJNE A,#08H,YWJC3 ;常态 累加不够8次 继续
MOV R0,#03H ;R0指定对累加值除8(右移3次)
YWJC9: CLR C ;求平均值运算,按R0指定次数对
MOV A,6FH ;累加和单元(6FH)(6EH)(6DH)右
RRC A ;移 得平均值于(6FH)(6EH)(6DH)
MOV 6FH,A ;中,但应有(6FH)=0
MOV A,6EH
RRC A
MOV 6EH,A
MOV A,6DH
RRC A
MOV 6DH,A
DJNZ R0,YWJC9
CLR 10H ;清液位故障标志
MOV 5EH,#00H ;清液位故障次数计数器
YWJC10: JNB 11H,YWJC14 ;是自检则跳过比较和恢复串口段
CLR C
MOV A,6DH ;液位测值与(7BH)(7AH)中的液瓶
SUBB A,7AH ;空伐值比较
MOV A,6EH
SUBB A,7BH
JNC YWJC12 ;测值>=伐值 液瓶未空 转
INC 5FH ;液瓶空检测次数加1
MOV A,5FH
CJNE A,#02H,YWJC13 ;不是连续2次测到液瓶空 转
YWJC11: JB 0FH,YWJC11 ;连续2次检测到液瓶空,则进行
MOV 50H,#30H ;“液瓶空,请停止输液”不间断
MOV 51H,#22H ;报警,并“液空”灯亮,“快”
MOV 52H,#1CH ;“慢”“堵液”灯灭
MOV 53H,#1AH
MOV 54H,#4CH
MOV 55H,#44H
MOV 56H,#0FFH
MOV 5BH,#50H
SETB 0FH
ANL 77H,#03H
ORL 77H,#20H
MOV A,#1CH ;液瓶空时滴速位置显示"u u u"
MOV 74H,A
MOV 75H,A
MOV 76H,A
AJMP BJ
YWJC12: MOV 5FH,#00H
YWJC13: MOV TMOD,#21H ;恢复串口.在6MHZ晶振下波特率
MOV TH1,#0F4H ;常数为F4H可产生1302波特率(在
MOV TL1,#0F4H ;PCON的SMOD=0时)
SETB REN
SETB ES
SETB TR1
YWJC14: JNB 10H,YWJC18 ;无液位故障 转
INC 5EH ;有液位故障 计次单元加1
MOV A,5EH
CJNE A,#02H,YWJC18 ;不是连续2次有液位故障 转
YWJC15: MOV A,#80H ;是连续2次有液位故障 置显示全
MOV R0,#70H ;为“.......”
YWJC16: MOV @R0,A
INC R0
CJNE R0,#78H,YWJC16
YWJC17: JB 0FH,YWJC17 ;置“请检查液瓶”连续不断报警
MOV 50H,#1AH
MOV 51H,#2CH
MOV 52H,#30H
MOV 53H,#0FFH
MOV 5BH,#50H
SETB 0FH
AJMP BJ
YWJC18: RET
EEX0: PUSH PSW ;保护现场
PUSH ACC
PUSH R0
JB 07H,EEX01 ;07H=1 不是第1个液滴信号 转
SETB 07H ;是第1个液滴信号 置07H=1
MOV 48H,#00H ;滴速数据队列计数器清零
SJMP EEX05
EEX01: MOV 47H,45H ;后移滴速数据队列
MOV 46H,44H
MOV 45H,43H
MOV 44H,42H
MOV 43H,41H
MOV 42H,40H
MOV 41H,DPH ;将前次至本次液滴经历时间存
MOV 40H,DPL ;入滴速数据队列头部(41H)(40H)
MOV A,48H
XRL A,#03H
JZ EEX02 ;队列满(有4组数据)数据可用
INC 48H ;队列未满 继续计数
SJMP EEX05
EEX02: CLR A
MOV 4AH,A ;和单元(4BH)(4AH)清0
MOV 4BH,A
MOV R0,#40H ;R0指向队列首址
EEX03: MOV A,4AH ;队列数据累加求和在(4BH)(4AH)
ADD A,@R0
MOV 4AH,A
INC R0
MOV A,4BH
ADDC A,@R0
MOV 4BH,A
INC R0
CJNE R0,#48H,EEX03
MOV R0,#02H ;(4BH)(4AH)/4 得平均值,供计算
EEX04: CLR C ;滴速用
MOV A,4BH
RRC A
MOV 4BH,A
MOV A,4AH
RRC A
MOV 4AH,A
DJNZ R0,EEX04
SETB 04H ;置允许滴速计算标志 04H=1
EEX05: MOV DPTR,#0000H ;清滴速计时器
POP R0 ;恢复现场
POP ACC
POP PSW
RETI
DS: JB 04H,DS3 ;04H=1 转去滴速计算
MOV A,DPH ;否则查DPH看二次液滴间隔是否
CLR C ;大于5秒.DPH的1个单位对应
SUBB A,#05H ;1.024秒(DPTR的1单位为4ms)
JNC DS1
JB 05H,DS2 ;若在堵液态则跳过计算和处理
AJMP DS10 ;DPH<5秒 转
DS1: MOV A,#1DH ;堵液时,滴速显示"o o o"
MOV 74H,A
MOV 75H,A
MOV 76H,A
DSX: JB 0FH,DSX ;DPH>5秒 则置“输液堵塞,请
MOV 50H,#44H ;检查”放音
MOV 51H,#48H
MOV 52H,#1CH
MOV 53H,#1AH
MOV 54H,#2CH
MOV 55H,#0FFH
MOV 5BH,#50H
SETB 0FH
SETB 05H ;置堵液标志 05H=1
CLR 07H ;清液滴标志 准备重新捕捉液滴
MOV DPTR,#0000H ;间隔时间
MOV A,77H ;置“堵液”灯亮
ANL A,#03H
SETB ACC.4
MOV 77H,A
DS2: AJMP DS11
DS3: CLR 04H ;清允许滴速计算标志
CLR 05H ;清堵液标志
DS4: MOV 4CH,#98H ;取常数3A98H(即1500)于计算工
MOV 4DH,#3AH ;作单元(4DH)(4CH)
ACALL DDIV ;除运算 得滴速于(4DH)(4CH)中
CLR 0AH ;予置滴速不超限
MOV A,4DH
JZ DS5 ;滴速高字节=0 正常 转DS5
CLR 09H ;高字节不为0 即滴速>256 不正常
CLR 0CH ;置滴速"快"标志(09H=0)
MOV A,#01H ;显示不加"."(0CH=0)
MOV 62H,A ;置滴速(62H)=01H("_"的段码),置
ACALL XSDS ;显示滴速为"- - -"
AJMP DS9 ;转去超限处理
DS5: MOV A,4CH ;取正常滴速值
DS6: MOV 62H,A ;滴速值-->(62H)
CLR 0CH ;显示不加"."
ACALL XSDS ;显示滴速
MOV A,62H ;取滴速值
CLR C
SUBB A,61H ;与滴速上限比较
JC DS7 ;<上限,转去与下限比较
CLR 09H ;>=上限,置滴速"快"标志(09H=0)
AJMP DS9 ;转去超限处理
DS7: MOV A,62H ;取滴速值
CLR C
SUBB A,60H ;与滴速下限比较
JC DS8 ;<下限
CLR 0AH ;上限>滴速>=下限,清超限标志
MOV 5CH,#00H ;清超限次数计数器
RET ;退出
DS8: SETB 09H ;滴速<下限,置"慢"标志(09H=1)
DS9: INC 5CH ;超限计次单元加1
MOV A,5CH ;查看超限计次单元(5CH)若大
CLR C ;于3 即连续3次以上超限 则
SUBB A,#03H ;置超限标志 0AH=1 并置超限
JC DS10 ;计次单元(5CH)=4 (防止连续
MOV 5CH,#04H ;256次以上超限使计次单元溢
SETB 0AH ;出变为0)
DS10: ACALL CXCL ;调滴速超限处理
DS11: RET
CXCL: JB 0AH,CXCL1 ;滴速超限处理程序
ANL 77H,#03H ;滴速无超限 置“超限”灯灭
RET ;退出
CXCL1: JB 0DH,CXCL3 ;滴速快慢报警开关0DH=1(关)转
MOV A,64H ;取报警间隔定时单元
CLR C
SUBB A,#04H ;定时>=4秒?
JC CXCL3 ;<4秒,不报警
MOV 64H,#00H ;>=4秒,定时器清0,报警
JB 0FH,CXCL3
MOV 50H,#34H ;放音区预置“滴速快,请调整”
MOV 51H,#1EH
MOV 52H,#1CH
MOV 53H,#1AH
MOV 54H,#40H
MOV 55H,#0FFH
MOV 5BH,#50H
JNB 09H,CXCL2 ;查看快慢标志
MOV 51H,#20H ;是慢 则放音“快”改为“慢”
CXCL2: SETB 0FH
CXCL3: JB 14H,CXCL4 ;若交显标志14H=1,转显示限值
MOV A,62H ;14H=0,显示测值
CLR 0CH ;显示不加"."
AJMP CXCL5
CXCL4: SETB 0CH ;显示限值加"."
MOV A,61H ;予取上限值
JNB 09H,CXCL5
MOV A,60H ;若09H=1取下限值
CXCL5: ACALL XSDS ;显示滴速
MOV A,77H ;取指示灯显示位的显示数据
JNB 09H,CXCL6
SETB ACC.2 ;09H=1置“快”灯亮“慢”灭
CLR ACC.3
SJMP CXCL7
CXCL6: SETB ACC.3 ;09H=0置“快”灯灭“慢”亮
CLR ACC.2
CXCL7: MOV 77H,A
RET
DDIV: CLR A ;双字节无符号数除法子程序
MOV 4FH,A ;入口:
MOV 4EH,A ;(4DH)(4CH)—被除数
MOV R0,#10H ;(4BH)(4AH)—非0除数
DDIV1: CLR C ;出口:
MOV A,4CH ;(4DH)(4CH)—商
RLC A ;(4FH)(4EH)—余数
MOV 4CH,A
MOV A,4DH
RLC A
MOV 4DH,A
MOV A,4EH
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -