專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

pic單片機(jī)PWM波形產(chǎn)生程序(匯編)

作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2008年08月07日   【字體:

;本例通過(guò)編程,在pic單片機(jī)pf18f485的控制下使CCP1模塊工作在脈寬調(diào)制PWM波形方式下從RC2口上輸出分辨率達(dá)10位的

;PWM波形,波形的占空比可以通過(guò)鍵盤調(diào)節(jié),當(dāng)按下K1鍵時(shí),輸出的PWM波形的占空比為25%,
;當(dāng)按下K2鍵時(shí),輸出的PWM波形的占空比為50%,當(dāng)按下K3鍵時(shí),輸出的PWM波形的占空
;比為75%,當(dāng)按下K4鍵時(shí),輸出的PWM波形的占空比為100% ,默認(rèn)輸出波形的占空比為50%
;為了強(qiáng)調(diào)編程技巧,鍵盤程序采用變位中斷方式
 
                   LIST          P=18F458
                  INCLUDE          "P18F458.INC"
 
                   DEYH                 EQU          0X20
                   DEYL                  EQU          DEYH+1
                   JIANR                EQU          DEYH+2             ;存儲(chǔ)鍵值用寄存器
                   ORG                   0X00
                   GOTO                MAIN                                   ;轉(zhuǎn)向主程序
                   ORG                   0X08
                   GOTO                INTSERVE                                     ;轉(zhuǎn)向中斷服務(wù)程序
                   ORG                   0X30
;***************PWM波形產(chǎn)生程序初始化******************
INITIAL
                   CLRF                  INTCON                          ;禁止總中斷和外圍中斷
                   BSF                     INTCON,RBIE                          ;B口變位中斷允許
                   BCF                    INTCON2,7                       ;使弱上拉有效
                   BSF                     INTCON2,1                       ;B口變位中斷高優(yōu)先級(jí)
                   BSF                     RCON,7                             ;使能中斷優(yōu)先級(jí)
                   MOVLW             0XFF
                   MOVWF            PR2                                        ;設(shè)置PWM的工作周期
                   MOVLW             0X7F
                   MOVWF            CCPR1L                                ;默認(rèn)占空比為50%
                   MOVLW             0X3C
                   MOVWF            CCP1CON                           ;設(shè)置CCP1模塊為PWM工作方式,且其工作循
                                                                                             ;環(huán)的低2位為11,高8位為01111111=7F
                   MOVLW             0X04
                   MOVWF            T2CON                               ;打開(kāi)TMR2,且使其前分頻為1
                   BCF                    TRISC,2                             ;設(shè)置CCP1引腳為輸出方式
                   BCF                    TRISB,1
                   BCF                    TRISA,3
                   BCF                    TRISE,0
                   BCF                    TRISE,1
                   BSF                     TRISB,4                          ;設(shè)置與鍵盤有關(guān)的各口的輸入輸出方式
                   BCF                    PORTB,1
                   BCF                    PORTA,3
                   BCF                    PORTE,0
                   BCF                    PORTE,1                                     ;K1,K2,K3,K4四條列線置0,為電平變化
                                                                                             ;中斷的產(chǎn)生創(chuàng)造初始條件 
                   MOVF                PORTB,W                  ;讀PORTB端口,建立變位中斷的初始條件
                                                                                             ;(由高到低時(shí)中斷)
                   RETURN
;*********鍵盤去抖子程序(8ms的延時(shí))******************
KEYDELAY
                   MOVLW             0X0A
                   MOVWF            DEYH
AGAIN2   MOVLW             0XFF
             MOVWF            DEYL
AGAIN1   DECFSZ             DEYL,1
             GOTO                AGAIN1
             DECFSZ             DEYH,1
             GOTO                AGAIN2                               ;具體程序語(yǔ)句參考3. 2節(jié)
                   RETURN 
;***************鍵服務(wù)子程序******************
KEYSERVE
JIANZHI                                                                             ;確定鍵值的子程序
                   BCF                    PORTB,1                 
                   BCF                    PORTA,3
                   MOVLW             0X03
                   MOVWF            PORTE                                  ;K1,K2置低電平,K3,K4置高電平
                   NOP
                   NOP                                                                  ;使引腳電平穩(wěn)定
                   BTFSS                PORTB,4
                   GOTO                K1K2                                ;RB4為0,表示按鍵為K1,K2中的一個(gè)
                   GOTO                K3K4                                ;RB4為1,表示按鍵為K3,K4中的一個(gè)
 
