STC12C5A60S2内部PWM模块及其程序

控制/MCU

1877人已加入

描述

  在众多的51系列单片机中,要算国内STC 公司的1T增强系列更具有竞争力,因他不但和8051指令、管脚完全兼容,而且其片内的具有大容量程序存储器且是FLASH工艺的,如STC12C5A60S2单片机内部就自带高达60K FLASHROM,这种工艺的存储器用户可以用电的方式瞬间擦除、改写。而且STC系列单片机支持串口程序烧写。显而易见,这种单片机对开发设备的要求很低,开发时间也大大缩短。

  PWM(2路)/PCA(可编程计数器阵列,2路):

  ——也可用来当2路D/A使用

  ——也可用来再实现2个定时器

  ——也可用来再实现2个外部中断(上升沿中断/下降沿中断均可分别或同时支持);

  S

S

S

  STC12C5A60S2内部PWM模块程序:

  **********************************************

  说明: 单片机的PCA_PWM使用,60S2只有两个PWM输出,分别是1.3和1.4,也可以通过AUXR设置到P4口。

  /*********************************************/

  #include《reg51.h》

  #include《intrins.h》

  #define uchar unsigned char

  #define uint unsigned int

  //新一代 1T 8051系列 单片机PCA/PWM 特殊功能寄存器

  // 7 6 5 4 3 2 1 0 Reset Value

  sfr CCON = 0xD8; //PCA 控制寄存器。 CF CR - - - - CCF1 CCF0 00xx,xx00

  //-----------------------

  sbit CF = CCON^7; //PCA计数器溢出标志,由硬件或软件置位,必须由软件清0。

  sbit CR = CCON^6; //1:允许 PCA 计数器计数, 必须由软件清0。

  //-

  //-

  sbit CCF1 = CCON^1; //PCA 模块1 中断标志, 由硬件置位, 必须由软件清0。

  sbit CCF0 = CCON^0; //PCA 模块0 中断标志, 由硬件置位, 必须由软件清0。

  //-----------------------

  sfr CMOD = 0xD9; //PCA 工作模式寄存器。 CIDL - - - CPS2 CPS1 CPS0 ECF 0xxx,x000

  /*

  CIDL: idle 状态时 PCA 计数器是否继续计数, 0: 继续计数, 1: 停止计数。

  CPS2: PCA 计数器脉冲源选择位 2。

  CPS1: PCA 计数器脉冲源选择位 1。

  CPS0: PCA 计数器脉冲源选择位 0。

  CPS2 CPS1 CPS0

  0 0 0 系统时钟频率 fosc/12。

  0 0 1 系统时钟频率 fosc/2。

  0 1 0 Timer0 溢出。

  0 1 1 由 ECI/P3.4 脚输入的外部时钟,最大 fosc/2。

  1 0 0 系统时钟频率, Fosc/1

  1 0 1 系统时钟频率/4,Fosc/4

  1 1 0 系统时钟频率/6,Fosc/6

  1 1 1 系统时钟频率/8,Fosc/8

  ECF: PCA计数器溢出中断允许位, 1--允许 CF(CCON.7) 产生中断。

  */

  //-----------------------

  sfr CL = 0xE9; //PCA 计数器低位 0000,0000

  sfr CH = 0xF9; //PCA 计数器高位 0000,0000

  //-----------------------

  // 7 6 5 4 3 2 1 0 Reset Value

  sfr CCAPM0 = 0xDA; //PCA 模块0 PWM 寄存器 - ECOM0 CAPP0 CAPN0 MAT0 TOG0 PWM0 ECCF0 x000,0000

  sfr CCAPM1 = 0xDB; //PCA 模块1 PWM 寄存器 - ECOM1 CAPP1 CAPN1 MAT1 TOG1 PWM1 ECCF1 x000,0000

  //ECOMn = 1:允许比较功能。

  //CAPPn = 1:允许上升沿触发捕捉功能。

  //CAPNn = 1:允许下降沿触发捕捉功能。

  //MATn = 1:当匹配情况发生时, 允许 CCON 中的 CCFn 置位。

  //TOGn = 1:当匹配情况发生时, CEXn 将翻转。

  //PWMn = 1:将 CEXn 设置为 PWM 输出。

  //ECCFn = 1:允许 CCON 中的 CCFn 触发中断。

  //ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn

  // 0 0 0 0 0 0 0 0x00 未启用任何功能。

  // x 1 0 0 0 0 x 0x21 16位CEXn上升沿触发捕捉功能。

  // x 0 1 0 0 0 x 0x11 16位CEXn下降沿触发捕捉功能。

  // x 1 1 0 0 0 x 0x31 16位CEXn边沿(上、下沿)触发捕捉功能。

  // 1 0 0 1 0 0 x 0x49 16位软件定时器。

  // 1 0 0 1 1 0 x 0x4d 16位高速脉冲输出。

  // 1 0 0 0 0 1 0 0x42 8位 PWM。

  //ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn

  // 0 0 0 0 0 0 0 0x00 无此操作

  // 1 0 0 0 0 1 0 0x42 普通8位PWM, 无中断

  // 1 1 0 0 0 1 1 0x63 PWM输出由低变高可产生中断

  // 1 0 1 0 0 1 1 0x53 PWM输出由高变低可产生中断

  // 1 1 1 0 0 1 1 0x73 PWM输出由低变高或由高变低都可产生中断

  //-----------------------

  sfr CCAP0L = 0xEA; //PCA 模块 0 的捕捉/比较寄存器低 8 位。 0000,0000

  sfr CCAP0H = 0xFA; //PCA 模块 0 的捕捉/比较寄存器高 8 位。 0000,0000

  sfr CCAP1L = 0xEB; //PCA 模块 1 的捕捉/比较寄存器低 8 位。 0000,0000

  sfr CCAP1H = 0xFB; //PCA 模块 1 的捕捉/比较寄存器高 8 位。 0000,0000

  //-----------------------

  // 7 6 5 4 3 2 1 0 Reset Value

  sfr PCA_PWM0 = 0xF2; //PCA 模块0 PWM 寄存器。 - - - - - - EPC0H EPC0L xxxx,xx00

  sfr PCA_PWM1 = 0xF3; //PCA 模块1 PWM 寄存器。 - - - - - - EPC1H EPC1L xxxx,xx00

  //PCA_PWMn: 7 6 5 4 3 2 1 0

  // - - - - - - EPCnH EPCnL

  //B7-B2: 保留

  //B1(EPCnH): 在 PWM 模式下,与 CCAPnH 组成 9 位数。

  //B0(EPCnL): 在 PWM 模式下,与 CCAPnL 组成 9 位数。

  /*******************************************************/

  void pwm_init(void) //PWM初始化函数,初始占空比为0

  {

  CMOD=0x02; //0000 0010 空闲时不计数,不产生中断,时钟源为fosc/2,因此输出占用率为fosc/512

  CL=0x00;

  CH=0x00;

  CCAPM0=0x42; //0100 0010, 8位 PWM

  CCAP0L=0x00;

  CCAP0H=0x00; //PWM实现方法,因为是8位,CL基础计数器从0xFF递减到0x00,溢出后将CCAP0H

  //的值加载到CCAP0L,若CL递减过程中,若大于CCAP0L,则输出高电平,否则为低电平

  CCAPM1=0x42;

  CCAP1H=0x00;

  CCAP1L=0x00;

  CR=1; //开启PCA计数器

  }

  /*****************************************************/

  void pwm_set(uchar x,uchar y) //占空比设置函数

  {

  CCAP0H=x; //设置比较值

  CCAP0L=x;

  CCAP1H=y;

  CCAP1L=y;

  }

  /**************************************************/

  void main(void)

  {

  pwm_init();

  pwm_set(0xff,0x0c); //设置为25%的占空比 1100 0000, 12*16(低电平):3×16(高电平)

  while(1){;}

  }

  /******************************************************/

  /*********************************************************/

  /*********************************************************/

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
评论(0)
发评论
可乐爱老酒 2017-09-16
0 回复 举报
很棒的资料,赞 收起回复
  • 相关推荐
  • S

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分