本帖最后由 安燕 于 2013-5-12 22:04 编辑
我现在需要用STC12C5A60S2单片机的PWM功能产生40KHz方波。我在芯片的数据手册里找到一个例子:
#include "reg51.h"
#include "intrins.h"
#define FOSC 18432000L
typedef unsigned char BYTE;
typedef unsigned int WORD;
/*Declare SFR associated with the PCA */
sfr CCON = 0xD8; //PCA控制寄存器
sbit CCF0 = CCON^0; //PCA模式0中断标志位
sbit CCF1 = CCON^1; //PCA模式1中断标志位
sbit CR = CCON^6; //PCA定时器运行控制位
sbit CF = CCON^7; //PCA定时器溢出标志位
sfr CMOD = 0xD9; //PCA模式寄存器
sfr CL = 0xE9; //PCA时基低8位
sfr CH = 0xF9; //PCA时基高8位
sfr CCAPM0 = 0xDA; //PCA单元0模式寄存器
sfr CCAP0L = 0xEA; //PCA单元0捕捉寄存器低8位
sfr CCAP0H = 0xFA; //PCA单元0捕捉寄存器高8位
sfr CCAPM1 = 0xDB; //PCA单元1模式寄存器
sfr CCAP1L = 0xEB; //PCA单元1捕捉寄存器低8位
sfr CCAP1H = 0xFB; //PCA单元1捕捉寄存器高8位
sfr PCAPWM0 = 0xf2;
sfr PCAPWM1 = 0xf3;
void main()
{
CCON = 0; //PCA控制寄存器初始化
//PCA定时器停止运行
//清楚CF标志位
//清除全部单元中断标志位
CL = 0; //PCA时基复位
CH = 0;
CMOD = 0x02; //设置PCA时钟源为FOSC/2
//PCA时钟溢出不能使位
CCAP0H = CCAP0L = 0x80; //PWM0输出占空比为50%
CCAPM0 = 0x42; //PCA工作在8bit模式
//PCA不中断
CCAP1H = CCAP1L = 0xff; //PWM 输出占空比0%
PCAPWM1 = 0x03;
CCAPM1 = 0x42; //PCA工作在8bit模式
//PCA不中断
CR = 1; //PCA定时启动
while ( 1);
}
我不知道要在哪里写入我需要的频率?
由于PWM是8位的,所以 PWM的频率=PCA 时钟输入源频率/256
PCA 时钟输入源可以从以下8种中选择一种:SYSclk, SYSclk/2 , SYSclk/4 ,SYSclk/6 ,SYSclk/8 ,SYSclk/2,定时器0的溢出,ECI/P3.4 输入。
CMOD = 0x02;那我选用的PCA时钟输入源就是SYSclk/2,我根据上述公式计算出SYSclk的值后在程序的那个地方写入?
求高手指点,如果有类似的程序和电路图分享的话就更好了。先谢谢了。 |