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

📄 syq.asm

📁 语音式输液监视器51单片机汇编程序 监测滴速、瓶空
💻 ASM
📖 第 1 页 / 共 3 页
字号:
         RLC   A
         MOV   4EH,A
         MOV   A,4FH
         RLC   A
         MOV   4FH,A
DDIV2:   CLR   C
         MOV   A,4EH
         SUBB  A,4AH
         MOV   49H,A
         MOV   A,4FH
         SUBB  A,4BH
         JC    DDIV3
         MOV   4FH,A
         MOV   4EH,49H
         INC   4CH
         SJMP  DDIV2
DDIV3:   DJNZ  R0,DDIV1
         RET
                    
JCL:     JB    02H,JCL1       ;02H=1 有键要处理
JCL0:    RET                  ;否则退出
JCL1:    MOV   A,79H          ;取键号(有 0,1,2,3四个有效键)
         JZ    JCL4           ;0号键 转滴速设定处理
         CJNE  A,#03H,JCL3
         JB    0DH,JCL2       ;3号键 置滴速超限报警开关 即
         SETB  0DH            ;改变开关标志 0DH 状态 
         SJMP  JCL3           ;若 0DH=1 则变为 0DH=0
JCL2:    CLR   0DH            ;若 0DH=0 则变为 0DH=1
JCL3:    CLR   02H            ;清未处理键标志(02H=0)
         RET                  ;退出
JCL4:    CLR   0CH            ;置滴速显示不加"."
         CLR   02H
         MOV   A,3FH          ;取设限状态
         JNZ   J2             ;状态\=0 转
J1.0:    JB    0FH,J1.0        ;如有其他放音,等待结束
         MOV   50H,#1AH        ;放音"请设定滴速上限"
         MOV   51H,#38H
         MOV   52H,#34H
         MOV   53H,#24H
         MOV   54H,#0FFH
         MOV   5BH,#50H
         SETB  0FH
J1.1:    JB    0FH,J1.1        ;等待放音结束
         CLR   02H
         CLR   12H             ;初始滴速设限速度标志(0.5秒)
J1.2:    MOV   63H,#00H        ;设限定时清0
J1.Z:    JB    01H,J1.3        ;有键按下(01H=1)
         CLR   02H             ;无键按下,清未处理键标志
         CLR   12H             ;初始滴速设限速度标志(0.5秒)
         MOV   A,63H           ;取设限按键等待时间
         CJNE  A,#05H,J1.Z     ;不到5秒,继续等待
         AJMP  J3              ;到5秒无按键,退出设限
J1.3:    MOV   A,79H           ;取键号
         JNZ   J1.Y            ;不是0号键 转
J1.X:    JNB   02H,J1.X        ;0号键,等待键释放
         INC   3FH             ;置为下一个设限状态
         AJMP  JCL4            ;转回JCL4处理
J1.Y:    CJNE  A,#01H,J1.7     ;不是1号键(增量键)转
         INC   61H             ;上限值加1
         MOV   A,61H
         CLR   C
         SUBB  A,#78H          ;所设上限>=规定上限最高值120?
         JC    J1.4            ;
         MOV   61H,#78H        ;>=120(78H)则置为120
J1.4:    MOV   A,61H           ;显示当前上限值
         ACALL XSDS
         MOV   DPTR,#0000H     ;清计时器(DPTR每4ms自动加1)
J1.5:    MOV   A,DPL
         JB    12H,J1.6        ;快速设限状态(12H=1)转
         CJNE  A,#80H,J1.5     ;慢态,查DPL=80H?(约0.5秒)等待
         SETB  12H             ;第1个慢态后立即置为快态
         AJMP  J1.2            ;继续查键
J1.6:    CJNE  A,#40H,J1.5     ;快态,查DPL=40H?(0.25秒)等待
         AJMP  J1.2            ;继续查键
J1.7:    CJNE  A,#02H,J1.2     ;不是2号键(减量键)转
         DEC   61H             ;上限值减1
         MOV   A,61H
         CLR   C
         SUBB  A,#3CH          ;所设上限<规定上限最低值60?
         JNC   J1.4
         MOV   61H,#3CH        ;< 60(3CH)则置为60
         AJMP  J1.4
J2:      CJNE  A,#01H,J3       ;不是第1设限态(设滴速下限)转
J2.0:    JB    0FH,J2.0        ;如有其他放音,等待结束
         MOV   50H,#1AH        ;放音"请设定滴速下限"
         MOV   51H,#38H
         MOV   52H,#34H
         MOV   53H,#28H
         MOV   54H,#0FFH
         MOV   5BH,#50H
         SETB  0FH
J2.1:    JB    0FH,J2.1        ;等待放音结束 
         CLR   02H             ;清未处理键标志
         CLR   12H             ;初始滴速设限速度标志(0.5秒)
