当前位置:首页 > 单片机 > 单片机
[导读]单片机汇编实现延迟的程序代码:DELAY: MOV R7,#250 ;D1: MOV R6,#250 ;D2: DJNZ R6,D2 ;DJNZ R7,D1 ;RET如果用高级语言编程,只需要简单地调用延时函数就可以实现,但是计算机具体是怎么实现的呢?要想知

单片机汇编实现延迟的程序代码:

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多倍,当然,工作寄存器的数量是有限的,因此这个延时程序也是有限的,如果还不够用怎么办呢,就目前我所学的知识,只能在母程序里面设置循环了,也就是让这个子程序在母程序里面继续循环

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