各种汇编延时程序大集合

合集下载

单片机延时500ms程序汇编

单片机延时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的程序。

当然,实际的延时程序可能会更加复杂,需要根据具体的单片机型号和工作频率进行调整,但是思路是相似的。

在实际的编程中,需要根据具体的需求和硬件环境来进行调整和优化,以实现更加稳定和精确的延时操作。

希望本文对单片机延时程序的编写有所帮助,也欢迎大家在评论区提出宝贵意见和建议。

各种延时程序

各种延时程序
DELAY2: MOV R0,#0B2H
DJNZ R0,$
DJNZ R1,DELAY2 ;延时 100 mS
DJNZ R2,DELAY1
POP R0
POP R1
POP R2
RET
(转贴)精确廷时计算公式:
延时时间=[(2*第一层循环+3)*第二层循环+3]*第三层循环+5
另外,网上有很多计算延时的应用程序,我这也有几个,有需要的同学发邮件.
DELAY: MOV R6,#250
DL1: MOV R7,#200
DL2: DJNZ R6,DL2
DJNZ R7,DL1
RET
;延时1046549微秒(12mhz)
;具体的计算公式是:
;((((r7*2+1)+2)*r6+1)+2)*r5+1+4 = ((r7*2+3)*r6+3)
D1: MOV R6,#200;
D2: MOV R5,#248;
DJNZ R5,$
DJNZ R6,D2;
DJNZ R7,D1;
RET
;这样算下来应该是1.000011秒
T_0: MOV R7,#10;
D1: MOV R6,#200;
D2: NOP
K2: MOV R7,#80H ;1指令周期256*10=2560
K3: NOP ;1指令周期
128*256*10=327680
DJNZ R7,K3 ;2指令周期
2*128*256*10=655360
DJNZ R6,K2 ;2指令周期
*r5+5

汇编延时程序

汇编延时程序

延时程序在单片机编程中使用非常广泛,但一些读者在学习中不知道延时程序怎么编程,不知道机器周期和指令周期的区别,不知道延时程序指令的用法, ,本文就此问题从延时程序的基本概念、机器周期和指令周期的区别和联系、相关指令的用法等用图解法的形式详尽的回答读者我们知道程序设计是单片机开发最重要的工作,而程序在执行过程中常常需要完成延时的功能。

例如在交通灯的控制程序中,需要控制红灯亮的时间持续30秒,就可以通过延时程序来完成。

延时程序是如何实现的呢?下面让我们先来了解一些相关的概念。

一、机器周期和指令周期1.机器周期是指单片机完成一个基本操作所花费的时间,一般使用微秒来计量单片机的运行速度,51 单片机的一个机器周期包括12 个时钟振荡周期,也就是说如果51 单片机采用12MHz 晶振,那么执行一个机器周期就只需要1μs;如果采用的是6MHz 的晶振,那么执行一个机器周期就需要2 μs。

2 .指令周期是指单片机执行一条指令所需要的时间,一般利用单片机的机器周期来计量指令周期。

在51 单片机里有单周期指令(执行这条指令只需一个机器周期),双周期指令(执行这条指令只需要两个机器周期),四周期指令(执行这条指令需要四个机器周期)。

除了乘、除两条指令是四周期指令,其余均为单周期或双周期指令。

也就是说,如果51 单片机采用的是12MHz 晶振,那么它执行一条指令一般只需1~2 微秒的时间;如果采用的是6MH 晶振,执行一条指令一般就需2~4 微秒的时间。

现在的单片机有很多种型号,但在每个型号的单片机器件手册中都会详细说明执行各种指令所需的机器周期,了解以上概念后,那么可以依据单片机器件手册中的指令执行周期和单片机所用晶振频率来完成需要精确延时时间的延时程序。

二、延时指令在单片机编程里面并没有真正的延时指令,从上面的概念中我们知道单片机每执行一条指令都需要一定的时间,所以要达到延时的效果,只须让单片机不断地执行没有具体实际意义的指令,从而达到了延时的效果。

嵌入式汇编延时指令

嵌入式汇编延时指令

嵌入式汇编延时指令
在嵌入式汇编中,延时通常用于控制程序的执行速度或等待某些事件发生。

以下是一些常见的延时指令:NOP (No Operation):这是一个空操作,它不会对任何数据进行操作。

它在一些情况下可以用于产生微小的延时。

assembly复制代码
NOP
DELAY:这是一个自定义的延时指令,具体的延时时间取决于你的硬件和编译器。

它通常会执行一系列的NOP或其他无操作指令来产生延时。

assembly复制代码
DELAY
HLT (Halt):这会导致处理器暂停执行,直到收到一个中断。

