AT89C51单片机,如何实现延迟一秒

2024-11-28 23:58:17
推荐回答(4个)
回答1:

其实可以用C语言实现的,先要定义好定时器的初值
不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期
机器周期=12/n(n指晶振频率),假设你要定时的时间为M
那么定时的初值为:
M/机器周期=初值;
TH0=(65536-初值)%256;
TL0=(65536-初值)/256;
将(65536-初值)所得的值化成16进制,其高位就是TH0的值,低位为TL0的值
例如用12M晶振做1ms定时计算如下:
机器周期=12/12*10^6=1us(微秒)
定时初值=(1*10^-3)/(1*10^-6)=1000;
所以:TH0=(65536-1000)%256;
TL0=(65536-1000)/256;
将65536-1000=64536化为16进制为:0xFC18
TH0=0xFC;
TL0=0X18;
定好初值后要延迟一秒就定一个延时参数,这里使用1000就行了(定时为1ms)中断程序为:
timer0() interrupt 1 // 1ms延时(12.0MHz)
{
TR0=0;
ET0=0;
TH0=0xfc;
TL0=0x18;
if(delayTimes1!=0) delayTimes1--;
TR0=1;
ET0=1;
}
调用程序大致为:
if(delay_flag==0)
{
delay_flag=1;
delayTimes1=1000;
}
if(delayTimes1==0)
{
delay_flag=0;
这里写定时到的操作就行了;
}

(在主程序中使用delay_ms()这样的程序会影响程序运行速度的,使用中断就不会)

回答2:

用tmer1中断,在中断里也设置一个计数器变量即可。即第N次中断时时间为1S

回答3:

用延时程序只是大约的计算时间,我这里有个延时c程序:

void delay_10us(uchar n)
{
do
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}while(--n);
}

void delay_ms(uint n)
{
do
{
delay_10us(131);
}while(--n);
}

然后在主程序里有延时的地方调用delay_ms(1000);语句就是延时一秒了,不过你要在头文件里加上"include",实践证明,这个延时程序还比较准。

用定时器当然可以,把定时器设置为定时方式1(我这里比如单片机晶振是12MHZ的),那一次最多能计时65ms,离1s远远不够,你可以把计时器的初值付为50ms中断溢出一次,然后在中断函数中用if语句判断,让它中断20次再变标志位,就是1s计时。但是延时程序用定时器没必要……

回答4:

/*-----------------------------------------------a
调用方式:void yanshi(int x)
函数说明:延时x毫秒(晶振为6.0000M)
-----------------------------------------------*/
void yanshi(int x)
{
int a;
char b;
for(a=0;a {
for(b=0;b<124;b++);
}
}
void main(void)
{
```````
yanshi(1000);
````````
}