版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
会计学1第定时计数器与可编程计数器阵列7.1STC12C5A60S2单片机的定时/计数器
7.1.1定时/计数器的结构及工作原理
定时/计数器的核心是一个加1计数器,加1计数器的脉冲有两个来源,一个是外部脉冲源,另一个是系统的时钟振荡器。计数器对两个脉冲源之一进行输入计数,每输入一个脉冲,计数值加1。当计数到计数器为全1时,再输入一个脉冲就使计数值回零,同时从最高位溢出一个脉冲使特殊功能寄存器TCON(定时器控制寄存器)的某一位TF0或TF1置1,作为计数器的溢出中断标志。第1页/共49页单片机中的微处理器、寄存器TCON和TMOD与定时/计数器T0、T1之间的关系
第2页/共49页7.1.2定时/计数器的相关寄存器1、定时器工作方式控制寄存器TMOD(地址为89H,复位值为00H)
M0M1C/TGATEM0M1C/TGATE定时器0定时器1定时器D0D1D2D3D4D5D6D7位号M1M0工作方式功能说明00013位计数器01116位计数器102可自动装入的8位计数器113定时器0:分成两个8位计数器定时器1:停止计数1)M1和M0:方式选择控制位。2)C/:功能选择位。用于“计数器”或“定时器”功能的选择。3)GATE:门控位。GATE用于选通控制。位名称第3页/共49页2、定时器控制寄存器TCON(地址为88H,复位值为00H)1)TF1:定时器/计数器1溢出标志位。2)TR1:定时器T1的运行控制位。3)TF0:定时器/计数器0溢出标志位。4)TR0:定时器T0的运行控制位。TCON的0~3位与外部中断有关。IT0IE0IT1IE1TR0TF0TR1TF1位名称D0D1D2D3D4D5D6D7位号第4页/共49页3、AUXR:辅助寄存器(地址为8EH,复位值为00H)--ELVDIESPIEADCIUART_M0x6T1x12T0x12位名称D0D1D2D3D4D5D6D7位号与定时器速度相关的控制位有:1)T0x12:定时器0速度控制位。0:定时器0的速度是传统8051单片机定时器的速度,即12分频。1:定时器0的速度是传统8051单片机定时器速度的12倍,即不分频。2)T1x12:定时器1速度控制位。0:定时器1的速度是传统8051单片机定时器的速度,即12分频。1:定时器1的速度是传统8051单片机定时器速度的12倍,即不分频。如果UART串口用T1作为波特率发生器,T1x12位决定UART串口是12T还是1T。UART_M0x6、BRTR、S2SMOD、BRTx12和S1BRS用于控制UART串口的速度。EXTRAM用于设置是否允许使用内部1024字节的扩展RAM。第5页/共49页7.1.3定时/计数器的工作方式
方式0和方式1第6页/共49页方式2
第7页/共49页方式3第8页/共49页当工作于定时状态时,定时/计数器是对时钟周期进行计数,若对时钟进行12分频,则对每12个时钟周期计数。当晶振频率为6MHz,采用12分频时,计数的单位时间间隔为 单位时间间隔Tu=定时时间为:TC=XTu。其中,Tu为单位时间间隔,TC为定时时间。7.1.4定时/计数器量程的扩展
STC12C5A60S2单片机中提供的定时/计数器可以使用户很方便地实现定时和对外部事件计数。但是在实际应用中,需要的定时时间或计数值可能超过定时/计数器的定时或计数能力,特别是当单片机的系统时钟频率较高时,定时能力就更为有限。为了满足需要,有时需要对单片机的定时计数能力进行扩展。定时能力和计数能力扩展的方法相同,在此主要对定时能力的扩展进行讨论,计数能力的扩展可参考定时能力扩展的方法进行。s=2μsSTC12C5A60S2单片机的定时器/计数器0或1是对脉冲进行不断加1进行计数的,因此,不能直接将实际的计数值作为计数初值送入计数寄存器THX、TLX中,而必须将实际计数值以28、213、216为模求补,以补码作为计数初值设置THX和TLX。即应装入计数/定时器的初值为:n=8,13或16=第9页/共49页系统时钟频率为6MHz,进行12分频时,定时器的最大定时能力
T=(216-0)×2μs=131072μs=131.072ms16T=(213-0)×2μs=16384μs=16.384ms13T=(28-0)×2μs=512μs8最大定时能力位数扩展方法:(1)软件扩展方法扩展方法是在定时器中断服务程序中对定时器中断请求进行计数,当中断请求的次数达到要求的值时才进行相应的处理。例如,某事件的处理周期为1s,但由于受到最大定时时间的限制,无法一次完成定时,此时可以将定时器的定时时间设为以10ms为一个单位,启动定时器后的每一次定时器溢出中断产生10ms的定时,进入中断服务程序后,对定时器的中断次数进行统计,每100次定时器溢出中断进行一次事件的处理,然后再以同样的方式进入下一个周期的事件处理。第10页/共49页(2)硬件扩展方法硬件扩展方法可以使用外接通用定时器芯片对单片机的定时能力进行扩展,如使用定时/计数器芯片8253,也可以利用单片机自身的资源对定时能力进行扩展。由于单片机的定时器没有对外输出引脚,所以两个16位的定时/计数器不能直接连在一起,可以通过单片机的端口P0~P3实现连接。下图给出了一种具体的连接方法。1)T0设置为16位定时器方式,当T0溢出时,执行T0的中断服务程序。在T0的中断服务程序中将P1.0取反。这样在P1.0将输出一个方波,其周期为T0定时时间的2倍。设T0的定时时间为TIME,则由P1.0输出的方波的周期为2×TIME。2)T1设置为16位计数器方式,将P1.0输出的方波接到T1的定时器外部输入端T1(P3.5),作为定时/计数器1的外部计数脉冲,其每个周期的下降沿使T1加1。设计数器T1的计数脉冲数为COUNT,则当T1溢出时,总定时时间T为:T=2×TIME×COUNT。第11页/共49页7.1.5定时/计数器编程举例定时/计数器的应用编程主要有两点:一是能正确初始化,包括写入控制字,进行时间常数的计算并装入;二是中断服务程序的编写,即在中断服务程序中编写实现定时完成的任务代码。一般情况下,定时/计数器初始化部分的步骤大致如下:(1)设置工作方式,将控制字写入TMOD寄存器。(2)设置分频方式,将控制字写入AUXR寄存器。默认的情况是12分频(兼容传统8051单片机),因此,如果使用传统8051单片机模式,可以不进行设置。(3)把定时/计数初值装入TLX、THX寄存器。(4)置位ETX允许定时/计数器中断(如果需要)。(5)置位EA使CPU开放中断。(6)置位TRX以启动定时/计数。第12页/共49页
【例7-1】
设系统时钟频率为6MHz,利用定时器T0定时,每隔1s将P2.0的状态取反。思路:将定时器的定时时间设为50ms,在中断服务程序中对定时器溢出中断请求进行计数,当计够20次时,将P2.0的状态取反,否则直接返回主程序。选择定时器T0的工作方式:软件启动、定时方式、16位定时器,方式字为01H。由于系统时钟频率为6MHz,12分频时,计数单位为2μs。定时器T0的装入初值为第13页/共49页汇编语言程序代码如下:$INCLUDE(STC12C5A.INC);包含STC12C5A60S2寄存器定义文件 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 ET0 ;允外T0中断 SETB EA ;CPU开中断 SETB TR0 ;启动T0计数 SJMP $ ;等待T0_ISR: MOV TL0,#58H MOV TH0,#9EH ;重新装入时间常数 DEC A ;累加器A内容减1 JNZ EXIT CPL P2.0 MOV A,#20 ;累加器A重载20EXIT: RETI END第14页/共49页对应的C语言程序如下:#include“stc12c5a.h” //包含STC12C5A60S2的寄存器定义文件sbitP20=P2^0; //声明P2.0的引脚位变量unsignedchari; //声明计数变量。在C语言程序中,尽量不要使用ACCvoidmain(void){ //SP=0x60; //使用C语言设计程序时,可以不设置堆栈指针 TMOD=0x01; TL0=0x58; TH0=0x9E; i=20; //计数变量赋初值 ET0=1; //允许T0中断 EA=1; //开放总的中断 TR0=1; //启动T0计数 while(1); //等待中断}voidT0_ISR(void)interrupt1//定时器T0中断函数{ TL0=0x58; //重新装入时间常数 TH0=0x9E;
i--; //计数变量减1 if(i==0){ //若减到0,则将P2.0取反
P20=!P20;
//将P2.0取反
i=20; //重新给计数变量赋值
}}第15页/共49页解:以T0为例,下面列出实现这一方法的关键代码,完整的程序,请读者自行编写。
MOVTMOD,#09H;T0初始化,T0工作于方式1、定时、GATE置1MOVTL0,#00HMOVTH0,#00HJNBP3.2,$;等待升高SETBTR0JBP3.2,$;等待下降CLRTR0;关T0MOVA,TL0;T0内容高8位送B,低8位送AMOVB,TH0……;计算脉宽或送显示器显示
【例7-2】利用定时器的门控方式可以实现正脉冲的脉宽测量。当GATE=1,TRX=1,只有/INTX引脚输入高电平时,TX才被允许计数,利用这一特点,可测量/INTX引脚上正脉冲的宽度,如下图所示。注意教材上的思考问题!!!第16页/共49页定时/计数器应用中应注意的问题
(1)定时/计数器的实时性大多数应用场合可忽略不计,但对某些要求实时性苛刻的场合,应采用补偿措施。(2)动态读取运行中的计数值在动态读取运行中的定时/计数器的计数值时,如果不加注意,就可能出错。这是因为不可能在同一时刻同时读取THX和TLX中的计数值。一种可避免读错的方法是:先读THX,后读TLX,重读THX,将两次读得的THX进行比较;若两次读得的值相等,则可确定读的值是正确的,否则重复上述过程,重复读得的值一般不会再错。第17页/共49页7.2STC12C5A60S2单片机的可编程时钟输出STC12C5A60S2单片机提供了3路可编程时钟输出功能。7.2.1可编程时钟输出的相关寄存器1、掉电唤醒寄存器WAKE_CLKO(地址为8FH,复位值为00000000B)T0CLKOT1CLKOBRTCLKOLVD_WAKET1_PIN_IET1_PIN_IERXD_PIN_IEPCAWAKEUP位名称D0D1D2D3D4D5D6D7位号1)BRTCLKO:是否允许P1.0(CLKOUT2)脚输出时钟。 0:不允许BRT在P1.0(CLKOUT2)脚输出时钟。 1:允许P1.0(CLKOUT2)脚输出时钟,输出时钟频率=BRT溢出率/22)T1CLKO:是否允许T1(P3.5)脚输出溢出脉冲。 0:不允许T1(P3.5)脚输出溢出脉冲。 1:允许T1(P3.5)脚输出溢出脉冲,输出时钟频率=T1溢出率/23)T0CLKO:是否允许T0(P3.4)脚输出溢出脉冲。 0:不允许T0(P3.4)脚输出溢出脉冲。 1:允许T0(P3.4)脚输出溢出脉冲,输出时钟频率=T0溢出率/2第18页/共49页2、辅助寄存器AUXR(地址为8EH,复位值为00H)S1BRSEXTRAMBRTx12S2SMODBRTRUART_M0x6T1x12T0x12位名称D0D1D2D3D4D5D6D7位号其中,与CLKOUT2/P1.0时钟输出有关的位有:1)BRTx12:CLKOUT2/P1.0的时钟输出频率控制位。0:独立波特率发生器工作在12T模式。CLKOUT2工作在12T模式时的输出频率CLKOUT2=(Fosc/2)/12/(256-BRT)1:独立波特率发生器工作在1T模式。
CLKOUT2工作在1T模式时的输出频率CLKOUT2=(Fosc/2)/(256-BRT)2)BRTR:独立波特率发生器运行控制位。0:不允许独立波特率发生器运行。1:允许独立波特率发生器运行。如果需要从CLKOUT2/P1.0脚输出时钟,需要在用户程序中进行下面的设置:1)对BRT寄存器送8位重装载值(使用“BRT=#reload_data;”语句);2)对AUXR寄存器中的BRTR位置1,让独立波特率发生器运行;3)对WAKE_CLKO寄存器中的BRTCLKO位置1,让独立波特率发生器的溢出在P1.0口输出时钟。第19页/共49页7.2.2可编程时钟输出的编程实例【例7-3】设时钟频率Fosc=18.432MHz,设计程序,从P1.0/CLKOUT2引脚输出频率为124.540KHz的时钟;从T0(P3.4)引脚输出频率为125KHz的时钟;从T1(P3.5)引脚输出频率为38.4KHz的时钟。解:使用STC12C5A60S2的可编程时钟输出功能完成所需要求。在下面的程序设计中(在此只给出C语言程序),T0、T1和独立波特率发生器BRT均工作在1T模式。程序编制如下:#include"stc12c5a.h"//包含STC12C5A60S2的寄存器定义头文件voidmain(void){TMOD=0x22;//T0和T1工作在方式2,8位自动重装计数器
AUXR=AUXR|0x80;//T0工作在1T模式
AUXR=AUXR|0x40;//T1工作在1T模式
AUXR=AUXR|0x04;//独立波特率发生器工作在1T模式//设置BRT的8位自动重装计数初值,输出时钟频率124.540KHzBRT=(256-74);//设置T0的8位自动重装计数初值,输出频率18432000/2/74=124540.54约为125KHzTH0=(256-74);//设置T1的8位自动重装计数初值,输出时钟频率18432000/2/240=38400HzTH1=(256-240);WAKE_CLKO=WAKE_CLKO|0x07;//允许T0,T1,独立波特率发生器输出时钟
TR0=1;//启动T0开始计数,对系统时钟进行分频输出
TR1=1;//启动T1开始计数,对系统时钟进行分频输出
AUXR=AUXR|0x10;//启动BRT工作,对系统时钟进行分频输出//至此时钟已经输出,用户可以通过示波器观看到输出的时钟频率
while(1);}第20页/共49页7.3STC12C5A60S2的可编程计数器阵列模块7.3.1
PCA模块的结构
PCA/PWM含有一个特殊的16位定时器,有2个16位的捕获/比较模块与之相连。模块0连接到P1.3/CCP0(可以通过AUXR1寄存器设置切换到P4.2/CCP0/MISO口),模块1连接到P1.4/CCP1(可以通过AUXR1寄存器设置切换到P4.3/CCP1/SCLK口)。每个模块可编程工作在4种模式:上升/下降沿捕获、软件定时器、高速输出或可调制脉冲输出。第21页/共49页16位PCA定时器/计数器的结构寄存器CH和CL的内容是自动递增计数的16位PCA定时器的值。PCA定时器的时钟源有以下几种:1/12振荡频率、1/8振荡频率、1/6振荡频率、1/4振荡频率、1/2振荡频率、振荡频率、定时器0溢出或ECI脚的输入(P1.2)。定时器的计数源可通过设置特殊功能寄存器CMOD的CPS2、CPS1和CPS0位选择其中一种。CMOD中的CIDL位用于控制空闲模式下是否允许停止PCA;CMOD中的ECF位用于中断控制,置位时,使能PCA中断。当PCA定时器溢出时,PCA计数溢出标志CF置位。CCON中的CR位是PCA的运行控制位。CR=1时,运行PCA。CR=0时,关闭PCA。CCON中还包括PCA定时器标志(CF)以及各个模块的标志(CCF1/CCF0)。当PCA计数器溢出时,CF位置位,如果CMOD寄存器的ECF位置位,就产生中断。CF位只能通过软件清除。CCON寄存器中的CCF0是PCA模块0的标志,CCF1是模块1的标志。当发生匹配或比较时由硬件置位。这些标志也只能通过软件清除。所有模块共用一个中断向量,可以在中断服务程序中判断CCF0和CCF1,以确定到底是哪个模块产生了中断。第22页/共49页7.3.2PCA/PWM模块的特殊功能寄存器1、PCA工作模式寄存器CMOD(地址为D9H,复位值为0XXX0000B)ECFCPS0CPS1CPS2---CIDL位名称D0D1D2D3D4D5D6D7位号1)CIDL:空闲模式下是否停止PCA计数的控制位。CIDL=0时,空闲模式下PCA计数器继续计数。CIDL=1时,空闲模式下PCA计数器停止计数。2)CPS2、CPS1、CPS0:PCA计数脉冲源选择控制位。PCA计数脉冲选择如表7-3所示(见教材)。3)ECF:PCA计数器溢出中断使能位。ECF=1时,允许寄存器CCON中CF位的中断。ECF=0时,禁止寄存器CCON中CF位的中断。第23页/共49页2、PCA控制寄存器CCON(地址为D8H,复位值为00XXXX00B)CCF0CCF1----CRCF位名称D0D1D2D3D4D5D6D7位号1)CF:PCA计数器溢出标志位。当PCA计数器溢出时,CF位由硬件置位。如果CMOD寄存器的ECF位置位,CF标志可用来产生中断。CF位可通过硬件或软件置位,但只能通过软件清零。2)CR:PCA计数器的运行控制位。通过软件置位CR位时,启动PCA计数器计数;清零CR位时,关闭PCA计数器。3)CCF1/CCF0:PCA各个模块的标志(CCF0对应模块0,CCF1对应模块1)。当发生匹配或比较时由硬件置位相应的标志位。这些标志只能通过软件清除。第24页/共49页3、PCA比较/捕获工作模式寄存器CCAPMn(n=0,1,下同。地址分别对应DAH和DBH,复位值均为X0000000B)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,用来产生中断。位名称ECCFnPWMnTOGnMATnCAPNnCAPPnECOMn-位号D0D1D2D3D4D5D6D7第25页/共49页PCA模块的工作模式设定16位高速输出4DHX01100116位软件定时器49HX00100116位捕获模式,由CEXn的跳变触发31HX00011X16位捕获模式,由CEXn的下降沿触发11HX00010X16位捕获模式,由CEXn的上升沿触发21HX00001X8位PWM输出,由低变高或者由高变低均可产生中断73H11001118位PWM输出,由高变低可产生中断53H11001018位PWM输出,由低变高可产生中断63H11000118位PWM,无中断42H0100001无此操作00H0000000模块功能可设数值ECCFnPWMnTOGnMATnCAPNnCAPPnECOMn第26页/共49页4、PCA/PWM模块寄存器PCA_PWMn(n=0、1,分别对应模块0和模块1,地址分别为F2H和F3H,复位值均为XXXXXX00B
)1)EPCnH:在PWM模式下,与CCAPnH组成9位数。2)EPCnL:在PWM模式下,与CCAPnL组成9位数。5、PCA的16计数器低8位CL和高8位CH。它们用于保存PCA的装载值。6、PCA捕捉/比较寄存器CCAPnL(低位字节)和CCAPnH(高位字节)用于保存各个模块的捕捉计数值。EPCnLEPCnH------位名称D0D1D2D3D4D5D6D7位号第27页/共49页7.3.3
PCA/PWM模块的工作模式1、捕获模式第28页/共49页2、16位软件定时器模式第29页/共49页3、高速输出模式第30页/共49页4、脉宽调节模式开漏开漏PWM无效仅为输入/高阻强推挽输出/强上拉输出,要加输出限流电阻1KΩ-10KΩ强推挽输出/强上拉输出强推挽输出/强上拉输出,要加输出限流电阻1KΩ-10KΩ弱上拉/准双向口PWM输出时的状态PWM之前的状态
I/O口作为PWM使用时的状态第31页/共49页7.3.4PCA/PWM模块的应用(1)设置PCA模块的工作方式,将控制字写入CMOD、CCON和CCAPMn寄存器。(2)设置捕捉寄存器CCAPnL(低位字节)和CCAPnH(高位字节)初值。(3)根据需要,开放PCA中断,将ECF/ECCF0/ECCF1需要置1的置1,并将EA置1。(4)启动PCA计数器(CH,CL)计数(使CR=1)。第32页/共49页【例7-4】利用PCA模块扩展外部中断。将P1.3(PCA模块0的外部输入)扩展为下降沿触发的外部中断,将P1.4(PCA模块1的外部输入)扩展为上升沿/下降沿都可触发的外部中断。当P1.3出现下降沿时产生中断,对P1.5取反;当P1.4出现下降沿或上升沿时都产生中断,对P1.6取反。(P1.5和P1.6可连接LED指示灯指示状态。)解:当PCA模块工作在捕获模式时,对外部输入CEXn的跳变进行采样。当采样到有效跳变时,PCA硬件将PCA计数器阵列寄存器(CH和CL)的值装载到捕获寄存器(CCAPnH和CCAPnL)中。如果CCON中的CCFn位和CCAPMn中的ECCFn位被置位,将产生中断。由此,可以将PCA模块作为扩展外部中断使用。按照要求,设置控制字时,PCA模块0应设为下降沿捕获(即CAPP0=0并且CAPN0=1),PCA模块1应设为上升沿和下降沿都能捕获的方式(即CAPP1=1并且CAPN1=1)。第33页/共49页汇编语言程序清单如下:$INCLUDE(STC12C5A.INC);包含STC12C5A60S2寄存器定义文件LED_PCA0EQUP1.5LED_PCA1EQUP1.6 ORG0000H LJMPMAIN ;转主程序
ORG003BH ;PCA中断
LJMPPCA_ISR
ORG0050HMAIN: MOVSP,#70H
;初始化PCA
MOVCMOD,#10000000B;空闲模式下停止PCA计数器工作;PCA时钟源为FOSC/12,禁止PCA计数器溢出时中断
MOVCCON,#00H;清零PCA计数器溢出中断请求标志位CF;CR=0,不允许PCA计数器计数;清零PCA各模块中断请求标志位CCFn
MOVCL,#00H
;清零PCA计数器
MOVCH,#00H
MOVCCAPM0,#11H;设置PCA模块0下降沿触发捕捉功能,ECCF0=1
MOVCCAPM1,#31H;模块1上升/下降沿均可触发捕捉功能,ECCF1=1
SETBEA;开整个单片机所有中断共享的总中断控制位
SETBCR;启动PCA计数器(CH,CL)计数
SJMP$;循环等待中断第34页/共49页;--------------PCA中断服务程序-------------------------PCA_ISR:
JNBCCF0,Not_PCA0 ;如果CCF0不等于1,则不是PCA模块0中断;直接去判是否是PCA模块1中断
;PCA模块0中断服务程序
CPLLED_PCA0;LED_PCA0取反,表示PCA模块0发生了一次中断
CLRCCF0;清PCA模块0中断标志Not_PCA0:
JNBCCF1,PCA_Exit;CCF1不等于1,不是PCA模块1中断,直接退出
;PCA模块1中断服务程序
CPLLED_PCA1;LED_PCA1取反,表示PCA模块1发生了一次中断
CLRCCF1
;清PCA模块1中断标志PCA_Exit:
RETI
END第35页/共49页C语言版本的程序如下:#include“stc12c5a.h”//包含STC12C5A60S2寄存器定义文件sbitLED_PCA0=P1^5;sbitLED_PCA1=P1^6;voidmain(void){
CMOD=0x80;//空闲模式下停止PCA计数器工作
//PCA时钟源为FOSC/12,禁止PCA计数器溢出时中断
CCON=0;//清零PCA计数器溢出中断请求标志位CF
//CR=0,不允许PCA计数器计数;PCA各模块中断请求标志位CCFn清零
CL=0;//PCA计数器清零
CH=0;
CCAPM0=0x11;//设置PCA模块0下降沿触发捕捉功能
CCAPM1=0x31;//设置PCA模块1上升/下降沿均可触发捕捉功能
EA=1;//开整个单片机所有中断共享的总中断控制位
CR=1;//启动PCA计数器(CH,CL)计数 while(1);
//等待中断}voidPCA_ISR(void)interrupt7//PCA中断服务程序{
if(CCF0)//PCA模块0中断服务程序
{
LED_PCA0=!LED_PCA0;//LED_PCA0取反,表示PCA模块0发生了中断
CCF0=0;//清PCA模块0中断标志
}
elseif(CCF1)//PCA模块1中断服务程序
{
LED_PCA1=!LED_PCA1;//LED_PCA1取反,表示PCA模块1发生了中断
CCF1=0; //清PCA模块1中断标志
}}第36页/共49页【例7-5】利用PCA功能做定时器使用。利用PCA模块的软件定时功能,实现在P1.6输出脉冲宽度为1秒钟的方波。假设晶振频率fosc=18.432MHz。解:在此选择PCA模块0实现定时功能。通过置位CCAPM0寄存器的ECOM位和MAT位,使PCA模块0工作于软件定时器模式。定时时间的长短,取决于时钟源的选择以及PCA计数器计数值的设置。本例中,时钟频率FOSC=18.432MHz,可以选择PCA模块的时钟源为FOSC/12,基本定时时间单位T为5ms,对5ms计数200次以后,即可实现1s的定时。通过计算,PCA计数器计数值为1E00H,可在中断服务程序中,将该值赋给[CCAP0H,CCAP0L]。第37页/共49页汇编语言程序清单如下:$INCLUDE(STC12C5A.inc);包含STC12C5A60S2寄存器定义文件COUNTEREQU30H;声明一个计数器,用来计数中断的次数LED_1sEQUP1.6 ORG0000H LJMPMAIN
;转主程序
ORG003BH
;PCA中断入口地址
LJMPPCA_ISR
ORG0050HMAIN: MOVSP,#70H
MOVCOUNTER,#200;设置COUNTER计数器初值
;初始化PCA模块
MOVCMOD,#10000000B;空闲模式下停止PCA计数器工作;选择PCA的时钟源为fOSC/12,禁止PCA计数器溢出时中断
MOVCCON,#00H;清零PCA计数器溢出中断请求标志位CF
;CR=0,不允许PCA计数器计数;清零PCA各模块中断请求标志位CCFn
MOVCL,#00H
;清零PCA计数器
MOVCH,#00H
MOVCCAP0L,#00H
;给PCA模块0的CCAP0L置初值
MOVCCAP0H,#1EH;给PCA模块0的CCAP0H置初值
MOVCCAPM0,#49H;设置PCA模块0为16位软件定时器
;ECCF0=1允许PCA模块0中断
;当[CH,CL]=[CCAP0H,CCAP0L]时,产生中断请求,CCF0=1,请求中断
SETBEA;开整个单片机所有中断共享的总中断控制位
SETBCR;启动PCA计数器(CH,CL)计数
SJMP$;循环等待中断第38页/共49页PCA_ISR:
;PCA中断服务程序
PUSHACC
;保护现场
PUSHPSW
;每5mS中断一次
MOVA,#00H
;给[CCAP0H,CCAP0L]增加一个数值
ADDA,CCAP0L
MOVCCAP0L,A
MOVA,#1EH
ADDCA,CCAP0H
MOVCCAP0H,A
CLRCCF0;清PCA模块0中断标志
DJNZ COUNTER,PCA_EXIT;中断计数没有减到0,直接退出
MOV COUNTER,#200 ;恢复中断计数初值
CPLLED_1s;LED_1S输出脉冲宽度为1秒钟的方波PCA_EXIT:
POPPSW;恢复现场
POPACC
RETI
END第39页/共49页对应的C语言程序如下:#include“stc12c5a.h”//包含STC12C5A60S2寄存器定义文件sbitLED_1s=P1^6;unsignedcharcnt;//中断计数变量voidmain(void){ cnt=200;//设置COUNTER计数器初值 CMOD=0x80;//#10000000B空闲模式下停止PCA计数器工作
//选择PCA时钟源为FOSC/12,禁止PCA计数器溢出时中断 CCON=0;//清零PCA计数器溢出中断请求标志位CF //CR=0,不允许PCA计数器计数;清零PCA各模块中断请求标志位CCFn CL=0;//清零PCA计数器 CH=0; CCAP0L=0;//给PCA模块0的CCAP0L置初值 CCAP0H=0x1e;//给PCA模块0的CCAP0H置初值 CCAPM0=0x49;//设置PCA模块0为16位软件定时器 //ECCF0=1允许PCA模块0中断
//当[CH,CL]=[CCAP0H,CCAP0L]时,CCF0=1,产生中断请求 EA=1;//开整个单片机所有中断共享的总中断控制位 CR=1;//启动PCA计数器(CH,CL)计数
while(1); //等待中断}第40页/共49页voidPCA_ISR(void)interrupt7 //PCA中断服务程序{ union{//定义一个联合,以进行16位加法
unsignedintnum; struct{//在联合中定义一个结构
unsignedcharHi,Lo; }Result; }temp; //每5ms中断一次
temp.num=(unsignedint)(CCAP0H<<8)+CCAP0L+0x1e00; CCAP0L=temp.Result.Lo;//取计算结果的低8位 CCAP0H=temp.Result.Hi; //取计算结果的高8位 CCF0=0; //清PCA模块0中断标志
cnt--; //修改中断计数 if(cnt==0) { cnt=200;//恢复中断计数初值 LED_1s=!LED_1s;//在P1.6输出脉冲宽度为1秒钟的方波 }}第41页/共49页【例7-6】利用PCA模块进行PWM输出。PWM脉冲由P1.3输出。假设晶振频率FOSC=18.432MHz。解:PWM无需中断支持,只需根据需要设置PCA模块的参数,并通过指令进行输出即可。PWM的占空比计算方法为:占空比=(pulse_width/256)*100%汇编语言程序如下:$INCLUDE(STC12C5A.INC);包含STC12C5A60S2寄存器定义文件;定义常量;pulse_width_MAX=pulse_width_MIN时,输出脉冲宽度不变。pulse_width_MAXEQU0F0H;PWM脉宽最大值,占空比=93.75%pulse_width_MINEQU10H;PWM脉宽最小值,占空比=6.25%stepEQU38H
;PWM脉宽变化步长;定义变量pulse_widthEQU30H
ORG0000H
LJMPMAIN
ORG0050HMAIN:
MOVSP,#70H
MOVCMOD,#80H;PCA在空闲模式下停止PCA计数器工作;PCA时钟模式为FOSC/12,禁止PCA计数器溢出中断
MOVCCON,#00H;禁止PCA计数器工作,清除中断标志、计数器溢出标志
MOVCL,#00H
;清0计数器
MOVCH,#00H第42页/共49页 ;设置模块0为8位PWM输出模式,脉冲在P1.3引脚输出 MOVCCAPM0,#42H MOVPCA_PWM0,#00H ;MOVPCA_PWM0,#03H;释放本行注释,PWM输出就一直是0,无脉冲。
SETBCR;将PCA计数器打开MAIN_LOOP: LCALLPWMOUT LJMPMAIN_LOOP;------------------------------------------------------------PWMOUT:;可以使用示波器观察P1.3的波形
;如果P1.3连接一个LED,则连接到P1.3的LED逐渐变亮 MOVA,#pulse_width_MIN;为输出脉冲宽度设置初值 MOVpulse_width,A;pulse_width数字越大脉宽越窄,LED越亮PWM_LOOP1: MOVA,pulse_width;判是否到达最大值 CLRC SUBBA,#pulse_width_MAX JNCPWM_A;到达最大值就转到逐渐变暗 MOVA,pulse_width;设置脉冲宽度。数字越大,脉宽越窄,LED越亮 MOVCCAP0H,A;核心语句
MOVCCAP1H,A;核心语句第43页/共49页
MOVA,pulse_width;计算下一次输出脉冲宽度数值
ADDA,#step
MOVpulse_width,A
LCALLDELAY;在一段时间内保持输出脉冲宽度不变
LJMPPWM_LOOP1PWM_A:
;如果P1.3连接一个LED,连接到P1.3的LED逐渐变暗
MOVA,#pulse_width_MAX;为输出脉冲宽度设置初值
MOVpulse_width,A;pulse_width数字越大脉宽越窄,LED越亮PWM_LOOP2:
MOVA,pulse_width;判是否到达最小值
CLRC
SUBBA,#pulse_width_MIN
JCPWM_B;到达最小值就返回。
JZPWM_B;到达最小值就返回。
MOVA,pulse_width;设置脉冲宽度。数字越大、脉宽越窄,LED越亮
MOVCCAP0H,A;核心语句
MOVCCAP1H,A;核心语句
MOVA,pulse_width;计算下一次输出脉冲宽度数值
CLRC
SUBBA,#step
MOVpulse_width,A
LCALLDELAY;在一段时间内保持输出脉冲宽度不变
LJMPPWM_LOOP2PWM_B:
RET第44页/共49页DELAY:;延时子程序 CLR
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五版知识产权反担保保证合同书2篇
- 2025版土地抵押权抵押资产证券化合同模板3篇
- 设备监理合同-《设备监理合同管理》押题密卷2
- 土壤污染治理与农业生态环境保护考核试卷
- 唇部护理产品的选择与涂抹技巧考核试卷
- 2025年销售部劳动合同加班时间规定范本2篇
- 2025年家政服务服务调整协议
- 2025年度木材行业绿色认证及产品检测服务合同范本4篇
- 2025年婚礼广告合作协议
- 二零二五年度房地产项目纳税担保及贷款担保合同2篇
- 2024年安全教育培训试题附完整答案(夺冠系列)
- 神农架研学课程设计
- 文化资本与民族认同建构-洞察分析
- 2025新译林版英语七年级下单词默写表
- 《锡膏培训教材》课件
- 唯物史观课件
- 2021-2022学年四川省成都市武侯区部编版四年级上册期末考试语文试卷(解析版)
- 中国传统文化服饰文化
- 大气污染控制工程 第四版
- 浅析商务英语中模糊语言的语用功能
- 工程勘察资质分级标准和工程设计资质分级标准
评论
0/150
提交评论