Keil纯软件延时程序

合集下载

使用KeilC进行51单片机延时程序编写的几点心得

使用KeilC进行51单片机延时程序编写的几点心得

使用KeilC进行51单片机延时程序编写的几点心得使用Keil C进行51单片机延时程序编写的几点心得应用单片机的时候,经常会遇到需要短时间延时的情况。

需要的延时时间很短,一般都是几十到几百微妙(us)。

有时候还需要很高的精度,比如用单片机驱动DS18B20的时候,误差容许的范围在十几us以内,不然很容易出错。

这种情况下,用计时器往往有点小题大做。

而在极端的情况下,计时器甚至已经全部派上了别的用途。

这时就需要我们另想别的办法了。

以前用汇编语言写单片机程序的时候,这个问题还是相对容易解决的。

比如用的是12MHz 晶振的51,打算延时20us,只要用下面的代码,就可以满足一般的需要:mov r0,#09hloop:djnzr0,loop51 单片机的指令周期是晶振频率的1/12,也就是1us一个周期。

mov r0,#09h需要2个极其周期,djnz也需要2个极其周期。

那么存在r0里的数就是(20-2)/2。

用这种方法,可以非常方便的实现256us以下时间的延时。

如果需要更长时间,可以使用两层嵌套。

而且精度可以达到2us,一般来说,这已经足够了。

现在,应用更广泛的毫无疑问是Keil的C编译器。

相对汇编来说,C固然有很多优点,比如程序易维护,便于理解,适合大的项目。

但缺点(我觉得这是C的唯一一个缺点了)就是实时性没有保证,无法预测代码执行的指令周期。

因而在实时性要求高的场合,还需要汇编和C的联合应用。

但是是不是这样一个延时程序,也需要用汇编来实现呢?为了找到这个答案,我做了一个实验。

用C语言实现延时程序,首先想到的就是C常用的循环语句。

下面这段代码是我经常在网上看到的:void delay2(unsigned char i){for(; i != 0; i--);}。

keil中延时函数

keil中延时函数

keil中延时函数
Keil中的延时函数是指在程序运行时,通过调用Keil提供的延时函数来实现程序暂停一定时间的效果。

这种功能常常被用于等待外设响应、调试代码等方面。

Keil提供了两种主要的延时函数:__delay()和__delay_ms()。

其中,__delay()函数的参数为CPU时钟周期数量,而__delay_ms()函数的参数为毫秒数。

这两个函数的实现机制都是基于循环计数实现的。

使用Keil中的延时函数时,需要注意以下几点:
1. 在使用__delay()函数时,需要根据CPU时钟频率计算出需要延迟的CPU时钟周期数量。

2. 在使用__delay_ms()函数时,需要根据CPU时钟频率和需要延迟的毫秒数来计算出需要调用的延时函数次数。

3. 延时函数执行时会占用CPU资源,因此需要注意不要过度使用延时函数,以免影响程序的运行效率。

4. 在使用延时函数时,需要考虑系统的实时性和稳定性,以确保程序的正确性和安全性。

总之,Keil中的延时函数是一种非常常用的程序设计方法,掌握其使用方法对于编写嵌入式系统程序非常重要。

- 1 -。

Keil仿真及软件延时语句的精确计算

Keil仿真及软件延时语句的精确计算

Keil仿真及延时语句的精确计算
1、编写程序:
2、点击工程设置对话框,弹出
将晶振的默认值修改为实验板上的晶振频率,eg:11.0592,单击“确定”,完成设置3、单击窗口上的调试按钮,进入软件模拟调试模式。

