单片机汇编延时系统
单片机延时500ms程序汇编

单片机延时500ms程序汇编一、概述在单片机编程中,延时操作是非常常见且重要的一部分。
延时可以使程序在执行过程中暂停一段时间,以确保输入输出设备能够正常工作,或者是为了保护其他设备。
本文将介绍如何使用汇编语言编写单片机延时500ms的程序。
二、延时原理在单片机中,延时操作通常通过循环来实现。
每个循环需要一定的时间,通过控制循环次数和循环体内的指令数量,可以实现不同长度的延时。
在汇编语言中,可以使用计数器来控制循环次数,从而实现精确的延时操作。
三、汇编语言编写延时程序接下来,我们将使用汇编语言编写延时500ms的程序。
1. 设置计数器初值在程序的开头我们需要设置计数器的初值,这个初值需要根据单片机的工作频率和所需的延时时间来计算。
假设单片机的工作频率为1MHz,那么在循环500次后,就能够达到500ms的延时。
我们需要将计数器的初值设为500。
2. 循环计数接下来,我们进入一个循环,在循环中进行计数操作。
每次循环结束时,都需要检查计数器的值,当计数器减至0时,表示已经达到了500ms的延时时间,可以退出循环。
3. 优化程序为了提高程序的执行效率,可以对计数器进行优化。
例如可以通过嵌套循环的方式,减少循环的次数,从而提高延时的精度和稳定性。
四、程序示例下面是一个简单的示例程序,演示了如何使用汇编语言编写延时500ms的程序。
```org 0x00mov r2, #500 ; 设置计数器初值为500delay_loop:djnz r2, delay_loop ; 进行计数ret ; 延时结束,退出程序```五、结语通过以上的示例程序,我们可以看到如何使用汇编语言编写单片机延时500ms的程序。
当然,实际的延时程序可能会更加复杂,需要根据具体的单片机型号和工作频率进行调整,但是思路是相似的。
在实际的编程中,需要根据具体的需求和硬件环境来进行调整和优化,以实现更加稳定和精确的延时操作。
希望本文对单片机延时程序的编写有所帮助,也欢迎大家在评论区提出宝贵意见和建议。
单片机汇编延时计算小程序

