版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGEPAGE11第11章STC15F2K60S2单片机CCP/PCA/PWM模块例题例11.3利用PCA模块扩展外部中断。将PCA0(P1.1)引脚扩展为下降沿触发的外部中断,将PCA1(Pl.0)引脚扩展为上升沿/下降沿都可触发的外部中断。当Pl.1出现下降沿产生中断时,对P1.5取反;当Pl.0出现下降沿或上升沿时都会产生中断,对P1.6取反。P1.7输出驱动工作指示灯。解:与定时器的使用方法类似,PCA模块的应用编程主要有两点:一是正确初始化,包括写入控制字、捕捉常数的设置等;二是中断服务程序的编写,在中断服务程序中编写需要完成的任务的程序代码。PCA模块的初始化部分大致如下:①设置PCA模块的工作方式,将控制字写入CMOD、CCON和CCAPMn寄存器。②设置捕捉寄存器CCAPnL(低位字节)和CCAPnH(高位字节)初值。③根据需要,开放PCA中断,包括PCA定时器溢出中断(ECF)、PCA模块0中断(ECCF0)和PCA模块1中断(ECCF1),并将EA置l。④置位CR,启动PCA定时器计数(CH,CL)计数。汇编语言参考程序如下:∶定义单片机管脚$INCLUDE(STC15F2K60S2.INC);包含STC15F2K60S2寄存器定义文件LED_STARTEQUP1.7;定义输出引脚LED_PCA0_INT0EQUPl.6LED_PCA1_INT1EQUPl.5ORG 0000HLJMP MAINORG 003BH;PCA中断的中断矢量地址LJMP PCA_ISRORG 0050HMAIN∶MOVSP,#7FHCLRLED_START;点亮开始工作指示灯LCALLPCA_INITIATE;调PCA模块初始化程序SJMP$;原地踏步PCA_INITIATE∶MOVCMOD,#80H;设置PCA在空闲模式下停止PCA计数器工作;PCA模块的计数器时钟源源为fSYS/10;禁止PCA计数器溢出中断MOVCCON,#00H;停止PCA计数器计数MOVCL,#00H;清0PCA计数器MOVCH,#00HMOVCCAPM0,#11H;设置PCA模块0下降沿触发捕捉功能,;开放PCA模块0中断MOVCCAPM1,#31H;设置PCA模块1下降沿和上升沿触发捕捉功能;开放PCA模块1中断SETBEASETBCRRETPCA_ISR∶PUSHACCPUSHPSWJNBCCF0,NOT_PCA0;如果CCF0为1,执行PCA模块0中断服务程序;如果CCF0为0,转执行PCA模块1中断标志判断CPLLED_PCA0_INT0;Pl.6LED变化一次,表示PCA模块0发生了一次中断CLRCCF0;清0PCA模块0中断请求标志NOT_PCA0∶JNBCCF1,PCA_ISR_EXIT;如果CCF1为0,则不是PCA模块1中断,立即推出;如果CCF1为1,执行PCA模块1中断服务程序CPLLED_PCA1_INT1;Pl.5LED变化一次,表示PCA模块1发生了一次中断CLRCCF1;清0PCA模块1中断请求标志PCA_ISR_EXIT∶POPPSWPOPACCRETIENDC51参考程序如下#include“STC15F2K60S2.h”//包含STC15F2K60S2寄存器定义文件sbitLED_PCA0_INT0=Pl^5;sbitLED_PCA1_INT1=Pl^6;sbitLED_START=Pl^7;voidmain(void){LED_START=0;CMOD=0x80;//空闲模式下停止PCA模块计数,时钟源为fSYS/10,//禁止PCA计数器溢出中断CCON=0;//禁止PCA计数器计数CL=0;CH=0;CCAPM0=0xll;//设置PCA模块0下降沿触发捕捉功能,并开放中断CCAPM1=0x31;//设置PCA模块0下降沿和上升沿触发捕捉功能,并开放中断EA=1;//开放总中断CR=1;//启动PCA模块计数器计数while(1);}voidPCA_ISR(void)interrupt7//PCA中断服务程序{if(CCF0){//PCA模块0中断服务程序LED_PCA0_INT0=!LED_PCA0_INT0;//LED_PCA0取反输出,表示PCA模块0发生了中断CCF0=0;//清0PCA模块0中断标志}elseif(CCF1){//PCA模块0中断服务程序LED_PCA1_INT1=!LED_PCA1_INT1;//LED_PCA1取反输出,表示PCA模块1发生了中断CCF1=0;//清0PCA模块1中断标志}}例11.4利用PCA模块的软件定时功能,在P1.5引脚输出周期为2S的方波。设晶振频率为18.432MHZ.。解:通过置位CCAPM0寄存器的ECOM0位和MAT0位,使PCA模块0工作于软件定时器模式。定时时间的长短取决于PCA模块捕获寄存器(CCAPnH、CCAPnL)的值与PCA计数器的时钟源。本例中,系统频率不分频,即系统时钟频率等于晶振频率,所以fSYS=18.432MHz,可以选择PCA模块的时钟源为fSYS/12,基本定时时间单位T为5mS。对5mS计数200次,即可实现1S的定时,1S时间到,对P1.5输出取反,即可实现在P1.5引脚输出周期为2S的方波。通过计算,5mS对应的PCA计数器计数值为1E00H,在初始化时,CH、CL从0000H开始计数,将1E00H直接传送给PCA模块捕获寄存器(CCAPnH、CCAPnL),每次5mS时间到的中断服务程序中将该值加给(CCAPnH、CCAPnL)。P1.7连接开始工作指示灯,P1.6连接5mS闪烁指示灯,P1.5连接1S闪烁指示灯,所有LED灯都是低电平驱动。汇编语言参考程序如下:$INCLUDE(STC10C5A.INC);包含STC15F;定义单片机管脚LED_MCU_STARTEQUPl.7LED_5mS_FlashingEQUPl.6LED_1S_FlashingEQUP1.5;定义常量Channe0_5mS_HEQU1EH;模块05mS定时时间常数的高8位Channe0_5mS_LEQU00H;模块05mS定时时间常数的低8位;定义变量CounterEQU30H;定义一个计数器,用来计数模块05mS中断的次数ORG 0000HLJMP MAINORG 003BHLJMP PCA_interruptORG 0050HMAIN: CLRLED_MCU_START;点亮MCU开始工作指示灯MOVSP,#7FHMOVCounter,#0;清0Counter计数器LCALLPCA_Initiate;调PCA模块初始化程序SJMP$PCA_Initiate:MOVCMOD,#80H;设置PCA在空闲模式下停止PCA计数器工作;PCA模块的计数器时钟源源为fSYS/12;禁止PCA计数器溢出中断MOVCL,#00H;设置PCA定时器计数的初始值MOVCH,#00HMOVCCAP0L,#Channe0_5mS_L;给PCA模块0的CCAP0L赋定时初值MOVCCAP0H,#Channe0_5mS_H;给PCA模块0的CCAP0L赋定时初值MOVCCAPM0,#49H;设置PCA模块0为16位软件定时器;开放PCA模块0中断SETBEA;开放总中断SETBCR;启动PCA计数器(CH,CL)计数RETPCA_interrupt∶PUSHACCPUSHPSWCPLLED_5mS_Flashing;5mS中断一次,每次进中断将该灯状态取反MOVA,#Channe0_5mS_L;给[CCAP0H,CCAP0L]增加5mS所需计数值ADDA,CCAP0LMOVCCAP0L,AMOVA,#Channe0_5mS_HADDCA,CCAP0HMOVCCAP0H,ACLRCCF0;清0PCA模块0的中断请求标志INCCounter;中断次数计数器+1MOVA,CounterCLRCSUBBA,#200;检测过什中断了200次(1秒)JCPCA_Interrupt_Exit;检测是否中断了200次(1秒),若还没到立即跳转退出MOVCounter,#00HCPLLED_1S_FlashingPCA_Interrupt_Exit:POPPSWPOPACCRETIENDC51参考程序如下:#include“stc15f2k60s2.h”//包含STC15F2K60S2寄存器定义文件sbitLED_MCU_START=Pl^7;sbitLED_5mS_Flashing=Pl^6;sbitLED_1S_Flashing=Pl^5;unsignedcharcnt;voidmain(void){LED_MCU_START=0;cnt=200;//设置5mS计数器的初始值CMOD=0x80;//设置PCA在空闲模式下停止PCA计数器工作//PCA模块的计数器时钟源源为fSYS/12//禁止PCA计数器溢出中断CCON=0;//清零PCA各模块中断请求标志位CCFnCL=0;//PCA计数器从0000H开始计数CH=0;CCAP0L=0;//给PCA模块0的CCAP0L置初值CCAP0H=0xle;CCAPM0=0x49;//设置PCA模块0为16位软件定时器//开放PCA模块0中断EA=1;//开放总中断CR=1;//启动PCA计数器计数while(1);//原地踏步,等待中断}voidPCA_ISR(void)interrupt7//PCA中断服务程序{union//定义一个联合体{unsignedintnum;struct{//在联合体中定义-个结构unsignedcharHi,Lo;}Result;}temp;temp.Num=(unsignedint)(CCAP0H<<8)+CCAP0L+0xle00;CCAP0L=temp.Result.Lo;//取计算结果的低8位CCAP0H=temp.Result.Hi;//取计算结果的低8位CCF0=0;//清0PCA模块0中断请求标志LED_5mS_Flashing=!LED_5mS_Flashing;cnt--;//中断次数计数器减1if(cnt==0)//如果cnt为0,说明1S时间到{cnt=200;//恢复中断计数初值LED_1S_Flashing=!LED_1S_Flashing;//在Pl.6输出脉冲宽度为1秒钟的方波}}例11.5利用PCA模块1进行高速输出,从P1.6输出频率f为105KHZ的方波信号。设晶振频率为18.432MHZ.。解:通过置位CCAPM1寄存器的ECOM1、MAT1和TOG1位,使PCA模块1工作在高速输出模式。本例中,系统频率不分频,即系统时钟频率等于晶振频率,所以fSYS=18.432MHz,设选择PCA模块的时钟源为fSYS/2,设高速输出所需的计数次数的用CCAP1H_value和CCAP1L_value表示,则计算如下:INT(fSYS/(4×f))=INT(18432000/(4×105000))=37=25HCCAP1H_value=0,CCAP1L_value=25H在初始化时,CH、CL从0000H开始计数,将0025H直接传送给PCA模块捕获寄存器(CCAPnH、CCAPnL),每次匹配时中断服务程序中将该值加给(CCAPnH、CCAPnL)。P1.7连接开始工作指示灯,LED灯是低电平驱动;P1.4输出可连接示波器进行观测。汇编语言参考程序如下:$INCLUDE(STC10C5ACCAP1L_ValueEQU25H;定义定时初值或定时的增量LED_MCU_STARTEQUPl.7ORG 0000HLJMP MAINORG 003BLJMP PCA_interruptORG 0060HMAIN∶MOVSP,#70H;设置堆栈指针CLRLED_MCU_START;点亮开始工作指示灯LCALLPCA_initiate;调用PCA初始化程序MAIN_loop∶N0PN0PN0PSJMPMAIN_loopPCA_initiate∶MOVCH,#00HMOVCL,#00HMOVCMOD.#00000010B;设置PCA在空闲模式下停止PCA计数器工作;PCA模块的计数器时钟源源为fSYS/2;禁止PCA计数器溢出中断MOVCCON.#00H;清除PCA计数器(CH,CL)计数溢出中断标志MOVCCAPM1,#01001101B;设置PCA模块l为高速脉冲输出模式,允许中断MOVCCAP1L,#CCAP1L_Value;给模块1CCAP1L赋初值MOVCCAP1H,#0;给模块1CCAP1H赋初值MOVIPH,#10000000B;设置PCA中断的优先级为最高级MOVIP,#10000000BSETBEA;开总中断SETBCR;启动PCA计数器RETPCA_interrupt∶PUSHACCPUSHPSWCLRCCF1;清PCA模块1中断请求标志MOVA,#CCAP1L_Value;给PCA模块1捕获寄存器加定时递增量ADDA,CCAP1LMOVCCAP1L,ACLRAADDCA,CCAP1HMOVCCAP1H,APOPPSWPOPACCRETIEND例11.6利用PCA模块的PWM功能,在P1.1引脚输出占空比为25%的PWM脉冲。设晶振频率为18.432MHZ.。解:P1.1引脚对应PCA模块0的输出,PCA模块的计数时钟源决定PWM输出脉冲的周期,但与PWM的占空比无关,PWM的占空比=(256-(CCAP0L))/256=25%,所以CCAP0L的设定值为C0H。此外,PWM无需中断支持。汇编语言参考程序如下:$INCLUDE(STC15F2K60S2.INC)ORG0000HMOVCMOD,#02H;设置PCA计数时钟源MOVCH,#00H;设置PCA计数初始值MOVCL,#00HMOVCCAPM0,#42H;设置PCA模块为PWM功能MOVCCAP0L,#0C0H;设定PWM的脉冲宽度MOVCCAP0H,#0C0H;与CCAP0L相同,寄存PWM的脉冲宽度参数SETBCR;启动PCA计数器计数SJMP$;PWM功能启动完成,程序结束ENDC51参考程序如下:#include“STC15F2K60S2.h”//包含STC15F2K60S2寄存器定义文件voidmain(void){CMOD=0x02;//设置PCA计数时钟源CH=0x00;//设置PCA计数初始值CL=0x00;CCAPM0=0x42;//设置PCA模块为PWM功能CCAP0L=0xC0;//设定PWM的脉冲宽度CCAP0H=0xC0;//与CCAP0L相同,寄存PWM的脉冲宽度参数CR=1;//启动PCA计数器计数while(1);//PWM功能启动完成,程序结束}例11.7利用PCA模块的PWM功能,利用PCA模块0的PWM输出控制LED灯的亮度,使LED的亮度循环逐渐变亮与逐渐变暗。用P2口LED灯显示当前PWM的占空比。设晶振频率为18.432MHZ.。解:选择PCA模块的计数时钟源为fSYS/12,且系统时钟不分频,即系统时钟为RC时钟或晶振时钟,则PCA模块的计数时钟源频率为fOSC/12。PWM的占空比变化范围设定为:6.25%~93.75%,对应的PWM脉宽设定值为F0H~10H。汇编语言参考程序如下:$INCLUDE(STC15F2K60S2.INC);包含STC15F2K60S2寄存器定义文件;定义常量pulse_width_MAXEQU0F0H;PWM脉宽设定值的最大值,对应最小占空比6.25%pulse_width_MINEQU10H;PWM脉宽设定值的最小值,对应最小占空比93.75%stepEQU38H;PWM脉宽变化步长;定义变量pulse_widthEQU30H;PWM对应的设定值ORG0000H LJMPMAINORG0050HMAIN:MOVSP,#70HLCALLPCA_initiateMAIN_loop:LCALLPWMSJMPMAIN_loopPCA_initiate:MOVCMOD,#80H;设置PCA在空闲模式下停止PCA计数器工作;PCA模块的计数器时钟源源为fSYS/10;禁止PCA计数器溢出中断MOVCCON,#00H;禁止PCA计数器工作,清除中断标志、计数器溢出标志MOVCL,#00H;清0计数器MOVCH,#00HMOVCCAPM0,#42H;设置模块0PWM输出模式,PWM脉冲在Pl.3引脚输出MOVPCA_PWM0,#00H;设置模块0为8位SETBCRRETPWM:MOVA,pulse_width_MIN;为输出脉冲宽度设置初值MOVpulse_width,A;pulse_width数字越大,脉宽越窄,LED越亮PWM_loop1:MOVA,pulse_width;判是否到达最大值CLRCSUBBA,#pulse_width_MAXJNCPWM_a;达到最大值,转到逐渐变暗程序MOVA,pulse_width;取脉冲宽度对应的设定值
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农业技术员岗前工作合规化考核试卷含答案
- 2026吉林大学白求恩第一医院梅河健康研究院招聘考试模拟试题及答案解析
- 大学生消防安全设计素材
- 消防安全教育培训计划
- 营养健康表演
- 2026 三年级上册美术《画秋天的树叶》课件
- 2025新疆金石期货有限公司招聘总经理岗位笔试历年参考题库附带答案详解
- 2025广西南宁隆安县园林绿化所招聘笔试历年参考题库附带答案详解
- 2025广东广州市榄核咨询服务有限公司招聘1人笔试历年参考题库附带答案详解
- 2026八年级上《轴对称》知识点梳理
- 其他地区2025年昌都市政府系统急需紧缺人才引进招聘11人笔试历年参考题库附带答案详解(5卷)
- 中国中煤能源集团有限公司2026届高校毕业生春季招聘备考题库及答案详解(各地真题)
- 2026广东广州铁路运输法院合同制审判辅助人员招聘3人笔试参考题库及答案解析
- 2026年地铁行车调度业务实操试题
- 第三单元 认识国家制度 单元行动与思考 课件-2025-2026学年统编版道德与法治八年级下册
- 幕墙预埋件检测标准与操作指南
- 2025年湖南省农业信贷融资担保有限公司员工招聘笔试历年典型考点题库附带答案详解
- 2026广东省水利水电第三工程局有限公司校园招聘笔试历年典型考点题库附带答案详解
- 2025年心理健康教师招聘考试试题及答案
- 2026年四川省宜居宜业和美乡村建设整县试点申报指南
- 家庭基金内部管理制度
评论
0/150
提交评论