:将程序复位到主函数的最开始处,准备重新运行程序;
:全速运行,运行程序时中间不停止;
:停止全速运行
:进入子函数内部
:单步执行代码,不进入子函数内部,可直接跳过函数
:跳出当前进入的函数
:程序直接运行至当前光标所在行;
:显示/隐藏编译窗口,可以查看每句C语言编译后对应的汇编代码
:显示/隐藏变量观察窗口,可以查看各个变量值的变化状态
4、查看硬件IO口电平变化:
选择IO口
查看IO状态:
5、查看变量的变化:
十进制显示:
十六进制显示:
十-----十六进制转换:
寄存器窗口:
其中sec 0.00042209=422.09us,程序启动执行到目前停止位置所花的所有时间,(这个时间是累积的)
A:单步执行所花的时间:
423.18-422.09=1.09us,恰好是51单片机在11.0592晶振频率下,一个机器周期(12个时钟周期)所花费的时间
B:延时语句的精确计算
在延时语句的两头设置端点:
点击全速运行,运行到第一个断点处,记录
再点击全速运行,运行到第二个断点处,记录968.31272ms 两个sec之差约为1s。

利用Keil调试精确实现软件延时

利用Keil调试精确实现软件延时
整个执行时间的比例,点击相应的函数名,可以在该窗口的状态栏看到更详细的数据,如下图:
图2 值得注意的是,用性能分析窗口来观察延时函数的执行时间要求被观察的延时函数中不能再调用其他任何子函数,被测函数只能由C的 基本语句组成,否则观测到的时候并不是整个函数的运行时间。 采用上述方法,得到了以下几个延时程序: /* * 延时400毫秒 */ void Delay400Ms(void){
while(s--){ delay_1_s();
} }
但是我碰到一个比较奇怪的问题:在实现N秒延时函数中,我不调用delay_1_s()这个延时1秒函数,而用delay_1_s()中的语句来替 换delay_1_s(),改后的函数如下:
void delayNs(uchar s) {
uchar loop=10; unint j; while(s--){
比如我需要一个400ms的延时,随便写了个两重循环,外层循环5次,内层循环暂且设为5000: void Delay400Ms(void){
uchar i=5;
unint j; while(i--){
j=5000; while(j--);
//通过keil调试来确定循环次数
} }
在main函数中调用Delay400Ms(): void main()
loop=10; //注意,不能忘了此句 while(loop--){
j=8375; while(j--); } }
}
{ while(1){ P1=0; Delay400ms();
P1=1; }
} 进入uVersion的调试状态,按F10进行单步,当黄色箭头指向Delay400ms()这条语句时记下左边窗中Sys->sec的值,如图, 是0.00042426。

KeilC51程序设计中几种精确延时方法

KeilC51程序设计中几种精确延时方法

Keil C51程序设计中几种精确延时方法2009年05月16日星期六 14:35转自:/archive/2009/03/06/1404721.html来源:嵌入式技术网作者:河南师范大学段向东毋茂盛时间:2007-12-19 发布人:林逸--------------------------------------------------------------------------------------------摘要实际的单片机应用系统开发过程中,由于程序功能的需要,经常编写各种延时程序,延时时间从数微秒到数秒不等,对于许多C51开发者特别是初学者编制非常精确的延时程序有一定难度。

本文从实际应用出发,讨论几种实用的编制精确延时程序和计算程序执行时间的方法,并给出各种方法使用的详细步骤,以便读者能够很好地掌握理解。

引言单片机因具有体积小、功能强、成本低以及便于实现分布式控制而有非常广泛的应用领域[1]。

单片机开发者在编制各种应用程序时经常会遇到实现精确延时的问题,比如按键去抖、数据传输等操作都要在程序中插入一段或几段延时,时间从几十微秒到几秒。

有时还要求有很高的精度,如使用单总线芯片DS18B20时,允许误差范围在十几微秒以内[2],否则,芯片无法工作。

用51汇编语言写程序时,这种问题很容易得到解决,而目前开发嵌入式系统软件的主流工具为C 语言,用C51写延时程序时需要一些技巧[3]。

因此,在多年单片机开发经验的基础上,介绍几种实用的编制精确延时程序和计算程序执行时间的方法。

实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。

1 使用定时器/计数器实现精确延时单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。

第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。

KeilC51程序设计中几种精确延时方法