{
for(x=0;x<256;x++)
{
for(y=0;y<256;y++)
{
periodicity=delay_time/(12.0/f);
delay_period_XY=w*(x*(3+2*y)+3)+3 ;
//精度控制
if((delay_period_XY>periodicity*0.9999)&&(delay_period_XY<periodicity*1.0001))
if((mcu_type==1)&&(delay_time>(12.0/f)*(255*(3+2*255)+3)))
{
printf("您输入的延时长度为%fus,超过了该汇编程序在51单片机下的最大延时长度%fus,将改用三重循环程序来实现该延时。\n",delay_time,(12.0/f)*(255*(3+2*255)+3));
printf("#pragma endasm\n");
if((mcu_type==1)&&(delay_time>(12.0/f)*(255*(255*(3+2*255)+3)+3)))
{
printf("您输入的延时长度为%fus,超过了该汇编程序在51单片机下的最大延时长度%fus,三重循环程序也无法实现。\n",delay_time,(12.0/f)*(255*(3+2*255)+3));
单片机汇编语言设计软件延时程序

2 T =2 u s
D J N Z R 1 . D E L 1 . 夕 } 循环减 1 条件转移执行一次 t 5 = 2 T =
一
‘
D J N Z R 1 。 D E L l
2 T=2 u s
; 外循环减 1 条 件转移执行一次 t 4 =
R E T : 返 回指令 . t 5 = 2 u s 时间精算公式 : t = t 0 + t 1 + ( t 2 + t 3 半 n O + t 4 ) n 1 + t 5= 2 木 n O n l + 3 木 n l + 5 u s ( 3 ) n 0 , n 1 的取值 范围在( 0 ~ 2 5 5 ) 内, 则延时 时间范围是 ( 1 0 ~ 1 3 1 8 4 5 ) u s ,最高可达 1 3 1 m s 。估算公式如 ( 4 ) 所示 。 构的一个典型程序 t  ̄ - 2 * n 0* n l U S ( 4 ) 1 指令周期 、 机器周期和 时钟周期 2 . 3 长延时程序——三重循环设计 若延时时间较长的时候 .可再重复执行上述 中等延 时 n 2 次来延 软件延时程序是通 过 C P U执行指令 消耗 时间来实现 的 。 首先要 程序如下所示 。 了解单片机 C P U在执行一条指令 时所需要 的时间。 即指令周期 。 指令 长时长 即采用三重循环结构来 实现 , A C A L L D E L : 子程序调用指令 . t O = 2 T = 2 u s 周期 是 以机器 周期 为单位 . MC S 5 1单片机通 常把 指令 分为 单周期 指 令、 双周期指令和 四周期 指令三种 ; 而机器周期是 指 C P U完成某一个 D E L : M O V R 2 , # n 2 ; 设置外循环循环次数 n 2 , t l = I T = 1 u s 规定操作所需要 的时 间. 它是 由 1 2 个时钟周期组成 : 时钟周期 又叫振 D E L 2 :MO V R 1 , # n l 泼 置 中循环循环次数 n 1 . t 2 = 1 T = l u s 荡周期 , 是 由单片机 内部振荡 电路产生 的, 是时钟频率的倒数 。 以时钟 D E L l :M O V R 0 , # n 0 ; 设置 内循环循环次数 n O . t 3 = 1 T = l u s 频率 1 2 M H z ( 后面的均 以这个频率来计算 ) 为例 . 计算如下 : D E L 0 :D J N Z R 0 , D E L 0 :内循 环减 1 条 件转 移执 行一 次 t 4 = 1 ) 时钟周期 T o s c = 1 / 时钟频率: 1 / 1 2 M = 1 / 1 2 u s
单片机汇编延时系统

51单片机延时程序2012-09-19 11:28:59| 分类:技术|字号订阅延时程序在单片机编程中使用非常广泛,但一些读者在学习中不知道延时程序怎么编程,不知道机器周期和指令周期的区别,不知道延时程序指令的用法, ,本文就此问题从延时程序的基本概念、机器周期和指令周期的区别和联系、相关指令的用法等用图解法的形式详尽的回答读者我们知道程序设计是单片机开发最重要的工作,而程序在执行过程中常常需要完成延时的功能。
例如在交通灯的控制程序中,需要控制红灯亮的时间持续30秒,就可以通过延时程序来完成。
延时程序是如何实现的呢?下面让我们先来了解一些相关的概念。
一、机器周期和指令周期1.机器周期是指单片机完成一个基本操作所花费的时间,一般使用微秒来计量单片机的运行速度,51 单片机的一个机器周期包括12 个时钟振荡周期,也就是说如果51 单片机采用12MHz 晶振,那么执行一个机器周期就只需要1μs;如果采用的是6MHz 的晶振,那么执行一个机器周期就需要2 μs。
2 .指令周期是指单片机执行一条指令所需要的时间,一般利用单片机的机器周期来计量指令周期。
在51 单片机里有单周期指令(执行这条指令只需一个机器周期),双周期指令(执行这条指令只需要两个机器周期),四周期指令(执行这条指令需要四个机器周期)。
除了乘、除两条指令是四周期指令,其余均为单周期或双周期指令。
也就是说,如果51 单片机采用的是12MHz 晶振,那么它执行一条指令一般只需1~2 微秒的时间;如果采用的是6MH 晶振,执行一条指令一般就需2~4 微秒的时间。
现在的单片机有很多种型号,但在每个型号的单片机器件手册中都会详细说明执行各种指令所需的机器周期,了解以上概念后,那么可以依据单片机器件手册中的指令执行周期和单片机所用晶振频率来完成需要精确延时时间的延时程序。
二、延时指令在单片机编程里面并没有真正的延时指令,从上面的概念中我们知道单片机每执行一条指令都需要一定的时间,所以要达到延时的效果,只须让单片机不断地执行没有具体实际意义的指令,从而达到了延时的效果。
单片机延时500ms程序汇编 -回复

单片机延时500ms程序汇编-回复如何利用汇编语言编写一个单片机延时500ms的程序首先,我们需要明确一个目标:利用汇编语言编写一个单片机延时500ms 的程序。
在这个程序中,我们将使用一个经典的延时算法来实现。
在单片机编程中,延时是一个非常常见和重要的操作。
通过延时操作,我们可以在单片机程序中创建指定时间间隔的暂停。
这对于控制外部设备或者程序运行过程中的等待时间非常有用。
接下来,我们将按照以下步骤一步一步地回答如何利用汇编语言编写一个单片机延时500ms的程序。
步骤1:选择合适的单片机和汇编语言首先,我们需要选择一个合适的单片机来进行编程。
不同的单片机可能使用不同的指令集和编程方式。
在这里,我们将选择一种常见的单片机,例如8051系列。
其次,我们需要选择一种适合我们的单片机的汇编语言。
例如,8051单片机通常使用Assembly language(汇编语言)编程。
这种语言能够直接与单片机的底层硬件进行交互,从而实现我们的延时操作。
步骤2:了解定时器和计数器的工作原理在单片机编程中,延时操作通常与定时器和计数器模块一起工作。
这两个模块能够提供精确的计时和计数功能,可以帮助我们实现所需的时间延迟。
在了解定时器和计数器的工作原理之后,我们可以开始编写延时程序。
步骤3:编写汇编程序首先,我们需要初始化定时器和计数器模块。
这可以通过设置相应的寄存器来完成。
我们需要选择一个合适的时钟源,并设置合适的预分频和计数器的初始值。
这样,我们就可以开始计时了。
接下来,我们需要编写一个循环来实现延时操作。
这个循环将会不断地检查计数器的值,直到达到所需的延时时间为止。
在每次循环中,我们需要使用条件语句来判断计数器是否达到目标时间。
如果达到了目标时间,我们就可以退出循环并继续执行程序的其他部分。
此外,我们还需要考虑溢出情况。
当计数器的值超出了其最大范围时,它将重新从零开始计数。
我们可以利用这一点来实现更长的延时。
例如,在每次检查之前,我们可以记录计数器的溢出次数。
51单片机汇编语言教程:5课单片机延时程序分析

51单片机汇编语言教程:第5课-单片机延时程序分析(基于HJ-1G、HJ-3G实验板)上一次课中,我们已经知道,程序中的符号R7、R6是代表了一个个的RAM单元,是用来放一些数据的,下面我们再来看一下其它符号的含义。
DELAY:MOV R7,#250;(6)D1:MOV R6,#250;(7)D2:DJNZ R6,D2;(8)DJNZ R7,D1;(9)RET;(10)〈单片机延时程序〉MOV:这是一条指令,意思是传递数据。
说到传递,我们都很清楚,传东西要从一本人的手上传到另一本人的手上,也就是说要有一个接受者,一个传递者和一样东西。
从指令MOV R7,#250中来分析,R7是一个接受者,250是被传递的数,传递者在这条指令中被省略了(注意:并不是每一条传递指令都会省的,事实上大部份数据传递指令都会有传递者)。
它的意义也很明显:将数据250送到R7中去,因此执行完这条指令后,R7单元中的值就应当是250。
在250前面有个#号,这又是什么意思呢?这个#就是用来说明250就是一个被传递的东西本身,而不是传递者。
那么MOV R6,#250是什么意思,应当不用分析了吧。
DJNZ:这是另一条指令,我们来看一下这条指令后面跟着的两个东西,一个是R6,一个是D2,R6我们当然已知是什么了,查一下D2是什么。
D2在本行的前面,我们已学过,这称之为标号。
标号的用途是什么呢?就是给本行起一个名字。
DJNZ指令的执行过程是这样的,它将其后面的第一个参数中的值减1,然后看一下,这个值是否等于0,如果等于0,就往下执行,如果不等于0,就转移,转到什么地方去呢?可能大家已猜到了,转到第二个参数所指定的地方去(请大家用自已的话讲一下这条语句是怎样执行的)。
本条指令的最终执行结果就是,在原地转圈250次。
执行完了DJNZ R6,D2之后(也就是R6的值等于0之后),就会去执行下面一行,也就是DJNZ R7,D1,请大家自行分析一下这句话执行的结果。
mcs-51单片机中汇编程序延时的精确算法。

MCS-51单片机中汇编程序延时的精确算法一、引言MCS-51单片机是一种常用的微控制器,其汇编程序编写对于工程师来说是极为重要的。
在MCS-51单片机中,延时是一种常见的需求,通过延时可以控制程序的执行速度和时间间隔。
而对于汇编程序中的延时算法,精确度的要求往往较高,特别是在一些实时系统中。
本文将针对MCS-51单片机中汇编程序延时的精确算法展开论述。
二、延时的需求在MCS-51单片机中,实现一定时间的延时是非常常见的需求。
在控制LED灯的闪烁过程中,需要一定的时间间隔来控制LED的亮灭频率;在读取传感器数据的过程中,需要一定的时间延时以确保传感器数据的准确性。
精确和可控的延时算法对于MCS-51单片机的应用来说是至关重要的。
三、常见的延时算法在MCS-51单片机的汇编程序中,常见的延时算法包括循环延时、定时器延时和脉冲宽度调制(PWM)延时等。
这些延时算法各有优缺点,需要根据具体的应用场景选择合适的算法。
1. 循环延时循环延时是一种简单而粗糙的延时算法,其原理是通过空转循环来消耗一定的CPU周期来实现延时。
这种延时算法的缺点是精度较差,受到CPU主频和编译器优化等因素的影响较大,不适合对延时精度有较高要求的场景。
2. 定时器延时定时器延时是一种利用MCS-51单片机内部定时器来实现延时的算法。
通过设置定时器的初值和计数方式,可以实现一定范围内的精确延时。
定时器延时的优点是精度高,不受CPU主频影响,适用于对延时精度要求较高的场景。
3. 脉冲宽度调制(PWM)延时脉冲宽度调制(PWM)延时是一种通过调节脉冲信号的宽度来实现延时的算法。
这种延时算法在一些特定的应用场景中具有较高的灵活性和精度。
例如在直流电机的速度调节过程中常常会采用PWM延时算法来实现精确的速度控制。
四、精确延时算法针对MCS-51单片机中汇编程序延时的精确算法,我们可以结合定时器延时和脉冲宽度调制(PWM)延时的优点,设计一种精确度较高的延时算法。
单片机延时汇编语言计算方法

单片机延时汇编语言计算方法我们用汇编语言写单片机延时10ms 的程序(用的是12MHz 晶振的MCS- 51),可以编写下面的程序来实现:MOV R5,#5 ①D1: MOV R6,#4 ②D2: MOV R7,#248 ③DJNZ R7,$ ④DJNZ R6,D2 ⑤DJNZ R5,D1 ⑥RET ⑦这个延时程序共有七条指令,现在就每一条指令执行的次数和所耗时间进行分析:第一条,MOV R5,#5 在整个程序中只执行一次,且为单周期指令,所以耗时1μs,第二条,MOV R6,#4 看⑥的指令可知,只要R5-1 不为0,就会返回执行这条指令,共执行了R5 次,共耗时5μs,第三条,MOV R7,#248 同第二条类似,只要R6-1 不为0,就会返回执行这条指令,同时受到外部循环R5 的控制,共耗时R5*R6*1=20μs,第四条,DJNZ R7,$ 只要R7-1 不为0,就执行这条指令,同时受到外部循环的控制,由于该指令是双周期指令,共耗时为R7*R6*R5*2=9920μs,第五条,DJNZ R6,D2 只要R6-1 不为0,就反复执行此条指令(内循环R6 次),又受外循环R7 的控制,共耗时R6*R5*2=40μs,第六条,DJNZ R5,D1 只要R5-1 不为0,就反复执行此条指令,耗时为R5*2=10μs,第七条,RET 此指令为双周期指令,耗时为2μs,我们也要考虑在调用子程序时用到LCALL 指令,耗时2μs,最后可以得到总的延时为:1+5+20+9920+40+10+2=9998μs=10ms 我们可以总结延时总时间的公式:延时总时间=[(2*一层循环次数+3)*二层循环次数+3]*三层循环次数+3 注意此公式只适用于三层以内的循环tips:感谢大家的阅读,本文由我司收集整编。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51单片机延时程序2012-09-19 11:28:59| 分类:技术|字号订阅延时程序在单片机编程中使用非常广泛,但一些读者在学习中不知道延时程序怎么编程,不知道机器周期和指令周期的区别,不知道延时程序指令的用法, ,本文就此问题从延时程序的基本概念、机器周期和指令周期的区别和联系、相关指令的用法等用图解法的形式详尽的回答读者我们知道程序设计是单片机开发最重要的工作,而程序在执行过程中常常需要完成延时的功能。
例如在交通灯的控制程序中,需要控制红灯亮的时间持续30秒,就可以通过延时程序来完成。
延时程序是如何实现的呢?下面让我们先来了解一些相关的概念。
一、机器周期和指令周期1.机器周期是指单片机完成一个基本操作所花费的时间,一般使用微秒来计量单片机的运行速度,51 单片机的一个机器周期包括12 个时钟振荡周期,也就是说如果51 单片机采用12MHz 晶振,那么执行一个机器周期就只需要1μs;如果采用的是6MHz 的晶振,那么执行一个机器周期就需要2 μs。
2 .指令周期是指单片机执行一条指令所需要的时间,一般利用单片机的机器周期来计量指令周期。
在51 单片机里有单周期指令(执行这条指令只需一个机器周期),双周期指令(执行这条指令只需要两个机器周期),四周期指令(执行这条指令需要四个机器周期)。
除了乘、除两条指令是四周期指令,其余均为单周期或双周期指令。
也就是说,如果51 单片机采用的是12MHz 晶振,那么它执行一条指令一般只需1~2 微秒的时间;如果采用的是6MH 晶振,执行一条指令一般就需2~4 微秒的时间。
现在的单片机有很多种型号,但在每个型号的单片机器件手册中都会详细说明执行各种指令所需的机器周期,了解以上概念后,那么可以依据单片机器件手册中的指令执行周期和单片机所用晶振频率来完成需要精确延时时间的延时程序。
二、延时指令在单片机编程里面并没有真正的延时指令,从上面的概念中我们知道单片机每执行一条指令都需要一定的时间,所以要达到延时的效果,只须让单片机不断地执行没有具体实际意义的指令,从而达到了延时的效果。
1.数据传送指令 MOV数据传送指令功能是将数据从一个地方复制、拷贝到另一个地方。
如:MOV R7,#80H ;将数据80H 送到寄存器R7,这时寄存器R7 里面存放着80H,就单这条指令而言并没有任何实际意义,而执行该指令则需要一个机器周期。
2.空操作指令 NOP空操作指令功能只是让单片机执行没有意义的操作,消耗一个机器周期。
3.循环转移指令 DJNZ循环转移指令功能是将第一个数进行减1 并判断是否为0,不为0 则转移到指定地点;为0 则往下执行。
如:DJNZ R7,KK ;将寄存器R7 的内容减1 并判断寄存器R7 里的内容减完1 后是否为0,如果不为0 则转移到地址标号为KK 的地方;如果为0 则执行下一条指令。
这条指令需要2 个机器周期。
利用以上三条指令的组合就可以比较精确地编写出所需要的延时程序。
三、1 秒延时子程序、流程图及时间计算(以单片机晶振为12MHz 为例,1 个机器周期需要1μs)了解了以上的内容,现在让我们来看看程序总共所需时间:1+10+2560+330240+660480+5120+20+2=998433 μs≈1S在这里运行这段程序共需998433 μs,还差1567μs才达到1S 的,所以想要达到完美的1S 延时,需要在返回指令RET 前再添加一些指令让它把1567μs的延时完成。
有兴趣的读者可以自己试着添加完成。
最后补充一点,编写程序时一般将延时程序编写成独立的子程序,而所谓子程序也就是一个实现某个功能的小模块。
这样在主程序中就可以方便地反复调用编写好的延时子程序。
小提示:循环转移指令(DJNZ )除了可以给定地址标号让其跳转外,还可以将地址标号改成$,这样程序就跳回本指令执行。
例如:DJNZ R7,$ ;R7 内容减1 不为0,则再次执行本指令;为0 则往下执行,当R7 的值改为10时,则执行完该条程序所需的时间为2*10=20 μs。
51单片机汇编延时程序算法详解将以12MHZ晶振为例,详细讲解MCS-51单片机中汇编程序延时的精确算法。
指令周期、机器周期与时钟周期指令周期:CPU执行一条指令所需要的时间称为指令周期,它是以机器周期为单位的,指令不同,所需的机器周期也不同。
时钟周期:也称为振荡周期,一个时钟周期=晶振的倒数。
MCS-51单片机的一个机器周期=6个状态周期=12个时钟周期。
MCS-51单片机的指令有单字节、双字节和三字节的,它们的指令周期不尽相同,一个单周期指令包含一个机器周期,即12个时钟周期,所以一条单周期指令被执行所占时间为12*(1/12000000)=1μs。
程序分析例1 50ms 延时子程序:DEL:MOV R7,#200 ①DEL1:MOV R6,#125 ②DEL2:DJNZ R6,DEL2 ③DJNZ R7,DEL1 ④RET ⑤精确延时时间为:1+(1*200)+(2*125*200)+(2*200)+2=(2*125+3)*200+3 ⑥=50603μs≈50ms由⑥整理出公式(只限上述写法)延时时间=(2*内循环+3)*外循环+3 ⑦详解:DEL这个子程序共有五条指令,现在分别就每一条指令被执行的次数和所耗时间进行分析。
第一句:MOV R7,#200 在整个子程序中只被执行一次,且为单周期指令,所以耗时1μs第二句:MOV R6,#125 从②看到④只要R7-1不为0,就会返回到这句,共执行了R7次,共耗时200μs第三句:DJNZ R6,DEL2 只要R6-1不为0,就反复执行此句(内循环R6次),又受外循环R7控制,所以共执行R6*R7次,因是双周期指令,所以耗时2*R6*R7μs。
例2 1秒延时子程序:DEL:MOV R7,#10 ①DEL1:MOV R6,#200 ②DEL2:MOV R5,#248 ③DJNZ R5,$ ④DJNZ R6,DEL2 ⑤DJNZ R7,DEL1 ⑥RET ⑦对每条指令进行计算得出精确延时时间为:1+(1*10)+(1*200*10)+(2*248*200*10)+(2*200*10)+(2*10)+2=[(2*248+3)*200+3]*10+3 ⑧=998033μs≈1s由⑧整理得:延时时间=[(2*第一层循环+3)*第二层循环+3]*第三层循环+3 ⑨此式适用三层循环以内的程序,也验证了例1中式⑦(第三层循环相当于1)的成立。
注意,要实现较长时间的延时,一般采用多重循环,有时会在程式序里加入NOP 指令,这时公式⑨不再适用,下面举例分析。
例3仍以1秒延时为例DEL:MOV R7,#10 1指令周期1DEL1:MOV R6,#0FFH 1指令周期10DEL2:MOV R5,#80H 1指令周期255*10=2550KONG:NOP 1指令周期128*255*10=326400DJNZ R5,$ 2指令周期2*128*255*10=652800DJNZ R6,DEL2 2指令周期2*255*10=5110DJNZ R7,DEL1 2指令周期2*10=20RET 2延时时间=1+10+2550+326400+652800+5110+20+2 =986893μs约为1s整理得:延时时间=[(3*第一层循环+3)*第二层循环+3]*第三层循环+3 ⑩结论:针对初学者的困惑,对汇编程序的延时算法进行了分步讲解,并就几种不同写法分别总结出相应的计算公式,只要仔细阅读例1中的详解,并用例2、例3来加深理解,一定会掌握各种类型程序的算法并加以运用。
单片机延时子程序1)延时为:20ms 晶振12M1+(1+2*248+2)*4+1+1+1=20000US=20MS用汇编..优点就是精确...缺点就是算有点复杂.DELAY20MS:MOV R7,#4D1:MOV R6,#248DJNZ R6,$DJNZ R7,D1NOPNOPRET2)一些通过计算51汇编指令得出的软延时子程序;*****************************************************************;延时10uS;*****************************************************************time10us: mov r5,#05h ;11usret;***************************************************************** ;延时50uS;*****************************************************************time50us: mov r5,#19h ;51usdjnz r5,$ret;***************************************************************** ;延时100uS;*****************************************************************time100us: mov r5,#31h ;99.6usdjnz r5,$ret;***************************************************************** ;延时200uS;***************************************************************** time200us: mov r5,#64h ;201usret;***************************************************************** ;延时250uS;*****************************************************************time250us: mov r5,#7ch ;249.6usdjnz r5,$ret;***************************************************************** ;延时350uS;*****************************************************************time350us: mov r5,#0afh ;351us time350us_1: djnz r5,time350us_1ret;***************************************************************** ;延时500uS;***************************************************************** time500us: mov r5,#0fah ;501ustime500us_1: djnz r5,time500us_1ret;***************************************************************** ;延时1mS;*****************************************************************time1ms: mov r5,#0fah ;1001us time1ms_1: nopnopdjnz r5,time1ms_1ret;***************************************************************** ;延时2.5mS;*****************************************************************time2_5ms: mov r5,#05h ;2.496mstime2_5ms_1: mov r6,#0f8h ;497usdjnz r6,$djnz r5,time2_5ms_1ret;*****************************************************************;延时10mS;*****************************************************************time10ms: mov r5,#14h ;10.262mstime10ms_1: mov r6,#0ffh ;511usdjnz r6,$djnz r5,time10ms_1ret;***************************************************************** ;延时50mS;*****************************************************************time50ms: mov r5,#63h ;49.996mstime50ms_1: mov r6,#0fbh ;503usdjnz r6,$djnz r5,time50ms_1ret;***************************************************************** ;延时100mS;***************************************************************** time100ms: mov r5,#0c3h ;100.036mstime100ms_1: mov r6,#0ffh ;511usdjnz r6,$djnz r5,time100ms_1ret;***************************************************************** ;延时200mS;*****************************************************************time200ms: mov r5,#02h ;250.351ms time200ms_1: mov r6,#0f4h ;125.173ms time200ms_2: mov r7,#0ffh ;511usdjnz r7,$djnz r6,time200ms_2djnz r5,time200ms_1ret;***************************************************************** ;延时500mS;*****************************************************************time500ms: mov r5,#04h ;500.701mstime500ms_1: mov r6,#0f4h ;125.173ms time500ms_2: mov r7,#0ffh ;511usdjnz r7,$djnz r6,time500ms_2djnz r5,time500ms_1ret;*****************************************************************;延时1S;*****************************************************************time1s: mov r5,#08h ;1001.401mstime1s_1: mov r6,#0f4h ;125.173mstime1s_2: mov r7,#0ffh ;511usdjnz r7,$djnz r6,time1s_2djnz r5,time1s_1ret12M晶振机器周期为1US NOP为单周期指令 DJNZ为双周期指令.3);;晶振12MHZ,延时1秒DELAY:MOV 72H,#100LOOP3:MOV 71H,#100LOOP1:MOV 70H,#47LOOP0:DJNZ 70H,LOOP0NOPDJNZ 71H,LOOP1MOV 70H,#46LOOP2:DJNZ 70H,LOOP2NOPDJNZ 72H,LOOP3MOV 70H,#48LOOP4:DJNZ 70H,LOOP44);延时1分钟子程序,F=6MHz;程序已测过,延时时间60,000,000.0uSdelay60s:mov r3,#228mov r2,#253mov r1,#219loop1: djnz r1,$djnz r2,loop1djnz r3,loop1nopret5)计算机反复执行一段程序以达到延时的目的称为软件延时,单片机程序中经常需要短时间的延时,但是相当一部分人对延时程序很模糊,对延时程序的算法不够了解,在这里我以12MHz晶振和两个经典延时子程序为例,详细分析单片机汇编延时程序。