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

📄 sucelev.asm

📁 八路数据采集系统 含有各个详细的子程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
         LOLMT  EQU 20H          ;温度下限存储首址               (20H-27H)
         HUCH   EQU 2AH          ;显示缓冲区首址                 (2AH-2FH)
         HILMT  EQU 30H          ;温度上限存储首址               (30H-37H)
         SHUJU  EQU 38H          ;量程转换后的温度数据存储首址   (38H-3FH)
         NUMK   EQU 40H          ;NUMK表示此次优先显示的路数,默认从零开始
         NUMN   EQU 41H          ;一次循环中,NUMN单元存储定时器重赋初值次数
         LBZ    EQU 42H          ;越温度底限标识字节
         HBZ    EQU 43H          ;越温度高限标志字节
         ZESH   EQU 44H          ;故障状态下,增时时间单元(用于显示故障原因)
         DOTB   EQU 45H          ;存放温度数据的小数信息
         BACI   EQU 46H          ;此单元存放同一路的采样次数(用于滤波)
         BALU   EQU 48H          ;同一路采样八次,放到以BALU为首单元中,用于滤波
         QLOCK  BIT 40H          ;请求锁定标志位                   (28H)
         YLOCK  BIT 41H          ;已经锁定标志位,只显示某一路       .               
         QLIM   BIT 42H          ;请求置上下限标志位                 .
         TODAO  BIT 43H          ;设定通道上下限时,表示通道数是否已输入
         GADI1  BIT 44H          ;高低设置选择标志位1               .
         GADI2  BIT 45H          ;高低设置选择标志位2               .
         XIAN   BIT 46H          ;设置高低限时,数据输入标志位       .
         GEW    BIT 47H          ;设置高低限时,输入数据的个位     (28H)
         SHI    BIT 48H          ;设置高低限时,输入数据的十位     (29H)
         BAI    BIT 49H          ;设置高低限时,输入数据的百位       .
         GUZO   BIT 4AH          ;故障总位,无论哪路有故障都置1    (29H)
         STATE  BIT 4BH          ;此位表明非正常的数值是超下限,还是越上限
         EOC    BIT P1.0         ;AD转换完成的标志位
         FIX    EQU 15           ;锁定某一路的功能键
         DING   EQU 13           ;设定某一路上下限的功能键
         LUSHU  EQU 8            ;AD转换的路数
         ORG   0000H
         LJMP  MAIN
         ORG   000BH
         LJMP  T0_INT
         ORG   0030H
  MAIN:  MOV   SP,#50H           ;SP置为50H
         LCALL INITIAL           ;初始化子程序,初始化定时器、8255、默认上下限
  LP0:   MOV   TH0,#3CH          ;每次循环前,先要定时
         MOV   TL0,#080H
         MOV   NUMN,#10          ;NUMN单元存储定时器重赋初值次数,每次定时100ms,
         SETB  TR0               ;定时10次即为1s
         LCALL ADTRANS           ;8路检测程序,并完成量程转换
         LCALL LIMCHEC           ;越界检查程序,某一路越界后置相应标志位
         LCALL ASSUREK           ;此子程序可确定此次循环显示哪路
         LCALL PREDISP           ;调显示之前,先填数据缓冲区
   LP3:  LCALL DISP              ;显示当前路温度值
         LCALL JIANSAO           ;调用键扫描程序,完成锁定显示与上下限设定功能
         MOV   A,NUMN            ;通过NUMN检查一下定时器是否已经定时完一秒
         CJNE  A,#0,LP3          ;如果没有定完一秒,继续调显示
         JB    YLOCK,LP0         ;若已锁定显示某路,继续显示该路
         INC   NUMK              ;路数增1,为下次检测准备
         MOV   A,NUMK
         CJNE  A,#LUSHU,LP0
         MOV   NUMK,#0           ;如果路数加一后为8,则置零
         AJMP  LP0               ;进行下一次检测并显示

  ;#################################################################### 主程序终