KeilC51程序设计中几种精确延时方法
将汇编语言与 C51 结合起来 ,充分发挥各自的优势 , 无疑是单片机开发人员的最佳选择 。
2. 3 使用示波器确定延时时间
熟悉硬件的开发人员 ,也可以利用示波器来测定延时 程序执行时间 。方法如下 : 编写一个实现延时的函数 ,在 该函数的开始置某个 I/ O 口线如 P1. 0 为高电平 ,在函数 的最后清 P1. 0 为低电平 。在主程序中循环调用该延时函 数 ,通过示波器测量 P1. 0 引脚上的高电平时间即可确定 延时函数的执行时间 。方法如下 :
Dly T) ,经过反汇编后得到如下代码 :
C :0x0014 DFFE DJ NZ R7 ,C :0014 / / 2 T 可以看出 ,这时代码只有 1 句 ,共占用 2 个机器周期 , 精度达到 2 μs ,循环体耗时 Dly T ×2 个机器周期 ;但这时 应该注意 ,Dly T 初始值不能为 0 。 这 3 种循环结构的延时与循环次数的关系如表 1 所列 。
用; ◆ 在程序的开头应加上预处理指令 # pragma asm ,
在该指令之前只能有注释或其他预处理指令 ; ◆ 当使用 asm 语句时 ,编译系统并不输出目标模块 ,
而只输出汇编源文件 ; ◆ asm 只能用小写字母 ,如果把 asm 写成大写 ,编译
系统就把它作为普通变量 ;
◆ # pragma asm 、# pragma endasm 和 asm 只能在函 数内使用 。
Keil C51 精确延时 程序执行时间
引 言
单片机因具有体积小 、功能强 、成本低以及便于实现 分布式控制而有非常广泛的应用领域[1] 。单片机开发者 在编制各种应用程序时经常会遇到实现精确延时的问题 , 比如按键去抖 、数据传输等操作都要在程序中插入一段或 几段延时 ,时间从几十微秒到几秒 。有时还要求有很高的 精度 ,如使用单总线芯片 DS18B20 时 ,允许误差范围在十 几微秒以内[2] ,否则 ,芯片无法工作 。用 51 汇编语言写程 序时 ,这种问题很容易得到解决 ,而目前开发嵌入式系统 软件的主流工具为 C 语言 ,用 C51 写延时程序时需要一 些技巧[3] 。因此 ,在多年单片机开发经验的基础上 ,介绍 几种实用 的 编 制 精 确 延 时 程 序 和 计 算 程 序 执 行 时 间 的 方法 。

Keil C51精确延时程序(C语言)

Keil C51精确延时程序(C语言)

Keil C51精确延时程序程序说明如下:振荡频率:12MHz机器周期=12/振荡频率=12/12000000=1us#include <reg52.h>void delay1(unsigned char i){ while(--i);}说明:delay1程序为:延时时间=(2*i+2)*机器周期。

i=1~255。

void delay2(unsigned char i){ while(i--);}说明:delay2程序为:延时时间=(6*i+2)*机器周期。

i=1~255。

void main (void){unsigned char m;delay1(10); //赋值并调延时程序delay1说明:本句为赋值并调用Delayus1:延时时间=(1+2)*机器周期。

全部延时时间为:延时时间=(1+2+2*i+2)*机器周期。

i=1~255。

本例:延时时间=(1+2+2*10+2)*1us=25usdelay2(10); //赋值并调延时程序delay2说明:本句为赋值并调用Delayus2:延时时间=(1+2)*机器周期。

全部延时时间为:延时时间=(1+2+6*i+2)*机器周期。

i=1~255。

本例:延时时间=(1+2+6*10+2)*1us=65usm=10; //赋值,m=1~255while(--m) ; //计算,延时时间=2*m*机器周期说明:本两句为赋值并计算。

全部延时时间为:延时时间=(1+2*m)*机器周期。

m=1~255。

本例:延时时间=(1+2*10)*1us=25uswhile(1);}。

Keil C51精确延时程序设计

Keil C51精确延时程序设计

Keil C51精确延时程序设计时间:2013-05-16 10:45:33 来源:电子设计工程作者:吴挺运,林成何摘要针对C语言代码的执行时间的可预见性差,结合Keil C51开发工具,分析了在Keil C51开发工具中利用C语言实现精确的延时程序的设计,指出了常用延时方法优缺点。

并通过一些实例分析了延时时间的计算方法,使C语言代码的延时时间可以被预见。

