/*-----------------------------------------------------*
*工 程 名:PWM.prj *
*硬件接线:PTD.4,即定时器1通道0(21脚)接指示灯或蜂鸣器 *
*程序描述:通过对PWM占空比的调节实现现指示灯的渐亮的功能*
* 当占空比为100%时再从0%逐渐增加 *
*目 的:学习HC08系列定时器脉宽调制功能 *
*-----------------------------------------------------*/
/*[头文件]*/
#include "MC68HC908GP32.H" //包含头文件
/*函数声明*/
void PWMInit(unsigned int ); //PWM初始化
void Delay_ms(unsigned char ); //延时
/*主程序*/
void main()
{
unsigned int Period; //PWM周期
unsigned int Duty; //PWM占空比
//[变量初始化]
Period =0x0180; //PWM周期默认为10ms
//[PWM初始化]
PWMInit(Period);
Duty = 0; //PWM占空比为0
//[主循环]
while(1)
{
//[判断脉宽是否达到周期的长度(占空比为100%)]
if(Duty<Period)
Duty=Duty+1; //PWM占空比加1
else //占空比达到100%,设置占空比为0%
Duty=0;
T1SC|=(1<<5); //停止定时器1计数器计数
//[设置PWM脉宽]
T1CH0H = (Duty>>8); //设置高字节
T1CH0L = Duty; //设置低字节
T1SC&=~(1<<5); //允许定时器1计数器计数
Delay_ms(10); //延时10ms
}
}
/*PWMinit:PWM初始化设置--------------------------------*
* 功 能:PWM脉冲周期、占空比的设置 *
* 参 数:rate=脉宽时钟数,cyc=脉冲周期时钟数 *
* 返 回:无 *
*-----------------------------------------------------*/
void PWMInit(unsigned int Period)
{
unsigned int Temp=Period;
//不允许溢出中断,不启动计数,分频因子=64,置位TSTOP,TRST
T1SC = 0x36;
//[设置PWM周期]
T1MODH = (Temp>>8);
T1MODL = Period;
//[初始化设置PWM脉宽为0]
T1CH0H = 0x00;
T1CH0L = 0x00;
//设为PWM模式,不允许输出比较中断,输出低电平,不带缓冲
T1SC0 = 0x1E;
//允许定时器1计数寄存器计数
T1SC &= 0xDF;
}
/*Delay_ms:毫秒级延时函数------------------------------*
*功 能:延时函数 *
*参 数:i=延时时间(ms) (i取值范围:1-255) *
*返 回:无 *
*-----------------------------------------------------*/
void Delay_ms(unsigned char i)
{ unsigned char j;
unsigned char u;
for(j=0;j<i;j++)
for(u=0;u<=250;u++) ;
}