J2.2:    MOV   63H,#00H        ;设限定时清0
J2.Z:    JB    01H,J2.3        ;有键按下转去处理
         CLR   02H             ;无键,清未处理键标志
         CLR   12H             ;初始滴速设限速度标志(0.5秒)
         MOV   A,63H
         CJNE  A,#05H,J2.Z     ;等待按键5秒
         AJMP  J3              ;5秒仍无键按下 转退出
J2.3:    MOV   A,79H           ;取键号
         JNZ   J2.Y            ;不是0号键 转
J2.X:    JNB   02H,J2.X        ;0号键,等待键释放
         INC   3FH             ;置为下一个设限状态
         AJMP  JCL4            ;转回JCL4处理
J2.Y:    CJNE  A,#01H,J2.7     ;不是1号键(增量)转
         INC   60H             ;1号键,滴速下限值加1
         MOV   A,60H
         CLR   C
         SUBB  A,#3CH          ;所设下限<规定下限最高值60?
         JC    J2.4            ;<60(3CH)有效,转 
         MOV   60H,#3CH        ;>=60,则置为60
J2.4:    MOV   A,60H           
         ACALL XSDS            ;显示所设下限值
         MOV   DPTR,#0000H     ;清计时器(DPTR每4ms自动加1)
J2.5:    MOV   A,DPL
         JB    12H,J2.6        ;快速设限状态(12H=1)转
         CJNE  A,#80H,J2.5     ;慢态,查DPL=80H?(约0.5秒)等待
         SETB  12H             ;第1个慢态后立即置为快态
         AJMP  J2.2            ;继续查键
J2.6:    CJNE  A,#40H,J2.5     ;快态,查DPL=40H?(0.25秒)等待
         AJMP  J2.2            ;继续查键
J2.7:    CJNE  A,#02H,J2.2     ;不是2号键(减量键)转
         DEC   60H             ;下限值减1
         MOV   A,60H
         CLR   C
         SUBB  A,#14H          ;所设下限<规定下限最低值20?
         JNC   J2.4
         MOV   60H,#14H        ;< 20(14H)则置为20
         AJMP  J2.4
J3:      MOV   A,61H          ;报"滴速上限,每分XX滴"
         CLR   08H            ;报上限标志
         ACALL BDS
         MOV   A,60H          ;报"滴速下限,每分XX滴"
         SETB  08H            ;报下限标志
         ACALL BDS
J3.1:    MOV   3FH,#00H
         CLR   02H
         CLR   12H
         CLR   07H
         RET

BDS:     CLR   13H            ;滴速十位0值标志清0
         JB    0FH,BDS        ;若有放衣数据未放完 等待
         MOV   50H,#34H       ;置放音区“滴速上/下限,每分”
         MOV   51H,#24H
         JNB   08H,BDS1       ;若08H=1则改为下限(音码28H)
         MOV   51H,#28H
BDS1:    MOV   52H,#1CH
         MOV   53H,#3CH
         MOV   5BH,#50H
         MOV   R0,#54H        ;R0指向放音区下一地址
         MOV   B,#64H         ;滴速/100得十进制百位值
         DIV   AB
         JZ    BDS2           ;若百位值=0 转
         RL    A              ;百位值转成音码(即音段地址)  
                              ;(值的BCD码左移1位即得音码)
         MOV   @R0,A          ;百位音码送放音区
         INC   R0             ;放音区地址加1
         MOV   @R0,#16H       ;“百”字音码送放音区
         INC   R0             ;放音区地址加1
BDS2:    XCH   A,B
         MOV   B,#0AH         ;余数/10得滴速十进制十位值
         DIV   AB
         JNZ   BDS3           ;十位值非0转去放音
         SETB  13H            ;十位值=0置标志13H=1
         SJMP  BDS4           ;暂不放音,结合个位一起处理
BDS3:    RL    A              ;十位值转成音码
         MOV   @R0,A          ;十位音码送放音区
         INC   R0             ;放音区地址加1
         MOV   @R0,#14H       ;“十”字音码送放音区
         INC   R0             ;放音区地址加1
BDS4:    XCH   A,B            ;取滴速个位值
         JZ    BDS6           ;个位=0不放音,转去结束
         JNB   13H,BDS5       ;个位,十位均非0,转个位放音
         MOV   @R0,#00H       ;个位非0十位=0,先放"零"音,再
         INC   R0             ;放个位值音
BDS5:    RL    A              ;个位值转成音码
         MOV   @R0,A          ;个位音码送放音区
         INC   R0             ;放音区地址加1
BDS6:    MOV   @R0,#18H       ;“滴”字音码送放音区
         INC   R0             ;放音区地址加1
         MOV   @R0,#0FFH      ;写入放音区结束标志FFH
         SETB  0FH            ;置放音请求标志 0FH=1
         RET

