微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > PIC单片机PWM波形产生程序

PIC单片机PWM波形产生程序

时间:12-31 来源:互联网 点击:

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top