问题可能出在定义或者调用上:
unsigned int ms
这说明函数的形参ms是一个无符号数,你是不是调用它时给它传递了一个有符号数?而且一个无符号数减到0的时候,再执行减一,也可能出现问题。
比如while(ms--),当ms等于0时,退出while循环,但ms又减1了,你可以把函数这样修改试一下,如果还不行,兄弟也没法治了:(
void Delay(int ms)//延时ms1(ms)
{
unsigned char i;
while(ms-->0)
{
for(i = 0; i < 120; i++);
}
}
能用定时器最好用,但有时是没必要用的,太浪费了,可以考虑用软件延时
本人认为单单用anynop是不行的,如果我要延时1mS那不是要重复写1000次吗?Keil C里面主要靠循环来实现软件延时,如for while,但Keil C很奇妙
写法不同所产生的汇编代码也不一样,所以造成编写的程序时时性差,但也不完全是这样的,要实现精确延时也是有可能的,用while(--i);如:
void delay(int i)
{
while(--i);
}
记住只有这一种写法[while(--i);]精度是两个时钟周期,其它如while(i--);for(;i>0;i--)精度都不行。
按Ctrl+F5开始调试,在UV3的底部就有时间出现。按F10单步调试,可以看到时间 在增加。你可以在延时子程序开始和结束处加上断点,然后按F5运行,**指针会停在延时开始,再F5,指针跳到延时结束 。这时可以看到时间 变化。
delay函数转换为汇编后是这样的
MOV Rn,#data 为1个周期
DJNZ Rn,rel为2个周期
总共为401个周期
如果按照12MHz晶振来算就是401us(包括调用时间为403us)
只是普通的延时
一般是用于一些低速总线上,从设备的通讯速率较低才采用延时的方法。
启动到那是这个数,单独延时没那么大,那个延时函数也不是1us的,调用时也用了几句LCALL之类的代码,更小的延时#include <intrinsh> 直接用_nop_();10us直接10个_nop_();
o(∩_∩)o 哈哈,记得给分
以上就是关于为什么写了一个简单的软件延时程序无法调试全部的内容,包括:为什么写了一个简单的软件延时程序无法调试、高手帮忙:Keil C中如何实现比较精确一点的延时、keil uvision3中如何查看程序中的延时等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)