********
void
T0_int(void)
interrupt
1
{
TH0
=
0x4C
//重新装载,50MS定时器初值
TL0
=
0x00
T0_count++
if(T0_count==20)
//1S到
{
T0_count
=
0
//在这写程序
}
}
main()
{
TMOD
=
0x01//定时器0,工作方式1,16位计数
TH0
=
0x4C
//50MS定时器初值
TL0
=
0x00
IE
=
0x82
//开总中断,开T0中断
EA
=
1
ET0
=
1
TR0
=
1
T0_count
=
0
i
=
0
loop:
goto
loop
}
还有:
for(us=0us<60us++)
/*延时500us*/
for(us=0us<1us++)
/*
延时15微秒*/
for(us=0us<5us++)
/*
延时51微秒*/
在单片机中,要延时程序尽量准确,可以:-延时循环尽量简单,尽量少开变量比如:
Delay(unsigned int uDelay) { while ( uDelay-- )}
-在主程序中用一个GPIO测试,如:
SetGPIOHigh()Delay(1000)SetGPIOLOW()
-用示波器测量该GPIO波形及频率
-调整Delay函数的调用值,可以用变量,在调试时实时修改变量值,找到延时1毫秒的值,把Delay函数改名为Delay1ms,之后调用这个函数完成精确延时
-其他的延时函数也可以类似上述方法完成,但记住在调试和实际使用时要用同样的CPU主频。
-最精确的还是用定时器中断程序计时
1、比较死板的方法是自己写一个delay函数,里面用for,while等做一些循环,下面是1ms的延时函数void
delay1ms(void)
{
unsigned
char
i,j
for(i=0i<10i++)
for(j=0j<33j++)
}
具体算法是//(3j+2)*i=(3×33+2)×10=1010(us),但精确度不高,如果想准确点可以调节相应的参数用示波器来实
现,上面的函数适用于程序简单,对时间性要求不高,如:点led灯,单个按键 *** 作等等。
2,就是用定时器中断里面设定标志位来产生延时的方法,比如你可以把定时器设定为每1ms进一次中断,在中断里面
把一个标志位(如flag)置一
当你需要1ms延时的时候你可以先初始化定时器,然后查询标志位是否置一,置一则执行if后面的语句,即if(fla{}
当你需要10ms延时时,你可以把flag设置为uchar,中断里面flag++外面查询用if(10==flag){}
以此类推,上面的方法精确度高适用地方。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)