改变PWM输出波占空比程序

改变PWM输出波占空比程序
改变PWM输出波占空比程序

;本例通过编程,使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

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

初始化子程序

.***************

******************

INITIAL

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 的延时)******************

.*********

MOVLW 0X0A

MOVWF DEYH

AGAIN2 MOVLW 0XFF

MOVWF DEYL

AGAIN1 DECFSZ DEYL , 1

GOTO AGAIN1

DECFSZ DEYH , 1

GOTO AGAIN2

RETURN

;*************** 键服务子程序

******************

KEYSERVE

JIANZHI

BCF PORTB,1

BCF PORTA,3

MOVLW 0X03

MOVWF PORTE

NOP

NOP

BTFSS PORTB,4

GOTO K1K2

GOTO K3K4

K1K2 BCF PORTB,1

BSF PORTA,3

NOP ;具体程序语句参考 3. 2节

;确定键值的子程序

;K1 ,K2 置低电平,K3,K4 置高电平

;使引脚电平稳定

;RB4 为0,表示按键为K1 ,K2 中的一个;RB4 为1,表示按键为K3 ,K4 中的一个

;K1 置低电平,K2 置高电平

KEYDELA Y

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%的子程序*********

*

NOP BCF INTCON , RBIF ;清除中断标志

CALL KEYDELA Y ;调用软件延时子程序消抖动

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

PER75

MOVLW MOVWF RETURN

0XBF CCPR1L

.********** 确定占空比为 100%的子程序

PER100

MOVLW 0XFF MOVWF CCPR1L

RETURN

.**************

INTSERVE

中断服务子程序 ***************

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

相关主题
相关文档
最新文档