微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 主流程调用没反应!求解

主流程调用没反应!求解

时间:10-02 整理:3721RD 点击:
    ORG  0000H        ;复位入口       
    LJMP  MAIN        ;转往主程序
   ;ORG 0003H        ;外部中断0服务子程序入口
   ;LJMP  IX0P        ;INT0下降沿请求中断:将小时数加1
   ;ORG  000BH        ;定时器0中断服务子程序入口
   ;LJMP  IT0P        ;对T0输入负脉冲每计满1次即请求中断:将分钟数加1
    ORG  001BH        ;定时器1中断服务子程序入口
    LJMP  IT1P        ;定时中断:进行实时钟计时
    ORG  0030H        ;主程序
MAIN:MOV SP,#6FH         ;总初始化,设定栈底指针
    ACALL D40MS         ;稍加延时(40mS),以待各芯片均退出复位状态
    MOV DPTR,#0FEFFH ;对8255A(U3)接口芯片初始化
    MOV A,#89H         ;设定为A输出(驱动字段)、B口输出(驱动字位),C口输入
    MOVX  @DPTR,A         ;写入方式控制字       
    MOV DPTR,#0FEFCH ;DPTR指向U3-A口
    MOV A,#0FFH         ;置八段均不亮的字段码(8255A初始化后输出寄存器全‘0')
    MOVX @DPTR,A         ;输出,关数码显示器(段输出口初始驱动全为‘1'无效)
    MOV DPTR,#0FDFFH ;对8255A(U5)接口芯片初始化
    MOV A,#8BH         ;设定为A口输出(驱L8~15),B口输入(按钮PB0~7),C口输入(开关SW0~7)
    MOVX  @DPTR,A         ;写入方式控制字
    MOV DPTR,#0FDFCH ;DPTR指向U5-A口
    MOV A,#0FFH         ;置八位输出均为‘1'无效
    MOVX @DPTR,A         ;输出,令L8-15初始不亮               
    MOV 40H,#00H  ;判断当前工作是否正常(正常/警告)
    MOV 41H,#00H  ;判断警告错误方式(溢出/干烧)
    MOV 42H,#00H  ;判断当前工作状态(待机/启动)
    MOV 43H,#00H  ;判断当前功能选择状态(豆浆/果汁)
    MOV 44H,#00H  ;编辑状态下判断闪烁位
    MOV 45H,#00H  ;判断是否进入保温模式
    MOV 46H,#00H  ;判断是否进入时钟编辑模式
    MOV 47H,#00H  ;判断是否闪烁
    MOV 48H,#00H  ;倒计时秒单元
    MOV 50H,#00H  ;倒计时分单元
    MOV 51H,#00H ;工序号存储单元
    MOV 52H,#00H  ;存储当前温度单元
    MOV 53H,#23H  ;35度控制温度存储单元
    MOV 54H,#32H  ;50度控制温度存储单元
    MOV 55H,#00H  ;溢出警告单元
    MOV 56H,#00H  ;干烧警告单元
    MOV 59H,#00H  ;判断计时是否满5秒
    MOV 30H,#10H  ;30H-37H为显示缓冲单元,初始值令显示‘12-59-45’
    MOV 31H,#05H
    MOV 33H,#09H
    MOV 34H,#05H
    MOV 36H,#59H
    MOV 37H,#12H
    SETB EA                ;开中断总允许
    MOV 38H,#00H   ;38H单元为实时钟200uS计数单元,清0
    MOV 39H,#00H   ;39H单元为10mS计数单元,清0
    MOV 3AH,#45H   ;秒单元初值
    MOV 3BH,#59H   ;分单元初值
    MOV 3CH,#12H   ;时单元初值,时钟初值12-59-45       
    MOV TL1,#0        ;置T1计数初值。00H-48H=C8H=184,184×TM≈200uS(199.6527778μS)
    MOV TH1,#0      ;即每约200uS请求中断。(TM=12×1/11.0592MHZ=1.085069444μS)
    SETB ET1         ;开T1中断允许
    SETB TR1        ;启动T1定时工作
    MOV 2EH,#00H
    MOV 2FH,#00H
LOOP:ACALL FGS      ;调用液位判断报警子模块
     ACALL TPB       ;调用PB0,PB1功能选择子模块
     ACALL XDPB      ;调用消抖单按键输入
     ACALL KT        ;调用K0-K3时分调校子模块
     ACALL CZ        ;调用显示内容送显缓子程序(拆字)(将时分秒送右6位显示缓冲单元)
     ACALL KEY             ;调用键盘扫描子程序 (扫描到按键压下时在左第3位显示键号)
     ACALL DISP      ;调用显示更新子程序 (动态驱动8位数码显示器一遍,约8mS)       
     ACALL LNP1             ;调用功能指示子模块
     ;ACALL ADSUB        ;调用A/D子模块采取当前温度
     SJMP LOOP       ;反复循环主流程
    FGS:MOV DPTR,#0FDFEH     ;电平开关SW0~7检测且控制L8~L15子程序
        MOVX  A,@DPTR             ;输入SW0~7电平
        JNB ACC.0,LP1         ;开关0为0则溢出状态
        JNB ACC.1,LP2
        RET
    LP1:MOV 40H,#01H
        CLR P3.2
        MOV P1,#00H            ;输入驱动L0-L7
        ACALL  EE              ;调用500毫秒延时
        SETB P3.2
        MOV P1,#0FFH         ;灭L0-L7
        ACALL  EE              ;调用500毫秒延时
        ACALL D03S          ;调用3秒延时
        JNB ACC.0,LP1
        RET
    LP2:MOV 40H,#01H
        MOV 41H,#01H
        CLR P3.2
        MOV P1,#00H            ;输入驱动L0-L5
        ACALL  EE              ;调用500毫秒延时
        SETB P3.2
        MOV P1,#0FFH         ;灭L0-L5
        ACALL  EE              ;调用500毫秒延时
        JNB ACC.1,LP2
        RET
      EE:MOV R5,#5             ;延时500ms
     EE1:MOV   R6,#200
     EE2:MOV   R7,#250
     EE3:DJNZ  R7,EE3
         DJNZ  R6,EE2
         DJNZ  R5,EE1
         RET
     AA0:MOV   R4,#3                 ;延时一分钟
      AA:MOV   R5,#200
     AA1:MOV   R6,#200
     AA2:MOV   R7,#250
     AA3:DJNZ  R7,AA3
         DJNZ  R6,AA2
         DJNZ  R5,AA1
         DJNZ  R4,AA0
         RET
    D03S:MOV R7,#25
   D03S2:MOV R6,#200
   D03S1:MOV R5,#200    ;3秒延时
   D03S0:NOP
        DJNZ R5,D03S0
        DJNZ R6,D03S1
        DJNZ R7,D03S2
        RET                       
     LNP1:MOV A,43H
          CJNE A,#2,LNP2
          CLR P1.3
   LNP2:CJNE A,#1,LNP3
          CLR P1.2
    LNP3:  RET
    TPB:JNB 2FH.5,TPB       ;(启动/取消)判PB5下降沿
        JB  2EH.5,TPB
   TPB1:JNB 2FH.6,TPB1       ;(豆浆/果汁)判PB6下降沿
        JB  2EH.6,TPB1
        MOV 43H,#01H            ;判断当前功能选择状态(豆浆/果汁)
        JNB 2FH.6,TPB2       ;(豆浆/果汁)判PB6下降沿
        JNB 2EH.6,TPB2
        MOV 43H,#02H         ;判断当前功能选择状态(豆浆/果汁)
        SJMP TPB1
   TPB2:MOV R1,#120
        JNB 2FH.6,TPB1       ;(豆浆/果汁)判PB6下降沿
        JB  2EH.6,TPB1
        JNB 2FH.5,TPB       ;(启动/取消)判PB5下降沿
        JB  2EH.5,TPB
        ACALL EE
        DJNZ R1,TPB2
        MOV 42H,#01H         ;启动
     GN:MOV A,43H            ;判断当前功能选择状态(豆浆/果汁)
        CJNE A,#00H,GK
        ACALL GN0
        CJNE A,#01H,GK
        ACALL GN15
     GK:RET
    GN0:INC 51H
    GN2:MOV A,52H
        MOV R0,53H      ;加热至35度
        CLR P1.0
        SUBB A,@R0
        JC GN3
        SJMP GN2
    GN3:INC 51H
    GN4:SETB P1.0
        CLR  P1.1       ;打浆25秒
        ACALL D15S
        SETB P1.1
        ACALL D25S
    GN5:INC 51H
    GN6:MOV A,52H
        MOV R1,54H      ;加热至50度
        CLR P1.0
        SUBB A,@R1
        JC GN7
        SJMP GN6
    GN7:INC 51H
    GN8:SETB P1.0       ;打浆25秒
        CLR  P1.1
        ACALL D25S
        SETB P1.1
        ACALL D25S
    GN9:INC 51H
   GN10:MOV A,53H       ;加热至50度
        MOV R0,54H
        CLR P1.0
        SUBB A,@R0
        JC GN11
        SJMP GN10
   GN11:INC 51H
   GN12:MOV R1,#4
        JNB ACC.3,GN13     ;煮浆4分钟
        DJNZ R1,GN12
   GN13:MOV R0,#10
        ACALL EE           ;调用5秒延时
        JNB ACC.3,GN12
        SJMP GN14           
   GN14:SETB P1.0
        CLR  P1.4
        CLR  P3.2  
        ACALL AA0           ;一分钟后进入保温
        RET

   GN15:INC 51H
   GN16:MOV R3,#4
        CLR  P1.3         ;启动预打浆
        ACALL  D25S            ;调用25秒延时
        SETB P1.3
        ACALL   D15S          ;调用15秒延时
        DJNZ R3,GN15  
        RET
   D15S:MOV R7,#125
  D15S2:MOV R6,#200
  D15S1:MOV R5,#200
  D15S0:NOP              ;15秒延时
        DJNZ R5,D15S0
        DJNZ R6,D15S1
        DJNZ R7,D15S2
        RET
   D25S:MOV R7,#210
  D25S2:MOV R6,#200
  D25S1:MOV R5,#200       ;25秒延时
  D25S0:NOP
        DJNZ R5,D25S0
        DJNZ R6,D25S1
        DJNZ R7,D25S2
        RET


    ;CZ: ;MOV A,4OH
        ;CJNE A,#OOH,CZ1  ;当前未无警告状态
        ;MOV A,41H  
        ;CJNE A,#OOH,CZ4  ;判断当前警告模式

    ;CZ: MOV A,51H           ;取当前数据单元BCD码
        ;ANL A,#0FH           ;保留低4位(个位)
        ;MOV 36H,A             ;送显缓当前个位单元
        ;ANL A,#0F0H          ;保留高4位(十位)
        ;SWAP A                 ;交换到低4位
        ;MOV 37H,A             ;送显缓当前十位单元
        ;MOV A,48H           ;取当前数据单元BCD码
        ;ANL A,#0FH           ;保留低4位(个位)
        ;MOV 32H,A             ;送显缓当前个位单元
        ;ANL A,#0F0H          ;保留高4位(十位)
        ;SWAP A                 ;交换到低4位
        ;MOV 33H,A             ;送显缓当前十位单元
        ;MOV A,50H           ;取当前数据单元BCD码
        ;ANL A,#0FH           ;保留低4位(个位)
        ;MOV 34H,A             ;送显缓当前个位单元
        ;ANL A,#0F0H          ;保留高4位(十位)
        ;SWAP A                 ;交换到低4位
        ;MOV 35H,A             ;送显缓当前十位单元
        ;MOV A,52H           ;取当前数据单元BCD码
        ;ANL A,#0FH           ;保留低4位(个位)
        ;MOV 30H,A             ;送显缓当前个位单元
        ;ANL A,#0F0H          ;保留高4位(十位)
        ;SWAP A                 ;交换到低4位
        ;MOV 31H,A             ;送显缓当前十位单元
        ;RET             ;子程序返回

    CZ: ;MOV A,46H
        ;CJNE A,#01H,CZ3 ;当前为时钟编辑状态
        MOV A,3AH           ;取当前数据单元BCD码
        ANL A,#0FH           ;保留低4位(个位)
        MOV 30H,A             ;送显缓当前个位单元
        ANL A,#0F0H          ;保留高4位(十位)
        SWAP A                 ;交换到低4位
        MOV 31H,A             ;送显缓当前十位单元
        MOV A,3BH           ;取当前数据单元BCD码
        ANL A,#0FH           ;保留低4位(个位)
        MOV 33H,A             ;送显缓当前个位单元
        ANL A,#0F0H          ;保留高4位(十位)
        SWAP A                 ;交换到低4位
        MOV 34H,A             ;送显缓当前十位单元
        MOV A,3CH           ;取当前数据单元BCD码
        ANL A,#0FH           ;保留低4位(个位)
        MOV 36H,A             ;送显缓当前个位单元
        ANL A,#0F0H          ;保留高4位(十位)
        SWAP A                 ;交换到低4位
        MOV 37H,A             ;送显缓当前十位单元
        MOV 32H,#16H
        MOV 33H,#16H
        RET             ;子程序返回
    ;CZ3:MOV A,3BH           ;取当前数据单元BCD码
        ;ANL A,#0FH           ;保留低4位(个位)
        ;MOV 32H,A             ;送显缓当前个位单元
        ;ANL A,#0F0H          ;保留高4位(十位)
        ;SWAP A                 ;交换到低4位
        ;MOV 33H,A             ;送显缓当前十位单元
        ;MOV A,3CH           ;取当前数据单元BCD码
        ;ANL A,#0FH           ;保留低4位(个位)
        ;MOV 36H,A             ;送显缓当前个位单元
       ; ANL A,#0F0H          ;保留高4位(十位)
        ;SWAP A                 ;交换到低4位
        ;MOV 37H,A             ;送显缓当前十位单元
        ;RET
   KEY:MOV 65H,64H                ;将上次扫描键号存为前键号
        MOV DPTR,#0FEFFH        ;键盘扫描子程序(反转法)。
        MOV A,#81H
           MOVX  @DPTR,A                ;C口先初始化为高4位输出方式驱键行线、低4位输入方式键列线
        MOV A,#0FFH             ;消除窜显
        MOV DPTR,#0FEFCH
        MOVX @DPTR,A
            MOV DPTR,#0FEFEH        ;DPTR指向C口       
        MOV A,#00H               
        MOVX @DPTR,A                ;键盘行线(高4位)输出驱动全'0'
        MOVX A,@DPTR                ;输入键盘列线电平(低4位)存60H单元
        MOV 60H,A
        MOV DPTR,#0FEFFH
        MOV A,#88H                               
           MOVX  @DPTR,A                ;C口改初始化为高4位输入驱键行线、低4位输出驱键列线
        MOV A,#0FFH             ;消除窜显
        MOV DPTR,#0FEFCH
        MOVX @DPTR,A
            MOV DPTR,#0FEFEH        ;DPTR指向C口
        MOV A,#00H                               
               MOVX @DPTR,A                ;键盘列线(低4位)输出驱动全'0'
        MOVX A,@DPTR                ;输入键盘行线电平(高4位)在A中
        ANL 60H,#0FH                ;保留列线电平值所在的低4位
        ANL A,#0F0H                ;保留行线电平值所在的高4位
        ORL 60H,A                ;将列线电平值、行线电平值组合成8位行列码于60H单元中
        MOV 61H,#00H                ;键号值从00H开始
        MOV R5,#10H                ;设定最多进行16次的键码查表
        MOV DPTR,#KEY_N                ;DPTR指向键码表首地址
     KY:MOV A,61H                ;置当前键号于A中
        MOVC A,@A+DPTR                ;查表读取键码表中当前键号对应位置的键码
        CJNE A,60H,NK                ;与8位行列码比较,不同则转NK查下一个
        SJMP KN                        ;相同,表明查到了当前按下的键号,转KN进行键功能处理
  KEY_N:DB 0EEH,0EDH,0EBH,0E7H        ;键码表。K0,K1,K2,K3键码
        DB 0DEH,0DDH,0DBH,0D7H        ;K4,K5,K6,K7键码
        DB 0BEH,0BDH,0BBH,0B7H        ;K8,K9,K10,K11键码
        DB 7EH,7DH,7BH,77H        ;K12,K13,K14,K15键码
     NK:INC 61H                        ;键号值加1
             DJNZ R5,KY                ;未查完键值表则继续
                        ;查完,说明无按键或出现异常行列码,结束并返回
     KN:MOV 64H,61H
        RET
     KT:MOV A,65H               ;K0进入时钟编辑模式
        CJNE A,#10H,LKD         ;前面无按键,则跳转LK1
        MOV A,64H
        CJNE A,#00H,LKD         ;检测键0是否有按下
        MOV  46H,#01H
    LK0:MOV A,46H
        JZ LKD
        MOV A,65H               ;K1,K2时分调校子模块
        CJNE A,#10H,LK1         ;前面无按键,则跳转LK1
        MOV A,64H
        CJNE A,#01H,LK1         ;检测键1是否有按下
        MOV 3AH,#00H            ;清零秒单位及其前一级计数单位
        MOV 39H,#00H
        MOV A,3CH               ;键1按下,则小时单元加1
        ADD A,#01H
        DA  A
        MOV 3CH,A
        CJNE A,#24H,LK1
        MOV 3CH,#00H
        RET
    LK1:MOV A,46H
        JZ LKD
        MOV A,65H               
        CJNE A,#10H,LK2         ;前面无按键则跳转到LK2
        MOV A,64H
        CJNE A,#02H,LK2         ;检测键2是否有按下
        MOV 3AH,#00H            ;清零秒单位及其前一级计数单位
        MOV 39H,#00H
        MOV A,3BH               ;分钟单位按百分之一秒BCD加1
        ADD A,#01H
        DA  A
        MOV 3BH,A
        CJNE A,#60H,LK2
        MOV 3BH,#00H
        RET
    LK2:MOV A,65H               
        CJNE A,#10H,LKD         ;前面无按键则跳转到LKD
        MOV A,64H
        CJNE A,#03H,LKD         ;检测键3是否有按下
        MOV 46H,#00H
    LKD:RET

  ;ADSUB:MOV DPTR,#0FBF8H ;A/D子程序。
        ;MOVX @DPTR,A         ;启动对IN0输入模拟电压信号的A/D转换
        ;LCALL D1MS         ;延时等待A/D转换结束
        ;MOVX A,@DPTR         ;读取A/D转换结果的8位二进制数字值
        ;MOV 52H,A
        ;MOV B,A                 ;A/D转换结果拆送最左两位显示缓冲单元
        ;ANL A,#0FH
        ;MOV 30H,A
        ;MOV A,B
        ;ANL A,#0F0H
        ;SWAP A
        ;MOV 31H,A
        ;RET

   DISP:MOV R0,#30H                    ;显示缓冲单元首地址
        MOV R3,#01H                    ;字位码初值(从最右位起)
   PDNZ:MOV A,46H
        CJNE A,#01H,DISP1_1_C                ;判断是否进入编辑模式
     NZ:MOV A,44H                        ;判断闪烁状态
        CJNE A,#00H,ZT                ;亮         
        MOV A,R3
        LJMP DISP1_1
     ZT:MOV A,R3                ;暗
        ANL A,47H
        LJMP DISP1_1
DISP1_1_C:MOV A,R3          
   DISP1_1:MOV DPTR,#0FEFDH         ; 8255B口(字位码输出口)
           MOVX @DPTR,A                  ; 输出字位码
           MOV A,@R0                       ; 取显示数据码
           MOV        DPTR,#TAB
           MOVC        A,@A+DPTR
       MOV DPTR,#0FEFCH
           MOVX @DPTR,A                   ; 输出字段码
           LCALL D1MS               ; 保持显示1毫秒
           MOV A,#0FFH
           MOVX @DPTR,A
           INC R0                        ; 指向下一显示缓冲单元
           MOV A,R3                     ; 取出字位码
           JB ACC.7,DISP2                ; 判已显示到最左位否
           RL A                    ; 未完,字位码左移1位
           MOV R3,A
           AJMP        PDNZ
DISP2:RET                                                 ; 转下一位显示
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;"0"~"9"   显示字段码表
    DB 88H,83H,0C6H,0A1H,86H,8EH,0BFH,0C8H           ;"A"-"F","-","N",
        DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H,01H      ;"0."~"9."   显示字段码表
     D1MS:MOV R7,#250                    ;延时1毫秒子程序
    D1MS1:NOP
            NOP
          NOP
          NOP
          DJNZ R7,D1MS1
          RET
  XDPB:MOV 2FH,2EH             ;原新态存为前态,滚动滤波法消除按键抖动
       MOV 2DH,2CH           ;前4次输入的电平值推至2AH~2DH单元
       MOV 2CH,2BH  
       MOV 2BH,2AH
       MOV 2AH,29H
       MOV DPTR,#0FDFDH      ;输入pb0~7新电平值,存29H单元
       MOVX A,@DPTR
       MOV  29H,A
       MOV  A,2DH            ;比较近5次输入的电平值不一致则新态照旧
       CJNE A,2CH,XDR
       CJNE A,2BH,XDR
       CJNE A,2AH,XDR
       CJNE A,29H,XDR
       MOV 2EH,A             ;近5次输入的电平值一致则存为新态
   XDR:RET
   ;IX0P:PUSH ACC        ;外部中断0服务子程序。保护现场
        ;PUSH PSW
        ;MOV A,3CH       ;小时单元(按BCD码)加1
        ;ADD A,#1         
        ;DA A
        ;MOV 3CH,A
        ;CJNE A,#24H,X0R ;满24小时?
        MOV 3CH,#0      ;满:将小时单元清零
   ; X0R:POP PSW         ;恢复现场
        ;POP ACC
        ;RETI                ;中断返回
   ;IT0P:PUSH ACC        ;外部中断0服务子程序。保护现场
       ;PUSH PSW
        ;MOV A,3BH       ;分钟单元(按BCD码)加1
        ;;ADD A,#1         
        ;DA A
        ;MOV 3BH,A
        ;CJNE A,#60H,T0R        ;满60分钟?
        ;MOV 3BH,#0      ;满:将分钟单元清零
    ;T0R:POP PSW         ;恢复现场
        ;POP ACC
        ;RETI                ;中断返回
   IT1P:PUSH ACC        ;定时器1服务子程序。保护现场
        PUSH PSW
        INC 38H         ;每200uS加1
        MOV A,38H
        CJNE A,#36,DONE ;满10mS?
        MOV 38H,#0        ;200uS计数单元清0
        MOV A,39H       ;BCD表示百分之一秒
        ADD A,#01H
        DA  A
        MOV 39H,A
        CJNE A,#00H,DONE;满1秒?
        MOV 39H,#0         ;10mS计数单元清0
        MOV A,3AH       ;秒单元(按BCD码)加1
        ADD A,#1            
        DA A
        MOV 3AH,A
        CJNE A,#60H,DONE;满1分钟?
        MOV 3AH,#0      ;秒单元清零
        MOV A,3BH       ;分钟单元(按BCD码)加1
        ADD A,#1         
        DA A
        MOV 3BH,A
        CJNE A,#60H,DONE;满1小时?
        MOV 3BH,#0      ;分钟单元清零
        MOV A,3CH       ;小时单元(按BCD码)加1
        ADD A,#1         
        DA A
        MOV 3CH,A
        CJNE A,#24H,DONE;满24小时?
        MOV 3CH,#0      ;小时单元清零
   DONE:POP PSW         ;恢复现场
        POP ACC               
        RETI            ;中断返回



  D40MS:MOV R6,#61        ;软件延时约40mS子程序
D30MS1:MOV R5,#200        ;[1+(1+3*200+2)*61+4]*12/11059.2KHz=39.9mS
D30MS0:NOP
        DJNZ R5,D30MS0
        DJNZ R6,D30MS1
        RET

       END






Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top