{
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),它记录下调用子程序返回后的时间,该时间值即为延时子程序的运行时间。 由此验证了延时子程序的执行时间。调节延时参数,可以得到不同的延时时间,通过软件模拟可以精确的得到。这比使用在线实时仿真的手段要方便多了,而直接在目标板上运行,你也不能得到精确的时间。使用软件模拟仿真是现在调试技术的发展方向。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)