Timer有个功能是输出PWM信号。实验代码如下
/****************************************************************************
***************************定时器初始化,让PE7、6、5、4输出PWM信号*****************
****************************************************************************/
void Timer_Pwm(void)
{
rPCONE = 0xaa6b;
//PE8-P0的引脚功能依次为:ENDIAN TOUT4、3、2、1、0 RXD0 TXD0 FOUT
rPUPE |= 0xf0; //TOUT4、3、2、1、0设置成不上拉,其他引脚上拉
rTCFG0 = 0x23f3f3f; //死区长度为2; Prescaler0/1/2=3f,3f,3f
//定时器输入时钟频率计算公式 = MCLK/{prescaler+1}/{divider value}
rTCFG1 = 0x0; // Interrupt; Devider value = 1/2
//定时器时钟 = (MCLK/prescaler+1)/2
rTCNTB0 = 20000; //决定TOUT 0引脚PWM输出信号的频率
rTCNTB1 = 32000; //决定TOUT 1引脚PWM输出信号的频率
rTCNTB2 = 43000; //决定TOUT 2引脚PWM输出信号的频率
rTCNTB3 = 53000; //决定TOUT 3引脚PWM输出信号的频率
rTCNTB4 = 64000; //决定TOUT 4引脚PWM输出信号的频率
rTCMPB0 = 12000; //决定TOUT 0引脚PWM输出高电平的信号宽度(rTCMPB0<rTCNTB0)
rTCMPB1 = 18000; //决定TOUT 1引脚PWM输出高电平的信号宽度(rTCMPB1<rTCNTB1)
rTCMPB2 = 25000; //决定TOUT 2引脚PWM输出高电平的信号宽度(rTCMPB2<rTCNTB2)
rTCMPB3 = 28000; //决定TOUT 3引脚PWM输出高电平的信号宽度(rTCMPB3<rTCNTB3)
rTCMPB4 = 36000; //决定TOUT 4引脚PWM输出高电平的信号宽度(rTCMPB4<rTCNTB4)
// rTCON = 0xaaaa0a; //自动重装,输出取反关闭,更新TCNTBn、TCMPBn,死区控制器关闭
// rTCON = 0x999909; //开始PWM输出(不使用死区控制器,上升沿会非常陡峭,是标准矩形波)
// rTCON = 0xeeee0e; //自动重装,输出取反打开,更新TCNTBn、TCMPBn,死区控制器关闭
// rTCON = 0xdddd0d; //开始PWM输出(不使用死区控制器,上升沿会非常陡峭,是标准矩形波)
// rTCON = 0xaaaa1a; //自动重装,输出取反关闭,更新TCNTBn、TCMPBn,死区控制器打开
// rTCON = 0x999919; //开始PWM输出(使用死区控制器,上升沿会变得平滑,适用于功率器件控制)
//Delay(7500); //延时若干个100us
rTCON = 0xaaaa0a; //自动重装,输出取反关闭,更新TCNTBn、TCMPBn,死区控制器关闭
rTCON = 0x999900; //停止蜂鸣器的叫声
// rTCON = 0x0; //停止定时器
rPCONE = 0xaa6b; //
//PE8-P0的引脚功能依次为:ENDIAN TOUT4、3、2、1 OUTPUT RXD0 TXD0 FOUT
}