PIC16F84单片机产生两组PWM输出实例

2019-10-21来源: eefocus关键字:PIC16F84  单片机  PWM输出

;**********************************************************************

;                                                                     *

;    檔案名稱:     PWM-C.asm                                         *


;**********************************************************************

;                                                                     *

;    其它檔案:      無                                                *


;**********************************************************************

;                                                                     *

;    說明:                                                            *

;         這個範例程式會產生兩個簡單的PWM脈波輸出                     *

;         設定暫存器'PWM_WORK_CFG1' 和 'PWM_WORK_CFG2'                *

;         將會改變PIN_PWM1和PIN_PWM2的工作周期                        *

;         請注意,'PWM_WORK_CFG1'和'PWM_WORK_CFG2'和'PWM_FULL'         *

;         暫存器的設定值需介於1-255之間.                              *

;         PWM1輸出腳PORTB.0 PWM2輸出腳PORTB.1                         *

;**********************************************************************

list      p=16F84             ; list directive to define processor

#include          ; processor specific variable definitions


__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_OFF & _RC_OSC


; '__CONFIG' directive is used to embed configuration data within .asm file.

; The lables following the directive are located in the respective .inc file.

; See respective data sheet for additional information on configuration word.



;********************** CONST DEFINITIONS******************************

FULL_WORK = 10 ; 最大工作周期預設值

DEF_WORK1 = 2 ; PWM1工作周期預設值

DEF_WORK2 = 8 ; PWM2工作周期預設值

PORT_OUT = PORTB           ; PWM輸出埠

PIN_PWM1 = 0               ; PWM1輸出腳位

PIN_PWM2 = 1               ; PWM2輸出腳位

;********************** VARIABLE DEFINITIONS***************************

CBLOCK 0x0C

w_temp ; variable used for context saving 

status_temp ; variable used for context saving

PWM_FULL ; 最大工作周期計數器(下數)

PWM_WORK_CFG1 ; PWM1 工作周期設定暫存器

PWM_WORK_CFG2 ; PWM2 工作周期設定暫存器

PWM_WORK_CNT1 ; PWM1 工作周期計數器(下數)

PWM_WORK_CNT2 ; PWM2 工作周期計數器(下數)

ENDC

;**********************************************************************

;******************      晶片重置後程式進入點   ***********************

;**********************************************************************

ORG     0x000 ; processor reset vector

ResetStart

  goto    main ; go to beginning of program

;**********************************************************************

;******************      中斷服務程式進入點   *************************

;**********************************************************************

ORG     0x004 ; interrupt vector location

movwf   w_temp ; save off current W register contents

movf STATUS,w ; move status register into W register

movwf status_temp ; save off contents of STATUS register


bsf     STATUS,RP0

bcf INTCON,T0IF ; 清除計時器中斷旗號

bcf     STATUS,RP0


decfsz PWM_FULL,F ; 檢查是否完成一個周期

goto ISR_PWM1

bsf PORT_OUT,PIN_PWM1 ; PWM1/PWM2回復High電位

bsf PORT_OUT,PIN_PWM2       

movlw FULL_WORK               ; 重新設定各工作周期計數器

movwf PWM_FULL

movf PWM_WORK_CFG1,W

movwf PWM_WORK_CNT1

movf PWM_WORK_CFG2,W

movwf PWM_WORK_CNT2

goto ISR_EXIT

ISR_PWM1

decfsz PWM_WORK_CNT1,F         ; 檢查PWM1工作周期

goto ISR_PWM2

bcf PORT_OUT,PIN_PWM1       ; 工作周期結束,將輸出設為Low電位

ISR_PWM2

decfsz PWM_WORK_CNT2,F         ; 檢查PWM2工作周期

goto ISR_EXIT

bcf PORT_OUT,PIN_PWM2       ; 工作周期結束,將輸出設為Low電位

ISR_EXIT

movf    status_temp,w ; retrieve copy of STATUS register

movwf STATUS ; restore pre-isr STATUS register contents

swapf   w_temp,f

swapf   w_temp,w ; restore pre-isr W register contents

retfie ; return from interrupt

;**********************************************************************

;******************      初始化PWM      *******************************

;**********************************************************************

InitPWM

bsf     STATUS,RP0 ; 設定PWM1/PWM2腳為輸出

                bcf     PORT_OUT,PIN_PWM1

                bcf     PORT_OUT,PIN_PWM2

bcf     STATUS,RP0

                bsf     PORT_OUT,PIN_PWM1       ; 預設PWM1/PWM2輸出高電位

                bsf     PORT_OUT,PIN_PWM2

movlw FULL_WORK               ; 設定各暫存器之預設值

movwf PWM_FULL

movlw DEF_WORK1

movwf PWM_WORK_CFG1

movwf PWM_WORK_CNT1

movlw DEF_WORK2

