打印
[51单片机]

振南ZN-X开发板(STC51版)实验 STC15系列PCA应用【定时器LED秒闪】

[复制链接]
2979|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
znmcu|  楼主 | 2014-10-15 16:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
振南网站还在继续美化改进,暂时提供一个平台来发布振南的实验和相关资料!
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种:STC15L2K60S2IAP15L2K61S2/IAP15W4K61S4),它们在功能上几乎相同,只是RAMROM容量不同,另外前缀IAP的芯片本身具有仿真器的功能

此实验主要是对PCAProgramable 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后,计数器立即以时钟频率开始自增。CFPCA计数器溢出标志位,如果CMOD的第0位,即ECF1,则它将产生溢出中断。所以我们可以通过为PCA设置初始,自增到溢出,产生中断的方式来实现定时。不过,振南这里没有得到这种方式,而是采用了一种新的思路,它被称为“软件定时器”,这种方法不使用溢出中断,而是使用了PCA的比较中断的功能,在后面大家会看到。

CCFnPCA的比较匹配中断标志,它应该在中断服务程序中被清0

 

ECOM0用来使能PCA的比较器功能。它将CCAP0H/CCAP0L16位值与CH/CH的计数值相比较,如果相等,并且MAT0ECCF0均为1,则产生中断。这里所要实现的“软件定时器”用的就是这个中断

CLCHPCA中的计数器,它们都是8位的,拼起来一共16位。

 

上面已经说过,不再多说。

 

基于STC PCA计数器比较中断的“软件定时器”的实现思想:

首先将PCA的计数器CH/CL0,然后设置比较寄存器的值为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头文件,详见头文件源代码

 

 

实验效果:

待发

 

 

代码下载:

http://down.znmcu.cn/ZN-X/ZN-X(51)/exps/stciap/PCA%20Timer%20test.rar

相关帖子

沙发
armxu| | 2014-10-15 17:37 | 只看该作者
好!希望你能讲讲用STC15单片机在11.0592M晶振下利用PWM产生占空比20%的脉冲。谢谢!

使用特权

评论回复
板凳
feifeizhuer| | 2016-5-16 09:36 | 只看该作者
正好接触这块

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:振南的znFAT -- 单片机上上的FAT32文件系统 www.znmcu.cn

4474

主题

5195

帖子

33

粉丝