INITIAL: MOV   TMOD,#01H         ;初始化定时器
         SETB  EA
         SETB  ET0
         MOV   R3,#LUSHU         ;给各路设定默认的高限
         MOV   A,#99             ;超过99度则报警
         MOV   R0,#HILMT         ;默认温度高限为100摄氏度,低限为20度
  NEXT4: MOV   @R0,A
         INC   R0
         DJNZ  R3,NEXT4
         MOV   R0,#LOLMT
         MOV   A,#20             ;给各路设定默认的低限
         MOV   R3,#LUSHU
  LP5:   MOV   @R0,A
         INC   R0
         DJNZ  R3,LP5
         MOV   ZESH,#20          ;报警时,1秒显示数值,1秒显示故障原因
         MOV   DPTR,#0FFDBH      ;初始化80255
         MOV   A,#080H
         MOVX  @DPTR,A
         MOV   NUMK,#0
         MOV   LBZ,#0FFH         ;初始化各功能单元
         MOV   HBZ,#0FFH
         CLR   QLIM              ;清请求置上下限标志位
         CLR   XIAN              ;清数据输入标志位
         CLR   YLOCK             ;清已经锁定标志位
         CLR   QLOCK             ;清请求锁定标志位
         CLR   TODAO
         CLR   GADI1
         CLR   GADI2
         RET

  ;#############################################################  初始化子程序终

ADTRANS: MOV R3,#LUSHU           ;AD转换的路数送给R3
         MOV R0,#SHUJU           ;存储数据的单元的地址送给R0
         MOV  DPTR,#0FFF0H
         MOV  A,#0
NEXT10:  MOV  R1,#BALU
         MOV  BACI,#8
         MOV  R2,A               ;R2中存放此次AD转换的路数
   LOP:  MOVX @DPTR,A            ;给AD送启动信号
         JNB  EOC,$              ;使用查询方式采集 AD 的信号
         MOVX A,@DPTR            ;AD转换完后的值送给 A
         MOV  @R1,A
         INC  R1
         MOV  A,R2
         DJNZ BACI,LOP           ;同一路采样八次
         ACALL LVBO              ;调用均值滤波程序,出口参数为A
         ACALL LCTRANS           ;入口参数为A,采集完一路即进行量程转换
         MOV  A,R5               ;R5是量程转换的整数位,送到存储单元中
         MOV @R0,A               ;将转化后的数值再送到存储单元中
         MOV A,R6                ;R6存储双字节除以单字节后得到的余数
         CLR C
         SUBB A,#25              ;余数小于25,则使小数位置零,否则置一
         MOV  A,DOTB             ;DOTB里面存储各路转换的小数信息
         JC  AD1                 ;余数小于25,则使小数位置零
         SETB ACC.7              ;余数大于25,则使小数位置1
         SJMP AD2
    AD1: CLR  ACC.7
    AD2: PUSH ACC                ;将ACC用堆栈保护
         MOV  A,R2               ;将此次AD转换的路数再赋给A
         CJNE A,#7,AD3           ;前六路操作完ACC.7后都要让ACC右移一位
         POP ACC
         SJMP AD4
    AD3: POP ACC                 ;弹出ACC,并右移一位
         RR   A
    AD4: MOV  DOTB,A             ;八路的小数信息存放在DOTB里面
         MOV A,R2                ;准备进行下一路转换
         INC A
         INC R0
         DJNZ R3,NEXT10
         RET

  ;########################################################## AD0809转换子程序终

   LVBO: SETB RS0                ;为防止此子程序所用寄存器与其它程序混用,更换
         CLR  A                  ;工作区
         MOV  R2,A               ;R2中存放均值的高字节
         MOV  R3,A               ;R3中存放均值的低字节
         MOV  R1,#8              ;R1中存放数值的个数
         MOV  A,R1
         PUSH ACC
         MOV  R0,#BALU
   FL40: MOV  A,@R0
         ADD  A,R3               ;把八个单元中的数依次加到A中
         MOV  R3,A               ;总和中的低字节放于R3
         CLR  A
         ADDC A,R2               ;总和中的高字节放于R3
         MOV  R2,A
         INC  R0
         DJNZ R1,FL40
   FL41: POP  ACC                ;双字节移位程序,相当于总和除以8
         CLR  C
   FL42: RRC  A
         JNC  FL43
         MOV  A,R3               ;出口参数为A
         CLR  RS0
         RET
   FL43: PUSH ACC
         CLR  C
         MOV  A,R2
         RRC  A
         MOV  R2,A
         MOV  A,R3
         RRC  A
         MOV  R3,A
         POP  ACC
         SJMP FL42

  ;###########################################################  均值滤波子程序终
  