它可以用于产生更长的延时,但会消耗CPU时间。

assembly复制代码
HLT
WAIT:这个指令会使程序暂停执行,直到某个条件满足。

它通常与中断或某个特定的状态寄存器一起使用。

assembly复制代码
WAIT
循环:通过循环执行某些指令可以产生延时。

例如,你可以循环执行NOP或其他无操作指令来产生延时。

assembly复制代码
LOOP: NOP
...
...
JMP LOOP
请注意,这些只是常见的延时指令,具体的实现可能会根据你使用的硬件和编译器有所不同。

在实际应用中,你可能需要根据你的特定需求和硬件平台来调整这些指令。

C及汇编延时程序讲解

C及汇编延时程序讲解

有个好帖,从精度考虑,它得研究结果是:void delay2(unsigned char i){while(--i);}为最佳方法。

分析:假设外挂12M(之后都是在这基础上讨论)我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据:delay2(0):延时518us 518-2*256=6delay2(1):延时7us(原帖写“5us”是错的,^_^)delay2(10):延时25us 25-20=5delay2(20):延时45us 45-40=5delay2(100):延时205us 205-200=5delay2(200):延时405us 405-400=5见上可得可调度为2us,而最大误差为6us。

精度是很高了!但这个程序的最大延时是为518us 显然不能满足实际需要,因为很多时候需要延迟比较长的时间。

那么,接下来讨论将t分配为两个字节,即uint型的时候,会出现什么情况。

void delay8(uint t){while(--t);}我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据:delay8(0):延时524551us 524551-8*65536=263delay8(1):延时15usdelay8(10):延时85us 85-80=5delay8(100):延时806us 806-800=6delay8(1000):延时8009us 8009-8000=9delay8(10000):延时80045us 80045-8000=45delay8(65535):延时524542us 524542-524280=262如果把这个程序的可调度看为8us,那么最大误差为263us,但这个延时程序还是不能满足要求的,因为延时最大为524.551ms。

那么用ulong t呢?一定很恐怖,不用看编译后的汇编代码了。

那么如何得到比较小的可调度,可调范围大,并占用比较少得RAM呢?请看下面的程序:/*--------------------------------------------------------------------程序名称:50us 延时注意事项:基于1MIPS,AT89系列对应12M晶振,W77、W78系列对应3M晶振例子提示:调用delay_50us(20),得到1ms延时全局变量:无返回:无--------------------------------------------------------------------*/void delay_50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--);}我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据:delay_50us(1):延时63us 63-50=13delay_50us(10):延时513us 503-500=13delay_50us(100):延时5013us 5013-5000=13delay_50us(1000):延时50022us 50022-50000=22赫赫,延时50ms,误差仅仅22us,作为C语言已经是可以接受了。

精确延时1秒程序单片机汇编

精确延时1秒程序单片机汇编

精确延时1秒程序单片机汇编(2006-12-14 15:44:23)转载▼DELAY:MOV R4,#10 ;延时子程序,12M晶振延时1.002秒L3: MOV R2 ,#200L1: MOV R3 ,#249L2: DJNZ R3 ,L2DJNZ R2 ,L1DJNZ R4 ,L3RET计算方法如下:[(249*2+1+2)*200+1+2]*10*12/12000000=1.002030s通常选用的是11.0592MHZ的晶振:[(249*2+1+2)*200+1+2]*10*12/11059200=1.08727213541666666...S参考文章:延时子程序的延时计算问题对于程序DELAY:MOV R0,#00HDELAY1: MOV R1,#0B3HDJNZ R1,$DJNZ R0,DELAY1查指令表可知MOV一个机器周期,DJNZ 指令需用两个机器周期,而一个机器周期时间长度为12/11.0592MHz,所以该段程序执行时间为:((0B3×2+1+2)×256+1)×12÷11059200=100.2789mS第一层:DJNZ R1,$:执行了B3H次,一次两个周期,所以为0B3×2;第二层:MOV R1,#0B3H为一个周期,DJNZ R0,DELAY1为两个周期,这样循环一次就是0B3×2+1+2个周期;第二层的执行次数本来是255次,但因为赋首值为0,而DJNZ是先减1,再比较的,所以就应该是256次。

这样的话,整个循环执行完应该是(0B3×2+1+2)×256+1次。

再加上开始赋值这一句,就是((0B3×2+1+2)×256+1)了不过一些要求不是很高的场合用0B3*256*2就可以了..。

用汇编语言编写1ms延时程序

用汇编语言编写1ms延时程序