C语言中嵌套汇编语言是一种有效的方法,可以充分发挥出各语言的优势特点、提高开发效率。

关键词 Keil C51;C语言;软件延时;单片机C语言具有较强的数据处理能力、语言功能齐全、使用灵活方便、开发效率高,被广泛应用于在单片机系统开发应用中。

在单片机幕统开发的过程中,经常需要使用到延时程序,但C语言代码执行时间。

的可预见性和实时性较差,在开发一些具有严格通信时序要求的系统时,往往需要反复调试延时代码,给开发者带来了较大困难。

比如使用DS18B20进行温度测控时,必须按照其单总线通信协议,否则无法读取温度数据。

针对上述问题,结合Keil C51开发工具和Proteus仿真软件,介绍在Keil C51开发系统中,利用C语言编写的延时程序设计及其运行的时间的计算方法。

1 常用延时程序的设计方法1.1 利用定时器/计数器延时利用C51单片机内部2个16位定时器/计数器实现精确的程序,由于定时器/计数器不占用CPU的运行时间,可以提高CPU的使用效率。

但假设使用12 MHz晶振,定时器工作在方式1模式下,其最长定时时间也只能达到65.53 ms,由此,可以采用中断方式进行溢出次数累加的方法进行长时间的延时程序设计。

但在开发过程中要考虑C51自动对断点的保护和重装初值所带来的延时误差,也可以使用定时器工作在方式2模式下,减少重装初值所带来的误差。

1.2 利用空操作实现延时当所需的延时非常短,可以利用Keil C51自带intrins.h头文件中的_nop_()函数实现函数延时。

keil5延时函数

keil5延时函数

keil5延时函数
Keil5中的延时函数是用来控制程序执行时间的一种方法。

它可以在程序中等待一段时间,以使程序执行更加精确和可预测。

在Keil5中,有两种延时函数可供选择:精确延时(Accurate Delay)和普通延时(Delay)。

精确延时函数的实现方式是利用Keil5中的定时器功能来实现精确的延时控制,可以设置精确的延迟时间。

而普通延时函数则是通过循环等待的方式来实现,因此精度较低,但使用起来更加简单。

在使用延时函数时,需要注意的是延时时间的单位是毫秒,因此在设置延时时间时需要将单位转换成毫秒。

此外,在程序中使用延时函数时还需要注意避免出现死循环等问题,以保证程序正常运行。

- 1 -。

keil中的准确延时

keil中的准确延时

很多初学者对于程序中ms级延时函数的编写方法比较疑惑,其原理和方式虽然简单,但是却没有相关资料。

这里用一个例程详细介绍一下。

过程参考如下:
在编译器下建立一个新项目,也可以利用已有项目。

此过程中需要注意,单片机晶振的选择,因为for循环里指令的执行时间和晶振有直接关系,本例中晶振使用11.0592M。

编写一段关于延时的函数,主要利用for循环,代码如下:
void delay_ms(unsigned int ms)
{
unsigned int i;
unsigned char j;
for(i=0;i<ms;i++)
{
for(j=0;j<200;j++);
for(j=0;j<102;j++);
}
}
其中ms是输入参数,如果输入1,就是要求程序延时1ms。

j变量是调整程序运行的时间参数。

调整j的数值,使1次循环的时间在1ms。

将此程序编译通过,然后利用软件仿真,调整时间。

两次时间差就是延时函数使用的时间,如果与1ms相差比较多,用户可以调整j参数的值,使延时时间尽量接近1ms。

如增大j的值for(j=0;j<105;j++);
此方法得出延时函数,在晶振不同的情况下,延时时间会不准。

另外这种方法不是完全精确的延时,所以不要太深研究误差的问题。

软件调试结果,这个程序的延时时间为:
1.01779ms,一般的单片机系统中都可以应用。

TAG: 51单片机单片机C精确延时延时计算KEIL精确延时。

Keil C51程序设计中几种精确延时方法

Keil C51程序设计中几种精确延时方法

