www.pudn.com > STC.rar > STC_PWM.C, change:2009-07-25,size:1500b


/* 
当CL 的值小于{EPCnL,CCAPnL}时,输出为低,当CL 的值大于或等于{EPCnL,CCAPnL}时,输出为高。 
当CL的值由FF变为00溢出时,{EPCnH,CCAPnH}的内容装载到{EPCnL,CCAPnL}中。 
这样就可以实现无干扰的更新PWM。要使能PWM模式,模块CCAPMn寄存器的PWMn和ECOMn位必须置位。 
*/ 
 
sfr CCON   = 0XD8; 
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; 
sfr CH     = 0XF9; 
sfr CCAP0L = 0XEA; 
sfr CCAP0H = 0XFA; 
sfr CCAPM0 = 0XDA; 
sfr CCAPM1 = 0XDB; 
sbit CR    = 0XDE; 
 
void init_pwm() 
{ 
	CMOD = 0X00;  // Setup PCA TIMER 
	CL   = 0X00; 
	CH   = 0X00; 
	CCAP0L = 0XC0;  //Setup the initial value same as CCAP0H 
	CCAP0H = 0XC0;  //25% Duty Cycle 
	CCAPM0 = 0X42;  // 0100,0010 Setup PCA module 0 in PWM mode 
	CR = 1;  //Start PCA Timer 
} 
 
void main() 
{ 
	init_pwm(); 
	while(1) ; 
}