用汇编语言编写1ms延时程序实验题目:设计延时时间1ms的程序实验目的:通过该延时时间程序的实验设计,了解运行程序时的我们可以通过该程序进行程序的延时操作,以便达到我们的操作目的。

实验设备:计算机一台。

实验程序:参考附录A实验内容:题目分析:题目是让计算机做一些无用的操作,来拖延时间。

可以根据一条指令执行时间需要几个时钟周期,即几个微妙,来编程延时程序,也就可以利用循环程序结构。

由查表可得,我们可以用PUSHF和POPF指令来进行编程。

而延时的时间主要取决于循环体及循环次数。

而PUSHF和POPF指令分别为10和8个时钟节拍,LOOP BX指令为3.4个时钟节拍,即此循环体需要用10+8+3.4=21.4拍,而每个时钟节拍是根据此系统的晶振频率而定的。

假设系统用的是8Mhz的晶振,则每个时钟节拍需要0.125μs,因此我们可以根据下列公式算出循环次数:换算成十六进制数为176H。

下图为程序流程图:六、实验总结:此程序中内循环是1ms时间,而在外循环中的两条控制指令DEC和JNZ所对应的时钟节拍分别为2个和4个,一共只需0.75μs,与1ms比较极短,所以我们在外循环里忽略不计了,外循环的循环初值为1000次,对应的十六进制为3E8H。

有时候我们需要计算机为我们“空”一点时间来进行空操作,即什么也不用做,我们可以通过上述的延时时间子程序来达到目的。

附录A延时1ms的程序如下:START: MOV CX,176H ;初始化,设定循环次数CX=376LP1:PUSHF ;循环体POPFLOOP LP1 ; CX CX-1,若CX0转LP1HLT ;暂停延时1s的程序如下:MOV BX,3E8H ; BX 1000LP2:MOV CX,176HLP1: PUSHFPOPF 延时1ms程序段LOOP LP1DEC BXDEC BX ; BX BX-1JNZ LP2 ;ZF=0时,转至LP2,即BX0时转HLT ;暂停参考文献郑学坚,周斌编著.微型计算机原理及应用(第三版).清华大学出版社.2001。

单片机汇编语言设计软件延时程序

单片机汇编语言设计软件延时程序

单片机汇编语言设计软件延时程序引言:在单片机编程中,经常需要使用延时函数来控制程序的执行时间,例如等待外设初始化完成、延迟发送数据等。

本文将介绍使用汇编语言设计的延时函数。

一、延时原理在单片机中,延时的实现主要通过定时器或循环计数的方式来实现。

定时器通常会使用内部时钟源来产生时钟信号,然后通过预设的计数值来控制定时时间。

循环计数方式则是通过程序在指定循环内部执行空操作的次数来实现延时。

二、定时器延时定时器延时的实现比较简单,只需要设置定时器的计数值和相关控制寄存器即可。

1.使用定时器0延时定时器0是一种常用的定时器,可通过T0计数器、定时器控制寄存器TCON和定时器模式控制寄存器TMOD来实现。

例如,以下是一个使用定时器0的延时函数的实现示例:```assemblydelay_us PROCMOV R4,16 ; 假设使用的是12MHz的晶振,所以每个机器周期为1/12MHz=83.33ns,16个机器周期为1.33usMOVR5,FFH;设置循环的次数delay_usroutine:NOP;执行空操作,延时一个机器周期DJNZ R5,delay_usroutine ;循环R5次RETdelay_us ENDPdelay_ms PROCMOV R7,4 ; 延时1ms需要延时四次1usLOOP:CALL delay_usDJNZR7,LOOPRETdelay_ms ENDP```在上述代码中,delay_us过程使用了16次空操作进行延时,该延时约为1.33us。

delay_ms过程通过循环调用delay_us过程实现了1ms的延时。

2.使用定时器1延时定时器1是使用T1计数器、定时器控制寄存器TCON和定时器模式控制寄存器TMOD来实现的。

例如,以下是一个使用定时器1的延时函数的实现示例:```assemblydelay_us PROCMOV R4,16 ; 假设使用的是12MHz的晶振,所以每个机器周期为1/12MHz=83.33ns,16个机器周期为1.33usMOVR5,FFH;设置循环的次数delay_usroutine:NOP;执行空操作,延时一个机器周期DJNZ R5,delay_usroutine ;循环R5次RETdelay_us ENDPdelay_ms PROCMOV R7,4 ; 延时1ms需要延时四次1usLOOP:CALL delay_usDJNZR7,LOOPRETdelay_ms ENDP```在上述代码中,delay_us过程使用了16次空操作进行延时,该延时约为1.33us。

汇编程序汇总

汇编程序汇总

