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

📄 spwm.asm

📁 利用MCS51单片机的I/O口实现PWM脉宽调制
💻 ASM
字号:


      SPEED     EQU 30H
      T5ms      EQU 31H   ;TIMER0' PERIOD

      LED0      EQU 32H   ;dISPLAY BUFFER
      LED1      EQU 33H
      LED2      EQU 34H
      LED3      EQU 35H
      LED_DIS   EQU 36H

      TEMP      EQU 37H
      KEY_TIME  EQU 38H
      KEY_PRE   EQU 39H
      KEY_VALUE EQU 3AH
      PWMKONG   EQU 3BH
      PWMTEMP   EQU 3CH
      PWMSU0    EQU 3DH
      PWMSU1    EQU 3EH
      PWMSU2    EQU 3FH
      PWMSU3    EQU 40H
     

      P1CON     EQU 09BH ;設定SFR內P1CON的位址
      SPWMC     EQU 0A3H ;設定SFR內SPWMC的位址
      SPWMD0    EQU 0A4H ;設定SFR內SPWMD0的位址
      SPWMD1    EQU 0A5H ;設定SFR內SPWMD1的位址
      SPWMD2    EQU 0A6H ;設定SFR內SPWMD2的位址
      SPWMD3    EQU 0A7H ;設定SFR內SPWMD3的位址

      T5msFLAG  BIT 10H
      KEY_FLAG  BIT 12H



      ORG 0000H
      AJMP MAIN

      ORG 000BH
      AJMP TIMER0


      ORG 0100H
MAIN:  LCALL INITSYSTEM
LOOP:  JNB P3.2,TONGXUN
       LCALL DISPLAY
       JNB   T5msFLAG,LOOP
       CLR   T5msFLAG
       MOV  A, T5ms
       MOV B,#03H
       DIV AB
       MOV TEMP,B
       MOV A,TEMP
       CJNE  A,#00,TASK1
TASK0: LCALL DISPLAY
       AJMP  BACK
TASK1: CJNE  A,#01,TASK2
       LCALL KEYIN
       LCALL KEY_DISPOSE
       AJMP  BACK
TASK2:
       LCALL PWM


BACK:
       AJMP  LOOP
       SJMP $

TIMER0:PUSH ACC
       PUSH B
       MOV  TH0,#0c5H;延时子程序3
       MOV  TL0,#68H
       SETB T5msFLAG
       INC  T5ms
       MOV  A,T5ms
       MOV  B,#03H
       DIV  AB
       MOV  T5ms,B
       JNB  KEY_FLAG, T0_BACK
       INC  KEY_TIME
T0_BACK:POP B
       POP  ACC
       RETI




TONGXUN:
     MOV SBUF,#55H
     MOV R7,#10H
DL1:MOV R6,#0F8H
     DJNZ R6,$
COMINT:JNB TI,RXDINT
     CLR TI
     RET
RXDINT:CLR RI
     JB F0,SEND
     MOV A,SBUF
     CJNE A,#55H,NEXT
     SETB F0
     SJMP SENDD
SEND:MOV A,SBUF
     CJNE A,#0FH,ERROR
SENDD:MOV A,@R0
     MOV C,PSW.0
     MOV TB8,C
     MOV SBUF,A
     INC R0
     DJNZ R1,NEXT
     CLR ES
      MOV P1,#00H
NEXT:RET
ERROR:DEC R0
     INC R1
     SJMP SENDD


DISPLAY:
      PUSH ACC
      PUSH B
      INC  LED_DIS
      MOV  A,LED_DIS
      MOV  B,#04H
      DIV  AB
      MOV  LED_DIS,B
      MOV  A, LED_DIS

CLED0:CJNE A,#00H,CLED1
      MOV  TEMP, LED0
      MOV A,TEMP
      MOV DPTR,#WORDTAB
      MOVC A,@A+DPTR
      MOV P0,A
      CLR P2.3
      CLR P2.2
      CLR P2.1
      SETB P2.0
      AJMP XIAN
CLED1: CJNE A,#01H,CLED2
      MOV  TEMP, LED1
      MOV A,TEMP
      MOV DPTR,#WORDTAB
      MOVC A,@A+DPTR
      MOV P0,A
      CLR P2.3
      CLR P2.2
      CLR P2.0
      SETB P2.1
      AJMP XIAN
CLED2: CJNE A,#02H,CLED3
      MOV  TEMP, LED2
      MOV A,TEMP
      MOV DPTR,#WORDTAB
      MOVC A,@A+DPTR
      MOV P0,A
      CLR P2.3
      CLR P2.1
      CLR P2.0
      SETB P2.2
      AJMP XIAN