movwf PWM_WORK_CFG2

movwf PWM_WORK_CNT2

retlw 0

;**********************************************************************

;******************      初始化計時器   *******************************

;**********************************************************************

InitTimer

bsf     STATUS,RP0

bsf OPTION_REG,T0CS ; 停止振盪器脈波輸入

bsf OPTION_REG,PSA ; 設定不使用脈波預除器

bsf INTCON,GIE ; 打開全域中斷開關(中斷總開關)

bcf INTCON,T0IF ; 清除計時器中斷旗號

bcf     STATUS,RP0

retlw 0

;**********************************************************************

;******************      啟動計時器     *******************************

;**********************************************************************

StartTimer

bsf     STATUS,RP0

bcf OPTION_REG,T0CS ; 設定振盪器脈波輸入(1/4 osc)

bsf INTCON,T0IE ; 打開計時器中斷

bcf     STATUS,RP0

retlw 0

;**********************************************************************

;******************      停止計時器     *******************************

;**********************************************************************

StopTimer

bsf     STATUS,RP0

bsf OPTION_REG,T0CS ; 停止振盪器脈波輸入

bcf INTCON,T0IE ; 關上計時器中斷

bcf     STATUS,RP0

retlw 0

;**********************************************************************

;******************      主程式進入點   *******************************

;**********************************************************************

main

bcf     STATUS,RP0 ; select Page 0 for Port Access

call InitPWM

call InitTimer

call StartTimer

goto $

;**********************************************************************

END ; directive 'end of program'


关键字:PIC16F84  单片机  PWM输出 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic477775.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:关于PIC单片机PAGE和BANK
下一篇:以汇编语言完成读写24LCxx系列的EEPROM的实例

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

PIC16F877矩阵键盘的识别
关于矩阵键盘的识别方法在51矩阵键盘识别中已经说过,现在要说的是PIC单片机与51单片机的区别,主要是PIC单片机的口子的输入输出需要TRISn寄存器设置,具体如下:扫描法:#include<pic.h>#define uchar unsigned char#define uint unsigned intuchar num;const ucharSSEG[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delay1ms(uint z){uint x;uchar y;for(x=z;x>
发表于 2019-11-16
PIC16F877矩阵键盘的识别
pic16f887 TMR0计时器讲解及准确定时程序
;        5 ANDWF OPTION_REG,W ;CLEAR THEM AFTERWARDS BY INSTRUCTION 6 ;“LOGICAL AND”         7 IORLW b’00000011’ ;PRESCALER RATE IS 1:16    8 MOVWF OPTION_REG暂存器设定说明:为了恰当地使用 TMR0,必须:1、要选择模式:● 计时器模式是借由 OPTION_REG 暂存器的 T0CS 来选择。 (T0CS: 0=timer, 1=counter
发表于 2019-11-16
pic16f887 TMR0计时器讲解及准确定时程序
用PIC16F1824的内部DAC做正弦波发生器测试
正弦波合成采用最简单的定时器扫描码表,内部的DAC只有5位,所以波形一般,如果加个RC滤波下估计还可以!除了IC外还有一个复位开关,下面有个去藕电容,其它就是接插件和万能板了。
发表于 2019-11-16
用PIC16F1824的内部DAC做正弦波发生器测试
pic16f887单片机用AD590高精度测温的电路和程序
一、 前言AD590 为Analog Devices 公司出品的一种双端温度转换电流源的单晶IC。图为AD590内部的线路结构,及其二种常用的包装。二、原理与暂存器设定说明原理:AD 590是一个良好的温度-电流转换的感测元件,具有良好的线性关系,其转换率为1μA/°K。&#1048708;图(左边)所示为AD 590转换电路,其输出转换率有100mV/°C(Vo15)输出。由于AD 590之转换率为1μA/°K。因运算放大器具有极高的输入阻抗,极小的输入电流的特性,使得AD 590电流完全流过R2与R3,故U1 的输出电压为1μA/°K.(R2+R3),当调整R2使得R2+R3=10KΩ时,U1 的输出电压为10mV/°K
发表于 2019-11-15
pic16f887单片机用AD590高精度测温的电路和程序
PIC18f4520单片机驱动H1632的C语言程序
#include<p18f4520.h>#include <delays.h>//#pragma config OSC = HS //配置内部振荡器Fosc/4 RA7,IO口RA7//#pragma config PWRT =OFF//#pragma config BOREN = OFF//#pragma config WDT = OFF//#pragma config MCLRE = ON//#pragma config PBADEN = OFF//#pragma config LVP = OFF#define CLK PORTCbits.RC3 #define DAT
发表于 2019-11-15
PIC18f4520单片机驱动H1632的C语言程序
PIC16F1937-PC通讯协议
;                  *//* 主控芯片:PIC16F1937                                                   
发表于 2019-11-14
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved