⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 syq.asm

📁 语音式输液监视器51单片机汇编程序 监测滴速、瓶空
💻 ASM
📖 第 1 页 / 共 3 页
字号:
         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 + -