器 延 时 从 程 序 的 执 行 效 率 和 稳 定 性 两 方 面 考 虑 都 是 最 佳
的 方 案 。但 应该 注 意 , 1编 写 的 中断 服 务 程 序 编 译 后 会 C5
自动 加 上 PUS AC P H S 、 OP P W 和 PO H C、 US P W P S P

JJ J c…

维普资讯

珏 譬



N U -( ); J
◆ #p a maam、 rg n a m 和 a m 只 能在 函 rg s #p a mae d s s 数 内使 用 。

NOP () 一 ;
N0 P () ;
AC C语 句 , 行 时 占用 了 4个 机 器 周 期 ; 程 序 中还 有 计 执 如 数 值加 1语 句 , 又 会 占用 1个机 器 周 期 。这 些 语 句 所 消 则 耗 的 时 间在 计 算 定 时初 值 时 要 考 虑 进 去 , 初值 中减 去 以 从
达 到最 小 误 差 的 目的 。


将 汇 编 语 言 与 C 1结 合 起 来 , 分 发 挥 各 自的 优 势 , 5 充
无 疑 是 单 片 机 开 发 人 员 的 最佳 选 择 。

Dea l u () ly 0 s 函数 中共 用 了 6个一 NOP () 句 , 个 一 语 每
语 句 执 行 时 间 为 1U 。主 函 数 调 用 Dea l u () , 执 S ly 0 s 时 先 行一 个 L CALL指 令 ( s , 后 执 行 6个一 2 )然 NOP () 句 一 语
维普资讯
K iC 1 序设 计中几 种精确 延 时方法 * el 5 程

Keil软件延时 - 单片机

Keil软件延时 - 单片机

Keil软件延时 - 单片机C语言常用的延时办法,有以下4种图1C语言延时图1是我们编程语言常用的4种延时方法,其中两种非精确延时,两种精确一些的延时。

for语句和while语句都可以通过改变i 的范围值来改变延时时间,但是C语言的时间都是不能通过程序看出来的。

精确延时有两个方法,一个方法是用定时器来延时,这个方法我们后边课程要详细介绍,定时器是单片机的一个重点。

另外一个就是用库函数_nop_();,一个NOP的时间是一个机器周期的时间,这个后边也要介绍。

非精确延时,只是在我们做一些简单的比如小灯闪烁,流水灯等简单实验中使用,而实际做实际开发程序中其实这种非精确延时用的极少,这里我们只是做演示功能使用。

好了,介绍完了,我们就要实战了。

上节课的LED小灯闪烁的程序,我们用的延时方式是for(i=0;i30000;i++);大家如果把这里的i改成100,下载进入单片机,会发现小灯一直亮,而不是闪烁状态,现在大家都把这个程序改一下,都改成100,然后下载观察一下现象再继续。

观察完了,毫无疑问,实际现象和我提到的理论是相符合的,这是为什么呢?这里介绍一个常识。

我们人的肉眼对闪烁的光线有一个最低分辨能力,通常情况下当闪烁的频率高于50Hz时,我们看到的信号就是常亮的。

即,延时的时间低于20ms的时候,我们的肉眼是分辨不出来小灯是在闪烁的,可能最多看到的是小灯亮暗稍微变化了一下。

要想清楚的看到小灯闪烁,延时的值必须大一点,大到什么程度呢,不同的亮度的灯不完全一样,大家可以自己做实验。

那么如何观察延时有多长时间呢?大家鼠标点Keil的Project--OptionsforTarget‘Target1’,或点Target1右侧图标,进入设置选项,如图2所示图2OptionsforTarget首先我们打开Target这个选项卡,找到里边的Xtal(MHz)这个位置,这是填写我们进行模拟时间的晶振选项,从我们原理图以及板子上都可以看到,我们单片机所配的晶振是11.0592MHz,所以这个地方我们要填上11.0592。

Keil_C51_for循环精确延时