CLED3:MOV TEMP, LED3
      MOV A,TEMP
      MOV DPTR,#WORDTAB
      MOVC A,@A+DPTR
      MOV P0,A
      CLR P2.0
      CLR P2.2
      CLR P2.1
      SETB P2.3
XIAN: POP B
      POP  ACC
      RET
WORDTAB: DB 3FH,06H,5BH,4FH ;"0","1","2","3"
         DB 66H,6DH,7DH,07H ;"4","5","6","7"
         DB 7FH,6FH ;8,9,a,b,c,d,e,f



KEYIN: PUSH ACC
       PUSH  B
       JNB P2.4,KEY_DOWN
       JNB P2.5,KEY_DOWN
       JNB P2.6,KEY_DOWN
       JNB P2.7,KEY_DOWN

       AJMP KEY_BACK
KEY_DOWN:
       inc key_time

       MOV A,KEY_TIME
       CJNE A,#04H,KEY_BACK

       MOV KEY_TIME,#00H

       JNB P2.4,KEY_DOWN1
       JNB P2.5,KEY_DOWN2
       JNB P2.6,KEY_DOWN3
       JNB P2.7,KEY_DOWN4
       AJMP KEY_BACK
KEY_DOWN1:
       MOV A,#01H
       AJMP PAN
KEY_DOWN2:
       MOV A,#02H
       AJMP PAN
KEY_DOWN3:
       MOV A,#03H
       AJMP PAN
KEY_DOWN4:
       MOV A,#04H



PAN:
       CJNE A,#01H,KEY1
KEY0:  MOV KEY_VALUE,#00H
       AJMP KEY_BACK
KEY1:  CJNE A,#02H,KEY2
       MOV KEY_VALUE,#01H
       AJMP KEY_BACK
KEY2:  CJNE A,#03H,KEY3
       MOV KEY_VALUE,#02H
       AJMP KEY_BACK
KEY3:  MOV KEY_VALUE,#03H
       AJMP KEY_BACK



KEY_BACK:POP B
       POP  ACC
       RET


KEY_DISPOSE:
       PUSH ACC
       PUSH  B
       MOV A,KEY_VALUE
START_KEY:
       CJNE A,#00H,KEY_D1
KEY_D0:INC SPEED
       ajmp fenjie
KEY_D1:CJNE A,#01H,KEY_D2      ;INCRESE SPEED
       DEC SPEED
       ajmp fenjie
KEY_D2:CJNE A,#02H,KEY_D3       ;INCRESE SPEED  +10
       MOV A,SPEED
       ADD A,#0AH
       mov speed,a
       ajmp fenjie
KEY_D3:CJNE A,#03H,KEY_DBACK   ;  DECRESE SPEED -10
       MOV A,SPEED
       SUBB A,#0AH
       mov speed,a
fenjie:MOV A,SPEED  ;百位
       mov b,#64h
       div ab
       mov led3,a
       mov temp,b
       mov a,temp

       mov b,#10
       div ab
       mov led2,a
       mov temp,b
       mov a,temp
       MOV LED1,A



       CPL P1.0
       CPL P1.1
       MOV KEY_VALUE,#0FFH

KEY_DBACK:POP B
       POP  ACC
        RET

PWM: PUSH ACC
     PUSH B
LOOP1:INC PWMTEMP
     MOV A,PWMTEMP
     MOV B,#04H
     DIV AB
     MOV PWMTEMP,B
     MOV A,PWMTEMP
PWM0:CJNE A,#00H,PWM1
     MOV A,PWMSU0
           MOV DPTR,#SINTAB
      MOVC A,@A+DPTR
     MOV SPWMD0,A
     INC PWMSU0 
     AJMP PWMBACK
PWM1:CJNE  A,#01H,PWM2
     MOV A,PWMSU1
           MOV DPTR,#SINTAB
      MOVC A,@A+DPTR
     MOV SPWMD1,A
     INC PWMSU1
     AJMP PWMBACK
PWM2:CJNE  A,#02H,PWM3
     MOV A,PWMSU2
           MOV DPTR,#SINTAB
      MOVC A,@A+DPTR
     MOV SPWMD2,A
     INC PWMSU2
     AJMP PWMBACK
PWM3:
     MOV A,PWMSU3
           MOV DPTR,#SINTAB
      MOVC A,@A+DPTR
     MOV SPWMD3,A
     INC PWMSU3
PWMBACK:
     POP B
     POP ACC
     RET
     