1、8255输入输出:mode equ 082h ; 方式0,PA,PC输出,PB输入PortA equ 8000h ; Port APortB equ 8001h ; Port BPortC equ 8002h ; Port CCAddr equ 8003h ; 控制字地址code segmentassume cs:codestart proc nearStart:mov al, modemov dx, CAddrout dx, al ; 输出控制字;实验1:PortA输出mov al, 80Hmov cx, 08HOutA:mov dx, PortAout dx, al ; 输出PortAshr al, 1 ; 移位mov ah,100call delay ; 延时loop OutA;实验2:PortB 输入PortA 输出mov dx, PortBin al, dx ; 读入PortBmov dx, PortAout dx, al ; 输出到PortAmov ah, 200call delayjmp Startendpdelay proc nearpush axmov al,0push cxmov cx,axloop $pop cxpop axretdelay endpcode endsend start2、8259中断程序mode equ 82h ; 8255 工作方式PA8255 equ 8000h ; 8255 PA口输出地址CTL8255 equ 8003hICW1 equ 00010011b ; 单片8259, 上升沿中断, 要写ICW4 ICW2 equ 00100000b ; 中断号为20HICW4 equ 00000001b ; 工作在8086/88 方式OCW1 equ 11111110b ; 只响应INT0 中断CS8259A equ 09000h ; 8259地址CS8259B equ 09001hdata segmentCNT db 0data endscode segmentassume cs:code, ds: dataIEnter proc nearpush axpush dxmov dx, PA8255inc CNTmov al, CNTout dx, al ; 输出计数值mov dx, CS8259Amov al, 20h ; 中断服务程序结束指令out dx, alpop dxpop axiretIEnter endpIInit procmov dx, CS8259Amov al, ICW1out dx, almov dx, CS8259Bmov al, ICW2out dx, almov al, ICW4out dx, almov al, OCW1out dx, alretIInit endpstart proc nearclimov dx, CTL8255mov al, modeout dx, almov ax, 0mov ds, axmov bx, 4*ICW2 ; 中断号mov [bx], offset IEntermov ax, seg IEnterinc bxinc bxmov [bx], ax ; 代码段地址为0call IInitmov ax, datamov ds, axmov CNT, 0 ; 计数值初始为0mov al, CNTmov dx, PA8255out dx, alstiLP: ; 等待中断,并计数。

汇编延时程序

汇编延时程序

DELAY:MOV R4,#2 ;延时子程序,12M晶振延时约1秒L3: MOV R2 ,#255L1: MOV R3 ,#255L2: DJNZ R3 ,L2DJNZ R2 ,L1DJNZ R4 ,L3RET这里的延时不是很精确..谁能给个精确点的数..R2,R3,R4DELAY:MOV R4,#25 ;延时子程序,12M晶振延时1.001秒L3: MOV R2 ,#200L1: MOV R3 ,#248L2: DJNZ R3 ,L2DJNZ R2 ,L1DJNZ R4 ,L3RET计算延时时间应注意以下几点:1、晶振跑多少的,象这里的6M的话,那么它执行的机器周期就是2us,2、看指令执行要多少个机器周期,向DJNZ、RET都要两个机器周期,3、那么,这里总共时间是26(1A)*255(0FF)*255(0FF)*2(机器周期)*2us(1个机器周期的时间)=6762600us 若要精确计算的话要加上上面赋值的时间和子程序返回的时间。

不过一般只要计算到上面就行了,因为赋值和返回指令的时间很短(相对于整个延时程序来说)希望对你有所帮助...51单片机 Keil C 延时程序的简单研究应用单片机的时候,经常会遇到需要短时间延时的情况。

需要的延时时间很短,一般都是几十到几百微妙(us)。

有时候还需要很高的精度,比如用单片机驱动DS18B20的时候,误差容许的范围在十几us以内,不然很容易出错。

这种情况下,用计时器往往有点小题大做。

而在极端的情况下,计时器甚至已经全部派上了别的用途。

这时就需要我们另想别的办法了。

以前用汇编语言写单片机程序的时候,这个问题还是相对容易解决的。

比如用的是12MHz晶振的51,打算延时20us,只要用下面的代码,就可以满足一般的需要:mov r0, #09hloop: djnz r0, loop51单片机的指令周期是晶振频率的1/12,也就是1us一个周期。

mov r0, #09h需要2个极其周期,djnz也需要2个极其周期。

汇编语言编写软件延时程序

汇编语言编写软件延时程序

