新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 单片机汇编延时程序的理解

单片机汇编延时程序的理解

作者:时间:2012-08-20来源:网络收藏

实现延迟的代码:

本文引用地址:http://www.eepw.com.cn/article/171019.htm

DELAY: MOV R7,#250 ;

D1: MOV R6,#250 ;

D2: DJNZ R6,D2 ;

DJNZ R7,D1 ;

RET

如果用高级语言编程,只需要简单地调用函数就可以实现,但是计算机具体是怎么实现的呢?要想知其所以然,还得从开始学起。

冒号前面的“DELAY”、“D1”、“D2”为语句行的名字,是为了的条件语句跳转用的,分号后面为注释,计算机执行时将过滤掉这些信息,最大限度减少代码长度,提高效率。

DELAY: MOV R7,#250 ; 名字为“DELAY”的语句:意思是将CPU内部内存RAM的R7位置填写为250(原来为0,为什么是0呢?因为任何开始执行前都要复位,就像我们打算盘要将算子复位一样,或者我们用沙盘写字,要将沙盘抹平类似)

D1: MOV R6,#250 ; 名字为“D1”的语句:将R6位置填写为250

D2: DJNZ R6,D2 ; 名字为“D2”的语句:将R6位置的250减1,如果为0就继续执行下一条,不为0就继续执行D2这一句,因为R6=250,所以这个语句要原地踏步执行250次!

DJNZ R7,D1 ; 这句没有名字,因为没有别的语句要跳到这里,所以就省略了。R7同样等于250,但它不是原地踏步,而是跳回了D1,这么干,D!、D2和本句将被循环执行250遍,需要强调的是:D2语句自身每次都要执行250遍,也就是执行了250*250=62500遍!

RET ;子程序结束(因为程序一般不作为独立程序存在,它只是一个子程序,也就是高级语言中的一个函数,看到这个字符,子程序将跳回到母程序,进行下一步)。

这个子程序这么反复地循环指令,到底有什么意义呢?又是怎么实现的程序呢?说起来计算机真是有点笨,它是*数程序执行的次数来累加时间的!也就是说语句本身就是为了浪费时间!哈哈,可笑吧?这就像你没有钟表,但是你知道你跑操场一圈是一分钟,然后就绕着操场跑了60圈,时间过了正好一小时一样。

如果是人的话,谁也不会笨到干这么累的活儿来计时,但计算机不一样,它不论静止还是运动,程序总是一拍一拍地运行着,所以它不累。

那么,计算机执行一个语句耗费的时间是多少呢?

以51型为例:如果采用12MHz的晶振,运行一个机器周期为1微秒,具体为什么暂时不管。的指令系统分为单周期、双周期和三周期指令(三周期实际上占用四个周期,多余一个周期浪费掉),这是有指令的内容决定的,内容多的单周期执行不完,肯定要延长了。子程序里面的MOV是单周期、DJNZ是双周期。


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