SINTAB:DB 7DH,80H,83H,86H,89H,8CH,8FH,92H,95H,98H,
      DB 9BH,9EH,0A1H,0A4H,0A7H,0AAH,0ADH,0B0H,0B2H,0B5H,0B8H,
      DB 0BBH,0BDH,0C0H,0C2H,0C5H,0C7H,0CAH,0CCH,0CFH,0D1H,0D3H,
      DB 0D5H,0D7H,0DAH,0DCH,0DEH,0E0H,0E1H,0E3H,0E5H,0E7H,0E8H,
      DB 0EAH,0EBH,0EDH,0EEH,0EFH,0F0H,0F2H,0F3H,0F4H,0F5H,0F6H,
      DB 0F7H,0F7H,0F8H,0F8H,0F9H,0F9H,0F9H,0FAH,0FAH,0FAH,0FAH,
      DB 0FAH,0FAH,0F9H,0F9H,0F9H,0F8H,0F8H,0F7H,0F6H,0F5H,0F5H,
      DB 0F4H,0F3H,0F2H,0F0H,0EFH,0EEH,0EDH,0EBH,0EAH,0E8H,0E7H,
      DB 0E5H,0E3H,0E1H,0E0H,0DEH,0DCH,0DAH,0D7H,0D5H,0D3H,0D1H,
      DB 0CFH,0CCH,0CAH,0C7H,0C5H,0C2H,0C0H,0BDH,0BBH,0B8H,0B5H,
      DB 0B2H,0B0H,0ADH,0AAH,0A7H,0A4H,0A1H,9EH,9BH,98H,95H,
      DB 92H,8FH,8CH,89H,86H,83H,80H,7DH
      DB 7DH,80H,83H,86H,89H,8CH,8FH,92H,95H,98H,
      DB 9BH,9EH,0A1H,0A4H,0A7H,0AAH,0ADH,0B0H,0B2H,0B5H,0B8H,
      DB 0BBH,0BDH,0C0H,0C2H,0C5H,0C7H,0CAH,0CCH,0CFH,0D1H,0D3H,
      DB 0D5H,0D7H,0DAH,0DCH,0DEH,0E0H,0E1H,0E3H,0E5H,0E7H,0E8H,
      DB 0EAH,0EBH,0EDH,0EEH,0EFH,0F0H,0F2H,0F3H,0F4H,0F5H,0F6H,
      DB 0F7H,0F7H,0F8H,0F8H,0F9H,0F9H,0F9H,0FAH,0FAH,0FAH,0FAH,
      DB 0FAH,0FAH,0F9H,0F9H,0F9H,0F8H,0F8H,0F7H,0F6H,0F5H,0F5H,
      DB 0F4H,0F3H,0F2H,0F0H,0EFH,0EEH,0EDH,0EBH,0EAH,0E8H,0E7H,
      DB 0E5H,0E3H,0E1H,0E0H,0DEH,0DCH,0DAH,0D7H,0D5H,0D3H,0D1H,
      DB 0CFH,0CCH,0CAH,0C7H,0C5H,0C2H,0C0H,0BDH,0BBH,0B8H,0B5H,
      DB 0B2H,0B0H,0ADH,0AAH,0A7H,0A4H,0A1H,9EH,9BH,98H,95H,
      DB 92H,8FH,8CH,89H,86H,83H,80H,7DH


INITSYSTEM:
       MOV SPEED,#96H     ;存速度的初值


       MOV TMOD,#01H       ;初始化定时器
       MOV TH0,#0c5H
       MOV TL0,#68H


       MOV T5ms,#00H          ;  初始化各变量初值
       CLR T5msFLAG
       CLR KEY_FLAG
       MOV LED_DIS,#00H
       MOV KEY_VALUE,#0FFH
       MOV KEY_TIME,#00H
       MOV KEY_PRE,#00H



       MOV PWMTEMP,#00H

       MOV P1CON,#78H ;設定P1.3-p1.6為SPWM輸出
       MOV SPWMC,#03H ;設定SPWM的頻率 (Divider=16)
       MOV SPWMD0,#083H ;設定輸出波形
       MOV SPWMD1,#023H
       MOV SPWMD2,#083H
       MOV SPWMD3,#023H
       
       MOV PWMSU0,#00H ;設定相位
       MOV PWMSU1,#3FH
       MOV PWMSU2,#7FH
       MOV PWMSU3,#0C0H

       SETB EA                ; 计数开始,允许中断
       SETB ET0
       SETB TR0
       clr p1

       MOV LED0,#00H              ; 初始化各管子初值
       MOV LED1,#00H
       MOV LED2,#05H
       MOV LED3,#01H
       RET
       END

⌨️ 快捷键说明

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