分享

pic单片机PWM波形产生程序(汇编)

 共同成长888 2015-06-30

;本例通过编程,在pic单片机pf18f485的控制下使CCP1模块工作在脉宽调制PWM波形方式下从RC2口上输出分辨率达10位的

;PWM波形,波形的占空比可以通过键盘调节,当按下K1键时,输出的PWM波形的占空比为25%,
;当按下K2键时,输出的PWM波形的占空比为50%,当按下K3键时,输出的PWM波形的占空
;比为75%,当按下K4键时,输出的PWM波形的占空比为100% ,默认输出波形的占空比为50%
;为了强调编程技巧,键盘程序采用变位中断方式
 
                   LIST          P=18F458
                  INCLUDE          "P18F458.INC"
 
                   DEYH                 EQU          0X20
                   DEYL                  EQU          DEYH+1
                   JIANR                EQU          DEYH+2             ;存储键值用寄存器
                   ORG                   0X00
                   GOTO                MAIN                                   ;转向主程序
                   ORG                   0X08
                   GOTO                INTSERVE                                     ;转向中断服务程序
                   ORG                   0X30
;***************PWM波形产生程序初始化******************
INITIAL
                   CLRF                  INTCON                          ;禁止总中断和外围中断
                   BSF                     INTCON,RBIE                          ;B口变位中断允许
                   BCF                    INTCON2,7                       ;使弱上拉有效
                   BSF                     INTCON2,1                       ;B口变位中断高优先级
                   BSF                     RCON,7                             ;使能中断优先级
                   MOVLW             0XFF
                   MOVWF            PR2                                        ;设置PWM的工作周期
                   MOVLW             0X7F
                   MOVWF            CCPR1L                                ;默认占空比为50%
                   MOVLW             0X3C
                   MOVWF            CCP1CON                           ;设置CCP1模块为PWM工作方式,且其工作循
                                                                                             ;环的低2位为11,高8位为01111111=7F
                   MOVLW             0X04
                   MOVWF            T2CON                               ;打开TMR2,且使其前分频为1
                   BCF                    TRISC,2                             ;设置CCP1引脚为输出方式
                   BCF                    TRISB,1
                   BCF                    TRISA,3
                   BCF                    TRISE,0
                   BCF                    TRISE,1
                   BSF                     TRISB,4                          ;设置与键盘有关的各口的输入输出方式
                   BCF                    PORTB,1
                   BCF                    PORTA,3
                   BCF                    PORTE,0
                   BCF                    PORTE,1                                     ;K1,K2,K3,K4四条列线置0,为电平变化
                                                                                             ;中断的产生创造初始条件 
                   MOVF                PORTB,W                  ;读PORTB端口,建立变位中断的初始条件
                                                                                             ;(由高到低时中断)
                   RETURN
;*********键盘去抖子程序(8ms的延时)******************
KEYDELAY
                   MOVLW             0X0A
                   MOVWF            DEYH
AGAIN2   MOVLW             0XFF
             MOVWF            DEYL
AGAIN1   DECFSZ             DEYL,1
             GOTO                AGAIN1
             DECFSZ             DEYH,1
             GOTO                AGAIN2                               ;具体程序语句参考3. 2节
                   RETURN 
;***************键服务子程序******************
KEYSERVE
JIANZHI                                                                             ;确定键值的子程序
                   BCF                    PORTB,1                 
                   BCF                    PORTA,3
                   MOVLW             0X03
                   MOVWF            PORTE                                  ;K1,K2置低电平,K3,K4置高电平
                   NOP
                   NOP                                                                  ;使引脚电平稳定
                   BTFSS                PORTB,4
                   GOTO                K1K2                                ;RB4为0,表示按键为K1,K2中的一个
                   GOTO                K3K4                                ;RB4为1,表示按键为K3,K4中的一个
 
K1K2         BCF                    PORTB,1
                   BSF                     PORTA,3                                     ;K1置低电平,K2置高电平
                   NOP
                   NOP                                                                  ;使引脚电平稳定
                   BTFSS                PORTB,4
                   GOTO                K1                                    ;RB4为0,表示按键为K1
                   GOTO                K2                                     ;RB4为1,表示按键为K2
 
K3K4         BCF                    PORTE,0
                   BSF                     PORTE,1                                     ;K3置低电平,K4置高电平
                   NOP
                   NOP                                                                  ;使引脚电平稳定
                   BTFSS                PORTB,4
                   GOTO                K3                                    ;RB4为0,表示按键为K3
                   GOTO                K4                                     ;RB4为1,表示按键为K4,以上对键盘进行扫
                                                                                             ;描,来确定是哪一个键按下
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                            ;以上根据按下的键把相应的值送给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. 单片机学习网斑竹ccmcu修改)***************
INTSERVE                   NOP
                   BCF                  INTCON,RBIF                           ;清除中断标志
                   CALL                  KEYDELAY                   ;调用软件延时子程序消抖动
                   MOVF                PORTB,W                          ;读PORTB的值,并同时改变中断发生的条件可
                                                                                             ;以屏蔽一次无用的中断,又可以防止按键时间
                                                                                             ;过长发生连续中断
                   BTFSC                PORTB,4
                   RETFIE                                                     ;判断为干扰,则返回,并可以屏蔽一次无用的
;中断
                   CALL                  KEYSERVE                    ;调用键服务子程序,确定键值
                   BCF                    PORTB,1
                   BCF                    PORTA,3
                   BCF                    PORTE,0
                   BCF                    PORTE,1                                ;送低电平至K1,K2,K3,K4,以防止键扫描
                                                                                             ;时改变K1,K2,K3,K4的电平,从而改变中
;断条件     
                   BCF                    INTCON,RBIF                           ;键扫描时可能会产生"电平变化"而使RBIF
                                                                                             ;置1,再清除一次RBIF以求避免额外中断
                   MOVLW             0X01                                               ;以下通过判断是哪个键按下从
                   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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多