振南网站还在继续美化改进,暂时提供一个平台来发布振南的实验和相关资料! http://www.znmcu.cn/znx_51_iap_exps_pca_timer_test.html STC/IAP15单片机 ZN-X开发板 群 187478076 振南QQ:987582714 振南的SD卡 FAT32 技术群:198521880
振南ZN-X开发板(STC51版)实验 之 PCA的应用(定时器) 实验说明: 振南的ZN-X开发板率先使用STC最新的增强型51单片机芯片(具体型号包括3种:STC15L2K60S2、IAP15L2K61S2/IAP15W4K61S4),它们在功能上几乎相同,只是RAM与ROM容量不同,另外前缀IAP的芯片本身具有仿真器的功能。 此实验主要是对PCA(Programable Counter Array,即可编程计数器阵列)的应用,它是STC特有的东西,功能强大,配置灵活,可以实现多种功能:捕获、定时、PWM输出、高速时钟输出等等。再加上一些应用上的技巧,将可以实现更多功能。 这里使用PCA实现定时器功能,配合中断在P10管脚上产生一个1Hz的翻转信号,P10上的发光二极管每隔1秒亮灭一次。 所需硬件: 振南ZN-X开发板(STC51版)基板[此实现只需要ZN-X基板,而不需要额外的模块] USB转串口模块(用于供电与程序的下载) STC PCA简介: STC15系列部分单片机集成 了3路可编程计数器阵列(CCP/PCA)模块,可用于软件定时器、外部脉冲的捕捉、高速脉冲输出以及脉宽调制(PWM)输出。 STC单片机中与实验相关的寄存器(大部分内容摘自STC芯片手册):
CMOD中的CPS2 CPS1 CPS0用来选择PCA的时钟源,说白了它决定了计数器的快慢。它可以选择系统时钟的1/2/4/6/8/12分频,也可以使用ECI管脚上输入的外部时钟(最大不能超过系统时钟的一半),或者是定时器0的溢出脉冲:将定时器0配置为自动循环装入模式,即每当它自增到0XFF->0X00时,将自动装入预设好的初值,继续自增。而如果PCA的时钟源配置为定时器0的溢出脉冲,那么每当定时器0溢出时PCA的计数器才会加1。这样,PCA的时钟源就非常灵活了。
CCON中的CR位用来启动计数器,它被置1后,计数器立即以时钟频率开始自增。CF是PCA计数器溢出标志位,如果CMOD的第0位,即ECF为1,则它将产生溢出中断。所以我们可以通过为PCA设置初始,自增到溢出,产生中断的方式来实现定时。不过,振南这里没有得到这种方式,而是采用了一种新的思路,它被称为“软件定时器”,这种方法不使用溢出中断,而是使用了PCA的比较中断的功能,在后面大家会看到。 CCFn是PCA的比较匹配中断标志,它应该在中断服务程序中被清0。
ECOM0用来使能PCA的比较器功能。它将CCAP0H/CCAP0L的16位值与CH/CH的计数值相比较,如果相等,并且MAT0和ECCF0均为1,则产生中断。这里所要实现的“软件定时器”用的就是这个中断。
CL与CH是PCA中的计数器,它们都是8位的,拼起来一共16位。
上面已经说过,不再多说。 基于STC PCA计数器比较中断的“软件定时器”的实现思想: 首先将PCA的计数器CH/CL清0,然后设置比较寄存器的值为T,计数器启动之后,它以时钟源频率自增,当与T相等时,将产生中断。T以及时钟源频率决定了这段时间的长短。在中断服务程序我们为比较寄存器+T,那么在经过相同的时间后,计数器的值再次与比较寄存器的值相等,中断再次产生。如此往复,便实现了定时功能。这就是基于STC PCA计数比较功能的定时器的主要实现思想。 在此实验中,我们要实现1秒的定时,首先使用定时器0来产生一个1KHz的溢出脉冲,即两次溢出之间的间隔为1ms。将此溢出脉冲作为PCA的时间源,然后将比较寄存器的增量T设为1000,这样即可实现1秒的定时。我们在中断服务程序中对P10进行取反,则可看到ZN-X开发板上的发光二极管每隔1秒亮灭一次。 实验代码: #include "STC15Fxxxx.H" #define T 1000 unsigned short value=0; void PCA_Isr() interrupt 7 using 1 //PCA中断 { CCF0=0; CCAP0L=value;CCAP0H=value>>8; value+=T; //每次都为比较寄存器自增T P10=~P10; //P10取反 } void main(void) { //Timer0产生 1ms溢出脉冲@5.5MHz Timer0_12T(); //Timer0设置为12T模式 TMOD=0x00; //自动重装模式 TH0=0xfe;TL0=0x35; TR0=1; //定时器0启动 CCON=0x00; CL=0;CH=0; //计数器清0 CMOD=0x04; //设置时钟源为定时器0的溢出脉冲 value=T; CCAP0L=value;CCAP0H=value>>8; value+=T; CCAPM0=0x49; //使能PCA的比较器功能、匹配中断 CR=1; //启动PCA计数器 EA=1; //打开全局中断 while(1); } 注:上面程序中的宏来自于STC15头文件,详见头文件源代码 |
实验效果: 代码下载: |