K1K2         BCF                    PORTB,1
                   BSF                     PORTA,3                                     ;K1置低電平,K2置高電平
                   NOP
                   NOP                                                                  ;使引腳電平穩(wěn)定
                   BTFSS                PORTB,4
                   GOTO                K1                                    ;RB4為0,表示按鍵為K1
                   GOTO                K2                                     ;RB4為1,表示按鍵為K2
 
K3K4         BCF                    PORTE,0
                   BSF                     PORTE,1                                     ;K3置低電平,K4置高電平
                   NOP
                   NOP                                                                  ;使引腳電平穩(wěn)定
                   BTFSS                PORTB,4
                   GOTO                K3                                    ;RB4為0,表示按鍵為K3
                   GOTO                K4                                     ;RB4為1,表示按鍵為K4,以上對(duì)鍵盤進(jìn)行掃
                                                                                             ;描,來(lái)確定是哪一個(gè)鍵按下
K1              MOVLW             0X01
                   MOVWF            JIANR
                   GOTO                RET
K2              MOVLW             0X02
                   MOVWF            JIANR
                   BCF                    PORTA,3
                   GOTO                RET
K3              MOVLW             0X03
                   MOVWF            JIANR
                   GOTO                RET
K4              MOVLW             0X04
                   MOVWF            JIANR                            ;以上根據(jù)按下的鍵把相應(yīng)的值送給JIANR
                   BCF                    PORTE,1        
RET           NOP
                   RETURN
;**********確定占空比為25%的子程序*********
PER25       MOVLW             0X3F
                   MOVWF            CCPR1L
                   RETURN
;**********確定占空比為50%的子程序*********
PER50       MOVLW             0X7F
                   MOVWF            CCPR1L
                   RETURN
;**********確定占空比為75%的子程序*********
PER75       MOVLW             0XBF
                   MOVWF            CCPR1L
                   RETURN
;**********確定占空比為100%的子程序*********
PER100     MOVLW             0XFF
                   MOVWF            CCPR1L
                   RETURN
;**************中斷程序(注:由http://www.torrancerestoration.com 單片機(jī)學(xué)習(xí)網(wǎng)斑竹ccmcu修改)***************
INTSERVE                   NOP
                   BCF                  INTCON,RBIF                           ;清除中斷標(biāo)志
                   CALL                  KEYDELAY                   ;調(diào)用軟件延時(shí)子程序消抖動(dòng)
                   MOVF                PORTB,W                          ;讀PORTB的值,并同時(shí)改變中斷發(fā)生的條件可
                                                                                             ;以屏蔽一次無(wú)用的中斷,又可以防止按鍵時(shí)間
                                                                                             ;過(guò)長(zhǎng)發(fā)生連續(xù)中斷
                   BTFSC                PORTB,4
                   RETFIE                                                     ;判斷為干擾,則返回,并可以屏蔽一次無(wú)用的
;中斷
                   CALL                  KEYSERVE                    ;調(diào)用鍵服務(wù)子程序,確定鍵值
                   BCF                    PORTB,1
                   BCF                    PORTA,3
                   BCF                    PORTE,0
                   BCF                    PORTE,1                                ;送低電平至K1,K2,K3,K4,以防止鍵掃描
                                                                                             ;時(shí)改變K1,K2,K3,K4的電平,從而改變中
;斷條件     
                   BCF                    INTCON,RBIF                           ;鍵掃描時(shí)可能會(huì)產(chǎn)生"電平變化"而使RBIF
                                                                                             ;置1,再清除一次RBIF以求避免額外中斷
                   MOVLW             0X01                                               ;以下通過(guò)判斷是哪個(gè)鍵按下從
                   SUBWF              JIANR,0                             ;而選擇PWM波形的不同占空比
                   BTFSC                STATUS,Z
                   CALL                  PER25                         ;若是K1按下,則PWM占空比為25%
;以下同理
                   MOVLW             0X02
                   SUBWF              JIANR,0
                   BTFSC                STATUS,Z
                   CALL                  PER50
                   MOVLW             0X03
                   SUBWF              JIANR,0
                   BTFSC                STATUS,Z
                   CALL                  PER75
                   MOVLW             0X04
                   SUBWF              JIANR,0
                   BTFSC                STATUS,Z
                   CALL                  PER100
                   RETFIE                                                             ;中斷返回
;****************************************
MAIN       NOP
                   CALL                  INITIAL                              ;初始化
                   BSF                     INTCON,GIE                    ;總中斷允許
HERE        GOTO                HERE                              ;等待中斷
                   END
關(guān)閉窗口