XSDS:    CJNE  A,#01H,XSDS1   ;滴速正常,转
         MOV   A,#01H         ;滴速不正常(即测值>255)时DS子
         MOV   74H,A          ;程序将测值置为01H,此时直接将
         MOV   75H,A          ;01H送显,显示为"- - -"
         MOV   76H,A
         RET   
XSDS1:   MOV   B,#64H         ;滴速/100得十进制"百"位值
         DIV   AB
         JZ    XSDS2          ;百位值=0直接送显示区(灭)
         ACALL DMZH           ;否则转换成显示段码
XSDS2:   MOV   74H,A          ;送显
         XCH   A,B            ;取余数
         MOV   B,#0AH      
         DIV   AB             ;余数/10得"十"位值
         ACALL DMZH           ;转换成段码
         MOV   75H,A          ;送显
         XCH   A,B            ;取"个"位值
         ACALL DMZH           ;转换成段码
         MOV   76H,A          ;送显
         JNB   0CH,XSDS3      ;滴速显示不需加"." 转
         MOV   A,#80H         ;加"."
         ORL   74H,A          ;(即将显示段码最高位置为1)
         ORL   75H,A
         ORL   76H,A
XSDS3:   RET

ZCX:     MOV   TMOD,#11H      ;T1,T0均为16位定时方式
         MOV   IP,#02H        ;T0为最高中断优先级
         MOV   TH0,#0F8H      ;T0定时常数
         MOV   TL0,#30H       ;(6MHZ晶振下定时4毫秒)
         SETB  IT1            ;外部中断EX1为后沿触发
         SETB  IT0            ;外部中断EX0为后沿触发
         CLR   A
         MOV   R0,#20H        ;(20H)—(7FH)清零
ZCX1:    MOV   @R0,A
         INC   R0
         CJNE  R0,#80H,ZCX1
         SETB  0EH            ;0EH=P1.2=1(保持对P1.2映像)
         ACALL DFJH           ;读分机号
         MOV   IE,#86H        ;允许EX1,ET0中断
         SETB  TR0            ;启动T0定时
         MOV   A,5DH          ;取分机号
         SWAP  A              ;在第0,1显示位显示分机号
         ANL   A,#0FH
         ACALL DMZH
         MOV   70H,A
         MOV   A,5DH
         ANL   A,#0FH
         ACALL DMZH
         MOV   71H,A
         ACALL ZJ             ;调自检子程序
         MOV   SCON,#0F0H     ;串口方式3,多机通讯,允许接收
         MOV   60H,#28H       ;予置滴速下限为每分钟40滴(28H)
         MOV   61H,#50H       ;予置滴速上限为每分钟80滴(50H)
         MOV   A,61H
         CLR   08H            ;置报上限标志(08H=0)
         ACALL BDS            ;报滴速上限
         MOV   A,60H
         SETB  08H            ;置报下限标志(08H=1)
         ACALL BDS            ;报滴速下限
ZCX2:    ACALL SJSX           ;调时间刷新
         ACALL YWJC           ;调液位检测
         ACALL DS             ;调滴速检测
         ACALL JCL            ;调键处理
         AJMP  ZCX2           ;转ZCX2循环

TX:      CLR   RI             ;清串口接收标志
         MOV   A,SBUF         ;取接收值(分机号)
         XRL   A,5DH          ;与本机分机号比较
         JZ    TX1            ;一至,有效 转去响应
         RETI                 ;否则退出
TX1:     CLR   ES             ;禁止串口中断
         CLR   TB8            ;多机识别位TB8清零
         MOV   SBUF,5DH       ;向主机发送本机分机号
TX2:     JNB   TI,TX2         ;等待发送完成
         CLR   TI
         MOV   SBUF,7FH       ;向主机发送输液时间的“时”
TX3:     JNB   TI,TX3
         CLR   TI
         MOV   SBUF,7EH       ;向主机发送输液时间的“分”
TX4:     JNB   TI,TX4
         CLR   TI
         MOV   SBUF,62H       ;向主机发送当前滴速
TX5:     JNB   TI,TX5
         CLR   TI
         MOV   SBUF,61H       ;向主机发送设定滴速上限
TX6:     JNB   TI,TX6
         CLR   TI
         MOV   SBUF,60H       ;向主机发送设定滴速下限
TX7:     JNB   TI,TX7         
         CLR   TI
         MOV   SBUF,77H       ;向主机发送指示灯信息 
TX8:     JNB   TI,TX8
         CLR   TI
         SETB  ES             ;允许串口中断
         RETI

BJ:      MOV   A,64H          ;对设定的报警语音信息不间
         CLR   C              ;断地每5秒重复播报
         SUBB  A,#05H         ;此报警只有关机才可解除
         JC    BJ             ;(64H)是报警间隔定时器,由4MS
         MOV   64H,#00H       ;中断子程序每秒加1
         MOV   5BH,#50H
         SETB  0FH
         AJMP  BJ     
                                               
END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -