STC12C5系列单片机属于增强性单片机,有多强呢?带有SPI接口,PCA模块,定时器输出,16K+的片上ROM,越来越妖孽了!前面见识了定时器输出功能,现在来领教一下STC12C5A60S单片机的PCA捕捉比较模块,后面有心情再看看SPI模块。

按我个人理解捕捉比较的意思应该是捕捉外部引脚上的跳变,与预设的值比较,然后做相应的动作。下文按这个理解展开。老规矩,寄存器功能介绍省略了,懒得抄手册了。

虽然说寄存器设置的说明不介绍,不过表格还是得给一张,这样条理比较清晰,如下:

1)PCA模块PWM的应用,感觉设置寄存器最少的一个:

PWM(脉宽调制,改变输出方波的占空比)估计拥有最广泛的应用空间(恕我眼见浅),据说常有人用PWM做心跳灯向妹子表白,不知道有没有成功;还有改变直流电机的输出转速。。。

怎么理解PWM这个功能呢?刚去了趟WC突然想到了:在一个有0xFF个刻度的跑表上,CH是秒表,CCAPnH是表面上的一个绊脚石,当CH遇到绊脚石,直接给跪了,一直跪到下一轮0x00,继续站起来行走。如果CCAPnH没被移动,CH还在同一个地方周而复始的摔倒(人说不要再同一个地方摔倒)。然后计算从0x00-0xFF这段时间里,CH站着走路占了这段时间的百分之几,给跪占了剩下的多少(路遇倒地不扶也就算了还做应用题)!

#include <STC\STC12C5A.H>enum sState
{sInit=0,sPca,sClk,sPwm,sClkOut,
};#define CCF1_INT 0x02
#define CCF0_INT 0x01#define ResetPCA() \
do{ \CCON = 0; \CL = 0; \CH = 0; \CMOD = 0x00; \CCAPM0 = 0x00; \CCAPM1 = 0x00; \
}while(0); \#define StartPCA() \
do{ \CR = 1; \
}while(0); \#define StopPCA() \
do{ \CR = 0; \
}while(0); \#define SetModnCmp(n) \
do{ \ CCAPM##n |= PCA0_ECOM; \CCAPM##n |= PCA0_MAT; \
}while(0); \#define SetModnTog(n) \
do{ \CCAPM##n |= PCA0_TOG; \
}while(0); \#define SetCapnMod(n,mod) \
do{ \CCAPM##n |= mod; \
}while(0); \#define SetCCAPn(n,hi,lo) \
do{ \CCAP##n##H = hi; \CCAP##n##L = lo; \
}while(0); \
//ECCFn 使能CCFn中断。使能寄存器CCON的比较/捕获标志CCFn,用来产生中断。
#define EnPcaModnInt(n) \
do{ \CCAPM##n |= PCA0_ECCF; \
}while(0); \//PCA0_ECOM 允许比较器功能控制位
//PCA0_PWM 脉宽调制模式。当PWMn=1时,CEXn脚用作脉宽调制输出
#define SetPwmMod(n) \
do{ \CCAPM##n |= PCA0_ECOM|PCA0_PWM; \
}while(0); \unsigned int CCAPnHVal = 0x80,CCAPnLVal = 0x80; void delay()
{int i=0,j=0;for(i=0;i<1000;i++){for(j=0;j<110;j++);}
}int main()
{unsigned char sState = sInit;ResetPCA();//pwm有比较功能 但没用到匹配...真特立独行//只要设置CCAPMn的PWM位和比较位SetPwmMod(0);//设置占空比,有点类似定时器Mod2,TH自动装载到TL//此处是CCAPnH自动装载到CCAPnL(8位);CH装载到CL(8位)//CH-CL低于    CCAPnH-CCAPnL输出0,其他输出1while(1){StopPCA();SetCCAPn(0,CCAPnHVal,CCAPnLVal);if(CCAPnHVal == 0xF0)CCAPnLVal = CCAPnHVal = 0x00;elseCCAPnLVal = CCAPnHVal = CCAPnLVal+0x10;//启动pca模块StartPCA();delay();}
}

PWM0的输出引脚是P1.3在我的开发板上正好连了一个红色LED,忽明忽亮的,眼都刺瞎了!用示波器测试时的确输出可变的波形。(无图无真相随我BB)

本来想用中断控制pwm占空比,不过没成功,没法调试好麻烦,只能用这种粗线条的延时了。

2) 在看PCA捕捉功能之前,先看下51MCU的计数器功能,PCA的捕捉功能应该是加强版计数器:

2a) 51的定时器对系统时钟计数,计满诺干个时钟脉冲后,产生溢出;计数器对外部输入信号计数,计满诺干负跳变后,产生溢出。传说,计算流水线上的工件数会用到计数器功能。想象一下点钞机里的票票经过光感时,使计数器不断的加一,想想是不是有点小激动?醒醒了,拿钱不是自己的。还是看下面的代码了

#include <reg51.h>#define MakeByte(target, Hi,Lo) \
do{ \  target |= (((Hi)<<4)|(Lo)); \
}while(0); \  #define SetTH(n,val) \
do{ \  TH##n = val; \
}while(0); \  #define SetTL(n,val)  \
do{ \  TL##n = val; \
}while(0); \  #define EnableET(n) \
do{ \  ET##n = 0x01; \  IE |= 0x80; \
}while(0); \#define StartClk(val) \
do{ \TCON |= val; \
}while(0); \sbit P10=P1^0;int main()
{//T0工作在方式2 计数器模式MakeByte(TMOD,0x00,0x06);SetTH(0,0xFF);SetTL(0,0xFF);EnableET(0);//启动定时器StartClk(0x10);while(1);
}  void IsrT0() interrupt 1
{
//TH自动装入0xFF,再计满一个负跳变又能进入isr
P10 = ~P10;
}

程序对P3.4引脚采样,遇到负跳变计数器加1,因为设置计数溢出是0xFF,因此只要有负跳变就产生中断,对P1.0引脚取反。因为文章是关于PCA的,所以不能安排MCU计数器模块抢了镜头~

蓝色波形是信号发生器的输出,黄色波形是P1.0的输出。因为2个负跳变产生一个完整的波形,因此P1.0方波周期正好对应2个信号发生器的周期。

2b) 回到文章的主角PCA模块,当PCA模块工作在捕获模式时,对外部输入CEXn(P13/P14)的跳变进行采样。当采样到有效跳变时,PCA硬件将PCA计数器阵列寄存器(CH和CL)的值装载到捕获寄存器(CCAPnH和CCAPnL)中。如果CCON中的CCFn位和CCAPMn中的ECCFn位被置位,将产生中断。

#include <STC\STC12C5A.H>enum sState
{sInit=0,sPca,sClk,sPwm,sClkOut,
};#define CCF1_INT 0x02
#define CCF0_INT 0x01#define ResetPCA() \
do{ \CCON = 0; \CL = 0; \CH = 0; \CMOD = 0x00; \CCAPM0 = 0x00; \CCAPM1 = 0x00; \
}while(0); \#define StartPCA() \
do{ \CR = 1; \
}while(0); \#define StopPCA() \
do{ \CR = 0; \
}while(0); \#define SetModnCmp(n) \
do{ \ CCAPM##n |= PCA0_ECOM; \CCAPM##n |= PCA0_MAT; \
}while(0); \#define SetModnTog(n) \
do{ \CCAPM##n |= PCA0_TOG; \
}while(0); \#define SetCapnMod(n,mod) \
do{ \CCAPM##n |= mod; \
}while(0); \#define SetCCAPn(n,hi,lo) \
do{ \CCAP##n##H = hi; \CCAP##n##L = lo; \
}while(0); \
//ECCFn 使能CCFn中断。使能寄存器CCON的比较/捕获标志CCFn,用来产生中断。
#define EnPcaModnInt(n) \
do{ \CCAPM##n |= PCA0_ECCF; \
}while(0); \//PCA0_ECOM 允许比较器功能控制位
//PCA0_PWM 脉宽调制模式。当PWMn=1时,CEXn脚用作脉宽调制输出
#define SetPwmMod(n) \
do{ \CCAPM##n |= PCA0_ECOM|PCA0_PWM; \
}while(0); \//当PCA模块工作在捕获模式时,对外部输入CEXn的跳变进行采样。
//当采样到有效跳变时,PCA硬件将PCA计数器阵列寄存器(CH和CL)的值装载到捕获寄存器(CCAPnH和CCAPnL)中。
//如果CCON中的CCFn位和CCAPMn中的ECCFn位被置位,将产生中断。
//当P1.3出现下降沿时产生中断 对P1.5取反void delay()
{int i=0,j=0;for(i=0;i<200;i++){for(j=0;j<110;j++);}
}int main()
{unsigned char sState = sInit;ResetPCA();EA = 1;//捕捉模式,捕捉到跳变沿时触发中断//CH-CL不用与CCAPnH-CCAPnL比较,因此不用使能ECOMn//也不需要设置PCA计数器阵列寄存器(CH和CL)以及捕获寄存器(CCAPnH和CCAPnL)SetCapnMod(0,PCA0_CAPN);//开启PCA中断EnPcaModnInt(0);//启动pca模块StartPCA();while(1){P12 = ~P12;   delay();}
}void PCA_ISR(void) interrupt 7
{switch(CCON&0x03){//模块0触发中断case CCF0_INT://清除模块中断标志位CCON &=   (0x00<<CCF0_INT);P15 = ~P15;break;//模块1触发中断case CCF1_INT:CCON &=    (0x00<<CCF1_INT);break;default:break;}
}

程序烧写到MCU后,用跳线帽连接P12和P13,使得P13对P12的输出经行采样。下面是示波器的输出:

蓝色波形是P12引脚的输出,黄色波形是P15引脚的输出。图中(我的低端示波器)可以很明显的看出P13上采样到一个负跳表,P15发生一次翻转。

这个功能跟计数器每次计满一个脉冲就触发中断类似,不过感觉没有计数器那么灵活,它可以计数256个跳变,不过PCA捕捉可以同时捕捉双边沿,可用于脉宽测量;

STC MCU PCA模块还有其他功能,不过感觉有点无聊,就不一一展示了,不过代码还是要贴上来已做备忘:

#include <STC\STC12C5A.H>enum sState
{sInit=0,sPca,sClk,sPwm,sClkOut,
};#define CCF1_INT 0x02
#define CCF0_INT 0x01#define ResetPCA() \
do{ \CCON = 0; \CL = 0; \CH = 0; \CMOD = 0x00; \CCAPM0 = 0x00; \CCAPM1 = 0x00; \
}while(0); \#define StartPCA() \
do{ \CR = 1; \
}while(0); \#define SetModnCmp(n) \
do{ \ CCAPM##n |= PCA0_ECOM; \CCAPM##n |= PCA0_MAT; \
}while(0); \#define SetModnTog(n) \
do{ \CCAPM##n |= PCA0_TOG; \
}while(0); \#define SetCapnMod(n,mod) \
do{ \CCAPM##n |= mod; \
}while(0); \#define SetCCAPn(n,hi,lo) \
do{ \CCAP##n##H = hi; \CCAP##n##L = lo; \
}while(0); \
//
#define EnPcaModnInt(n) \
do{ \CCAPM##n |= PCA0_ECCF; \
}while(0); \#define SetPwmMod(n) \
do{ \CCAPM##n |= PCA0_ECOM|PCA0_PWM; \
}while(0); \int main()
{unsigned char sState = sInit;ResetPCA();EA = 1;while(1){switch(sState){case sInit://输入提示break;default: sState = sInit;break;case sPca:ResetPCA();//捕捉模式,捕捉到跳变沿时触发中断//CH-CL不用与CCAPnH-CCAPnL比较,因此不用使能ECOMn//也不需要设置PCA计数器阵列寄存器(CH和CL)以及捕获寄存器(CCAPnH和CCAPnL)SetCapnMod(0,PCA0_CAPN|PCA0_CAPP);//开启PCA中断EnPcaModnInt(0);sState = sInit;break;case sClk:
//软件定时器功能
ResetPCA();//定时器功能//CH-CL增加计数值,然后与CCAPnH和CCAPnL比较,相等触发中断//有比较功能 设置比较和匹配控制位SetModnCmp(0);//设置 CCAPnH和CCAPnL,当CH-CL计数值==CCAPnH-CCAPnL中的预制值//发生中断SetCCAPn(0,0x80,0x00);//开启PCA中断EnPcaModnInt(0);sState = sInit;break;case sPwm:ResetPCA();//pwm有比较功能 但没用到匹配...真特立独行//只要设置CCAPMn的PWM位和比较位SetPwmMod(0);//设置占空比,有点类似定时器Mod2,TH自动装载到TL//此处是CCAPnH自动装载到此处是CCAPnL(8位);CH装载到CL(8位)//CH-CL低于  CCAPnH-CCAPnL输出0,其他输出1SetCCAPn(0,0x80,0x80);sState = sInit;break;case sClkOut:
//高速输出功能
ResetPCA();//当PCA计数器的CH-CL与CCAPnH-CCAPnL中的预制值相等时//CCPn发生翻转,这个功能也用到比较-匹配SetModnCmp(0);SetModnTog(0);EnPcaModnInt(0);sState = sInit;break;                 }//启动pca模块StartPCA();  }
}void PCA_ISR(void) interrupt 7
{switch(CCON&0x03){//模块0触发中断case CCF0_INT://清除模块中断标志位CCON &=   (0x00<<CCF0_INT);break;//模块1触发中断case CCF1_INT:CCON &=    (0x00<<CCF1_INT);break;default:break;}
}

STC12系列单片机PCA模块应用相关推荐

  1. 51单片机PCA模块配置

    PCA模块是"可编程计数器阵列"的缩写,英文名称是"Programmable Counter Array",以下的说明均以SILICON LAB生产的C8051 ...

  2. STC12系列单片机的1T模式和12T模式

    STC12系列单片机的1T模式和12T模式 总结 STC12系列单片机的1T模式和12T模式 基本原理 以定时器为例 总结 1T 模式 (不分频) -- 1个系统基本时钟,执行一个动作: 12T模式( ...

  3. STC12C5A60S2系列单片机PCA时钟源设置

    在使用STC12C5A60S2系列单片机PCA输出PWM时需要设置PCA时钟源,如以下代码 链接地址:https://blog.csdn.net/Xiaomo_haa/article/details/ ...

  4. STC12系列单片机的空闲模式、休眠模式(又叫掉电模式、停机模式)

    1. 空闲模式 空闲模式是指只有单片机不工作的状态.此时CPU无时钟停止工作,但是外部中断.外部低压检测电路.定时器.A/D转换.串行口等仍正常运行. 在空闲模式下,RAM.堆栈指针(SP).程序计数 ...

  5. Modbus RTU 51单片机从机源码与组态软件通信支持485和232串口通信,该从机源码可直接用于51系列和STC12系列单片机的

    Modbus RTU 51单片机从机源码与组态软件通信支持485和232串口通信,该从机源码可直接用于51系列和STC12系列单片机的,支持功能码01,02,03,04,05,06,0F,10等常用功 ...

  6. STC12系列单片机的AUXR辅助寄存器

    AUXR.0:S1BRS,如果为1那么串口1的波特率发生器为独立波特率发生器,否则为定时器1 AUXR.1:EXTRAM,为1则可以使用内部扩展RAM AUXR.2:BRTx12,为1则独立波特率发生 ...

  7. STC15系列单片机-PWM模块

    STC15W内部集成了一个15位的PWM模块, 可以6路独立输出. 此外PWM模块每一路都有两个用于控制波形翻转的计数器T1和T2, 可以灵活地控制每路PWM的高低电平宽度, 从而实现对PWM占空比的 ...

  8. 蓝桥杯单片机 超声波模块和PCA模块

    蓝桥杯单片机 超声波模块和PCA模块 原理 超声波测量的原理 PCA模块的原理 代码 PCA定时器的范例程序 超声波测量的参考代码 原理 超声波测量的原理 超声波由一个超声波模块向前方发出,并在空气中 ...

  9. 有关利用PL2303HX USB到RS232 TTL转换器适配器模块把STC89C52RC等STC系列单片机与计算机连接、向Keil添加STC库及hex文件考录方法小结

    有关利用PL2303HX USB到RS232 TTL转换器适配器模块把STC89C52RC等STC系列单片机与计算机连接.向Keil添加STC库及hex文件考录方法小结 PL2303HX转换器适配器模 ...

最新文章

  1. python拿来干嘛-Python是什么 Python的用处
  2. 目标文件中的几个重要的段
  3. 数据结构实验之数组二:稀疏矩阵
  4. 洛谷 - P4390 [BOI2007]Mokia 摩基亚(带修二维数点-四叉线段树/CDQ分治)
  5. css 横线_atom.css正式发布,从此跟CSS框架说拜拜。
  6. AGPM(高级组策略管理)3.0之二操作
  7. web学习2--理解MVC及快速入门
  8. redis 队列_Redis与Rabbitmq消息队列的区别
  9. 【读书笔记】--- 《码出高效:java开发手册》
  10. linux查看磁盘io带宽,[Linux] 磁盘IO性能查看和优化以及iostat命令
  11. 点击button标签会导致提交form
  12. Atitit.atiInputMethod v2词库清理策略工具    q229
  13. 一键启动按钮线断了_【汽车用车】汽车一键启动功能不仅只用来打火,还可以这么操作?...
  14. 【Landsat 8】遥感影像文件内容及命名规则
  15. python博弈论代码_博弈论的算法总结
  16. html中如何写平方根等,excel平方根
  17. Unity3D手游开发实践《腾讯桌球》客户端开发经验总结(转自GameRes游资网)
  18. 懒人神器,IDEA插件之EasyCode,自动生成CRUD代码
  19. 每一个成年男人在算法中都是好色之徒
  20. 1146 Topological Order

热门文章

  1. 人体姿态估计——MSPN
  2. 初二因式分解奥数竞赛题_初二年级数学因式分解练习题及答案
  3. 【UI设计No1】Adobe软件介绍
  4. 我部门当前的岗位说明书
  5. HTML5 video标签支持情况分析
  6. 用python编写飞机3D模型
  7. java三层架构(表示层,业务逻辑层,数据访问层,与两层的区别,三层架构的优缺点)
  8. zzuli 1904 小火山的股票交易
  9. HarmonyOS服务卡片——残奥会卡片
  10. 三星c1116 android5.0,三星C1116(GALAXY K Zoom 联通3G)一键救砖教程,轻松刷回官方系统...