PIC单片机PWM波形产生程序
;本例通过编程,在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.51hei.com 单片机学习网斑竹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
- 基于PIC单片机的智能型漏电断路器设计(11-25)
- 基于PIC单片机的无线实时监控防盗系统的设计与实现(11-18)
- PIC单片机键盘矩阵扫描C语言程序(12-02)
- PIC单片机控制第一个发光管闪动程序(12-02)
- PIC单片机驱动LCD12864液晶显示闪动字体程序(12-02)
- PIC单片机控制8位流水灯C语言程序(12-02)