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

📄 程序原.asm

📁 实验室开发的用于驱动血泵的程序
💻 ASM
字号:
ED_DATA        EQU   40H         ;显示数据区,共4个单元,存储格式
                                 ;1234
DELAY_TIME_H  EQU   46H         ;延时控制位,用于决定电机的转速
DELAY_TIME_L  EQU   45H
TIME_SETP_H    EQU   00H         ;每次步进的长度
TIME_SETP_L    EQU   0C8H
MAX_DELAY_H  EQU  0ECH        ;延时上限
MAX_DELAY_L  EQU  78H
MIN_DELAY_H   EQU  8AH         ;延时下限
MIN_DELAY_L   EQU  0D0H
COUNT          EQU  48H          ;决定输出步序,
FLAG            EQU  49H
SPEED           EQU  50H          ;速度等级
ORG 0000H
JMP   MAIN
ORG 0003H                          ;外中断0
JMP   Int
NOP
NOP
CALL Err            ;软件陷阱
ORG 000BH                          ;定时中断0
JMP Timer0
NOP
NOP
CALL Err            ;软件陷阱
ORG 0013H                          ;外中断1
JMP  Int3
NOP
NOP
CALL Err           ;软件陷阱
ORG 001BH                         ;定时器中断1
JMP Timer1
NOP
NOP
CALL Err           ;软件陷阱

;//////////////////////////////////////////////////////////////////////////
ORG 0080H
MAIN:
               CALL Init
               CALL Int
               CALL Int3
               JMP  $

;////////////////////////////中断服务程序区////////////////////
Timer0:

        RETI

Timer1:                                ;为保证输出的连续,用中断来输出
        CLR  TR1                       ;停止计数
        MOV TH1,DELAY_TIME_H           ;置计数器初值
        MOV TL1,DELAY_TIME_L
        MOV  A,FLAG
        JNZ  Timer1_Loop1
        INC  COUNT                  ;加一
        INC  COUNT
    Timer1_Loop1:
        DEC  COUNT                  ;减一
        MOV  A,COUNT               ;范围限制
        CJNE  A,#06H,Timer1_Loop2
        MOV  COUNT,#00H
     Timer1_Loop2:
        CJNE  A,#0FFH,Timer1_Loop3
        MOV  COUNT,#05H
     Timer1_Loop3:
        MOV  A,COUNT
        MOV  DPTR,#DATA_CODE     ;查表
        MOVC A,@A+DPTR            ;读控制码
        ANL   P1,#0F0H               ;输出
        ORL   P1,A
        SETB  TR1                    ;开计数器
        RETI

Int:                                   ;电机加速,即增大计数器初值
        CLR    ET0                    ;关外部中断0
        INC    SPEED                 ;查表显示转速
        CALL   JUDEG                ;判断范围
        CALL   LED_SHOW            ;改变速度等级显示
        MOV    A,SPEED
        RL      A                     ;A x 2
        MOV   DPTR,#SPEED_CODE
        PUSH   Acc
        MOVC  A,@A+DPTR           ;取延时高位
        MOV   R7,A
        INC    DPTR
        POP   Acc
        MOVC A,@A+DPTR           ;取延时低位
        MOV  R6,A
        MOV  A,SPEED
        JNZ  Int_Loop1
        MOV  R5,#1                   ;减速
        JMP  Int_Loop2
     Int_Loop1:
        MOV  R5,#0                  ;加速
     Int_Loop2:
        CALL  Chang_Speed
     ;等待按键释放
     INT_Wait:
        JB     P3.2,INT_END
        CALL  Delay
        JMP   INT_Wait
     INT_END:
        SETB  ET0                   ;开中断
        RETI
                                    ;电机减速,即减小计数器初值

Int3:
        CLR   ET1
        DEC   SPEED
        CALL  JUDEG               ;判断范围
        CALL  LED_SHOW           ;改变速度等级显示
        MOV   A,SPEED
        RL     A                   ;A x 2
        MOV   DPTR,#SPEED_CODE
        PUSH   Acc
        MOVC  A,@A+DPTR         ;取延时高位
        MOV   R7,A
        INC    DPTR
        POP    Acc
        MOVC  A,@A+DPTR        ;取延时低位
        MOV   R6,A
        MOV   A,SPEED
        CJNE   A,#05H,Int3_Loop1
        MOV   R5,#0                ;加速
        JMP    Int3_Loop2
     Int3_Loop1:
        MOV   R5,#1                ;减速
     Int3_Loop2:
        CALL   Chang_Speed
     ;等待按键释放
     INT3_Wait:
        JB      P3.3,INT3_END
        CALL   Delay
        JMP    INT3_Wait
     INT3_END:
        SETB   ET1
        RETI

Err:
        MOV   A,#00H             ;返回
        PUSH   Acc
        PUSH   Acc
        RET

