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

📄 syq.asm

📁 语音式输液监视器51单片机汇编程序 监测滴速、瓶空
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;-----------内存分配---------

;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 + -