汇编语言比较准确延时程序

合集下载

基于汇编语言的精确延时的实现

基于汇编语言的精确延时的实现

料 。大 家 在 学 习这 款 单 片 机 的 过 程 中接 触 了很 多 需 要 延 时 的
场 合 , 比如 我 们 所 熟 悉 的按 键 软 件 去 抖 动 【 l 1 、 定 时 检 测 、定 时 扫 描 。虽 然 绝 对 精 确 的 延 时 不 可 能 实 现 ,但 是 在 某 些 应 用 场 合 ,需 要 的 是 更 为 精 确 的延 时 程 序 ,诸 如 交 通 灯 的精 确 定 时 、 P WM 技 术 在 电机 调 速 和 电 力 电 子 中 的应 用 、 通 信 时 产 生 稳 定 的波特率等。
拟运 算,结果证 明该程序达到 了预期 的效果 。
关键 词 :单 片机 ; 汇 编语 言 ; 延 时程 序 ; 循环 ; 机 器 周期
Th e Ac h i e v e me n t o f Pr e c i s i o n De l a y Ba s e d o n As s e mb l y La n g u a g e
c i s i o n d e l a y o f 1 0 ms w a s d e s i g n e d , a n d s i mu l a t e d b y Ke i l , t h e r e s u l t s s h o w t h a t he t p r o g r a m a c h i e v e d t h e d e s i r e d e f e c t .

单片机延时500ms程序汇编

单片机延时500ms程序汇编

单片机延时500ms程序汇编

一、概述

在单片机编程中,延时操作是非常常见且重要的一部分。延时可以使

程序在执行过程中暂停一段时间,以确保输入输出设备能够正常工作,或者是为了保护其他设备。本文将介绍如何使用汇编语言编写单片机

延时500ms的程序。

二、延时原理

在单片机中,延时操作通常通过循环来实现。每个循环需要一定的时间,通过控制循环次数和循环体内的指令数量,可以实现不同长度的

延时。在汇编语言中,可以使用计数器来控制循环次数,从而实现精

确的延时操作。

三、汇编语言编写延时程序

接下来,我们将使用汇编语言编写延时500ms的程序。

1. 设置计数器初值

在程序的开头我们需要设置计数器的初值,这个初值需要根据单片机

的工作频率和所需的延时时间来计算。假设单片机的工作频率为

1MHz,那么在循环500次后,就能够达到500ms的延时。我们需要将计数器的初值设为500。

2. 循环计数

接下来,我们进入一个循环,在循环中进行计数操作。每次循环结束时,都需要检查计数器的值,当计数器减至0时,表示已经达到了500ms的延时时间,可以退出循环。

3. 优化程序

为了提高程序的执行效率,可以对计数器进行优化。例如可以通过嵌套循环的方式,减少循环的次数,从而提高延时的精度和稳定性。

四、程序示例

下面是一个简单的示例程序,演示了如何使用汇编语言编写延时500ms的程序。

