STC12C5A60S2单片机 PWM调试

#include <REG52.H>
#include <intrins.h>
#define U8 unsigned char
#define U16 unsigned int

/********************************************************************
                              ÑÓʱº¯Êý
*********************************************************************/
void DelayMs(U8 ms) //ÔÚ11.0592M¾§ÕñÏ£¬stc10fϵÁУ¨µ¥ÖÜÆÚÖ¸ÁµÄms¼¶ÑÓʱ
{
U16 i;
while(ms--)
{
   for(i = 0; i < 850; i++);
}
}

/********************************************************************
                             ³õʼ»¯¶¨Ò庯Êý
*********************************************************************/

sfr CCON     = 0xD8; //PCA¿ØÖƼĴæÆ÷
sfr CMOD     = 0xD9; //PCAģʽ¼Ä´æÆ÷
sfr CCAPM0   = 0xDA; //PCAÄ£¿é0ģʽ¼Ä´æÆ÷ //Ä£¿é0¶ÔÓ¦P1.3/CEX0/PCA0/PWM0(STC12C5A60S2ϵÁÐ)
sfr CCAPM1   = 0xDB; //PCAÄ£¿é1ģʽ¼Ä´æÆ÷ //Ä£¿é1¶ÔÓ¦P1.4/CEX1/PCA1/PWM1(STC12C5A60S2ϵÁÐ)
sfr CL       = 0xE9; //PCA ¶¨Ê±¼Ä´æÆ÷ µÍλ
sfr CH       = 0xF9; //PCA ¶¨Ê±¼Ä´æÆ÷ ¸ßλ
sfr CCAP0L   = 0xEA; //PCAÄ£¿é0µÄ ²¶»ñ¼Ä´æÆ÷ µÍλ
sfr CCAP0H   = 0xFA; //PCAÄ£¿é0µÄ ²¶»ñ¼Ä´æÆ÷ ¸ßλ
sfr CCAP1L   = 0xEB; //PCAÄ£¿é1µÄ ²¶»ñ¼Ä´æÆ÷ µÍλ
sfr CCAP1H   = 0xFB; //PCAÄ£¿é1µÄ ²¶»ñ¼Ä´æÆ÷ ¸ßλ
sfr PCA_PWM0 = 0xF2; //PCA PWM ģʽ¸¨Öú¼Ä´æÆ÷0
sfr PCA_PWM1 = 0xF3; //PCA PWM ģʽ¸¨Öú¼Ä´æÆ÷1
sbit CF   = 0xDF;    //PCA¼ÆÊýÒç³ö±ê־λ
sbit CR   = 0xDE;    //PCA¼ÆÊýÆ÷ ÔËÐпØÖÆλ
sbit CCF1 = 0xD9;    //PCAÄ£¿é1ÖжϱêÖ¾
sbit CCF0 = 0xD8;    //PCAÄ£¿é0ÖжϱêÖ¾

