单片机延时程序,延时时间计算 for(m=20;m>0;m--) for(n=20;n>0;n--) for(s=248;s>0;s--); 请高手

单片机延时程序,延时时间计算 for(m=20;m>0;m--) for(n=20;n>0;n--) for(s=248;s>0;s--); 请高手,第1张

void Delay_ms(void)

{

unsigned char m,n,s

for(m=20m>0m--)

for(n=20n>0n--)

for(s=248s>0s--)

}

我结合了你的for循环软件延时来给你简单讲解一下,软件延时是单片机在执行一条空指令耗费的时间,当程序执行到Delay_ms();延时后,先执行M减一次for(m=20m>0m--) 接着再执行N减一次for(n=20n>0n--),最后是 for(s=248s>0s--)

这是一个嵌套语句

for(m=20m>0m--)

m每减去一次;

for(n=20n>0n--)

N要执行20次 n-到0为止

for(s=248s>0s--)

n每减去一次就执行一次 for(s=248s>0s--)

m减到0就退出循环,就在这段时间里耗费的时间称之为延时。

这个是按照时钟周期来计算的,

12M晶振: 仿真计算时间199665199ms 不到200ms

举一个例子来说明吧.比如你要编一个延时50毫秒的子程序,那么步骤如下:

1、查看一下你的硬件环境,比如晶振大小,CPU型号,不用CPU指令的机器周期是不一样的。

2、计算延时需要的机器周期。比如采用12M晶振,CPU采用通用8051,那么一个机器周期为1US,50毫秒为50*1000=50000US,需要的机器周期=50000/1=50000。

3、试编程,如下:

程序代码指令时间 总共时间

DELAY50MS: 2 2

MOV R7,#A 1 1

DELAY1:

MOV R6,#B 1 1*A

DJNZ R6,$ 2 2*B*A

DJNZ R7,DELAY1 2 2*A

RET 2 2

所以总时间=2+1+A+2*A*B+2*A+2=5+3A+2AB

4、凑数求A、B

根据2、3得到如下式子:

50000=5+3A+2AB

可以有很多种结果,不过最好是以A尽可能小,B尽可能大为原则,当然不能大于255.

我现在凑出A=110,B=225;那么总延时时间=5+3*110+2*110*225=49835。还差165US

5、补齐不够时间

再加一个小循环就OK了,呵呵如下:

MOV R6,#C

DJNZ R6,$

会算了吧,2*C+1=165;所以C=82。

现在完整的延时程序出来了,如下:

DELAY50MS: 2 2

MOV R7,#110 1 1

DELAY1:

MOV R6,#225 1 1*110

DJNZ R6,$ 2 2*225*110

DJNZ R7,DELAY1 2 2*110

MOV R6,#821 1

DJNZ R6,$22*82

RET 2 2

很圆满:总的时间50000微妙,也就是50毫秒。这种方式编程,在该硬件环境下可以保证最大误差为1微妙。

那样的真实速度,尤其是模拟一个延时程序,需要比较长的时间,这里就阐述如何简单和正确的进行延时程序的调试。下面是个典型的AVR延时子程序DELAY:LDI R16,197PUSH R16DEL1:PUSH R16DEL2:PUSH R16DEL3:DEC R16BRNE DEL3POP R16DEC R16BRNE DEL2POP R16DEC R16BRNE DEL1POP R16 z 先将汇编程序中的延时参数197改为3,重新编译后进入调试方式。(更简单的方式是先单步执行初试化部分的指令,当执行完“ldi r16,197”一句后,使用鼠标双击Register窗口中R16寄存器,将R16的值改写为3,这样就不需要重新编译程序了。)

z 使用单步执行的方式执行延时子程序的每一句语句,查看程序的逻辑对不对,能否正确运行,堆栈是如何工作的,SP指针如何变化,各个寄存器如何变化,PC的变化,RAM中数据的变化。这样即了解了AVR的工作原理,也了解程序设计的技巧),或验证程序是否同自己想象的那样正确,而且训练了如何熟练使用DEBUG(熟练使用工具也是很重要的一环)。

z 验证了整个延时程序没有逻辑错误后,可以查看延时子程序的延时时间了。1.将延时参数由3改回197,编译后进入调试方式。 2.在调用该子程序的语句“rcall delay”处设置一个断点;在接下来的一个语句“sbi portc,0”处设置第二个断点。 3.按F5,全速运行程序。 4.当程序在第一个断点处停下时,到Processor的选项中(展开该图标)找到Stop Watch子项,双击将其清零。 5.按F5,从断点处继续全速运行程序(开始调用延时子程序)。 6.等大约十几秒或几十秒后(取决于你的PC速度),程序在第二个断点处停下(子程序模拟运行时,AVR Studio下面状态栏中的运行图标为绿色,暂停为黄色)。 7.查看Processor的选项中Stop Watch的值(本例中为999826.75us),它记录下调用子程序返回后的时间,该时间值即为延时子程序的运行时间。 由此验证了延时子程序的执行时间。调节延时参数,可以得到不同的延时时间,通过软件模拟可以精确的得到。这比使用在线实时仿真的手段要方便多了,而直接在目标板上运行,你也不能得到精确的时间。使用软件模拟仿真是现在调试技术的发展方向。


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

原文地址: http://outofmemory.cn/yw/11640933.html

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

发表评论

登录后才能评论

评论列表(0条)

保存