Keil_C51_for循环精确延时
C:0x080A DFF6 DJNZ R7,C:0802
C:0x080C 22 RET
500ms延时子程序
程序:
void delay500ms(void)
{
uchar i,j,k;
for(i=15;i>0;i--)
for循环实现C语言精确延时(晶振12MHz,一个机器周期1us.)
2ms延时子程序
void delay2ms(void)
{
uchar i,j,k;
for(i=5;i>0;i--)
for(j=8;j>0;j--)
for(k=25;k>0;k--);
}
10ms延时子程序
程序:
void delay10ms(void)
{
uchar i,j,k;
for(i=5;i>0;i--)
for(j=4;j>0;j--)
for(k=248;k>0;k--);
uchar i,j,k;
for(i=5;i>0;i--)
for(j=8;j>0;j--)
for(k=248;k>0;k--);
}
200ms延时子程序
程序:
void delay200ms(void)
{
C:0x080A DDFA DJNZ R5,C:0806
C:0x080C DEF6 DJNZ R6,C:0804
C:0x080E DFF2 DJNZ R7,C:0802
C:0x0810 22 RET
for(j=202;j>0;j--)
for(k=81;k>0;k--);

Keil C下用软件精确延时的实现

Keil C下用软件精确延时的实现

KelC 下 用 软 件 精 确 延 时 的 实 现 i
鲁 庆 宾 , 艳 玲 邵
( 阳理 工 学 院 南

河南 南 阳
4 30 7 0 4)
要 : 单 片 机 的应 用 系 统 中 , 常 需 要 用 到 不 同 精 度 的 时 间 延 时 , 不 同场 合 下 , 时 时 间 可 能 从 几 微 秒 到 几 在 经 在 延
NOP
一 一
用 汇编语 言 实现 这些延 时 , 是非 常 简单 的事 情 ,
因为延 时时 间很 容易 计算 。 但 是 汇 编 语 言 是 针 对 具 体 的 微 处 理 器 而 特 有
的 , 了 通 用 性 差 , 可 移 植 的 特 点 外 , 大 的 问 题 除 不 最
() 指 令 每 增 加 一 条 , 时 时 间 增 ; 延
0 前 言
单 片 机 因 为 体 积 小 、 能 强 、 制 灵 活 的 特 点 在 功 控 各 个 领 域 内 有 着 非 常 广 泛 的 应 用 , 制 过 程 中 经 常 控
v i ea od d ly()


NOP

( );

会 遇 到不 同精度 的时 间需 求 , 如键 盘去 抖延 时 、 据 数
精确计算 , 以满 足 不 同场 合 的需 求 。 关 键 词 : e ; 编 语 言 ; 片机 ; 确 延 时 ; 时 器 KiC 汇 l 单 精 定
中 图 分 类 号 :T 3 9 0 P 0 .5 文 献 标 识 码 :A
#i ude < i rns ncl nti .h >
间选择不 同的方法 。
fr i o ( =0; <l; + +) i i :

keil延时函数

keil延时函数

keil延时函数Keil是一种常用的嵌入式开发工具,它提供了方便易用的编程环境,包括了编译器、调试器以及一系列辅助工具。

在Keil中,延时函数是我们经常使用的一个功能,它可以帮助我们在程序中实现延时的效果。

接下来,我将详细介绍Keil的延时函数。

在Keil中,延时函数实际上是通过软件实现的,主要是利用了内部的计时器和系统时钟来实现精确的延时。

Keil提供了一系列的延时函数,可以满足不同需求的延时操作。

在Keil中,最常用的延时函数是`delay`函数。

它的原型如下:```cvoid delay(unsigned int count);```这个函数的参数`count`表示要延时的时间,单位是毫秒(ms)。

例如,如果我们调用`delay(1000)`,那么程序会延时1秒钟。

在这个函数内部,程序会利用一个循环来进行延时操作,具体的实现如下:```cvoid delay(unsigned int count)unsigned int i,j;for(i=0;i<count;i++)for(j=0;j<1000;j++);```在这个函数中,我们通过两个嵌套的`for`循环来进行延时操作。

外层循环控制延时的次数,内层循环用来进行具体的延时。

每次内层循环都会执行1000次,而每次内层循环的执行时间取决于系统时钟的频率。

除了`delay`函数外,Keil还提供了其他一些延时函数,可以根据具体需求选择使用。

以下是其中一些常用的延时函数:1. `void delay_us(unsigned int us)`:这个函数用于实现微秒级别的延时,单位是微秒(us)。

2. `void delay_ms(unsigned int ms)`:这个函数用于实现毫秒级别的延时,单位是毫秒(ms)。

3. `void delay_sec(unsigned int sec)`:这个函数用于实现秒级别的延时,单位是秒(sec)。

Keil C中软件实现精确延时的几种方法

Keil C中软件实现精确延时的几种方法
void delay (uint i)
{
uchar j;
while(i--)
{
for(j=0;j<123;j++);//1ms基准延时程序
}
}
2设置断点计算延时时间
对于熟悉汇编语言的开发人员可用Keil C中的反汇编工具计算延时时间。但很多C程序员可能对汇编语言不太熟悉,特别是每个指令执行的时间是很难记忆的,因此,常使用Keil C的性能分析器计算延时时间。这里以前面介绍的for(i=0;i<124;i--)结构为例。使用这种方法时,必须先设置系统所用的晶振频率,选择Optionsfor target中的target选项,在Xtal(MHz)中填入所用晶振的频率。将程序编译后,分别在延时程序开始和结束处设置两个运行断点。选择start/stop debug session按钮进入程序调试窗口。运行程序前,要首先将程序复位,计时器清零,然后按F5键运行程序,从左边窗口的sec项可以看到程序到了第一个断点,也就是所要计算的程序段的开始处,用了多少时间;再按F5键,程序到了第2个断点处也就是所要计算的程序段的结束处,记下此时sec项显示的时间。最后用结束处的时间减去开始处时间,就得到循环程序段所占用的时间。
KeilC中软件实现精确延时的几种方法
赵晓东,张丽梅
(中北大学信息与通信工程学院山西太原030051)
摘要:在单片机应用系统开发过程中,经常需要编写各种延时程序,延时时间从数微秒到数秒不等,本文讨论了几种常用的软件延时及计算时间的方法,以供学习和使用。
关键词:KeilC软件延时
单片机开发者在编制各种应用程序时经常会遇到实现精确延时的问题,比如按键去抖、数据传输等操作都要在程序中插入一段或几段延时,时间从几十微秒到几秒。有时还要求有很高的精度,如使用单总线芯片DS18B20时,允许误差范围在十几微秒以内,否则芯片无法工作。实现延时分为两类方法:一种是硬件延时,要用到定时器/计数器;另一种是软件延时,主要采用循环体进行。从程序的执行效率和稳定性两方面考虑,使用定时器/计数器延时是最佳的方案。但是占用了一个定时器,比较浪费,并且可移植性也比较差。因此,一般不建议采用,本文主要讨论软件延时。目前开发嵌入式系统软件的主流工具为C语言,写延时程序时需要一些技巧。本文介绍几种实用的编制精确延时程序和计算程序执行时间的方法。

keil延时程序讲解

keil延时程序讲解

Keil延时程序是指在嵌入式系统中使用Keil编译器编写的用于实现延时功能的代码。

在嵌入式系统中,由于处理器速度较慢,因此需要使用延时程序来实现某些功能,如等待某个事件发生或控制执行时间等。

Keil编译器提供了多种延时函数,其中最常用的是delay_ms()和delay_us()函数。

这两个函数分别用于实现毫秒级和微秒级的延时。

delay_ms(unsigned int ms):该函数用于实现毫秒级延时。

参数ms表示延时的毫秒数。

例如,delay_ms(1000)表示延时1000毫秒,即1秒。

delay_us(unsigned int us):该函数用于实现微秒级延时。

参数us表示延时的微秒数。

例如,delay_us(1000)表示延时1000微秒,即1毫秒。

以下是一个简单的示例,演示如何使用Keil延时程序实现LED闪烁功能:复制代码运行#include <reg52.h> // 包含头文件,定义了51单片机的寄存器#include <intrins.h> // 包含头文件,定义了一些内联函数sbit LED = P1^0; // 定义LED连接的端口void delay_ms(unsigned int ms) {unsigned int i, j;for (i = ms; i > 0; i--)for (j = 114; j > 0; j--);}void delay_us(unsigned int us) {unsigned int i;for (i = us; i > 0; i--);}void main() {while (1) {LED = 0; // LED亮delay_ms(500); // 延时500毫秒LED = 1; // LED灭delay_ms(500); // 延时500毫秒}}在这个示例中,我们首先定义了一个名为LED的变量,用于控制LED的开关。

Keil C51程序设计中几种精确延时方法 精确延时

Keil C51程序设计中几种精确延时方法 精确延时

Keil C51程序设计中几种精确延时方法2008-04-03 08:48实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。

1 使用定时器/计数器实现精确延时单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。

第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。

本程序中假设使用频率为12 MHz的晶振。

最长的延时时间可达216=65 536 μs。

若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。

在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。

使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。

但应该注意,C51编写的中断服务程序编译后会自动加上PUSH ACC、PUSH PSW、POP PSW和POP ACC语句,执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。

这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。

2 软件延时与时间计算在很多情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延时。

下面介绍几种软件延时的方法。

2.1 短暂延时可以在C文件中通过使用带_NOP_( )语句的函数实现,定义一系列不同的延时函数,如Delay10us( )、Delay25us( )、Delay40us( )等存放在一个自定义的C文件中,需要时在主程序中直接调用。

如延时10 μs 的延时函数可编写如下:void Delay10us( ) {_NOP_( );_NOP_( );_NOP_( )_NOP_( );_NOP_( );_NOP_( );}Delay10us( )函数中共用了6个_NOP_( )语句,每个语句执行时间为1 μs。

KeilC51精确延时程序设计

KeilC51精确延时程序设计

KeilC51精确延时程序设计吴挺运;林成何【期刊名称】《电子科技》【年(卷),期】2012(025)012【摘要】C programming In view language of the poor predictability of the execution time of the C programming language code, we use to achievethe accurate design of delay procedure in detail, and point out the advantages and disadvantages of the usual delay methods. Besides, introduce the calculation of the delay time through some we take advantage of some powerful functions of Keil C51 to examples so that the delay time of the C programming lan- guage code can be predicted. Nesting the assembly language into C programming language can give full play to the advantages of all kinds of language and thus improving the development efficiency%针对C语言代码的执行时间的可预见性差,结合KeilC51开发工具,分析了在KeilC51开发工具中利用c语言实现精确的延时程序的设计,指出了常用延时方法优缺点。

并通过一些实例分析了延时时间的计算方法,使c语言代码的延时时间可以被预见。

keil中计算延时方法

keil中计算延时方法

如何用keil调试时计算延时的方法
作者:pc63 来源:单片机学习网字体:大中小在百度搜索相关内容
编辑导读:C51单片机开发工具DIY|如何用keil调试时计算延时的方法|EM78系列单片机的子程序库|实战msp430:TB捕获PWM波的脉冲宽度|单片机系统开发的规范化问题|PIC8位单片机汇编语言常用指令|89S51看门狗功能的使用方法|EM C8BIT单片机指令应用的误区与技巧|PWM技术在单片机控制智能充电器中的应用|单片机系统设计与C51编程实践|
正文:
有一些朋友在问C语言中的运算时间要如何计算,现在我举一个简单的例子说明一下。

图1
如果我们要算for(b=0;b<50000;b++); 晶振为12M,先要设置一下项目的所用的晶振频率。

图2:打开项目设置窗口
图6 用结束处的时间减去开始时间就得到要算程序段所用的时间1.850036秒
用这个方法也可以仿真出任何频率下的任何指令或程序所要用的时间
补漏:也可以看左边工具栏SEC,只是全速运行是数字是不会动的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

keil调试延时程序
2007-11-25 22:20
时间的单位换算
1秒=1000毫秒(ms) 1毫秒=1/1,000秒(s)
1秒=1,000,000 微秒(μs) 1微秒=1/1,000,000秒(s)
1秒=1,000,000,000 纳秒(ns) 1纳秒=1/1,000,000,000秒(s)
1秒=1,000,000,000,000 皮秒(ps) 1皮秒=1/1,000,000,000,000秒(s)
参考资料:资料
用定时器延时,有时候显得有点麻烦,我们不如考虑软件精确延时,软件延时无非就是利用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();
}
}。

相关文档
最新文档