//* CCAPOH = CCAPOL = 0XC0; //Ä£¿é0Êä³ö Õ¼¿ÕÒòÊýΪ25%
//* CCAPOH = CCAPOL = 0X80; //Ä£¿é0Êä³ö Õ¼¿ÕÒòÊýΪ50%
//* CCAPOH = CCAPOL = 0X40; //Ä£¿é0Êä³ö Õ¼¿ÕÒòÊýΪ75%
/********************************************************************
                              PWMʱÖÓº¯Êý
*********************************************************************/
void PWM_clock(U8 clock)
{
CMOD |= (clock<<1);
CL = 0x00;
CH = 0x00;
}
 /********************************************************************
                              PWMÊä³öº¯Êýº¯Êý
*********************************************************************/
void PWM_start(U8 module,U8 mode)
{

/********************ÉèÖÃPWMÐźÅÊä³öÖµ*******************************/
CCAP0L = 0Xc0;
CCAP0H = 0Xc0;   //Ä£¿é0³õʼÊä³ö Õ¼¿ÕÒòÊýΪ25%
CCAP1L = 0Xc0;
CCAP1H = 0Xc0;   //Ä£¿é1³õʼÊä³ö Õ¼¿ÕÒòÊýΪ25%

if(module==0)
   {
    switch(mode)
     {
   case 0: CCAPM0 = 0X42;break; //Ä£¿é0ÉèÖÃΪ8λPWMÊä³ö£¬ÎÞÖжÏ
   case 1: CCAPM0 = 0X53;break; //Ä£¿é0ÉèÖÃΪ8λPWMÊä³ö£¬Ï½µÑزúÉúÖжÏ
   case 2: CCAPM0 = 0X63;break; //Ä£¿é0ÉèÖÃΪ8λPWMÊä³ö£¬ÉÏÉýÑزúÉúÖжÏ
   case 3: CCAPM0 = 0X73;break; //Ä£¿é0ÉèÖÃΪ8λPWMÊä³ö£¬Ìø±äÑزúÉúÖжÏ
   default: break;
   }
}
else
    if(module==1)
     {
      switch(mode)
       {
   case 0: CCAPM1 = 0X42;break; //Ä£¿é1ÉèÖÃΪ8λPWMÊä³ö£¬ÎÞÖжÏ
   case 1: CCAPM1 = 0X53;break; //Ä£¿é1ÉèÖÃΪ8λPWMÊä³ö£¬Ï½µÑزúÉúÖжÏ
   case 2: CCAPM1 = 0X63;break; //Ä£¿é1ÉèÖÃΪ8λPWMÊä³ö£¬ÉÏÉýÑزúÉúÖжÏ
   case 3: CCAPM1 = 0X73;break; //Ä£¿é1ÉèÖÃΪ8λPWMÊä³ö£¬Ìø±äÑزúÉúÖжÏ
   default: break;
   }
   }
   else
     if(module==2)
        {
        switch(mode)
    {
      case 0: CCAPM0 = CCAPM1 = 0X42;break; //Ä£¿é0ºÍ1ÉèÖÃΪ8λPWMÊä³ö£¬ÎÞÖжÏ
      case 1: CCAPM0 = CCAPM1 = 0X53;break; //Ä£¿é0ºÍ1ÉèÖÃΪ8λPWMÊä³ö£¬Ï½µÑزúÉúÖжÏ
      case 2: CCAPM0 = CCAPM1 = 0X63;break; //Ä£¿é0ºÍ1ÉèÖÃΪ8λPWMÊä³ö£¬ÉÏÉýÑزúÉúÖжÏ
      case 3: CCAPM0 = CCAPM1 = 0X73;break; //Ä£¿é0ºÍ1ÉèÖÃΪ8λPWMÊä³ö£¬Ìø±äÑزúÉúÖжÏ
      default: break;
      }
       }
CR=1; //PCA¼ÆÊýÆ÷¿ªÊ¼¼ÆÊý
}
/********************************************************************
                              ¶¨Ê±Æ÷º¯Êý
*********************************************************************/
void PCA_Intrrpt(void) interrupt 7
{
if(CCF0) CCF0=0;
if(CCF1) CCF1=0;   //Èí¼þÇåÁã
if(CF)   CF=0;    //Èí¼þÇåÁã
}

/********************************************************************
                             Ö÷º¯Êý
*********************************************************************/
void main()
{
TMOD|=0x02; /* timer 0 mode 2: 8-Bit reload */
TH0=0xff;
TR0=1;
PWM_clock(2);   // PCA/PWMʱÖÓԴΪ ¶¨Ê±Æ÷0µÄÒç³ö
PWM_start(0,0); // Ä£¿é0,ÉèÖÃΪPWMÊä³ö,ÎÞÖжÏ,³õʼռ¿ÕÒòËØΪ25%
while(1)
   {
    DelayMs(250);
   }
}

/********************************************************************
                              结束
*********************************************************************/

PCA的16位计数器,低8位CL和高8位CH,复位值均为00H,用于保存PCA的装载值。

寄存器CH和CL的内容是正在自由递增计数的16位PCA定时器的值,PCA定时器是2个模块的公共时间基准,可通过编程工作在:1/12系统时钟、1/8系统时钟、1/6系统时钟、1/4系统时钟、1/2系统时钟、系统时钟、定时器0溢出或ECI脚的输入(STC12C5A60S2系列的P1.2口)。

定时器的计数源由CMOD特殊功能寄存器中的CPS2、CPS1和CPS0位来确定

PCA捕获/比较寄存器 --低位字节CCAPnL和高位字节CCAPnH

当PCA模块用于捕获或比较时,它们用于保存各个模块的16位捕捉计数值;当PCA模块用于PWM模式时,它们用来控制输出的占空比。其中,n = 0、1,分别对应模块0和模块1.复位值均为00H。

时间: 2024-10-17 05:18:04

STC12C5A60S2单片机 PWM调试的相关文章

STC12C5A60S2单片机 串口调试

与串口1中断相关的寄存器有IE.IPH和IP 串口中断允许位ES位于中断允许寄存器IE中. EA:CPU的总中断允许控制位,EA=1,CPU开总中断:EA=0,CPU关总中断.各中断源首先受EA控制,其次还受各中断源自己的中断允许控制位控制. 与串口2中断相关的寄存器IE2.IP2H和IP2 串口2中断允许为ES2位于中断寄存器IE2中. 1 #ifndef _UART_H_ 2 #define _UART_H_ 3 4 #define uchar unsigned char 5 #define