LCTRANS: MOV  B,#25              ;量程转换的方法是采集后的数先乘以25,再除以51
         MUL  AB
         MOV  R1,B               ;R1里面存放被除数高字节
         MOV  R5,A               ;R5里面存放被除数低字节
         MOV  R4,#51             ;R4里面存放除数
         MOV  R7,#08H            ;被除数字节长度
         ACALL  CHU4             ;做一次除法运算
LOOP:    RET
CHU4:    MOV  A,R5
         ADD  A,R5               ;左移被除数低字节,包括后来的商左移
         MOV  R5,A
         MOV  A,R1
         ADDC  A,R1
         MOV  R1,A               ;左移被除数高字节
         JNC  CHU4_1             ;被除数高字节移位后判断是否溢出
         ACALL DIV256
         INC  R5                 ;有溢出肯定大于单字节除数
         SJMP  LOOP1             ;商加一
CHU4_1:  SUBB A,R4               ;没溢出比较高字节是否够减
         JC LOOP1                ;不够减继续移位
         MOV R1,A                ;够减商加一,余下的移位
         INC R5
LOOP1:   DJNZ R7,CHU4
         RET
DIV256:  PUSH ACC
         MOV A,#255              ;A中用255减单字节除数够减
         CLR  C
         SUBB A,R4
         INC  A                  ;加上进位1
         ADD A,R1                ;加上减法后剩下的值,
         MOV R1,A                ;实际为将高字节扩展为9位与除数做减法
         POP ACC
         RET

  ;###########################################################  量程转换子程序终

LIMCHEC: MOV  R0,#HILMT          ;上限存储首址
         MOV  R1,#SHUJU         ;温度数据存储首址
         ACALL CHECK            ;高越界检查
         MOV  HBZ,A             ;高越限标志存于HBZ
         MOV  DPTR,#0FFD8H      ;通过8255送LED显示
         MOVX  @DPTR,A
         MOV  R0,#LOLMT         ;下限存储首址
         MOV  R1,#SHUJU         ;温度数据存储首址
         ACALL CHECK            ;低越界检查
         XRL  A,#0FFH           ;由于是低值检查,所以要先与0FFH抑或一下
         MOV  LBZ,A             ;低越限标志存于LBZ
         MOV  DPTR,#0FFD9H      ;通过8255送LED显示
         MOVX  @DPTR,A
         RET
         
  ;############################################################ 越界检查程序1终

 CHECK:  MOV  R3,#LUSHU         ;此程序为越界检测程序的一个子程序
 NEXT9:  PUSH ACC               ;使用前要先进行堆栈保护
         MOV  A,@R0
         CLR C
         SUBB A,@R1
         POP  ACC
         JNC OK1
         CLR ACC.7              ;比低限高要清零
         SJMP OK2
   OK1:  SETB ACC.7             ;比高限高要置位
   OK2:  RR  A                  ;检查完一路,就将相应标志位右移一次
         INC R1
         INC R0
         DJNZ R3,NEXT9
         RL  A                  ;共右移了7次,多移一次,所以再左移一次
         RET

  ;############################################################ 越界检查程序2终

ASSUREK: MOV  A,LBZ             ;将低值标识字节赋予A
         CJNE A,#0FFH,NEXT0     ;若转移,则表明8路至少有一路超低限
         MOV  A,HBZ             ;将高值标识字节赋予A
         CJNE A,#0FFH,NEXT0     ;若转移,则表明8路至少有一路超高限
         CLR  GUZO              ;各路无故障,清故障总位
         RET                    ;若返回,表明各路无故障
   NEXT0:SETB GUZO              ;有异常,置状态总位
         JNB   YLOCK,ASSU       ;若已锁定某路,置故障总位后不必再求应显示那路
         RET

⌨️ 快捷键说明

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