如何实现500us延时? n=t/2T=500us/2us=250次
MOV DEL0: DJNZ
循环结构
R0,#250;执行1次MOV需要1个机器周期,时间是1*T=1us R0,DEL0;循环执行250次DJNZ的时间2us*250=500us
Step 1
软件延时程序解析
要执行DJNZ 指令
?次
MAIN: CLR
调用子程序
ACALL DEL SETB P0.0 ACALL DEL SJMP MAIN
子程序入口地址

DEL:
MOV MOV MOV
R2,#10 R1,#200 R0,#250
;1us,设定外循环10次 ;1us,设定中循环100次 ;1us,设定内循环250次
延 时 子 程 序
汇编语言编写软件延时程序以单片机控制led灯的闪烁为例软件延时程序应用软件延时程序编写软件延时程序解析step时钟周期1晶振频率晶振频率为12mhz时钟周期112us1个机器周期12个时钟周期1个机器周期则为t1us1个指令周期14个机器周期movr0250
《单片机原理与应用》
汇编语言编写软件延时程序
方法1:软件延时
利用CPU执行指令消耗的时间实现。
方法2:定时器
利用单片机内部定时器定时。
任务要求:汇编语言编写软件延时程序 ——以单片机控制LED灯的闪烁为例
任务实施步骤
Step 1
Step 2
Step 3
软件延时程序 解析
软件延时程序 编写
软件延时程序 应用
知 识 点 小 结
Step 1
从内向外逐层构建循环结构
2、学会估算软件 延时程序的时间
t≈2*T*n0*n1*n2(us) ——n0,n1,n2范围0~255,一般习惯取10的倍数

汇编延时程序

汇编延时程序
; 闪烁功能1键处理程序
KEY1:LCALL DL10MS
JB P3.1,OUT1
SETB 01H ;20H.1位置1(执行闪烁功能2标志)
CLR 00H
CLR 02H
JB 03H,MAIN ;备用
AJMP MAIN ;返回主程序MAIN
;
;************;
; 功能程序 ;
;************;
;第1种闪烁功能程序
FUN0: MOV A,#0FEH ;累加器赋初值
SETB 00H ;20H.0位置1(上电时自动执行闪烁功能1)
RET ;子程序返回
;
;************;
; 主 程 序 ;
;************;
;
START:ACALL CLEAR ;调用初始化子程序
JNB P3.0,KEY0 ;读P3.0口,若为0转KEY0
JNB P3.1,KEY1 ;读P3.1口,若为0转KEY1
JNB P3.2,KEY2 ;读P3.2口,若为0转KEY2
JNB P3.3,KEY3 ;读P3.3口,若为0转KEY3
LOOP1: DJNZ R2,LOOP1
RET
;
;10毫秒延时子程序(调用20次0.5毫秒延时子程序)
DL10MS:MOV R3,#14H
LOOP2: LCALL DL512
DJNZ R3,LOOP2
RET
;
RETI ;中断返回(不开中断)
ORG 0023H ;串行口中断入口地址
RETI ;中断返回(不开中断)
;
;************;

单片机汇编语言设计软件延时程序

单片机汇编语言设计软件延时程序

Science &Technology Vision 科技视界延时程序是单片机中一个很重要的部分,通常有两种方法实现:一是,定时器定时实现延时;二是,软件延时程序。

本文要介绍的是软件延时程序。

这种方法是通过CPU 执行指令消耗时间来实现延时,其内容虽然简单,应用却极其广泛,比如跑马灯,多位数码管的动态显示,键盘扫描等等都需要用到软件延时。

本文介绍要介绍单片机里用汇编语言设计软件延时程序及其延时时间的估算方法,这也是循环结构的一个典型程序。

1指令周期、机器周期和时钟周期软件延时程序是通过CPU 执行指令消耗时间来实现的,首先要了解单片机CPU 在执行一条指令时所需要的时间,即指令周期。

指令周期是以机器周期为单位,MCS51单片机通常把指令分为单周期指令、双周期指令和四周期指令三种;而机器周期是指CPU 完成某一个规定操作所需要的时间,它是由12个时钟周期组成;时钟周期又叫振荡周期,是由单片机内部振荡电路产生的,是时钟频率的倒数。

以时钟频率12MHz(后面的均以这个频率来计算)为例,计算如下:1)时钟周期Tosc=1/时钟频率=1/12M=1/12us 2)机器周期T=12个时钟周期=12Tosc=1us 3)指令周期=(1~4)个机器周期=(1~4)T=(1~4)us软件延时程序常用的指令如下所示,计算其指令周期。

MOV Rn,#data ;数据传送指令,t=1T=1us DJNZ Rn,rel ;减1条件转移指令,t=2T=2us NOP ;空操作指令,t=1T=1us RET ;子程序返回指令,t=2T=2us ACALL ;短调用指令,t=2T=2us LCALL ;长调用指令,t=2T=2us2软件延时程序以及时间计算方法从指令周期的概念得知,单片机CPU 执行一条指令花(1~4)us,若想得到一定时间t 的延时,则需要执行指令次数n=t/指令周期,我们可采用循环结构来实现。

2.1短暂延时程序———单循环设计在循环入口设置循环次数n0,执行减1条件转移指令n0次来实现短暂延时程序,程序如下所示。

汇编延时1s的延时子程序

汇编延时1s的延时子程序

汇编延时1s的延时子程序1. 引言在计算机中,延时操作是指暂停程序的执行一段时间。

在某些应用中,需要通过延时来控制程序的执行速度或实现特定的时间间隔。

本文将介绍如何使用汇编语言编写一个延时1秒的延时子程序。

2. 延时原理在汇编语言中,我们可以使用计数器来实现延时操作。

计数器是一个特殊的寄存器,可以用来保存一个定时值,并在每个时钟周期递减。

当计数器的值为零时,表示经过了一段时间,可以继续执行后面的指令。

为了实现1秒钟的延时,我们需要知道CPU的主频(也称为振荡频率),即每秒钟振荡多少次。

假设CPU主频为f,则每个振荡周期为1/f秒。

因此,要实现1秒钟的延时,需要经过f个振荡周期。

3. 编写延时子程序步骤一:初始化计数器首先,我们需要将计数器初始化为CPU主频-1(因为计数器从0开始计数)。

假设CPU主频为f,则初始化计数器的值为f-1。

MOV CX, f-1 ; 初始化计数器为CPU主频-1步骤二:循环减计数器接下来,我们需要使用一个循环来递减计数器的值,直到它变为零。

在每次循环中,我们可以执行一些无关紧要的操作,以消耗一定的时间。

DELAY_LOOP:NOP ; 无操作指令,用于消耗时间LOOP DELAY_LOOP ; 循环减计数器并判断是否为零步骤三:调用延时子程序在我们的主程序中,可以通过调用延时子程序来实现1秒钟的延时。

在调用之前,需要将CPU主频f的值传递给延时子程序。

PUSH f ; 将CPU主频压入栈中CALL DELAY ; 调用延时子程序完整代码示例下面是一个完整的汇编代码示例:DELAY PROC NEARPUSH CX ; 保存寄存器CX的值MOV CX, [BP+4] ; 获取传入的CPU主频值DELAY_LOOP:NOP ; 无操作指令,用于消耗时间LOOP DELAY_LOOP ; 循环减计数器并判断是否为零POP CX ; 恢复寄存器CX的值RET ; 返回到调用者处DELAY ENDPMAIN PROC NEAR; 初始化堆栈等操作省略MOV AX, CPU_FREQUENCY ; 将CPU主频值赋给AX寄存器PUSH AX ; 将AX寄存器的值压入栈中CALL DELAY ; 调用延时子程序; 其他指令省略MAIN ENDP4. 总结通过使用汇编语言编写延时子程序,我们可以实现在程序中添加延时操作。

汇编延时1s的延时子程序

汇编延时1s的延时子程序

汇编延时1s的延时子程序一、延时子程序的概念延时子程序是指在程序中设置一个时间延迟,使得程序在执行到该子程序时暂停一段时间后再继续执行下一条指令。

在汇编语言中,常用的延时子程序有软件延时和硬件延时两种。

二、软件延时的实现方法1. 循环计数法循环计数法是一种简单而常用的软件延时方法。

其原理是利用CPU进行循环计数,当计数器达到设定值后,即完成了指定的时间延迟。

2. 空循环法空循环法是在循环体内不执行任何有意义的操作,只进行空转等待的方法。

其原理是利用CPU进行忙等待,当指定的时间到达后再继续执行下一条指令。

三、硬件延时的实现方法硬件延时是通过外部电路或芯片来实现的。

常用的硬件延时器有555定时器和8254可编程定时器等。

四、汇编语言实现1s延时子程序以下以循环计数法为例,介绍如何使用汇编语言实现1s延时子程序。

1. 程序思路:(1)将需要等待的时间转换为机器周期;(2)循环计数,当计数器达到指定值时,跳出循环。

