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

发布者:bluepion最新更新时间: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输出 引用地址:PIC16F84单片机产生两组PWM输出实例

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

推荐阅读最新更新时间:2024-11-13 13:05

超1000万颗:比亚迪半导体车规级MCU再显强劲实力
MCU——微控制单元,作为汽车电子系统内部运算和处理的核心,是实现汽车智能化的关键。比亚迪半导体深耕MCU领域已十余年,拥有一系列车规级和工业级MCU产品。截至目前,比亚迪半导体车规级MCU量产装车突破1000万颗!这是国产MCU在汽车领域又一重大里程碑。 随着汽车自动化、电动化、智能化、网联化推动汽车行业快速发展,车规级MCU的市场需求不断增加。根据国际知名分析机构IC Insights预测,2021-2023年器件涨幅逐步加大,车规级MCU芯片年销售额将达到81亿美元。 2007年,比亚迪半导体进入工业MCU领域,工业级触控MCU市场占有率国内第一。基于行业深厚的积淀、高品质的管控能力与强劲的研发实力,比亚迪半导体从工
[汽车电子]
超1000万颗:比亚迪半导体车规级<font color='red'>MCU</font>再显强劲实力
22-基于51单片机的数字时钟(万年历)
具体实现功能 系统由STC89C52单片机+DS1302时钟芯片+按键模块+LCD1602显示+电源构成。 具体功能: 1、可以显示年、月、日、时、分、秒、星期、农历; 2、按键可以设置闹钟及报警; 3、按键可以调整时间,显示是平年还是闰年。 共4个按键:设置、加、减、切换。 设计背景 在现实我们生活中每个人都可能有自己的时钟,光阴在永不停息的流逝,有了时钟人们就能随着时间有计划的过着每一天。然而现在绝大部分的时钟有的需要不断地更换电池,有些时钟需要外接电源,如果一旦电池没电或者外接电源无法供电,时钟就会停止计时了。而美国DALLAS 公司的新型时钟日历芯片DS1302就能解决这一问题。该器件能提供实时时钟
[单片机]
22-基于51<font color='red'>单片机</font>的数字时钟(万年历)
STM32单片机实现固件在线升级(IAP)
1,固件升级方案综述 单片机的固件升级方式有很多种。1、ICP:简单说就是在单片机开发时使用烧录器升级程序,比如使用J-Link烧录单片机程序。2、ISP:在单片机内部实现了基于通信接口(如串口、I2C、SPI等等)的FLASH引导程序,配合厂家提供的烧录软件工具或自行开发的软件实现程序烧录。3、IAP:是指单片机程序开发好之后在运行过程中由外部用户发起的在线升级,这种升级方式一般由用户自行设计升级方案,方案灵活性和自由度较高,在智能家居、汽车电子、物联网设备中常用的OTA即空中下载技术原理也与之类似。 2,划分FALSH存储区域 在STM32系列单片机中,程序存储在内部FLASH中,按照不同的单片机型号FLASH大小有所不同
[单片机]
STM32<font color='red'>单片机</font>实现固件在线升级(IAP)
简单的PCB制作——单片机的最小系统
单片机的最小系统: 1、芯片:AT89C51 2、晶振电路(相当于心脏)12MHZ。 3、复位(g高电平复位,低电平复位) 制作简单的PCB: (一)、新建PCB工程,原理库和PCB,然后保存,可以修改名字但是后缀名不变,可以修改地址,但是三个地址保存在同一个文件夹中。 (二)、在空白处右击,opinion--- document opinion,修改纸张大小。 (三)、找系统的默认库文件(点开右侧的library之后,在点开libraries可以安装库文件。 (四)、在总工程上右击,点“add existing to project” 将自己的库加载到工程文件中,同时要保证自己的库与所新建的工程
[单片机]
简单的PCB制作——<font color='red'>单片机</font>的最小系统
基于51单片机的多功能计算器,支持二八十进制小数负数计算
硬件设计 工作原理 利用矩阵键盘进行按键的输入,通过对矩阵键盘的扫描,获取用户的输入,并实时的显示在1602液晶上,每次获取到输入时,根据软件设计的相应方法对输入进行处理、运算,输入结束后(以“=“为标志),将最终的运算结果输出的液晶上。 仿真图1: (LCD1602显示,支持负数和进制运算及有限的连续运算,连续运算时候无法识别优先级,不支持小数;) 仿真图2: LCD1602显示,支持负数和小数及开根号,不支持连续运算; 程序设计1 #include reg51.h #include stdio.h #include intrins.h #include string.h #include mat
[单片机]
基于51<font color='red'>单片机</font>的多功能计算器,支持二八十进制小数负数计算
智能驾驶和ADAS及当前汽车域控制器MCU-AURIX TC397
AURIX微控制器TC3xx系列具有高达六核的高性能架构及其在连接性、安全性和功能安全方面的先进特性,非常适合于广泛的汽车和工业应用领域。除了发动机管理和变速器控制外,目标动力总成应用还包括电气和混合驱动的新系统。性能和强大的安全架构的结合使该系列成为支持下一代自动驾驶的领域控制和数据融合应用的理想选择,同时也是目前底盘域、动力域的理想选择。 最新的AURIX TC3xx微控制器也非常适合安全关键型应用,以支持清洁、自主和联网汽车。从传统的安全气囊、制动和动力转向,到使用雷达、激光雷达或凸轮技术的基于传感器的系统支持的故障操作系统。性能和强大的安全架构的结合使该系列成为支持下一层次自动驾驶的领域控制和数据融合应用的理想选择。
[汽车电子]
智能驾驶和ADAS及当前汽车域控制器<font color='red'>MCU</font>-AURIX TC397
基于STM32单片机的DLP1700显示电路、光路系统改进设计
DLP投影技术是应用美国德州仪器公司开发的数字微镜元件--DMD(Digital Micromirror Device)作为主要关键处理元件以实现数字光学处理过程的技术。DLP显示的色彩清晰度高、艳丽、细腻、逼真,且为全数字显示即可靠性极高,能在各类产品(如大屏幕数字电视、公司/家庭/专业会议投影机和数码相机(DLP Cinema))中提供最佳图像效果。目前,大部分的家用或商用DLP投影机都采用了单片结构,使得其便于移动携带,因而得到越来越广泛的应用。在目前应用发展的基础上,又对其结构的精简性、携带的方便性提出了更高的要求。传统的DLP投影仪是通过DVI接口接收外部信号,并且经过信号转换传送给DLP控制器来控制DLP的显示,占用的
[单片机]
基于STM32<font color='red'>单片机</font>的DLP1700显示电路、光路系统改进设计
关于使用GD32 MCU实现位带操作的指南
MCS-51单片机可以简单的将P1口的第2位独立操作,如P1.2=0;P1.2=1,就是这样把P1口的第三个脚(BIT2)置0置1。对于32位ARM MCU 我们可以像51单片机一样单独的对某个端口的某一个IO单独操作吗?答案是可以的。并且这样就引入了“位带操作”的概念。简而言之,为了能够实现单独的位控制,所以就有了位带这样的操作机制。 ARM Cortex-M3处理器采用哈佛结构,可以使用相互独立的总线来读取指令和加载/存储数据。指令代码和数据都位于相同的存储器地址空间,但在不同的地址范围。程序存储器,数据存储器,寄存器和I/O端口都在同一个线性的4 GB的地址空间之内。这是Cortex-M3的最大地址范围,因为它的地址总线
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
更多往期活动
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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