一种最原始,最没有效率的延时程序。在调用这个延时程序时,CPU将在while(time--){}这个循环处不停的等待,直到time减到零,标志着延时结束。程序也随之退出。
从函数第一句开始,直到while循环语句之前,都属于定时器配置。通过注释可以看出,使用了定时器3。由于不知道单片机的型号,只能做一个通用的解释。看懂这一解释的基础是你知道单片机定时器的配置方法和工作原理。
首先,表示时间的变量time不是时间单位,并不表示毫秒或者秒,他代表了延时多少个脉冲。而变量val也是脉冲,他定义了一个定时器工作周期所经过的脉冲数。单个脉冲表示的时间间隔则通过单片机工作频率计算出来。比如说,单片机的频率为10mHz,那么每个脉冲的时间就是1uS(假设分频电路为1:1)。如果需要定时器的一个工作周期为1ms,那么val就需要设为1000。如果延时10ms,则time=100。可见,延时时间只能是定时器工作周期的整数倍。
rTcon3是定时器3的计数器,每个脉冲过后,会根据定时器的设定而自动进行+1操作。完成一个工作周期后,恢复为0。
这是利用定时器3的计数功能来延时的程序
void Delay(int time)
{
U32 val = (PCLK>>3)/1000-1;
rTCFG0 &= ~(0xff<<8);
rTCFG0 |= 3<<8; //prescaler = 3+1
rTCFG1 &= ~(0xf<<12);
rTCFG1 |= 0<<12; //mux = 1/2 //这四句设置定时器输入的频率,PCLK/8
rTCNTB3 = val; //设置计数值,输入频率除以1000,即计数器到底时正好1ms
rTCMPB3 = val>>1; // 50% //这个是设置比较值,计数到这个值时,引脚会有输出
rTCON &= ~(0xf<<16);
rTCON |= 0xb<<16; //interval, inv-off, update TCNTB3&TCMPB3, start timer 3
rTCON &= ~(2<<16); //clear manual update bit //这几行是启动定时器,开始进行计数,计数到0时自动重新装载计数值
while(time--) {
while(rTCNTO3>=val>>1);
while(rTCNTO3
};
}