STC12C5A60S2单片机PWM程序
根据提供的文件信息,本文将详细解析“STC12C5A60S2单片机PWM程序”的关键知识点,包括但不限于单片机PWM的基本原理、该程序如何实现PWM信号的输出以及如何通过不同的配置参数调整PWM信号的具体特性。 ### 一、PWM的基本概念 PWM(Pulse Width Modulation)即脉冲宽度调制技术,是一种通过对数字信号高电平持续时间(即占空比)的控制来模拟不同电压水平的方法。在电机控制领域,PWM常被用来调节电机转速或方向。 ### 二、STC12C5A60S2单片机简介 STC12C5A60S2是一款基于8051内核的高性能单片机,具有高速度、低功耗等特点。它内置了多种功能模块,如定时器、ADC、DAC等,其中PCA(Programmable Counter Array)模块可以用来实现PWM功能。 ### 三、STC12C5A60S2单片机PWM实现原理 在STC12C5A60S2单片机中,PCA模块可以实现两个独立的PWM通道。通过设置不同的寄存器值,可以调整PWM信号的周期、频率以及占空比。 #### 1. 关键寄存器解释 - **CCON(PCA控制寄存器)**:配置PCA的工作模式。 - **CMOD(PCA模式寄存器)**:设置PCA时钟源。 - **CCAPM0/1(PCA模式寄存器)**:配置PCA0/1的工作模式。 - **CL/CH(PCA计数器)**:设置PCA计数器的当前值。 - **CCAP0L/H/CCAP1L/H(PCA捕获/比较寄存器)**:存储PCA0/1的捕获值或比较值。 - **PCA_PWM0/1(PCA PWM控制寄存器)**:配置PCA0/1作为PWM输出时的工作模式。 - **CF/CR(PCA标志/控制位)**:控制PCA的启动/停止及溢出标志。 #### 2. PWM信号的配置步骤 1. **初始化时钟源**:通过`PWM_clock`函数设置PCA模块的时钟源。 2. **配置工作模式**:通过`PWM_start`函数设置PCA0/1的工作模式,包括但不限于占空比、PWM类型(正常/边缘/中心对齐等)。 3. **启动PCA**:使能PCA模块,并通过中断服务函数重置标志位,确保程序正常运行。 ### 四、代码详解 #### 1. 延时函数 `DelayMs` 该函数用于提供延时功能,适用于精确控制延时的情况。对于11.0592MHz的STC10F系列单片机,`DelayMs`函数中的循环次数为850时,大约延迟1毫秒。 #### 2. 设置PCA时钟源 `PWM_clock` 此函数通过设置`CMOD`寄存器,配置PCA的时钟源,例如设置为2,则表示PCA/PWM的时钟源为定时器0。 #### 3. 初始化PCA/PWM `PWM_start` 该函数根据传入的参数`module`(0/1/2,分别对应PCA0、PCA1、同时配置PCA0和PCA1)和`mode`(0/1/2/3,分别代表不同的工作模式),初始化PCA/PWM模块。例如,当`module=0`且`mode=0`时,PCA0将以8位PWM正常模式工作,并且初始占空比设为25%。 ### 五、总结 通过上述分析可以看出,该STC12C5A60S2单片机PWM程序能够实现两个独立PWM信号的输出,并且可以通过不同的配置参数灵活调整PWM信号的特性。这对于需要精细控制的场合,如智能小车中对两路马达的控制,是非常有用的。此外,程序中还包含了一个定时器0的配置,用以提供稳定的时钟源给PCA模块,从而保证PWM信号的稳定输出。
main.c
#include <REG51.H>
#include <intrins.h>
#define U8 unsigned char
#define U16 unsigned int
void DelayMs(U8 ms);
void PWM_clock(U8 clock);
void PWM_start(U8 module,U8 mode);
////////////////////// 延时子程序/////////////////////////////
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 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%
void PWM_clock(U8 clock);
void PWM_start(U8 module,U8 mode);
void PWM_clock(U8 clock)
{
CMOD |= (clock<<1);
CL = 0x00;
CH = 0x00;
}
void PWM_start(U8 module,U8 mode)
{
剩余7页未读,继续阅读
- zrbniepan2012-02-10两个程序放在一起有点乱
- zhengjun132015-09-14程序很乱啊,加个说明就好了!
- xhj_nono2012-07-12有点不清楚
- u0111683502013-10-23程序有点乱
- liyongqiang292014-04-26效果不是太好,需要整理一番!!
- 粉丝: 1
- 资源: 10
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助