51编程中的延时时间函数问题

51编程中的延时时间函数问题,第1张

实话是,没有固定的参数,原因是,首先51的主频是不一定的,然后一般延时看的是对应的汇编语言代码,也就是对应的一条汇编指令执行的时间而定的。因此,从C语言里面不容易实现精确的延时处理。一般的处理方式是,使用keil或者其他软件的调试,在延时函数的前后加上断点,查看前后执行的时间,然后逐渐的修改for循环里面的数值,使之比较接近想要的延时时间。

由于使用延时的不精确性,建议使用定时器实现类似的功能即可。

delay函数是一般自己定义的一个延时函数。

C语言定义延时函数主要通过无意义指令的执行来达到延时的目的。

关于单片机C语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而本函数克服了以上缺点,能够精确计数出要延时值且精确达到1us,本举例所用CPU为STC12C5412系列12倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。

ms=1时,第一个for循环进入,然后在第二个for循环中执行100次

再回到第一个for循环中进行第二次循环

就这样

你可以进入编辑器,添加断点,自行查看代码执行过程

void main()

{

if(s19==0) //判断按键是否按下,s19是个开关

delay(10); //等待再次判断,以防误 *** 作,去抖

if(s19==0)

{P1=0x7f; }

}

这个这样写不行呀,这样只会执行一次呀。延时没有问题

void main()

{

while(1)

{

if(s19==0) //判断按键是否按下,s19是个开关

{

delay(10); //等待再次判断,以防误 *** 作,去抖

if(s19==0)

{P1=0x7f; }

}

}

}

楼主呀, {P1=0x7f; }这个里面要有多的延时呀,没有的话自然没有了呀。你换成:

{P1=0x7f;delay(100); }肯定有的啦。

其实这个你自己可以单步调试出来得呀。

unsigned long TimeTickCount;//1ms计时器

void Timer0Configuration();

void Delay1ms(unsigned int a);

void main()

{

while(1)

{

Delay1ms(1000);//1s延时;

}

}

void Delay1ms(unsigned int a)//0~65535

{

unsigned long b;//0~0xffffffff

b = TimeTickCount;//记下及时器初始值

while((TimeTickCount-b<a)||(0xffffffff+TimeTickCount-b<a));

//当计数器未溢出只须用 计数器实时变化的值-其初始值

//当计数器溢出则须用 计时器上限值+计数器实时变化的值-其初始值

}

void Timer1Configuration()

{

TMOD=0X10;//选择为定时器模式,工作方式1。

TH1=0Xfc; //给定时器赋初值,定时1000us

TL1=0X18;

ET1=1;//打开定时器1中断允许

EA=1;//打开总中断

TR1=1;//打开定时器

}

void interrupt_timer1() interrupt 3 //1000us

{

TH1 = 0xfc; //重装

TL1 = 0x18;

TimeTickCount++;//1000us计时器

}

如果在程序中X=10(你写程序时肯定会给他赋一个值,在这里假定是10),即在程序的某处会有delay(10)这样的语句。相当于循环了600X=60010=6000次。可以根据自己的需要来定。你说得对,可以写一个就行。但是有些芯片,你在控制他时,时序要求非常严格,如果延时太长或延时太短,都不会运行出结果。如果需要小延时的地方(只需几个us),只写一个就可以。如果需要延时几ms,只写一个,可能达不到延时要求。总而言之,要根据你的程序需要,时间长了,学的多了,也就懂了。希望我的回答,能给你提供点帮助

1、C语言中没有_nop_()函数,该函数是在51单片机中用的延时函数,延时一个指令周期。一般包含在

intrinsh

头文件当中。

2、例如用6MHz的晶振,则如下for循环大约延时1秒。

int

i;

for(i=0;

i<6000000;

i++)

_nop_();

//

延时一个指令周期,相当于执行一条无意义的语言

我这有个函数自己实验出来的,在KEIL里看差不多就是延时1毫秒

void delay1ms(unsigned int t)

{

unsigned x,y;

for(x=t;x>0;x--)

for(y=124;y>0;y--);

}

把t 改为你要延时的数就可以了,1毫秒就把t改为1 500毫秒就把t改为500

void Delay1000us() { unsigned char i, j; //延时等等1毫秒

i = 2; j = 239; //下面需要做双重循环,其中外循环2次,内循环239次

do{

while(--j); //每次内循环做一次减法和一次判断

} while(--i); //每次外循环做一次减法和一次判断

}

正如函数名写明的大体上可以认为,在当前的时钟频率下,经过测试,做上述这么多次的运算(执行语句次数)会耗时1毫秒。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12156107.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存