实话是,没有固定的参数,原因是,首先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毫秒。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)