;/////////////////////////////普通函数区/////////////////////
;初始化函数
Init:
        MOV   SP,#60H             ;设定堆栈
        MOV   TMOD,#10H         ;选用定时器1,工作方式1
        MOV   TH1,#8AH           ;置计数器初值,初始化为延时
        MOV   TL1,#0D0H
        MOV   FLAG,#00H          ;正传控制
        MOV   COUNT,#00H
        MOV   DELAY_TIME_H,#00H ;写延时控制字
        MOV   DELAY_TIME_L,#00H
        MOV   SPEED,#00H         ;速度等级1
        MOV   TCON,#00H         ;设置中断触发方式为低电平触发
        MOV   IP,#08H             ;设定Timer1的中断优先级为最高
        ;MOV  IE,#8AH
        MOV   IE,#8FH             ;开除串行中断外的所有中断,开总中断
        SETB   TR1                ;开始计数
        CALL   LED_SHOW
        MOV   A,SPEED
        RL     A                    ;A x 2
        MOV   DPTR,#SPEED_CODE
        PUSH   Acc
        MOVC  A,@A+DPTR         ;取延时高位
        MOV   R7,A
        INC    DPTR
        POP    Acc
        MOVC  A,@A+DPTR        ;取延时低位
        MOV   R6,A
        MOV   R5,#00H
        CALL   Chang_Speed
        RET

JUDEG:
        PUSH   Acc
        MOV   A,SPEED;
        CJNE   A,#06H,JUDEG_NEXT1
        MOV   SPEED,#00H
   JUDEG_NEXT1:
        CJNE   A,#0FFH,JUDEG_NEXT2
        MOV   SPEED,#05H
   JUDEG_NEXT2:
        POP    Acc
        RET

;显示转速程序
LED_SHOW:
        PUSH   Acc
        MOV    A,SPEED
        INC     A
        MOV   DPTR,#LED_CODE0
        MOVC  A,@A+DPTR               ;查表显示速度等级
        MOV   P2,A
        POP    Acc
        RET

;最终速度值放在R7/R6中,R7为高位 ,R5=0速度增加,R5=1速度减小
Chang_Speed:
            PUSH   Acc
      Chang_Speed_Loop:
            MOV   A,R5
            JZ     Chang_Speed_Loop1
            CALL  Dec_Speed              ;减速
            CALL  Delay                  ;延时
            CLR   C
            MOV  A,R6
            SUBB  A,DELAY_TIME_L
            MOV   A,R7
            SUBB  A,DELAY_TIME_H
            JC     Chang_Speed_Loop
            JMP   Chang_Speed_Loop2
      Chang_Speed_Loop1:
            CALL  Add_Speed
            CALL  Delay                  ;延时
            CLR   C
            MOV  A,R6
            SUBB A,DELAY_TIME_L
            MOV  A,R7
            SUBB A,DELAY_TIME_H
            JNC  Chang_Speed_Loop
      Chang_Speed_Loop2:

            MOV DELAY_TIME_L,R6      ;确保最终速度稳定
            MOV DELAY_TIME_H,R7
            POP  Acc
            RET

Add_Speed:
          PUSH  Acc
          MOV  A,DELAY_TIME_L       ;改变延时值
          ADD  A,#TIME_SETP_L
          MOV  DELAY_TIME_L,A
          MOV  A,DELAY_TIME_H
          ADDC A,#TIME_SETP_H
          MOV  DELAY_TIME_H,A
          POP   Acc
          RET

Dec_Speed:
          PUSH  Acc
          CLR   C
          MOV  A,DELAY_TIME_L       ;改变延时值
          SUBB  A,#TIME_SETP_L
          MOV   DELAY_TIME_L,A
          MOV   A,DELAY_TIME_H
          SUBB  A,#TIME_SETP_H
          MOV   DELAY_TIME_H,A
          POP    Acc
          RET

Delay:		                               ;延时
          PUSH   Acc
          MOV   R0,#64H
     LOOP_LEDW:
          MOV   A,0FFH
     loop_led:
           DEC   A
           NOP
           JNZ   loop_led
           DJNZ  R0,LOOP_LEDW
           POP   Acc
         RET

;///////////////////////////DATA///////////////////////////////
DATA_CODE: DB 01h,03h,02h,06h,04h,05h     ;电机控制代码
            NOP
            NOP
            CALL Err                     ;软件陷阱

LED_CODE0:                             ;共阳极代码
         DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
            NOP
            NOP
            CALL Err                     ;软件陷阱

LED_CODE1:                             ;共阴极代码
         DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H
            NOP
            NOP
            CALL Err                     ;软件陷阱

SPEED_CODE:
         DB 08AH,0D0H                  ;1档转速的延时值,高位在前
         DB 09EH,058H                  ; 2档转速的延时值
         DB 0B1H,0E0H                  ; 3档转速的延时值
         DB 0C5H,068H                  ; 4档转速的延时值
         DB 0D8H,0F0H                  ; 5档转速的延时值
         DB 0ECH,077H                  ; 6档转速的延时值

ORG 0300H
            NOP
            NOP
            CALL Err                   ;软件陷阱
            END

⌨️ 快捷键说明

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