#include "stc.h"
#include "pwm.h"
/*********************************************************************************************
程序名: PWM模块调试程序(仅实验用)
编写人: so守
编写时间: 2010年2月16日
硬件支持: STC12C5a60s2 22.MHz
老妖叫这些口为CCP!!!!!!!!!!!!!!!!!!!!!!P13 P14
接口说明: STC12XX 只有两路,模块0 模块1 PWM频率=时钟源输入频率/256 8位嘛
CCAPnH=256(1-占空比)CAPnH 是8 位整数,占空比是分数。
脉冲宽度调制频率
PCA定时器模式 PWM 频率
12MHz 16MHz
1/12振荡频率(晶振大小) 3.9KHz 5.2KHz
1/4振荡频率 11.8KHz 15.6KHz
定时器0溢出:
8位 15.5Hz 20.3Hz
16位 0.06Hz 0.08Hz
8位自动重装 3.9KHz 到15.3KHz 5.2KHz 到20.3KHz
外部输入(最大) 5.9KHz 7.8KHz
修改日志:
NO.1-WAV文件输出格式,输出比特为“8Bit”中采样频率可选择 24000H生成 WAV文 件语音的频率范围为 300Hz~3000Hz,而音乐的频率范围为 20Hz~20kHz
在PWM声音播放器中需要注意的就是PWM的频率一般是低通滤波器截止频率的4倍以上,
如果要播放音乐,C4 和 C5 选择 680pF,
PWM 频率至少在 44.1kHz 以上。
RdDataConvert=RdData*2-20; //将读出的数据增大,扩大声音,用RdDataConvert来改变PWM波的占空比
/*********************************************************************************************
/*********************************************************************************************
函数名:PWM初始化函数
调 用:PWM_init();
参 数:无
返回值:无
结 果:将PCA初始化为PWM模式,初始占空比为0
备 注:需要更多路PWM输出直接插入CCAPnH和CCAPnL即可 设置时钟来源,设定基础定时器,设定PWM模式,装入中心值
/**********************************************************************************************/
void PWM_init (void)
{
//CMOD决定了时钟源的来源1.0 &1.1 00 FOSC/12 01 FOSC/2 10 定时器溢出 11 P3.4外部输入
//CMOD=0x02; //设置PCA定时器// 0 1 0 Timer0 溢出由定时器的溢出率决定频率
//使用了定时器0,要启动么~
CMOD=0x01;//1/2f(33mhz 15mhz 58khz 22mhz 11mhz 42khz)
//基础定时器
CL=0x00;
CH=0x00;
/////////////////////////////////////////////////////////////
//PWM0设置PCA工作方式
//CCAPM0=0x4C; //为16位高速PWM方式//16位如何控制~
CCAPM0=0x42;//八位PWM
//在八位PWM下,CL在PCA启动后递减,当为0溢出将CCAP0H值放入CCAP0L,
//CL继续递减,当CL的值大于PWM输出高电平
CCAP0L=0x00; //设置PWM0初始值与CCAP0H相同,这个就是调整脉宽的
CCAP0H=0x00; // PWM0初始时为0
//////////////////////////////////////////////////////////////
CCAPM1=0x42;//PWM1设置PCA工作方式为PWM方式
CCAP1L=0x00; //设置PWM1初始值与CCAP0H相同
CCAP1H=0x00; // PWM1初始时为0
//同时CCAPM可以设置捕获的电平特点
/////////////////////////////////////////////////////////////////
///////////不同单片机,寄存器地址一样,只是多了与少而已,可以借鉴设置的含义
/* //CCAPM2=0x42; //PWM2设置PCA工作方式为PWM方式
//CCAP2L=0x00; //设置PWM2初始值与CCAP0H相同
//CCAP2H=0x00; // PWM2初始时为0
//CCAPM3=0x42; //PWM3设置PCA工作方式为PWM方式
//CCAP3L=0x00; //设置PWM3初始值与CCAP0H相同
//CCAP3H=0x00; // PWM3初始时为0 */
CR=1; //启动PCA定时器//允许 PCA 计数器计数, 必须由软件清0
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:PWM0占空比设置函数
调 用:PWM0_set();
参 数:0x00~0xFF(亦可用0~255)
返回值:无
结 果:设置PWM模式占空比,为0时全部高电平,为ff时全部低电平
备 注:如果需要PWM1的设置函数,只要把CCAP0L和CCAP0H中的0改为1即可
这个是当基础计时器溢出时,装入低位,与低位比较时得出高低电平的时间
/**********************************************************************************************/
void PWM0_set (unsigned char a)
{
CCAP0L= a; //设置值直接写入CCAP0L
CCAP0H= a; //设置值直接写入CCAP0H
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:PWM1占空比设置函数
调 用:PWM1_set();
参 数:0x00~0xFF(亦可用0~255)
返回值:无
结 果:设置PWM模式占空比,为0时全部高电平,为ff时全部低电平
备 注:如果需要PWM1的设置函数,只要把CCAP0L和CCAP0H中的0改为1即可
/**********************************************************************************************/
void PWM1_set (unsigned char a)
{
CCAP1L= a; //设置值直接写入CCAP0L
CCAP1H= a; //设置值直接写入CCAP0H
}
/**********************************************************************************************/
//* CCAPOH = CCAPOL = 0XC0; //模块0输出 占空因数为25%
//* CCAPOH = CCAPOL = 0X80; //模块0输出 占空因数为50%
//* CCAPOH = CCAPOL = 0X40; //模块0输出 占空因数为75%