2. 程序代码:delay:mov cx, 0FFFFh ;将计数器初始化为最大值mov dx, 0FFFFhdelay1:loop delay1 ;循环计数dec dx ;减少dx的值jnz delay1 ;如果dx不为0,则继续循环dec cx ;减少cx的值jnz delay1 ;如果cx不为0,则继续循环ret ;延时结束,返回3. 程序说明:(1)mov cx, 0FFFFh:将CX寄存器初始化为最大值,即65535;(2)mov dx, 0FFFFh:将DX寄存器初始化为最大值,即65535;(3)loop delay1:循环计数,每次减少CX的值,当CX的值为0时跳出循环;(4)dec dx:每次减少DX的值;(5)jnz delay1:如果DX的值不为0,则跳转到delay1标号处继续执行循环;(6)dec cx:每次减少CX的值;(7)jnz delay1:如果CX的值不为0,则跳转到delay1标号处继续执行循环;(8)ret:延时结束,返回。

汇编延时程序

汇编延时程序
如图4.1.1 所示的石英晶体为12MHz,因此,1 个机器周期为1 微秒
机器周期微秒
MOV R6,#20 2 个机器周期 2
D1: MOV R7,#248 2 个机器周期 2 2+2×248=498
由以上可知,当R6=10、R7=248 时,延时5ms,R6=20、R7=248 时,
延时10ms,以此为基本的计时单位。如本实验要求0.2 秒=200ms,
10ms×R5=200ms,则R5=20,20*10002=200004us.
延时子程序如下:
即P1.0=0 时,发光二极管L1 亮;我们可以使用SETB P1.0 指令使P1.0
端口输出高电平,使用CLR P1.0 指Y: MOV R5,#20
D1: MOV R6,#20
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
(2). 输出控制
如图1 所示,当P1.0 端口输出高电平,即P1.0=1 时,根据发光二极管
的单向导电性可知,这时发光二极管L1 熄灭;当P1.0 端口输出低电平,
DJNZ R7,$ 2 个机器周期 2+ 2×248= 498
DJNZ R6,D1 2 个机器周期 2+20(2+498)=10002
因此,上面的延时程序时间为10.002ms。

单片机的汇编延时程序

单片机的汇编延时程序