STC12C系列单片机PWM脉宽调制

最近给别人做了一个小东西,MCU选的是STC12C5A60S2 ,需要用到PWM控制功能. 在网上找了一下,发现解释的不尽人意,无奈之下自己琢磨数据手册弄明白了. 首先,STC12C5A60S2内置有两个 编程计数器阵列(PCA) 模块,分别用于软件定时器,外部脉冲的捕捉,高速输出以及脉宽调制输出(PWM).具体寄存器详见数据手册这里就不多累述了. 这里就只讲PWM的实现,首先需要对PCA进行初始化配置,代码如下: void Pwm0_init(void) //PWM0初始化配置 { CCON

51单片机PWM直流电机调速

直流电动机的PWM调压调速原理 直流电动机转速N的表达式为:N=U-IR/Kφ 由上式可得,直流电动机的转速控制方法可分为两类:调节励磁磁通的励磁控制方法和调节电枢电压的电枢控制方法.其中励磁控制方法在低速时受磁极饱和的限制,在高速时受换向火花和换向器结构强度的限制,并且励磁线圈电感较大,动态响应较差,所以这种控制方法用得很少.现在,大多数应用场合都使用电枢控制方法. 对电动机的驱动离不开半导体功率器件.在对直流电动机电枢电压的控制和驱动中,对半导体器件的使用上又可分为两种方式:线性放大驱动方式

51单片机PWM程序详解

#include<reg51.h> //程序是基于KEIL-C51编写,引入8051头文件 sbit P10=P1^0; sbit P11=P1^1; unsigned int scale; //占空比控制变量 void main(void) { unsigned int n; //延时循环变量 TMOD=0x02; //定时器0,工作模式2(0000 0010),8位定时 TH0=0x06; //定时250us(12M晶振) TL0=0x06; //预置值 TR0=1; //启动定时器0 E

STMF103系列单片机无法调试和下载程序的原因及其解决

时间:2018/11月/15 经过实践中发现,使用stm32cubeMX 自动生成的代码,烧入单片机后第一次,断电重启后能够运行. 但是,再次对其进行操作的时候,发现无法进行调试,也无法对其下载程序. 怀疑是硬件问题,比如怀疑是硬件不稳定导致的.但是实际上原因并不是. 换了另外一块主芯片一样的不同设计的板子,依然发现了类似现象. 怀疑是软件问题. 经过同事指导,将boot0.boot1的跳线接到高电平,不从内部flash启动. 发现可以在IDE环境下(比如keil v5)对其进行下载程序.这一次

51单片机PWM

由定时器产生PWM信号,可手动按键调节PWM的占空比,按键由外部中断实现 #include <reg51.h> #include <intrins.h> #define CYCLE 6000 //周期6000 * 1us = 6ms #define SCALE (CYCLE / 100) //比例 1% #define ONE 0x10 #define TWO 0x01 #define THREE 0x40 #define FOUR 0x04 typedef unsigned ch

STC12C5A60S2片内存储器介绍

STC12C5A60S2内部集成RAM 1280字节,其中 内部RAM(data):256 Byte 内部扩展RAM(xdata):1024 Byte 支持片外扩展RAM: 64kB STC12C5A60S2单片机的所有程序存储器都是片上Flash存储器,不能访问外部程序存储器,且程序存储器和数据存储器是各自独立编址的.其中 程序存储器(AP): 0000H~0EFFFH (60K) STC12C5A60S2系列单片机内部集成了的EEPROM是与程序空间是分开的,可将内部Data Flash当E

STC12C5A60S2 12M 红外发射

/* STC12C5A60S2 11.0592M  从串口获取数据,红外发射 串口发送请用16进制的格式 这里采用1T周期的STC12C5A60S2单片机,11.0592MHZ 正电源→红外LED→P0.0脚. 串口1默认选T1作为波特率发生器 TO用于中断 */ #include <STC12C5A60S2.H> #include <INTRINS.h> sbit  ISR_LED = P0^0; static bit wave;                   //载波标志

嵌入式调试器原理和各类调试器集锦(JLINK、STLINK、CCDEBUG)

工欲善其事,必先善其器.调试器在嵌入式开发调试中的重要性不言而喻,单步.断点和监察的效率远高于串口打印.但是,调试器对于一般开发人员往往是一个黑匣子.今天我们就来谈谈调试器的原理,顺便把自己的几类调试器接线和注意事项记录下来,以便查找.我常常要面对几个方案,而各个方案的调试器都不一样,接线有时连自己都记不住.所以这个帖子应值得嵌入式开发工程师收藏. 一.嵌入式调试多样性 我们先来回想调试的场景,思考一下这几个问题: 1. ARM开发环境有Keil.IAR.ADS等等,我们发现这几个平台都能用同一