题目:MCS-51单片机,使用 6MHz 晶振,一个机器周期为 2us,计算出下列程序的延时时间。
DEL: MOV R5, #100
DEL0: MOV R6, #200
DEL1: MOV R7, #248
DEL2: DJNZ R7, DEL2
DJNZ R6, DEL1
DJNZ R5, DEL0
RET
本题答案是10.000 406s,请各位帮忙解释一下这个延时时间是如何计算啊?
悬赏分:100 - 解决时间:2010-7-11 17:51
;------------------------------------------------------
最佳答案: 题目中的答案是错的。应该是:19 960 606 us。
本题目的程序,共有三重循环,耗时的正确计算方法,可见下图。
图片链接:http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/album/item/a5fcfaf66794e262730eec8d.html
图中,还给出了用 keil 调试结果的画面。
包括调用指令的时间,共用了19 960 610 us。
;------------------------------------------------------
回答者: 做而论道 - 十三级 2010-7-11 17:14
提问者对于答案的评价:谢谢!解释的很清楚!果然是书错了。。。
原题网址:http://z.baidu.com/question/166181328.html
;------------------------------------------------------
后记:
能够精确计算程序的执行时间,是汇编语言的长处。而用C语言编写程序,执行的时间只能进行估算和测试。
但是有很多网友,都把这两者弄混了:
在用C语言编程的时候,偏要追问程序执行时间的计算公式;
在用汇编语言编程的时候,却采用简略的时间计算方法。
特别是现在这道题,要求精确算出 us 量级的数值,很明显是应该采用精确的计算方法。多数网友却马虎的很!采用了简略的算法。如果这是考试题,显然会挂科一批人。
精确的计算方法,其实并不难,看看插图,划分出几个循环结构的圈,逐“层”计算即可。
如果用简易的估算方法,只是计算主要的循环体(本题仅为2T)的循环耗时时间,过程如下:
100 * 200 * 248 * 2T = 9 920 000 T
如:T = 2us,则延时时间为:19 940 000 us 。
这个数字和精确计算的结果相比,误差约为千分之一。这个算法,在实际应用方面,是完全可以的。
但是,这个简易的算法,精度仅在 10ms 的等级,如果作为理论分析来用,误差还是相当大的。
另外,用 keil 软件进行单步调试的时候,所耗用所机器周期和时间, keil 都能够十分清晰给出,它要比 Proteus 软件的效果好得多。
对于本题目,做而论道提出的答案,完全得到了验证,可见插图所示。