当前位置:首页 > 单片机 > 单片机
[导读]用定时器延时,有时候显得有点麻烦,我们不如考虑软件精确延时,软件延时无非就是利用for或while多重循环。以前用到延时函数时,都是从网上下载别人写好的延时子程序。延时5ms,400ms,1s,……,这些延时函数的函数名中

用定时器延时,有时候显得有点麻烦,我们不如考虑软件精确延时,软件延时无非就是利用for或while多重循环。以前用到延时函数时,都是从网上下载别人写好的延时子程序。延时5ms,400ms,1s,……,这些延时函数的函数名中都清清楚楚地标明了延时的时间,可我一直不知道这些函数是如何编写的,确切地说,是如果根据延时时间来确定循环次数的。如果是纳秒级的延时,可以通过示波器来观察波形,或者反汇编一下,计算一下指令执行时间,但如果延时时间相对较长,示波器便无能为力了。这几天好好看了一下Keil调试,发现Keil的功能实在是太强大了。利用Keil uVersion的调试就可以写出精确的软件延时程序。以下是我的简单小结,文中所有程序都是在Xtal=11.0592MHZ下测试。


比如我需要一个400ms的延时,随便写了个两重循环,外层循环5次,内层循环暂且设为5000:


复制代码

void Delay400Ms(void){

uchar i=5;

unint j;

while(i--){

j=5000; //通过keil调试来确定循环次数

while(j--);

}

}

复制代码

在main函数中调用Delay400Ms():


复制代码

void main()

{

while(1){

P1=0;

Delay400ms();

P1=1;

}

}

复制代码

进入uVersion的调试状态,按F10进行单步,当黄色箭头指向Delay400ms()这条语句时记下左边窗中Sys->sec的值,如图,是0.00042426。



再按F10,执行完Delay400ms()后,sec值变为0.38858181,此时记录刚才的初值0.00042426,结果0.38815755即说明执行Delay400ms()耗时388.15755ms,由此可见还未达到400ms的延时要求。此时,增加内循环的次数,将j的值增加到6700,再重复上述过程,算得0.40009874,即Delay400ms()程序延时400.09874ms,此时已经符合延时400ms的要求。


除了上述所说的观察sec值来确定延时时间外,还可以从Keil的性能分析窗口中观测到执行Delay400ms()函数的时间。进入调试状态后使用菜单View->Performance Analyzer Window,打开性能分析对话框,进入该对话框后,只有一项unspecified,点鼠标右键,在快捷菜单中选择Setup PA即打开性能分析设置对话框,对于C 语言程序,该对话框右侧的“Function Symbol”下的列表框给出函数符号,双击某一符号,该符号即出现在Define Performance Analyzer 下的编缉框中,每输入一个符号名字,点击Define 按钮,即将该函数加入其上的分析列表框。对于汇编语言源程序,Function Symbol 下的列表框中不会出现子程序名,可以直接在编缉框中输入子程序名,点击Close 关闭窗口,回到性能分析窗口,此时窗口共有4 个选项。全速执行程序,可以看到Delay400Ms 后出现一个蓝色指示条,配合上面的标尺可以直观地看出该函数占整个执行时间的比例,点击相应的函数名,可以在该窗口的状态栏看到更详细的数据,如下图:


值得注意的是,用性能分析窗口来观察延时函数的执行时间要求被观察的延时函数中不能再调用其他任何子函数,被测函数只能由C的基本语句组成,否则观测到的时候并不是整个函数的运行时间。


采用上述方法,得到了以下几个延时程序:


复制代码

/*

* 延时400毫秒

*/

void Delay400Ms(void){

uchar i=5;

unint j;

while(i--){

j=6699;

while(j--);

}

}


/*

* 延时1秒

*/

void delay_1_s()

{

uchar loop=10;

unint j;

while(loop--){

j=8375;

while(j--);

}

}


/*

* 延时N 秒,参数s为需要延时的秒数

*/

void delay_N_s(uchar s)

{

while(s--){

delay_1_s();

}

}

复制代码


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

嵌入式开发作为一种专业且技术密集型的领域,涵盖了从硬件底层驱动、中间件到应用层软件开发等多个层面的工作,其所需的工具种类繁多,各有针对性,旨在提升开发效率、保证代码质量以及简化调试过程。

关键字: 嵌入式开发 keil

之后新建新的工程,添加.a文件就可以使用了,当然也可以使用keil来添加,但是keil默认的是用.lab,需要自己配置一下文件属性,改为lib文件即可。一半release sdk的时候用这种方式很关键的,毕竟自己的核心代...

关键字: keil 文件属性 lib文件

DSP28335与AD7606通过SPI的串行数据交互

关键字: keil C

AD7606的并行采集

关键字: ad7606 数据 C keil

为帮助大家更好使用单片机编程软件,本文将对keil单片机编程软件仿真、调剂技巧予以讲解,并对该单片机编程软件的常见错误提示予以阐述。

关键字: 单片机编程软件 指数 keil

本文对于单片机编程软件的介绍将基于如何采用keil单片机编程软件调试stm32,如果你对单片机编程软件抑或本文内容具有兴趣,不妨继续往下阅读哦。

关键字: 单片机编程软件 指数 keil

本文对于单片机编程软件的介绍基于两点:1.keil单片机编程软件编译环境优化等级说明,2.keil单片机编程软件中两大概念名词解析。

关键字: 单片机编程软件 指数 keil

为增加大家对单片机编程软件的了解,本文将对keil单片机编程软件予以介绍,主要在于介绍该单片机编程软件的模式设置和一些编程事项。

关键字: keil 单片机编程软件 指数

为帮助大家更快学会单片机编程软件的使用,本文将对keil单片机编程软件的使用方法加以介绍。如果你对本文内容具有兴趣,不妨继续往下阅读哦。

关键字: keil 单片机编程软件 指数

本文对单片机编程软件的介绍基于Keil,主要在于介绍keil单片机编程软件如何将hex下载进STM32,如何烧写hex文件以及如何直接使用二进制数。

关键字: keil 单片机编程软件 指数
关闭
关闭