欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    【大学课件】定时计数器PPT.ppt

    • 资源ID:5986484       资源大小:517.51KB        全文页数:49页
    • 资源格式: PPT        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    【大学课件】定时计数器PPT.ppt

    第8章 定时/计数器,8.1 STC12C5410AD单片机的定时/计数器,8.2 STC12C5410AD的PCA/PWM模块,在计算机控制中可供选择的定时方法,(1)软件定时 执行一个循环程序来实现。(2)硬件定时 定时全部由硬件电路完成,不占用CPU时间,但需要通过改变电路的元件参数来调节定时时间,在使用控制上不够方便,同时增加了开发成本。(3)可编程定时器定时 由单片机内部的定时模块单元完成。,STC12C5410AD单片机内部有 两个16位的定时/计数器 四路可编程计数器阵列(Programmable Counter Array,PCA)/脉宽调制(Pulse Width Modulation,PWM)。,8.1 STC12C5410AD单片机的定时/计数器,1、定时/计数器的结构及工作原理,定时/计数器的核心是一个加1计数器,加1计数器的脉冲有两个来源,一个是外部脉冲源,另一个是系统的时钟振荡器。计数器对两个脉冲源之一进行输入计数,每输入一个脉冲,计数值加1。当计数到计数器为全1时,再输入一个脉冲就使计数值回零,同时从最高位溢出一个脉冲使特殊功能寄存器TCON(定时器控制寄存器)的某一位TF0或TF1置1,作为计数器的溢出中断标志。,单片机中的微处理器、寄存器TCON和TMOD与定时/计数器T0、T1之间的关系,2、定时/计数器方式和控制寄存器,定时器工作方式控制寄存器TMOD,M0,M1,C/,GATE,M0,M1,C/,GATE,00H,定时器0,定时器1,89H,复位值,D0,D1,D2,D3,D4,D5,D6,D7,地址,1)M1和M0:方式选择控制位。,2)C/,:功能选择位。用于“计数器”或“定时器”功能的选择。,3)GATE:门控位。GATE用于选通控制。,定时器控制寄存器 TCON,00H,IT0,IE0,IT1,IE1,TR0,TF0,TR1,TF1,88H,复位值,D0,D1,D2,D3,D4,D5,D6,D7,地址,1)TF1:定时器/计数器1溢出标志位。2)TR1:定时器T1的运行控制位。3)TF0:定时器/计数器0溢出标志位。4)TR0:定时器T0的运行控制位。TCON的03位与外部中断有关。,AUXR:辅助寄存器,000000XXB,-,-,ELVDI,ESPI,EADCI,UART_M0 x6,T1x12,T0 x12,8EH,复位值,D0,D1,D2,D3,D4,D5,D6,D7,地址,1)T0 x12:定时器0速度控制位。0:定时器0的速度是传统8051单片机定时器的速度,即12分频。1:定时器0的速度是传统8051单片机定时器速度的12倍,即不分频。2)T1x12:定时器1速度控制位。0:定时器1的速度是传统8051单片机定时器的速度,即12分频。1:定时器1的速度是传统8051单片机定时器速度的12倍,即不分频。UART_M0 x6用于设置UART模式0的速度,详细内容请见“串行通信”一章。,3、定时/计数器的工作方式,方式0,方式1,方式2,方式3,当工作于定时状态时,定时/计数器是对时钟周期进行计数,若对时钟进行12分频,则对每12个时钟周期计数。当晶振频率为6MHz,采用12分频时,计数的单位时间间隔为单位时间间隔Tu=,定时时间为:TC=XTu。其中,Tu为单位时间间隔,TC为定时时间。,4、定时/计数器量程的扩展,STC12C5410AD单片机中提供的定时/计数器可以使用户很方便地实现定时和对外部事件计数。但是在实际应用中,需要的定时时间或计数值可能超过定时/计数器的定时或计数能力,特别是当单片机的系统时钟频率较高时,定时能力就更为有限。为了满足需要,有时需要对单片机的定时计数能力进行扩展。定时能力和计数能力扩展的方法相同,在此主要对定时能力的扩展进行讨论,计数能力的扩展可参考定时能力扩展的方法进行。,=,s=2s,STC12C5410AD单片机的定时器/计数器0或1是对脉冲进行不断加1进行计数的,因此,不能直接将实际的计数值作为计数初值送入计数寄存器THX、TLX中,而必须将实际计数值以28、213、216为模求补,以补码作为计数初值设置THX和TLX。即应装入计数/定时器的初值为:,n=8,13或16,系统时钟频率为6MHz,进行12分频时,定时器的最大定时能力,扩展方法:,(1)软件扩展方法 扩展方法是在定时器中断服务程序中对定时器中断请求进行计数,当中断请求的次数达到要求的值时才进行相应的处理。例如,某事件的处理周期为1s,但由于受到最大定时时间的限制,无法一次完成定时,此时可以将定时器的定时时间设为以10ms为一个单位,启动定时器后的每一次定时器溢出中断产生10ms的定时,进入中断服务程序后,对定时器的中断次数进行统计,每100次定时器溢出中断进行一次事件的处理,然后再以同样的方式进入下一个周期的事件处理。,(2)硬件扩展方法 硬件扩展方法可以使用外接通用定时器芯片对单片机的定时能力进行扩展,如使用定时/计数器芯片8253,也可以利用单片机自身的资源对定时能力进行扩展。由于单片机的定时器没有对外输出引脚,所以两个16位的定时/计数器不能直接连在一起,可以通过单片机的端口P0P3实现连接。下图给出了一种具体的连接方法。,1)T0设置为16位定时器方式,当T0溢出时,执行T0的中断服务程序。在T0的中断服务程序中将P1.0取反。这样在P1.0将输出一个方波,其周期为T0定时时间的2倍。设T0的定时时间为TIME,则由P1.0输出的方波的周期为2TIME。2)T1设置为16位计数器方式,将P1.0输出的方波接到T1的定时器外部输入端T1(P3.5),作为定时/计数器1的外部计数脉冲,其每个周期的下降沿使T1加1。设计数器T1的计数脉冲数为COUNT,则当T1溢出时,总定时时间T为:T=2TIMECOUNT。,5、定时/计数器编程举例,定时/计数器的应用编程主要有两点:一是能正确初始化,包括写入控制字,进行时间常数的计算并装入;二是中断服务程序的编写,即在中断服务程序中编写实现定时完成的任务代码。一般情况下,定时/计数器初始化部分的步骤大致如下:(1)设置工作方式,将控制字写入TMOD寄存器。(2)设置分频方式,将控制字写入AUXR寄存器。默认的情况是12分频(兼容传统8051单片机),因此,如果使用传统8051单片机模式,可以不进行设置。(3)把定时/计数初值装入TLX、THX寄存器。(4)置位ETX允许定时/计数器中断(如果需要)。(5)置位EA使CPU开放中断。(6)置位TRX以启动定时/计数。,【例8-l】设计利用定时计数器T0、T1端作为外部中断源输入线进行外部中断源扩充的程序。解:为了扩充外部中断源,可以利用定时计数器工作于计数状态时,T0(P3.4)或T1(P3.5)引脚上发生负跳变,计数器增1这一特性,把P3.4、P3.5作为外部中断源请求输入线,使计数器的计数值为-1(即0FFH),则外部T0、T1输入一个脉冲即计数溢出,从而置位相应的中断请求标志,以此来申请中断,则相当于扩充了一根/INT线。编程时,将T0置为方式2计数,计数初值0FFH,计数输入端T0(P3.4)发生一次负跳变,计数器加1并产生溢出标志向CPU申请中断,中断处理程序使累加器A内容减1,送P1口,然后返回主程序。汇编语言程序清单如下:,$include(STC12.INC);包含STC12C5410AD单片机寄存器定义文件ORG 0000H LJMP MAIN;转主程序ORG 000BH;定时器T0中断服务程序入口地址LJMP T0_ISR;转中断服务程序ORG0100H;主程序的存放起始地址 MAIN:MOV SP,#60H;给栈指针赋初值MOV TMOD,#06H;定时器T0工作于方式2MOV TL0,#0FFH;送时间常数MOV TH0,#0FFHSETB ET0;允许T0中断SETB EA;CPU开中断SETB TR0;启动T0计数器HERE:LJMP HERE;等待T0_ISR:DEC A;T0中断服务程序 MOV P1,A;累加器A内容减1送P1口 RETIEND,对应的C语言程序如下:#include“stc12.h”/包含STC12C5410AD单片机寄存器定义文件 unsigned char cnt;void timer0_ISR(void)interrupt 1/T0中断函数 cnt=cnt-;/在C语言程序中,使用变量cnt代替汇编语言中的累加器A P1=cnt;void main(void)cnt=0 xff;TMOD=0 x06;/定时器0工作于方式2 TL0=0 xff;TH0=0 xff;TR0=1;ET0=1;EA=1;while(1);/等待中断,【例8-2】设系统时钟频率为6MHz,利用定时器T0定时,每隔1s将P1.0的状态取反。,思路:将定时器的定时时间设为50ms,在中断服务程序中对定时器溢出中断请求进行计数,当计够20次时,将P1.0的状态取反,否则直接返回主程序。选择定时器T0的工作方式:软件启动、定时方式、16位定时器,方式字为01H。由于系统时钟频率为6MHz,12分频时,计数单位为2s。定时器T0的装入初值为,汇编语言程序代码如下:$include(STC12.INC);包含STC12C5410AD单片机寄存器定义文件 ORG 0000H LJMP MAIN;转主程序 ORG 000BH;T0中断服务程序入口地址 LJMP T0_ISR ORG 0100HMAIN:MOV SP,#60H;设置堆栈指针 MOV TMOD,#01H;T0初始化 MOV TL0,#58H MOV TH0,#9EH MOV A,#20;累加器A置20 SETB TR0;启动T0计数 SETB ET0;允外T0中断 SETB EA;CPU开中断 SJMP$;等待T0_ISR:MOV TL0,#58H MOV TH0,#9EH DEC A;累加器A内容减1 JNZ EXIT CPL P1.0 MOV A,#20;累加器A重载20EXIT:RETI END,对应的C语言程序如下:#include“stc12.h”/包含STC12C5410AD单片机的寄存器定义文件 sbit P10=P10;/声明P1.0的位变量unsigned char i;/声明计数变量。在C语言程序中,不能使用ACCvoid timer0_ISR(void)interrupt 1/定时器T0中断函数 TL0=0 x58;/重新装入时间常数 TH0=0 x9E;i-;/计数变量减1 if(i=0)/若减到0,则将P1.0取反 P10=!P10;i=20;/重新给计数变量赋值 void main(void)/SP=0 x60;/使用C语言设计程序时,可以不设置堆栈指针 TMOD=0 x01;TL0=0 x58;TH0=0 x9E;i=20;/计数变量赋初值 TR0=1;/启动T0计数 ET0=1;/允许T0中断 EA=1;/开放总的中断 while(1);/等待中断,【例8-3】设晶振频率为6MHz,定时/计数器T0工作于方式2,产生500s定时中断,在中断服务程序中把累加器A的内容减1,然后送P1口显示。,$include(STC12.INC);包含STC12C5410AD单片机寄存器定义文件ORG0000H LJMP MAIN;转主程序ORG 000BH;T0中断服务程序LJMPT0_ISRORG0030HMAIN:MOVSP,#60H MOVA,#0FFHMOVTMOD,#02H;T0初始化MOVTL0,#06H;送500s时间常数MOVTH0,#06HSETBET0;允许T0中断SETBEA;CPU开中断SETBTR0;启动T0计数SJMP$;等待T0_ISR:DEC A;累加器A内容减1送P1口MOVP1,ARETIEND,对应C语言程序如下:#include“stc12.h”unsigned char cnt;void T0_ISR(void)interrupt 1cnt-;P1=cnt;void main(void)cnt=0 xff;TMOD=0 x02;TL0=0 x06;TH0=0 x06;ET0=1;/允许T0中断 EA=1;/CPU开中断TR0=1;/启动T0计数 while(1);/等待中断,解:以T0为例,下面列出实现这一方法的关键代码,完整的程序,请读者自行编写。MOV TMOD,#09H;T0初始化,T0工作于方式1、定时、GATE置1 MOV TL0,#00H MOV TH0,#00H JNB P3.2,$;等待升高 SETB TR0 JB P3.2,$;等待下降 CLR TR0;关T0 MOV A,TL0;T0内容高8位送B,低8位送A MOV B,TH0;计算脉宽或送显示器显示,【例8-4】利用定时器的门控方式可以实现正脉冲的脉宽测量。当GATE=1,TRX=1,只有/INTX引脚输入高电平时,TX才被允许计数,利用这一特点,可测量/INTX引脚上正脉冲的宽度,如下图所示。,6、定时/计数器应用中应注意的问题,(1)定时/计数器的实时性 大多数应用场合可忽略不计,但对某些要求实时性苛刻的场合,应采用补偿措施。(2)动态读取运行中的计数值 在动态读取运行中的定时/计数器的计数值时,如果不加注意,就可能出错。这是因为不可能在同一时刻同时读取THX和TLX中的计数值。一种可避免读错的方法是:先读THX,后读TLX,重读THX,将两次读得的THX进行比较;若两次读得的值相等,则可确定读的值是正确的,否则重复上述过程,重复读得的值一般不会再错。,8.2 STC12C5410AD的PCA/PWM模块,1、PCA/PWM模块的结构,PCA/PWM含有一个特殊的16位定时器,有4个16位的捕获/比较模块与之相连。,16位PCA定时器/计数器的结构,寄存器CH和CL的内容是自由递增计数的16位PCA定时器的值。定时器的计数源由特殊功能寄存器CMOD的CPS1和CPS0位确定四种中的一种。CMOD中的CIDL位,用于控制空闲模式下是否允许停止PCA;CMOD中的ECF位用于中断控制,置位时,使能PCA中断。当PCA定时器溢出时,将PCA计数溢出标志CF置位。CCON中的CR为PCA的运行控制位。置位CR位时,运行PCA。清零CR位时,关闭PCA。CCON中还包括PCA定时器标志(CF)以及各个模块的标志(CCF3/CCF2/CCF1/CCF0)。当PCA计数器溢出时,CF位置位,如果CMOD寄存器的ECF位置位,就产生中断。CF位只能通过软件清除。CCON寄存器的位03是PCA各个模块的标志,当发生匹配或比较时由硬件置位。这些标志只能通过软件清除。所有模块共用一个中断向量。可以在中断服务程序中判断CCF0CCF3,以判断到底是哪个模块产生了中断。,2、PCA/PWM模块的特殊功能寄存器,(1)PCA工作模式寄存器(CMOD),0XXXX000B,ECF,CPS0,CPS1,-,-,-,-,CIDL,D9H,复位值,D0,D1,D2,D3,D4,D5,D6,D7,地址,1)CIDL:空闲模式下是否停止PCA计数的控制位。CIDL=0时,空闲模式下PCA计数器继续计数。CIDL=1时,空闲模式下PCA计数器停止计数。2)CPS1、CPS0:PCA计数脉冲源选择控制位。PCA计数脉冲选择如表8-3所示(见教材P159)。3)ECF:PCA计数器溢出中断使能位。ECF=1时,允许寄存器CCON中CF位的中断。ECF=0时,禁止寄存器CCON中CF位的中断。,2、PCA/PWM模块的特殊功能寄存器,(2)PCA控制寄存器(CCON),00XX0000B,CCF0,CCF1,CCF2,CCF3,-,-,CR,CF,D8H,复位值,D0,D1,D2,D3,D4,D5,D6,D7,地址,1)CF:PCA计数器溢出标志位。当PCA计数器溢出时,CF位由硬件置位。如果CMOD寄存器的ECF位置位,CF标志可用来产生中断。CF位可通过硬件或软件置位,但只能通过软件清零。2)CR:PCA计数器的运行控制位。通过软件置位CR位时,启动PCA计数器计数;清零CR位时,关闭PCA计数器。3)CCF3/CCF2/CCF1/CCF0:PCA各个模块的标志(CCF0对应模块0,CCF1对应模块1,CCF2对应模块2,CCF3对应模块3)。当发生匹配或比较时由硬件置位相应的标志位。这些标志只能通过软件清除。,2、PCA/PWM模块的特殊功能寄存器,(3)PCA比较/捕获工作模式寄存器CCAPMn,1)ECOMn:允许比较器功能控制位。ECOMn=1时,允许比较器功能。2)CAPPn:正捕获控制位。CAPPn=1时,允许上升沿捕获。3)CAPNn:负捕获控制位。CAPNn=1时,允许下降沿捕获。4)MATn:匹配控制位。当MATn=1时,PCA计数值与模块的比较/捕获寄存器的值匹配时,将置位CCON寄存器的中断标志位CCFn。5)TOGn:翻转控制位。当TOGn=1时,工作于PCA高速输出模式,PCA计数器的值与模块的比较/捕获寄存器的值匹配时,将使CEXn脚(CEX0/P3.7,CEX1/P3.5,CEX2/P2.0,CEX3/P2.4)翻转。6)PWMn:脉宽调制模式。当PWMn=1时,CEXn脚用作脉宽调制输出。7)ECCFn:使能CCFn中断。使能寄存器CCON的比较/捕获标志CCFn,用来产生中断。,X0000000B,ECCFn,PWMn,TOGn,MATn,CAPNn,CAPPn,ECOMn,-,复位值,D0,D1,D2,D3,D4,D5,D6,D7,2、PCA/PWM模块的特殊功能寄存器,PCA模块的工作模式设定,8位PWM,0,1,0,0,0,0,1,16位高速输出,X,0,1,1,0,0,1,16位软件定时器,X,0,0,1,0,0,1,16位捕获模式,由CEXn的跳变触发,X,0,0,0,1,1,X,16位捕获模式,由CEXn的下降沿触发,X,0,0,0,1,0,X,16位捕获模式,由CEXn的上升沿触发,X,0,0,0,0,1,X,无此操作,0,0,0,0,0,0,0,模块功能,ECCFn,PWMn,TOGn,MATn,CAPNn,CAPPn,ECOMn,2、PCA/PWM模块的特殊功能寄存器,(4)PCA/PWM模块寄存器PCA_PWMn,XXXXXX00B,EPCnL,EPCnH,-,-,-,-,-,-,复位值,D0,D1,D2,D3,D4,D5,D6,D7,1)EPCnH:在PWM模式下,与CCAPnH组成9位数。2)EPCnL:在PWM模式下,与CCAPnL组成9位数。(5)PCA的16计数器低8位CL和高8位CH。它们用于保存PCA的装载值。(6)PCA捕捉/比较寄存器CCAPnL(低位字节)和CCAPnH(高位字节)用于保存各个模块的捕捉计数值。,3、PCA/PWM模块的工作模式,(1)捕获模式,3、PCA/PWM模块的工作模式,(2)16位软件定时器模式,3、PCA/PWM模块的工作模式,(3)高速输出模式,3、PCA/PWM模块的工作模式,(4)脉宽调节模式,开漏,开漏,PWM无效,仅为输入/高阻,强推挽输出/强上拉输出,要加输出限流电阻1K-10K,强推挽输出/强上拉输出,强推挽输出/强上拉输出,要加输出限流电阻1K-10K,弱上拉/准双向口,PWM输出时的状态,PWM之前的状态,I/O口作为PWM使用时的状态,4、PCA/PWM模块的应用,一般情况下,PCA/PWM模块的初始化部分大致如下:(1)设置PCA/PWM模块的工作方式,将控制字写入CMOD、CCON和CCAPMn寄存器。(2)设置捕捉寄存器CCAPnL(低位字节)和CCAPnH(高位字节)初值。(3)将ECF/ECCF0/ECCF1/ECCF2/ECCF3中需置1的位置1。(4)开PCA 中断和 LVD(低压检测)中断共享的总中断控制位(使得EPCA_LVD=1)。(5)开整个单片机所有中断共享的总中断控制位EA(使得EA=1)。(6)启动 PCA 计数器(CH,CL)计数(使得CR=1)。,【例8-5】利用PCA 功能扩展外部中断。将P3.7(PCA模块0)扩展为下降沿外部中断,将P3.5(PCA模块1)扩展为上升沿/下降沿都可触发的外部中断。,解:当PCA 模块工作在捕获模式时,对模块的外部CEXn输入的跳变进行采样。当采样到有效跳变时,PCA硬件将PCA计数器阵列寄存器(CH和CL)的值装载到模块的捕获寄存器(CCAPnL和CCAPnH)中。如果CCON中的CCFn位和CCAPMn中的ECCFn位被置位,将产生中断。由此,可以将PCA模块作为扩展外部中断使用。按照要求,设置控制字时,PCA模块0应设为下降沿捕获(即CAPN0=1),PCA模块1应设为上升沿和下降沿都能捕获的方式(即CAPP1=1并且CAPN1=1)。,汇编语言程序清单如下:$include(STC12.inc);包含STC12C5410AD寄存器定义文件 ORG 0000H LJMP MAIN;转主程序ORG 0033H;PCA中断LJMP PCA_ISRORG 0050H MAIN:MOV SP,#7FH;初始化 PCA MOV CMOD,#10000000B;空闲模式下停止PCA 计数器工作;PCA 时钟源为fosc/12;禁止PCA 计数器溢出时中断 MOV CCON,#00H;清0 PCA计数器溢出中断请求标志位CF;CR=0,不允许PCA计数器计数;清0 PCA各模块中断请求标志位CCFnMOV CL,#00H;清0 PCA 计数器 MOV CH,#00H MOV CCAPM0,#11H;设置PCA模块0下降沿触发捕捉功能,ECCF0=1MOV CCAPM1,#31H;模块1上升/下降沿均可触发捕捉功能,ECCF1=1SETB EPCA_LVD;开PCA中断和LVD中断共享的总中断控制位SETB EA;开整个单片机所有中断共享的总中断控制位SETB CR;启动 PCA 计数器(CH,CL)计数 SJMP$;循环等待中断,;PCA中断服务程序PCA_ISR:PUSH ACC;保护现场PUSH PSWJNB CCF0,Not_PCA0;如果CCF0不等于1,就不是PCA模块0中断;直接去判是否是PCA模块1中断;PCA模块0中断服务程序 CPL P1.6;P1.6变化一次,表示PCA模块0发生了一次中断CLR CCF0;清PCA模块0中断标志Not_PCA0:JNB CCF1,PCA_Exit;CCF1不等于1,不是PCA模块1中断,直接退出;PCA模块1中断服务程序CPL P1.5;P1.5变化一次,表示PCA模块1发生了一次中断CLR CCF1;清PCA模块1中断标志PCA_Exit:POP PSW;恢复现场POP ACCRETI END,C语言版本的程序如下:#include“stc12.h”/包含STC12C5410AD寄存器定义文件sbit P15=P15;sbit P16=P16;void PCA_ISR(void)interrupt 6/PCA中断服务程序if(CCF0)/PCA模块0中断服务程序P16=!P16;/P1.6变化一次,表示PCA模块0发生了一次中断CCF0=0;/清PCA模块0中断标志else if(CCF1)/PCA模块1中断服务程序 P15=!P15;/P1.5变化一次,表示PCA模块1发生了一次中断CCF1=0;/清PCA模块1中断标志void main(void)/初始化PCA CMOD=0 x80;/#10000000B;空闲模式下停止PCA 计数器工作/PCA 时钟源为fosc/12,禁止PCA 计数器溢出时中断 CCON=0;/清0 PCA计数器溢出中断请求标志位CF/CR=0,不允许PCA计数器计数,清0 PCA各模块中断请求标志位CCFnCL=0;/清0 PCA 计数器 CH=0;CCAPM0=0 x11;/设置PCA模块0下降沿触发捕捉功能CCAPM1=0 x31;/设置PCA模块1上升/下降沿均可触发捕捉功能EPCA_LVD=1;/开PCA中断和LVD中断共享的总中断控制位EA=1;/开整个单片机所有中断共享的总中断控制位CR=1;/启动 PCA 计数器(CH,CL)计数 while(1);/等待中断,【例8-6】利用PCA 功能做定时器使用。利用PCA模块的软件定时功能,实现在P1.5输出脉冲宽度为 1 秒钟的方波。假设晶振频率fosc=18.432MHz。,解:在此,选择PCA模块0实现定时功能。通过置位CCAPM0寄存器的ECOM和MAT位,可使PCA模块0工作于软件定时器模式。定时时间的长短,主要取决于时钟源的选择以及PCA计数器计数值的设置。本例中,时钟频率fosc=18.432MHz,可以选择PCA模块的时钟源为fosc/12,基本定时时间单位T为5ms,对5ms计数200次以后,就实现了1秒钟的定时。通过计算,PCA计数器计数值为1E00H,可在中断服务程序中,将该值赋给CCAP0H,CCAP0L。,汇编语言程序清单如下:$include(STC12.inc);包含STC12C5410AD寄存器定义文件COUNTER EQU 30H;声明一个计数器,用来计数中断的次数 ORG 0000H LJMP MAIN;转主程序ORG 0033H;PCA中断入口地址LJMP PCA_ISRORG 0050HMAIN:MOV SP,#70H MOV COUNTER,#200;设置COUNTER计数器初值;初始化PCA模块MOV CMOD,#10000000B;空闲模式下停止PCA计数器工作;选择PCA的时钟源为fosc/12;禁止PCA计数器溢出时中断MOV CCON,#00H;清0 PCA计数器溢出中断请求标志位CF;CR=0,不允许 PCA 计数器计数;清0 PCA 各模块中断请求标志位CCFnMOV CL,#00H;清0 PCA 计数器 MOV CH,#00HMOV CCAP0L,#00H;给PCA模块0的CCAP0L置初值MOV CCAP0H,#1EH;给PCA模块0的CCAP0H 置初值MOV CCAPM0,#49H;设置PCA模块0为16位软件定时器;ECCF0=1允许PCA模块0中断;当CH,CL=CCAP0H,CCAP0L时,产生中断请求,CCF0=1,请求中断SETB EPCA_LVD;开PCA中断和LVD中断共享的总中断控制位SETB EA;开整个单片机所有中断共享的总中断控制位SETB CR;启动PCA计数器(CH,CL)计数SJMP$;循环等待中断,;PCA中断服务程序PCA_ISR:PUSH ACC;保护现场PUSH PSWMOV A,#00H;给CCAP0H,CCAP0L增加一个数值ADD A,CCAP0LMOV CCAP0L,A MOV A,#1EHADDC A,CCAP0HMOV CCAP0H,ACLR CCF0;清 PCA 模块0 中断标志DJNZ COUNTER,PCA_EXIT;中断计数没有减到0,直接退出MOV COUNTER,#200;恢复中断计数初值CPL P1.5;在P1.5输出脉冲宽度为1秒钟的方波PCA_EXIT:POP PSW POP ACC RETI END,对应的C语言程序如下:#include“stc12.h”/包含STC12C5410AD寄存器定义文件sbit P15=P15;unsigned char cnt;/中断计数变量void PCA_ISR(void)interrupt 6/PCA中断服务程序CCAP0L+=0;/给CCAP0H,CCAP0L增加一个数值CCAP0H+=0 x1e;CCF0=0;/清 PCA 模块0 中断标志cnt=cnt-;/修改中断计数 if(cnt=0)cnt=200;/恢复中断计数初值P15=!P15;/在P1.5输出脉冲宽度为1秒钟的方波void main(void)cnt=200;/设置COUNTER计数器初值/初始化PCA模块CMOD=0 x80;/#10000000B 空闲模式下停止PCA计数器工作/选择PCA的时钟源为fosc/12/禁止PCA计数器溢出时中断CCON=0;/清0 PCA计数器溢出中断请求标志位CF/CR=0,不允许 PCA 计数器计数/清0 PCA 各模块中断请求标志位CCFnCL=0;/清0 PCA 计数器 CH=0;CCAP0L=0;/给PCA模块0的CCAP0L置初值CCAP0H=0 x1e;/给PCA模块0的CCAP0H 置初值CCAPM0=0 x49;/设置PCA模块0为16位软件定时器/ECCF0=1允许PCA模块0中断/当CH,CL=CCAP0H,CCAP0L时,产生中断请求,CCF0=1,请求中断EPCA_LVD=1;/开PCA中断和LVD中断共享的总中断控制位EA=1;/开整个单片机所有中断共享的总中断控制位CR=1;/启动PCA计数器(CH,CL)计数while(1);/等待中断,【例8-7】利用PCA模块进行PWM输出。PWM脉冲由P3.5和P3.7输出。假设晶振频率 fosc=18.432MHz。,解:PWM无需中断支持,只需根据需要设置PCA模块的参数,并通过指令进行输出即可。PWM的占空比计算方法为:占空比=(pulse_width/256)*100%汇编语言程序如下:$include(STC12.INC);包含STC12C5410AD寄存器定义文件;定义常量;pulse_width_MAX=pulse_width_MIN 时,输出脉冲宽度不变。pulse_width_MAX EQU 0F0H;PWM 脉宽最大值,占空比=93.75%pulse_width_MIN EQU 10H;PWM 脉宽最小值,占空比=6.25%step EQU 38H;PWM 脉宽变化步长;定义变量 pulse_width EQU 30HORG 0000HLJMP MAINORG 0050HMAIN:MOV SP,#7FH MOV CMOD,#80H;PCA 在空闲模式下停止 PCA 计数器工作;PCA 时钟模式为fosc/12;禁止 PCA 计数器溢出中断 MOV CCON,#00H;禁止PCA计数器工作,清除中断标志、计数器溢出标志MOV CL,#00H;清0计数器 MOV CH,#00H,;-;设置模块0为8位PWM输出模式,脉冲在P3.7引脚输出MOV CCAPM0,#42H;核心语句,-0100,0010 MOV PCA_PWM0,#00H;核心语句;MOV PCA_PWM0,#03H;释放本行注释,PWM 输出就一直是 0,无脉冲。;-;设置模块1为8位PWM输出模式,PWM无需中断支持。脉冲在P3.5引脚输出MOV CCAPM1,#42H;核心语句,-0100,0010 MOV PCA_PWM1,#00H;核心语句;MOV PCA_PWM1,#03H;释放本行注释,PWM 输出就一直是0,无脉冲。SETB EPCA_LVD;开 PCA 中断 SETB EA;开总中断 SETB CR;将PCA 计数器打开 MAIN_LOOP:LCALL PWMOUTLJMP MAIN_LOOP;-PWMOUT:;可以使用示波器观察P3.5的波形;如果P3.5连接一个LED,则连接到P3.5的LED逐渐变亮MOV A,#pulse_width_MIN;为输出脉冲宽度设置初值MOV pulse_width,A;pulse_width数字越大脉宽越窄,LED越亮PWM_LOOP1:MOV A,pulse_width;判是否到达最大值 CLR C SUBB A,#pulse_width_MAXJNC PWM_A;到达最大值就转到逐渐变暗 MOV A,pulse_width;设置脉冲宽度。数字越大,脉宽越窄,LED越亮MOV CCAP0H,A;核心语句 MOV CCAP1H,A;核心语句,MOV A,pulse_width;计算下一次输出脉冲宽度数值ADD A,#stepMOV pulse_width,ALCALL DELAY;在一段时间内保持输出脉冲宽度不变 LJMP PWM_LOOP1PWM_A:;如果P3.5连接一个LED,连接到P3.5的LED逐渐变暗MOV A,#pulse_width_MAX;为输出脉冲宽度设置初值MOV pulse_width,A;pulse_width 数字越大脉宽越窄,LED越亮PWM_LOOP2:MOV A,pulse_width;判是否到达最小值CLR C SUBB A,#pulse_width_MINJC PWM_B;到达最小值就返回。JZ PWM_B;到达最小值就返回。MOV A,pulse_width;设置脉冲宽度。数字越大、脉宽越窄,LED 越亮MOV CCAP0H,A;核心语句 MOV CCAP1H,A;核心语句 MOV A,pulse_width;计算下一次输出脉冲宽度数值CLR C SUBB A,#stepMOV pulse_width,A LCALL DELAY;在一段时间内保持输出脉冲宽度不变LJMP PWM_LOOP2PWM_B:RET,;-DELAY:CLR A MOV R1,A MOV R2,A MOV R3,#80H DELAY_LOOP:NOP NOP NOP DJNZ R1,DELAY_LOOPDJNZ R2,DELAY_LOOPDJNZ R3,DELAY_LOOPRET;-END【思考】写出对应的C语言程序,【例8-8】利用PCA模块1进行高速输出。假设晶振频率fosc=18.432MHz。从P3.5脚输出125.0KHz的方波脉冲。解:利用PCA模块的高速输出功能,可以进行高速脉冲输出。要激活高速输出模式,CCAPM1寄存器的TOG、MAT和ECOM位必须都置位。按照PCA高速输出模式介绍中的计算方法,通过计算,得到CCAP1L中的值应设置为42H。汇编语言程序如下:$include(STC12.INC);包含STC12C5410AD寄存器定义文件CCAPnL_Value EQU 25H;fosc=18.432MHz时,高速脉冲输出=124.540KHORG 0000H LJMP MAINORG 0033H;PCA中断入口地址LJMP PCA_ISRORG 0060H MAIN:MOV SP,#70H;设置堆栈指针;PCA模块初始化MOV CMOD,#00000010B;CIDL=0,PCA 计数器在空闲模式下继续工作;CPS1,CPS0=(0,1),PCA 计数器计数脉冲来源为系统时钟源fosc/2;ECF=0,禁止PCA计数器计数溢出中断MOV CCON,#00H;清除PCA计数器计数溢出中断标志CF;停止PCA计数器计数,CR=0;清除 模块 1 中断标志,CCF1=0;清除 模块0 中断标志,CCF0=0MOV CH,#00H;清0 PCA 计数器高8位MOV CL,#00H;清0 PCA 计数器低8位,;设置模块1为高速脉冲输出模式,脉冲在P3.5引脚输出MOV CCAPM1,#01001101B;PCA模块1为高速脉冲输出模式,允许触发中断MOV CCAP1L,#42H;给模块 1置初值 MOV CCAP1H,#0;给模块 1置初值,此句不可少;其它中断服务可能会使模块1高速脉冲输出的某个周期突然变得很大,因此,;必须将PCA中断的优先级设置为唯一的最高级,其它中断的优先级都要比它低。MOV IPH,#01000000B;PCA 中断的优先级设置为唯一的最高级MOV IP,#01000000BSETB EPCA_LVD;开 PCA 中断 SETB EA;开总中断 SETB CR;将PCA 计数器打开 SJMP$;循环等待中断;-PCA_ISR:;PCA中断服务程序PUSH ACC;4 Clock PUSH PSW;4 Clock CLR CCF1;1 Clock,清PCA模块1中断标志MOV A,#CCAPnL_Value;2 Clock ADD A,CCAP1L;3 Cloc

    注意事项

    本文(【大学课件】定时计数器PPT.ppt)为本站会员(sccc)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开