单片机的汇编延时程序
50ms延时;一般书上的程序
DEL: MOV R7,#200
LO: MOV R6,#123
NOP
L1: DJNZ R6,L1
DJNZ R7,L0
RET
但是这个程序实际上延时50.001ms,多了一个机器周期,其实这个问题是不可能由一个二重循环实现精确延时的,必须采用三重循环
我的程序;
DEL: MOV R5,#29
L0: MOV R7,#22
L1: MOV R6,#6
L2: DJNZ R6,L2
DJNZ R7,L1
DJNZ R5,L0
RET
此时精确延时50ms,并且三个寄存器里的数值是可以
变化的,这里要讨论的是,为什么不能,或说不容易用
一个二重循环去实现一些精确的延时程序,而三重循环
确一般是可以的,在数学上,是一些函数数值的遍历性,他与连续函数的因连续而具有的介值性有所不同,是不
是也存在一些值,用三重循环也不能实现呢?于是我们
开始使用四重?充要条件是什么呢?。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MOV TH0,#3CH
MOV TL0,#0B0H
MOV R4, #10
SETB ET0
SETB EA
SETB TR0
SJMP $ ;
RET
DELAY: ;延时子程序(1秒)
MOV R0,#0AH
DELAY1: MOV R1,#00H
DELAY2: MOV R2,#0B2H
DJNZ ห้องสมุดไป่ตู้2,$
DJNZ R1,DELAY2
DJNZ R0,DELAY1
RET
MOV R2,#10 ;延时1秒
LCALL DELAY
*r5+5
DEL : MOV R5,#08H
DEL1: MOV R6,#0FFH
DEL2: MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,DEL2
DJNZ R5,DEL1
RET
;1秒延时子程序是以12MHz晶振
POP R0
POP R1
POP R2
RET
1:DEL: MOV R7, #200
DEL1: MOV R6, #123
NOP
DEL2: DJNZ R6, DEL2
D52: NOP
NOP
NOP
NOP
DJNZ R6,D52
DJNZ R7,D51
POP PSW
RET
DELAY: ;延时1毫秒
PUSH PSW
SETB RS0
MOV R7,#50
D1: MOV R6,#10
D2: DJNZ R6,$
DJNZ R7,D1
POP PSW
2*128*256*10=655360
DJNZ R6,K2 ;2指令周期
2*256*10=5120
DJNZ R5,K1 ;2指令周期2*10=20
RET
;2指令周期21+10+2560+327680+655360+5120+20+2=990753
CTC0: MOV TH0, #3CH
MOV TL0, #0B0H
DJNZ R4, LP
CPL P1.0
MOV R4, #10
LP: RETI
END
Delay1S:mov r1,#50
del0: mov r2,#91
del1: mov r3,#100
djnz r3,$
djnz r2,del1
djnz r1,del0
Ret
;1秒延时子程序是以12MHz晶振为例算指令周期耗时
POP 06H
POP 05H
POP 04H
RET
RET
;===================================
DELAY2400: ;10x244+4=2447
/1.024=2390
MOV R0,#244 ;1
DELAY24001:
MUL AB ;4
MUL AB ;4
DJNZ R0,DELAY24001 ;2
delay_30ms: ;30ms
MOV R2,#12
JMP DELAY_MS
DELAY_5MS: ;5MS
MOV R2,#2
;===================================
DELAY_MS:
CALL DELAY2400
DJNZ R2,DELAY_MS
;约等于1秒1秒=1000000微秒
;这个算下来也只有0.998抄
T_0: MOV R7,#10;
D1: MOV R6,#200;
D2: MOV R5,#248;
DJNZ R5,$
DJNZ R6,D2;
DJNZ R7,D1;
RET
PUSH 05H
PUSH 06H
MOV R4,#50
DELAY5S_0:MOV R5,#200
RET
ORG 0
LJMP MAIN
ORG 000BH
LJMP CTC0
MAIN: MOV SP, #50H
CLR EA
MOV TMOD, #01H
;这样算下来应该是1.000011秒
T_0: MOV R7,#10;
D1: MOV R6,#200;
D2: NOP
MOV R5,#248;
DJNZ R5,$
DJNZ R6,D2;
DJNZ R7,D1;
RET
DELAY_2S: ;10MS(11.0592mhz)
2: DEL: MOV R7, #200
DEL1: MOV R6, #123
DEL2:NOP
DJNZ R6,DEL2
DJNZ R7,DEL1
RET
D500MS:
PUSH PSW
SETB RS0
MOV R7,#200
D51: MOV R6,#250
MOV R2,#50 ;延时5秒
LCALL DELAY
DELAY: ;延时子程序
PUSH R2
PUSH R1
PUSH R0
DELAY1: MOV R1,#00H
DELAY2: MOV R0,#0B2H
DJNZ R0,$
DJNZ R1,DELAY2 ;延时 100 mS
DJNZ R2,DELAY1
MOV R4,#20
DELAY10MSA:
MOV R5,#247
DJNZ R5,$
DJNZ R4,DELAY10MSA
DJNZ R3,DELAY10MS
RET
DELAY_500MS: ;500500MS
MOV R2,#208
;513微秒延时程序
DELAY: MOV R2,#0FEH
DELAY1: DJNZ R2,DELAY1
RET
;10毫秒延时程序
DL10MS: MOV R3,#14H
DL10MS1:LCALL DELAY
DJNZ R3,DL10MS1
MOV R3,#200
JMP DELAY10MS
DELAY_100MS: ;100MS(11.0592mhz)
MOV R3,#10
JMP DELAY10MS
DELAY_10MS:
MOV R3,#1
DELAY10MS: ;去抖动10MS
(11.0592mhz)
DELAY5S_1:MOV R6,#245
DJNZ R6,$
DJNZ R5,DELAY5S_1
DJNZ R4,DELAY5S_0
RET
;0.1s延时程序12mhz
DELAY: MOV R6,#250
DL1: MOV R7,#200
DL2: DJNZ R6,DL2
DJNZ R7,DL1
RET
;延时1046549微秒(12mhz)
;具体的计算公式是:
;((((r7*2+1)+2)*r6+1)+2)*r5+1+4 = ((r7*2+3)*r6+3)
DJNZ R7, DEL1
RET
是50.001ms 算法是:
0.001ms+200*0.001ms+200*0.001ms+200*123*0.002ms+200*0.002ms
;(123*2+4)*200+1
JMP DELAY_MS
DELAY_175MS: ;175MS
MOV R2,#73
JMP DELAY_MS
delaY_120MS: ;120MS
MOV R2,#50
JMP DELAY_MS
delay_60ms: ;60ms
MOV R2,#25
JMP DELAY_MS
各种汇编延时程序大集合
标签:51单片机 汇编 延时
在论坛上看到不少不错的延时程序,整理如下共同分享:
精确延时计算公式:
延时时间=[(2*第一层循环+3)*第二层循环+3]*第三层循环+5
;延时5秒左右
DELAY5S:PUSH 04H
KK: MOV R5,#10 ;1指令周期1
K1: MOV R6,#0FFH ;1指令周期10
K2: MOV R7,#80H ;1指令周期256*10=2560
K3: NOP ;1指令周期
128*256*10=327680
DJNZ R7,K3 ;2指令周期
相关文档
最新文档