PIC16F84产生两组PWM输出的实例源程序

发布者:美人如玉剑如虹最新更新时间:2018-03-12 来源: eefocus关键字:PIC16F84  PWM输出 手机看文章 扫描二维码
随时随地手机看文章

PIC16F84产生两组PWM输出的实例源程序

;**********************************************************************
 list      p=16F84            ; list directive to define processor
 #i nclude         ; 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输出 引用地址:PIC16F84产生两组PWM输出的实例源程序

上一篇:PIC单片机程序设计的基本框架
下一篇:使用PIC读写1-wire EEPROM DS2430的实例

推荐阅读最新更新时间:2024-03-16 15:57

stm32f103c8v6多路PWM输出
参考正点原子PWM输出MINI板输出实验。 首先附PWM输出通道 原子提供的代码只有一路PWM,但是定时器的配置已经无需更改了。我们需要修改PWM.c文件 1.添加通道二的初始化 TIM_OC2Init(TIM1, &TIM_OCInitStructure); 2.CH2预装载使能 TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); 主函数main.c需要添加比较函数 TIM_SetCompare2(TIM1,led1pwmval); 至此第二路PWM成功输出通道为PA.9,但是没有任何现象观测,因此我们需要修改led.c 及led.h文件观
[单片机]
stm32f103c8v6多路<font color='red'>PWM</font><font color='red'>输出</font>
51单片机输出3路PWM,驱动RGB LED源程序
用单片机中断处理PWM,控制普通三色LED,输出七种不同颜色,呼吸变化。不占用程序运行时间。 单片机源程序如下: } else //白色由亮变暗 { time-=t; G_OUT=time; B_OUT=time; R_OUT=time; if(time =MIN
[单片机]
51单片机<font color='red'>输出</font>3路<font color='red'>PWM</font>,驱动RGB LED源程序
stm32使用tim3输出4路pwm(khz级)
tim3_pwm4.h /********************************************************* TIM3输出4路pwm,单独控制占空比 **********************************************************/ #ifndef _PWM_ #define _PWM_ #include stm32f10x.h #define CLOCK 72000 extern u16 arr; //预加载值 extern u16 psc; //分频值 /**************************************
[单片机]
MSP430F149单片机能输出多少路PWM波?
在使用430的PWM波的时候,我一直有一个困惑,那就是它到底能输出几路PWM波?我想别的朋友可能也有相同的困惑,在我查找了好多资料之后最终搞懂了,下面分享一下学习经验。 首先,MSP430F149有两个16位的定时器Timer_A和Timer_B,其中TA有3个捕获比较单元,TB有7个捕获比较单元,产生PWM波需要将定时器配置在比较模式下,刚开始我以为既然TA有三个捕获比较模块,那么就应该有三个PWM波,结果怎么配置都无法产生TA1,后来在我仔细查看User's Guide才弄懂了,下面先上图: 上图说道:每个捕获、比较模块的输出可以产生PWM信号,每个输出根据EQU0和EQUX可以配置为8种模式。 我们知道
[单片机]
MSP430F149单片机能<font color='red'>输出</font>多少路<font color='red'>PWM</font>波?
msp430TIME_B PWM输出
msp430TIME_B PWM输出 #include msp430x14x.h void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT P4DIR |= 0x1E; P4SEL |= 0x1E; TBCCR0 = 500; TBCCTL1 = OUTMOD_3; TBCCR1 = 100; TBCCTL2 = OUTMOD_3; TBCCR2 = 200; TBCCTL3 = OUTMOD_3; TBCCR3 = 300; TBCCTL4 = OUTMOD_3; TBCCR4 = 250; TBCTL = TBSSEL_2 + MC_3; }
[单片机]
玩转STM32CubeMX | PWM输出
1.PWM简介 脉冲宽度调制(PWM,Pulse Width Modulation)简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。即对脉冲宽度的控制,PWM原理如下图示: 图中我们假定定时器是工作在向上计数PWM模式,且当CNT CCRx时输出0,当CNT = CCRx时输出1,那么就可以得到如上的PWM示意图:当CNT CCRx时,IO口输出低电平;当CNT = CCRx时,IO口输出高电平;当CNT值达到ARR的时候,重新归零,然后重新向上计数,依次循环。改变CCRx的值就可以改变PWM输出的占空比,改变ARR的值就可以改变PWM输出的频率 输出模式有两种:PWM1和PWM2
[单片机]
玩转STM32CubeMX | <font color='red'>PWM</font><font color='red'>输出</font>
ATmega2560单片机12路PWM输出的程序 每路PWM可独立控制
PWM模块设计说明: 使用ATmega2560单片机开发一个12路PWM输出的程序,要求每路PWM可以独立控制。通过串口指令控制某路PWM输出某个频率值(具体通道受指令第一字节控制),每路PWM的频率范围能在20-2000HZ范围内变化(具体频率值受指令第二字节控制),同时,还能够随时停止某路的输出。 指令要求: A1 XX 第一路PWM连续输出占空比为50%不变的方波。 (XX为00时,停止输出,为01~FF时,输出20~2000HZ频率值,其中重点关照1000HZ以下,以5HZ为步进;1000-2000HZ以15HZ步进即可,以上要求的步进值并非十分严格,如果不易实现,可以稍微修改。) 以下均相同要求: A2 XX 第二
[单片机]
STM32——PWM输出总结
学习后发现stm32的定时器功能确实很强大,小总结一下方便以后使用的时候做参考。Stm32定时器一共分为三种:tim1和tim8是高级定时器,6和7是基本定时器,2 5是通用定时器。从名字就可以看得出来主要功能上的差异。今天我主要是用定时器做pwm输出,所以总结也主要是针对pwm方面的。 先大致说下通用和高级定时器的区别。通用的可以输出四路pwm信号互不影响。高级定时器可以输出三对互补pwm信号外加ch4通道,也就是一共七路。 所以这样算下来stm32一共可以生成4*5+7*2=30路pwm信号。接下来还有功能上的区别:通用定时器的pwm信号比较简单,就是普通的调节占空比调节频率(别的不常用到的没去深究);
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved