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

📄 pwm.asm

📁 几种实现电机调速方法的源程序
💻 ASM
字号:
          ORG  0000H
         JMP   MAIN
          ORG   000BH
          JMP   SHUCHU
          ORG  0023H
          JMP  CHUAN
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         ;初始化
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    MAIN: FLAG  EQU  10H
          CLR   FLAG
          MOV   SP,#27H
          MOV   SCON,#90H      ;设置为方式2
          MOV   PCON,#80H
          MOV   TMOD,#01H
          ;MOV   IE,#98H
          ;MOV   IP,#10H      ;串口优先


          SETB   EA    ;开中断
          SETB   ES    ;串行口中断
          SETB   ET0  ;使用TIMER0中断
          CLR    TR0
          SETB   PT0
          MOV   TH0,#10H
          MOV   TL0,#10H
          SETB   P2.7        ;关输出
          CLR    RS1
          CLR    RS0
          MOV   67H,#060H   ;设置温度给定值Tg=30度
          MOV   68H,#02     ;设置KP
          MOV   69H,#01     ;设置Ki
          MOV   6AH,#01     ;设置KD
          MOV   6BH,#0
          MOV   6CH,#0
          MOV   6DH,#0
          MOV   6EH,#0
          MOV   6FH,#0
          MOV   70H,#0
          MOV   71H,#0
          MOV   72H,#0
          MOV   73H,#0
          MOV   74H,#0
          MOV   75H,#0
          MOV   76H,#0
          MOV   77H,#0
          MOV   78H,#0
          MOV   79H,#0
          MOV   7AH,#0

          MOV   7BH,#10H     ;初始定时时间
          MOV   7CH,#10H
           SETB   TR0
    KAI: ;MOV 66H,#00H
          MOVX  @R0,A
     WAIT:  JB   P1.7,ADC
            JMP WAIT
     ADC : MOVX  A,@R0
          ;ADD A,#08H
          MOV   66H,A      ;采集温度Tc=66H

          MOV   B,#04H     ;采集数据除4
          DIV   AB
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         ;数据作十进制调整
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          CLR   C
          MOV   R5,#00H
         MOV   R4,#00H
          MOV   R3,#08H
  NEXT:  RLC   A
          MOV   R2,A
          MOV   A,R5
          ADDC  A,R5
          DA    A
         MOV   R5,A
          MOV   A,R4
          ADDC  A,R4
          DA A
          MOV   R4,A
          MOV   A,R2
          DJNZ  R3,NEXT

          MOV   A,R5

          CLR   TB8
          MOV   SBUF,A     ;发送数据
          JBC  TI ,$
          MOV  R5,#10       ;每2秒采集温度一次

  LOOP1: LCALL   XIAODUO
         DJNZ    R5,LOOP1
         LCALL   PID
         ;SETB    TR0
         JMP     KAI

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          ;PID子程序
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    PID:     MOV   A,67H        ;计算Ei,先取温度给定值
             CLR   C
             SUBB   A,66H       ;Ei
             JNC   PID1         ;判Ei正负,如为正,跳至PID1

             ;CLR   TR0
             SETB  FLAG
             CLR  P2.7
             MOV  7DH ,#0FFH
             MOV  7EH, #0FDH


             JMP   CHUPID

             CPL   A            ;Ei为负,求补
             ADD   A,#01H
             SETB   30H         ;Ei为负,符号位置1
             SJMP   PID2
    PID1:    CLR   30H          ;Ei为正,符号位置0
             SETB   TR0
    PID2:    MOV   6BH,A        ;Ei值存6BH
             MOV   R1,6BH       ;计算Ei-(Ei-1),先将Ei送R1
             MOV   C,30H        ;将Ei的符号位送20H位
             MOV   20H,C
             MOV   R2,6CH       ;将(Ei-1)值送R2
             MOV   C,31H        ;将(Ei-1)的符号位送21H
             MOV   21H,C
             LCALL   DJF        ;
             MOV    6EH,R3      ;将差值Ei-(Ei-1)送6EH
             MOV    C,22H       ;将差值Ei-(Ei-1)的符号位送33H
             MOV    33H,C
             MOV    R1,6CH       ;  计算(Ei-1)-(Ei-2),先将(Ei-1)值送R1
             MOV    C,31H        ; 将(Ei-1)的符号位值送20H
             MOV    20H,C
             MOV    R2,6DH       ; 将(Ei-2)值送R2
             MOV    C,32H        ; 将(Ei-2)的符号位值送21H
             MOV    21H,C
             LCALL   DJF       ;
             MOV    6FH,R3    ; 将差值(Ei-1)-(Ei-2)送6FH
             MOV    C,22H     ; 将差值(Ei-1)-(Ei-2)的符号位送34H
             MOV    34H,C
             MOV    R1,6EH      ; 计算[Ei-(Ei-1)]-[(Ei-1)-(Ei-2)],先将Ei-(Ei-1)值送R1
             MOV    C,33H       ; 将Ei-(Ei-1)的符号位值送20H
             MOV    20H,C
             MOV    R2,6FH      ; 将(Ei-1)-(Ei-2)值送R2
             MOV    C,34H      ;  将(Ei-1)-(Ei-2)的符号位值送21H
             MOV    21H,C
             LCALL   DJF
             MOV    70H,R3      ; 将差值[Ei-(Ei-1)]-[(Ei-1)-(Ei-2)]送70H
             MOV    C,22H       ; 将差值[Ei-(Ei-1)]-[(Ei-1)-(Ei-2)]的符号位送35H
             MOV    35H,C
             MOV    A,68H        ; 计算Kp[Ei-(Ei-1)],将Kp送A
             MOV    B,6EH        ; 将[Ei-(Ei-1)]送B
             MUL    AB
             MOV    71H,B        ; 将Kp[Ei-(Ei-1)]存71H(高位),72H(低位)
             MOV    72H,A
             MOV    A,69H        ; 计算Ki*Ei,将Ki送A
             MOV    B,6BH        ; 将Ei送B
             MUL    AB
             MOV    73H,B        ; Ki*Ei 存73H(高位),74H(低位)
             MOV    74H,A
             MOV    A,6AH         ;计算Kd [Ei-(Ei-1)]-[(Ei-1)-(Ei-2)],将Kd送A
             MOV    B,70H         ;将[Ei-(Ei-1)]-[(Ei-1)-(Ei-2)]送B
             MUL    AB
             MOV    75H,B         ; Kd [Ei-(Ei-1)]-[(Ei-1)-(Ei-2)]存75H(高位),76H(低位)
             MOV    76H,A
             MOV    R1,71H       ; 计算Kp[Ei-(Ei-1)]+Ki*Ei
             MOV    R2,72H
             MOV    C,33H
             MOV    23H,C
             MOV    R3,73H
             MOV    R4,74H
             MOV    C,30H
             MOV    24H,C
             LCALL   SJF
             MOV    77H,R5      ;将Kp[Ei-(Ei-1)]+Ki*Ei送77H(高位),78H(低位)
             MOV    78H,R6
             MOV    C,25H       ;将Kp[Ei-(Ei-1)]+Ki*Ei的符号位送36H
             MOV    36H,C

             MOV    R1,77H       ; 计算&Ui
             MOV    R2,78H
             MOV    C,36H
             MOV    23H,C
             MOV    R3,75H
             MOV    R4,76H
             MOV    C,35H
             MOV    24H,C
             LCALL   SJF
             MOV    79H,R5       ; 将&Ui送79H(高位),7AH(低位)
             MOV    7AH,R6
             MOV    C,25H        ; 将&Ui的符号位送37H
             MOV    37H,C


             MOV    R1,79H       ; 输出PWM时间的计算
             MOV    R2,7AH
             MOV    C,37H
             MOV    23H,C
             MOV    R3,7BH
             MOV    R4,7CH
             CLR    24H
             LCALL  SJF
             MOV    7BH,R5
             MOV    7CH,R6
             MOV    7DH,7BH
             MOV    7EH,7CH

            ; MOV    R1,7DH       ; 计算Ui
            ; MOV    R2,7EH
            ; CLR    23H
            ; MOV    R3,79H
            ; MOV    R4,7AH
            ; MOV    C,37H
            ; MOV    24H,C
            ; LCALL   SJF
            ; JNB   25H,PID3
            ; MOV   7BH,#00H       ; 如为负,则令输出值为0
            ; MOV   7CH,#00H
            ; SJMP   PID4
    ; PID3:   MOV   7BH,R5         ; 否则,将计算得到Ui值送7BH(高位)、7CH(低位)
    ;         MOV   7CH,R6
     PID4:   MOV   6DH,6CH        ; 数据始代,(Ei-1)值送(Ei-2)
             MOV   6CH,6BH        ; Ei值送(Ei-1)
    ;         MOV   7DH,7BH        ; Ui值送(Ui-1)
    ;         MOV   7EH,7CH


     CHUPID:        RET

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      ;单字节带符号的减法子程序
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     DJF:    JB   20H,DJF4
             JB   21H,DJF2
             CLR   C
             MOV   A,R1
             SUBB   A,R2
             MOV   R3,A
             JC   DJF1
             CLR   22H
             RET
    DJF1:    MOV    A,R3
             CPL   A
             ADD   A,#01H
             MOV   R3,A
             SETB   22H
             RET
    DJF2:    MOV   A,R1
             ADD   A,R2
             MOV   R3,A
             JNC   DJF3
             MOV   R3,#0FFH
    DJF3:    CLR   22H
             RET
    DJF4:    JB   21H,DJF6
             MOV   A,R1
             ADD   A,R2
             MOV   R3,A
             JNC   DJF5
             MOV   R3,#0FFH
    DJF5:    SETB   22H
             RET
    DJF6:    CLR   C
             MOV   A,R2
             SUBB  A,R1
             MOV   R3,A
             JC   DJF1
             CLR   22H
             RET

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      ;双字节带符号数的加法子程序
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     SJF:    JB   23H,SJF3
             JB    24H,SJF2
             MOV   A,R2
             ADD   A,R4
             MOV   R6,A
             MOV   A,R1
             ADDC   A,R3
             MOV   R5,A
             JNC   SJF1
             MOV   R5,#0FFH
             MOV   R6,#0FFH
     SJF1:   CLR   25H
             RET
     SJF2:   CLR   C
             MOV   A,R2
             SUBB   A,R4
             MOV   R6,A
             MOV   A,R1
             SUBB   A,R3
             MOV   R5,A
             JC   SJF4
             CLR   25H
             RET
     SJF3:   JB   24H,SJF5
             CLR   C
             MOV   A,R4
             SUBB   A,R2
             MOV   R6,A
             MOV   A,R3
             SUBB   A,R1
             MOV   R5,A
             JC   SJF4
             CLR   25H
             RET
    SJF4:    MOV   A,R6
             CPL   A
             ADD   A,#01H
             MOV   R6,A
             MOV   A,R5
             CPL   A
             ADDC   A,#00H
             MOV   R5,A
             SETB   25H
             RET
    SJF5:    MOV   A,R2
             ADD   A,R4
             MOV   R6,A
             MOV   A,R1
             ADDC   A,R3
             MOV   R5,A
             JNC   SJF6
             MOV   R5,#0FFH
             MOV   R6,#0FFH
    SJF6:    SETB   25H
             RET

   SHUCHU:   PUSH   A
             PUSH   PSW
             JB     FLAG,GAO
             CLR    P2.7
             MOV    TH0,7DH
             MOV    TL0,7EH
             SETB   FLAG
             JMP    HUI
      GAO:   SETB   P2.7
             MOV    A,#0FFH
             SUBB   A,7EH
             MOV    TL0,A
             MOV    A,#0FFH
             SUBB   A,7DH
             MOV    TH0,A
             CLR  FLAG
       HUI:  POP   PSW
             POP    A
             RETI

   CHUAN:    PUSH   A
             PUSH   PSW
             JNB    RI ,HUI001
             MOV    A,SBUF
             MOV    67H,A
             JBC    RI,$
   HUI001:   CLR    TI
             POP    PSW
             POP    A
             RETI


XIAODUO: MOV   R7,#100    ;采集延时
    D1:   MOV   R6,#248
          DJNZ  R6,$
          DJNZ  R7,D1
          RET
          END

⌨️ 快捷键说明

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