-延时循环尽量简单,尽量少开变量比如:
Delay(unsigned int uDelay) { while ( uDelay-- )}
-在主程序中用一个GPIO测试,如:
SetGPIOHigh()Delay(1000)SetGPIOLOW()
-用示波器测量该GPIO波形及频率
-调整Delay函数的调用值,可以用变量,在调试时实时修改变量值,找到延时1毫秒的值,把Delay函数改名为Delay1ms,之后调用这个函数完成精确延时
-其他的延时函数也可以类似上述方法完成,但记住在调试和实际使用时要用同样的CPU主频。
-最精确的还是用定时器中断程序计时
下面的延时的基本程序(中断加计数器)********
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微秒*/
1、十秒对于单片机来说是很长很长的时间了,单片机十秒的时间什么事都不能做,只在跑这延时程序,那是什么概念,用中断的话,单片机正常运行其他程序,只是时间到了才过来处理延时以后的程序,效率不知道高了多少 。
2、例程:
//假设晶振12MHZ
#include "reg51.h"unsigned int YSJS=0
void main(void)
{
TMOD |= 0X10 //定时器1工作于方式1,16位定时器
TH1 = 0XFF //定时器1定时时间=500uS
TL1 = 0X06
ET1 = 1 //使能定时器1中断
EA =1 //开总中断
while(1)
{
}
}
void TIMER1(void) interrupt 3 //定时器1中断函数使用默认寄存器组
{
TH1 = 0XFF //定时器1定时时间=500us
TL1 = 0X06
YSJS++
if(YSJS==20000) //500uS*20000=10000000us=10s
{
P1 = P1 ^ 0X01 //P1.0十秒钟翻转一次
YSJS = 0
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)