您的位置 首页 传感器

关于单片机汇编延时程序的一些了解

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

单片机汇编完成推迟的程序代码:

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微秒,就算出它占用的时刻,也便是延时的时长了!

榜首句:DELAY: MOV R7,#250 ;履行了一次,没有任何句子跳转给它,单周期。1

第二句:D1: MOV R6,#250 ;履行了250次,全部是第四句跳过来的,单周期。250

第三句:D2: DJNZ R6,D2 ;原地履行了250次,从第二句顺延(第二句履行完,没有其它跳转的话肯定要履行第三句)过来250次,也便是250*250=62500次,双周期*2。125000

第四句:DJNZ R7,D1 ; 从第三句顺延过来250次,双周期*2。500

总计:1+250+125000+500=1257501次,乘以1微秒,换算约为0.13秒。

咱们能够经过调整R6、R7的数值来调整延时的长度。事实上,8位计算机中,R6之类的作业寄存器地址最大只能放下255的十进制数值,因而要经过上述程序到达更长的延时是办不到的。

那怎样办呢?

咱们能够再添加一个R4,让上述的程序最多能够循环255遍,这样,0.13秒的200多倍便是30秒上下了,不行的话再添加循环,又能够扩展200多倍,当然,作业寄存器的数量是有限的,因而这个延时程序也是有限的,假如还不行用怎样办呢,就现在我所学的常识,只能在母程序里边设置循环了,也便是让这个子程序在母程序里边持续循环。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/chuanganqi/347423.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部