```

org 0x00

mov r2, #500 ; 设置计数器初值为500

delay_loop:

djnz r2, delay_loop ; 进行计数

ret ; 延时结束,退出程序

比较精确的延时小程序

比较精确的延时小程序

#ifndef _DELAY_H

#define _DELAY_H

// mcu:avr crystal=8MHz 适用于A VR Mega系列单片机

// 该头文件中延时1us,10us,50us,1ms,5ms四个子程序已经A VRstudio4.16验证,是包含调用时间在内的很精确的延时

void Delay_1us(void);

void Delay_10us(void);

void Delay_50us(void);

void Delay_1ms(void);

void Delay_5ms(void);

void Delay_Ms(unsigned int xms);

void Delay10us(unsigned int x10us);

void Delay_1us(void)

{

NOP();

}

void Delay_10us(void)

{

unsigned char i;

for(i=0;i<17;i++);

}

void Delay_50us(void)

{

unsigned char i;

for(i=0;i<97;i++);

}

void Delay_1ms(void)

{

unsigned int i;

for(i=0;i<988;i++); //1141

}

void Delay_5ms(void)

{

unsigned int i;

for(i=0; i<2177;i++)

{

NOP();

NOP();

NOP();

NOP();

NOP();

NOP();

NOP();

NOP();

NOP();

}

}

void Delay_Ms(unsigned int xms) //crystal=8MHz {

各种汇编延时程序大集合

各种汇编延时程序大集合

各种汇编延时程序大集合标签:51单片机 汇编 延时 在论坛上看到不少不错的延时程序,整理如下共同分享:精确延时计算公式:延时时间=[(2*第一层循环+3)*第二层循环+3]*第三层循环+5;延时5秒左右DELAY5S:PUSH 04H PUSH 05H PUSH 06H MOV R4,#50 DELAY5S_0:MOV R5,#200 DELAY5S_1:MOV R6,#245 DJNZ R6,$ DJNZ R5,DELAY5S_1DJNZ R4,DELAY5S_0 POP 06H POP 05H POP 04H RET ;513微秒延时程序DELAY: MOV R2,#0FEHDELAY1: DJNZ R2,DELAY1RET;10毫秒延时程序DL10MS: MOV R3,#14HDL10MS1:LCALL DELAYDJNZ R3,DL10MS1RET;0.1s延时程序12mhzDELAY: MOV R6,#250DL1: MOV R7,#200DL2: DJNZ R6,DL2DJNZ R7,DL1RET;延时1046549微秒(12mhz);具体的计算公式是:;((((r7*2+1)+2)*r6+1)+2)*r5+1+4 = ((r7*2+3)*r6+3)*r5+5DEL : MOV R5,#08HDEL1: MOV R6,#0FFHDEL2: MOV R7,#0FFHDJNZ R7,$DJNZ R6,DEL2DJNZ R5,DEL1RET;1秒延时子程序是以12MHz晶振Delay1S:mov r1,#50del0: mov r2,#91del1: mov r3,#100 djnz r3,$ djnz r2,del1 djnz r1,del0Ret;1秒延时子程序是以12MHz晶振为例算指令周期耗时KK: MOV R5,#10 ;1指令周期1K1: MOV R6,#0FFH ;1指令周期10K2: MOV R7,#80H ;1指令周期256*10=2560K3: NOP ;1指令周期128*256*10=327680DJNZ R7,K3 ;2指令周期2*128*256*10=655360DJNZ R6,K2 ;2指令周期2*256*10=5120DJNZ R5,K1 ;2指令周期2*10=20RET ;2指令周期21+10+2560+327680+655360+5120+20+2=990753;约等于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;这样算下来应该是1.000011秒T_0: MOV R7,#10;D1: MOV R6,#200;D2: NOPMOV R5,#248;DJNZ R5,$DJNZ R6,D2;DJNZ R7,D1;RETDELAY_2S: ;10MS(11.0592mhz)MOV R3,#200JMP DELAY10MSDELAY_100MS: ;100MS(11.0592mhz)MOV R3,#10JMP DELAY10MSDELAY_10MS:MOV R3,#1DELAY10MS: ;去抖动10MS(11.0592mhz)MOV R4,#20DELAY10MSA:MOV R5,#247DJNZ R5,$DJNZ R4,DELAY10MSADJNZ R3,DELAY10MSRETDELAY_500MS: ;500500MSMOV R2,#208JMP DELAY_MSDELAY_175MS: ;175MSMOV R2,#73JMP DELAY_MSdelaY_120MS: ;120MSMOV R2,#50JMP DELAY_MSdelay_60ms: ;60msMOV R2,#25JMP DELAY_MSdelay_30ms: ;30msMOV R2,#12JMP DELAY

汇编延时程序算法详解

汇编延时程序算法详解

汇编延时程序算法详解

计算机反复执行一段程序以达到延时的目的称为软件延时,单片机应用程序中经常需要短时间延时。

有时要求很高的精度,网上或书中虽然有现成的公式可以套用,但在部分算法讲解中发现有错误之处,而且延时的具体算法讲得并不清楚,相当一部分人对此仍很模糊,授人鱼,不如授之以渔,本文将以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

单片机延时500ms程序汇编 -回复

单片机延时500ms程序汇编 -回复

单片机延时500ms程序汇编-回复

如何利用汇编语言编写一个单片机延时500ms的程序

首先,我们需要明确一个目标:利用汇编语言编写一个单片机延时500ms 的程序。在这个程序中,我们将使用一个经典的延时算法来实现。

在单片机编程中,延时是一个非常常见和重要的操作。通过延时操作,我们可以在单片机程序中创建指定时间间隔的暂停。这对于控制外部设备或者程序运行过程中的等待时间非常有用。

接下来,我们将按照以下步骤一步一步地回答如何利用汇编语言编写一个单片机延时500ms的程序。

步骤1:选择合适的单片机和汇编语言

首先,我们需要选择一个合适的单片机来进行编程。不同的单片机可能使用不同的指令集和编程方式。在这里,我们将选择一种常见的单片机,例如8051系列。

其次,我们需要选择一种适合我们的单片机的汇编语言。例如,8051单片机通常使用Assembly language(汇编语言)编程。这种语言能够直接与单片机的底层硬件进行交互,从而实现我们的延时操作。

步骤2:了解定时器和计数器的工作原理

在单片机编程中,延时操作通常与定时器和计数器模块一起工作。这两个模块能够提供精确的计时和计数功能,可以帮助我们实现所需的时间延迟。

在了解定时器和计数器的工作原理之后,我们可以开始编写延时程序。

步骤3:编写汇编程序

首先,我们需要初始化定时器和计数器模块。这可以通过设置相应的寄存器来完成。我们需要选择一个合适的时钟源,并设置合适的预分频和计数器的初始值。这样,我们就可以开始计时了。

接下来,我们需要编写一个循环来实现延时操作。这个循环将会不断地检查计数器的值,直到达到所需的延时时间为止。在每次循环中,我们需要使用条件语句来判断计数器是否达到目标时间。如果达到了目标时间,我们就可以退出循环并继续执行程序的其他部分。

mcs-51单片机中汇编程序延时的精确算法。

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)延时是一种通过调节脉冲信号的宽度来实现延时的算法。这种延时算法在一些特定的应用场景中具有较高的灵活性

汇编语言比较准确延时程序

汇编语言比较准确延时程序

便于初学者,较为精确的延时程序

;***************************************************************** ;延时10uS

;*****************************************************************

time10us: mov r5,#05h ;11us

djnz r5,$

ret

;***************************************************************** ;延时50uS

;*****************************************************************

time50us: mov r5,#19h ;51us

djnz r5,$

ret

;***************************************************************** ;延时100uS

;*****************************************************************

time100us: mov r5,#31h ;99.6us

djnz r5,$

ret

;***************************************************************** ;延时200uS

;*****************************************************************

KeilC51精确延时程序执行时间

KeilC51精确延时程序执行时间

Keil C51精确延时程序执行时间

引言

单片机因具有体积小、功能强、成本低以及便于实现分布式控制而有非常广泛的应用领域[1]。单片机开发者在编制各种应用程序时经常会遇到实现精确延时的问题,比如按键去抖、数据传输等操作都要在程序中插入一段或几段延时,时间从几十微秒到几秒。有时还要求有很高的精度,如使用单总线芯片DS18B20时,允许误差围在十几微秒以[2],否则,芯片无法工作。用51汇编语言写程序时,这种问题很容易得到解决,而目前开发嵌入式系统软件的主流工具为C语言,用C51写延时程序时需要一些技巧[3]。因此,在多年单片机开发经验的基础上,介绍几种实用的编制精确延时程序和计算程序执行时间的方法。

实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。

1使用定时器/计数器实现精确延时

单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达

216=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。

在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意,C51编写的中断服务程序编译后会自动加上PUSH ACC、PUSH PSW、POP PSW和POP ACC语句,执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。

用汇编语言编写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=376

LP1:PUSHF ;循环体

POPF

LOOP LP1 ; CX CX-1,若CX0转LP1

mcs-51单片机中汇编程序延时的精确算法。 -回复

mcs-51单片机中汇编程序延时的精确算法。 -回复

mcs-51单片机中汇编程序延时的精确算法。-回复MCs51单片机中的汇编程序延时是一种非常重要的功能,它可以用于控制程序的执行速度,并保证特定操作之间的时间间隔。在本文中,我们将详细介绍MCs51单片机中汇编程序延时的精确算法,并一步一步回答与此主题相关的问题。

首先,让我们了解一下MCs51单片机的基本原理。MCs51是一种8位微控制器,广泛应用于各种嵌入式系统中。它的工作原理是通过读取和执行存储在其内部存储器中的指令来完成各种任务。延时指令是一种特殊的指令,用于使程序在一定时间内暂停执行。

1. 什么是MCs51单片机中的延时?

在MCs51单片机中,延时是指在程序执行过程中暂停一段时间。这段时间可以是固定的,也可以根据不同的需求和算法进行动态调整。延时指令是通过向计时器/计数器寄存器写入特定的数值来实现的。

2. MCs51单片机中的延时精确性有多高?

MCs51单片机可以实现非常高精度的延时,通常可以达到微秒级别。这种高精度是由于MCs51单片机的工作频率相对较高,并且可以使用精确的定时器/计数器来控制延时。

3. MCs51单片机中的延时算法是如何工作的?

MCs51单片机中的延时算法基于定时器/计数器的工作原理。定时器/计数器是一种特殊的寄存器,可以产生固定频率的时钟信号。通过调整寄存器的初值,可以控制定时器/计数器产生的时钟脉冲的数量。

4. 常用的基本延时算法是什么?

MCs51单片机中常用的基本延时算法是利用循环来实现的。具体而言,通过实现一个循环,使程序重复执行一定次数,从而产生延时效果。循环的次数可以根据不同的算法和需求进行调整。

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

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

方法1:软件延时
利用CPU执行指令消耗的时间实现。
方法2:定时器
利用单片机内部定时器定时。
任务要求:汇编语言编写软件延时程序 ——以单片机控制LED灯的闪烁为例
任务实施步骤
Step 1
Step 2
Step 3
软件延时程序 解析
软件延时程序 编写
软件延时程序 应用
知 识 点 小 结
Step 1
为子程序的入口地址,该指令前必须有标号。
(3)子程序返回指令:RET
主程序 调用子程 序
图2 LED灯闪烁流程图
子程序 的入口地 址
子程序 返回 指 令
Step 3

软件延时程序应用
ORG 0000H P0.0 ;程序入口地址 ;点亮LED灯 ;调用延时子程序 ;熄灭LED灯 ;调用延时子程序 ;跳转到MAIN入口地址
时钟周期=1/晶振频率
软件延时程序解析
晶振频率为12MHz,时钟周期= 1/12us
1个机器周期则为 T=1us
1个机器周期=12个时钟周期
1个指令周期=(1~4)个机器周期
MOV R0,#250 ;执行1次MOV需要1个机器周期,时间1*T=1us
DJNZ R0,$
;执行1次DJNZ需要2个机器周期,时间2*T=2us
R0,#250
;设置内循环次数n0

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

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

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=2us

汇编延时程序

汇编延时程序

;************;;小灯控制程序;;************;;;************;;中断入口程序;;************;;ORG 0000H ;程序执行开始地址LJMP START ;跳至START执行ORG 0003H ;外中断0中断入口地址RETI ;中断返回(不开中断)ORG 000BH ;定时器T0中断入口地址RETI ;中断返回(不开中断)ORG 0013H ;外中断1中断入口地址RETI ;中断返回(不开中断)ORG 001BH ;定时器T1中断入口地址RETI ;中断返回(不开中断)ORG 0023H ;串行口中断入口地址RETI ;中断返回(不开中断);;************;; 初始化程序 ;;************;;CLEAR: MOV 20H,#00H ;20H单元内存清0(闪烁标志清0)SETB 00H ;20H.0位置1(上电时自动执行闪烁功能1)RET ;子程序返回;;************;; 主 程 序 ;;************;;START:ACALL CLEAR ;调用初始化子程序MAIN: LCALL KEYWORK ;调用键扫描子程序JB 00H,FUN0 ;20H.0位为1时执行FUN0JB 01H,FUN1 ;20H.1位为1时执行FUN1JB 02H,FUN2 ;20H.2位为1时执行FUN2JB 03H,MAIN ;备用AJMP MAIN ;返回主程序MAIN;;************;; 功能程序 ;;************;;第1种闪烁功能程序FUN0: MOV A,#0FEH ;累加器赋初值FUN00:MOV P1,A ;累加器值送至P1口LCALL DL05S ;延时JNB ACC.7,MAIN ;累加器最高位为0时转MAINRL A ;累加器A中数据循环左移1位AJMP FUN00 ;转FUN00循环;;第2种闪烁功能程序FUN1:MOV A,#0FEH ;累加器赋初值FUN11:MOV P1,A ;累加器值送至P1口LCALL DL05S ;延时JZ MAIN ;A为0转MAINRL A ;累加器A中数据循环左移1位ANL A,P1 ;A同P1口值相与AJMP FUN11 ;转FUN11循环;; 第3种闪烁功能程序FUN2:MOV A,#0AAH ;累加器赋初值MOV P1,A ;累加器值送至P1口LCALL DL05S ;延时CPL A ;A中各位取反MOV P1,A ;累加器值送至P1口LCALL DL05S ;延时AJMP MAIN ;转MAIN;************;; 扫键程序 ;;************;;KEYWORK:MOV P3,#0FFH ;置P3口为输入状态JNB P3.0,KEY0 ;读P3.0口,若为0转KEY0JNB P3.1,KEY1 ;读P3.1口,若为0转KEY1JNB P3.2,KEY2 ;读P3.2口,若为0转KEY2JNB P3.3,KEY3 ;读P3.3口,若为0转KEY3RET ;子程序返回;;闪烁功能0键处理程序KEY0:LCALL DL10MS ;延时10毫秒消抖JB P3.0,OUT0 ;P3.0为

汇编延时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 ; 调用延时子程序

完整代码示例

下面是一个完整的汇编代码示例:

汇编语言软件延时1s的实现方法

汇编语言软件延时1s的实现方法

汇编语⾔软件延时1s的实现⽅法

对于不同的计算机,因为其主频不同,延时1s的参数也不相同,计算延时的⽅法如下:

计算机主频:x (Hz)

⼀条LOOP语句执⾏始终周期数:y

所需要延时的时间:z (s)

需要执⾏的语句数:a

z=y*(1/x)*a

计算得到所需的执⾏语句数编写程序。

例:(计算机主频为3GHz)

delay proc near

push bx

push cx

mov bx,400h

for1:mov cx,0ffffh

for2:loop for2

dec bx

jnz for1

pop cx

pop bx

ret

delay endp

扩展知识:

单⽚机汇编跳转指令延时⼀秒

DELAY: MOV R7,#10 ;延时1S⼦程序

DL1: MOV R6,#200-----1T

DL2: MOV R5,#248------1T

DJNZ R5,$

DJNZ R6,DL2

DJNZ R7,DL1

RETLP

RET

这是如何延时的呢,晶振为12MHZ为T=1us,DJNZ为双周期指令,主要是嵌套循环延时⼀秒,我们看计算结果:

DJNZ R5,$-----------------------248*2=496500us

DJNZ R6,DL2----------------------(496+1+2)*200=99800us

DJNZ R7,DL1------------------------(99800+2+1)*10=998030~~1s;

总结

以上所述是⼩编给⼤家介绍的汇编语⾔软件延时1s的实现⽅法,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

便于初学者,较为精确的延时程序

;***************************************************************** ;延时10uS

;*****************************************************************

time10us: mov r5,#05h ;11us

djnz r5,$

ret

;***************************************************************** ;延时50uS

;*****************************************************************

time50us: mov r5,#19h ;51us

djnz r5,$

ret

;***************************************************************** ;延时100uS

;*****************************************************************

time100us: mov r5,#31h ;99.6us

djnz r5,$

ret

;***************************************************************** ;延时200uS

;*****************************************************************

time200us: mov r5,#64h ;201us

djnz r5,$

ret

;***************************************************************** ;延时250uS

;*****************************************************************

time250us: mov r5,#7ch ;249.6us

djnz r5,$

ret

;***************************************************************** ;延时350uS

time350us: mov r5,#0afh ;351us

time350us_1: djnz r5,time350us_1

ret

;***************************************************************** ;延时500uS

;*****************************************************************

time500us: mov r5,#0fah ;501us

time500us_1: djnz r5,time500us_1

ret

;***************************************************************** ;延时1mS

;*****************************************************************

time1ms: mov r5,#0fah ;1001us time1ms_1: nop

nop

djnz r5,time1ms_1

ret

;***************************************************************** ;延时2.5mS

;*****************************************************************

time2_5ms: mov r5,#05h ;2.496ms

time2_5ms_1: mov r6,#0f8h ;497us

djnz r6,$

djnz r5,time2_5ms_1

ret

;***************************************************************** ;延时10mS

;*****************************************************************

time10ms: mov r5,#14h ;10.262ms

time10ms_1: mov r6,#0ffh ;511us

djnz r6,$

djnz r5,time10ms_1

ret

;延时50mS

;*****************************************************************

time50ms: mov r5,#63h ;49.996ms

time50ms_1: mov r6,#0fbh ;503us

djnz r6,$

djnz r5,time50ms_1

ret

;***************************************************************** ;延时100mS

;*****************************************************************

time100ms: mov r5,#0c3h ;100.036ms

time100ms_1: mov r6,#0ffh ;511us

djnz r6,$

djnz r5,time100ms_1

ret

;***************************************************************** ;延时200mS

;*****************************************************************

time200ms: mov r5,#02h ;250.351ms

time200ms_1: mov r6,#0f4h ;125.173ms

time200ms_2: mov r7,#0ffh ;511us

djnz r7,$

djnz r6,time200ms_2

djnz r5,time200ms_1

ret

;***************************************************************** ;延时500mS

;*****************************************************************

time500ms: mov r5,#04h ;500.701ms

time500ms_1: mov r6,#0f4h ;125.173ms

time500ms_2: mov r7,#0ffh ;511us

djnz r7,$

djnz r6,time500ms_2

djnz r5,time500ms_1

ret

相关文档
最新文档