谈谈单片机里延时子程序

合集下载

HT单片机延时子程序设计

HT单片机延时子程序设计

HT单片机延时子程序设计单片机延时子程序设计是一种常用的程序设计技术,可以通过编程实现对系统的延时控制,实现各种功能需求。

一、延时原理在单片机中,延时的实现原理主要是基于时钟脉冲的计数器计时。

单片机的时钟频率是固定的,通常为一个定值,通过控制时钟脉冲的频率,我们可以实现不同的延时功能。

二、延时程序设计延时子程序设计通常分为两种情况:固定延时和可调延时。

下面我们将分别介绍这两种情况的延时程序设计。

1.固定延时固定延时是指延时时间是固定不变的,不受外部条件的影响。

为了实现固定延时,可以通过编程设置一个计时器,每次进行固定次数的循环,从而达到延时的目的。

下面是一个实现固定延时的示例代码:```unsigned int i, j;// do nothing, just wait}}```2.可调延时可调延时是指延时时间可以根据需要进行调整的情况。

为了实现可调延时,可以利用系统的定时器模块,设置一个定时器中断,在定时器中断服务子程序中进行延时控制。

下面是一个实现可调延时的示例代码:```#include <8051.h>#define TIMER0_H_BYTE (*((unsigned char volatile xdata *)0xFFC0))#define TIMER0_L_BYTE (*((unsigned char volatile xdata *)0xFFC1))}EA = 1; // enable interruptTH0=TIMER0_H_BYTE=0xFF;TL0=TIMER0_L_BYTE=0xFF;// do nothing, just wait for interrupt}EA = 0; // disable interrupt```在上面的例子中,通过设置定时器0的定时时间为50us,然后将延时时间转换为中断次数进行控制。

通过改变调用delay_adjustable函数时设置的延时时间,可以实现可调延时功能。

单片机·延时程序小结

单片机·延时程序小结

单片机·延时程序小结
在单片机实验中,有一个很重要也是很基本的子程序必须要求我们掌握,
那就是延时程序。

下面我凭记忆来讲解延时程序。

课本上讲,1 个机器周期=6 个状态周期=12 个时钟周期,而这个时钟周期与
晶振频率有关。

我们接下来要上的实验基本都是以12MHz 的晶振。

12M 的频率,得其周期为1/12 乘10 的-6 方s,那么1 个机器周期就是它的12 倍,即1us, 而一般语句需要2 个机器周期,例如
MOV R6,#20
DNJZ R6,$
每一次执行时,每一个过程就需要2 个机器周期,为1us 乘2。

.同样C 语言中for 循环语句没执行一次也是2 个机器周期,即2us。

下面我会以每个语句执
行一次用时的2us 为基本单位,不会再细化了。

汇编语言最基本延时:
MOV R6,#20
D1:MOV R7,#248
DNJZ R7,$//循环248 次,共用248X2us,
DNJZ R6,D1
我开始也是搞不懂怎么算它到底延时多少,现在给大家写它表达式:
我觉得应该从最后往前算,在MOR R7,#248 执行一次前提下,用时1X2us, 然后循环减248,用时248X2us,故共用时[2+2X248]us。

然而又由于DNJZ R6,D1,上面的过程又循环20 次,故上面的循环最终用时20X[2+2X248]us。

接着注意到单纯DNJZ R6,D1 会用时20X2=40us。

C51单片机的几种常用延时程序设计2024

C51单片机的几种常用延时程序设计2024

引言概述:C51单片机是一种广泛应用于嵌入式系统中的微控制器,它具有高度集成化、易于编程和灵活性强等特点。

在C51单片机的软件开发过程中,延时程序设计是非常重要的一部分。

本文将介绍C51单片机中几种常用的延时程序设计方法,包括循环延时、定时器延时、外部中断延时等。

这些方法不仅可以满足在实际应用中对延时的需求,而且可以提高程序的稳定性和可靠性。

正文内容:一、循环延时1. 使用循环控制语句实现延时功能,例如使用for循环、while循环等。

2. 根据需要设置延时的时间,通过循环次数来控制延时的时长。

3. 循环延时的精度受到指令执行时间的影响,可能存在一定的误差。

4. 循环延时的优点是简单易用,适用于较短的延时时间。

5. 注意在循环延时时要考虑其他任务的处理,避免长时间的等待造成程序卡死或响应延迟。

二、定时器延时1. 使用C51单片机内置的定时器模块来实现延时。

2. 配置定时器的工作模式,如工作方式、定时器精度等。

3. 设置定时器的初值和重装值,控制定时器中断的触发时间。

4. 在定时器中断服务函数中进行延时计数和延时结束标志的设置。

5. 定时器延时的优点是精确可控,适用于需要较高精度的延时要求。

三、外部中断延时1. 在C51单片机上配置一个外部中断引脚。

2. 设置外部中断中断触发条件,如上升沿触发、下降沿触发等。

3. 在外部中断中断服务函数中进行延时计数和延时结束标志的设置。

4. 外部中断延时的优点是能够快速响应外部信号,适用于实时性要求较高的场景。

5. 注意在外部中断延时时要处理好外部中断的抖动问题,确保延时的准确性。

四、内部计时器延时1. 使用C51单片机内部的计时器模块来实现延时。

2. 配置计时器的工作模式,如工作方式、计时器精度等。

3. 设置计时器的初值和重装值,使计时器按照一定的频率进行计数。

4. 根据计时器的计数值进行延时的判断和计数。

5. 内部计时器延时的优点是能够利用单片机内部的硬件资源,提高延时的准确性和稳定性。

单片机定时器延时程序

单片机定时器延时程序

单片机定时器延时程序一、引言在单片机的应用中,定时器是一个非常重要的模块。

通过使用定时器,我们可以实现各种定时功能,如延时、计时等。

本文将介绍单片机定时器的延时程序,通过编写代码实现定时功能的延时操作。

二、定时器的基本原理单片机中的定时器是通过计数器的方式实现的。

定时器有一个时钟源,每个时钟周期计数器加1。

当计数器的值达到预设值时,就会触发定时器中断,并执行相应的中断服务程序。

通过改变计数器的预设值,我们可以实现不同的定时功能。

三、编写延时程序在单片机中,我们可以通过设置定时器的预设值来实现延时功能。

下面是一个简单的延时程序示例:```c#include <reg52.h>void delay(unsigned int ms){unsigned int i, j;for(i=0; i<ms; i++)for(j=0; j<1234; j++);}void main(){while(1){// 延时1秒delay(1000);// 执行其他操作}}```上述代码中,我们定义了一个delay()函数,用来实现延时操作。

delay()函数的参数ms表示延时的毫秒数。

通过for循环的嵌套,我们可以控制延时的时间。

在主函数中,我们可以调用delay()函数来实现延时操作。

在上述代码中,我们设置延时1秒,然后执行其他操作。

通过不断调用delay()函数,我们可以实现不同的延时功能。

四、延时精度问题在实际应用中,我们经常会遇到延时精度的问题。

由于单片机的时钟源和延时程序本身的执行时间误差,可能导致延时时间不准确。

为了提高延时精度,我们可以通过以下几种方法来解决:1. 使用定时器的中断功能:通过设置定时器的中断,可以在延时结束时触发中断,从而提高延时精度。

2. 调整延时参数:根据实际情况,可以适当调整延时参数,以达到所需的延时时间。

3. 使用外部时钟源:在一些对延时精度要求较高的应用中,可以使用外部时钟源来提高延时精度。

单片机常用子程序

单片机常用子程序
// P3.0~P3.3,第1~4列
// P3.4~P3.7,第1~4行
// 0 1 2 3
// 4 5 6 7
// 8 9 10 11
// 12 13 14 15
//****************************************************
void delay(unsigned int t)
while(P3!=0xf0);//等待按键弹出
//beep();
return(key);
}
void main()
{
while(1)
{
unsigned char key;
key=ScanKey44();
switch(key)
{
case 0x11:key=0; break; //0
case 0x24:key=6; break; //6
case 0x28:key=7; break; //7
case 0x41:key=8; break; //8
case 0x42:key=9; break; //9
case 0x44:key=10; break; //10
key=P3&0x3c;
while((P3&0x3c)!=0x3c); //等待弹出
//beep();
return(key);
}
#define S1 0x0e
#define S2 0x0d
#define S3 0x0b
#define S4 0x07
//4个简单按键扫描子程序
case 0x12:key=1; break; //1

谈谈51单片机里的延时子程序

谈谈51单片机里的延时子程序

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

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

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

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

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

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

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

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

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

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

单片机课程实验报告-延时子程序

单片机课程实验报告-延时子程序

单片机实验报告实验报告单片机实验报告一、实验目的:学习P1口的使用方法,学习延时子程序的编写二、实验要求:以P1口作为输出口,控制6个发光二极管,模拟交通信号灯的管理。

在实验仪上选择两组红、黄、绿指示灯,代表交通信号灯。

设有一个十字路口为东西南北方向,其中东西方向为支路,南北方向为主路。

初始状态为4个路口的红灯全亮。

之后,南北路口的绿灯亮,东西路口的红灯亮。

南北路口方向通车,延时20秒后,南北路口绿灯熄灭,黄灯开始闪烁,闪烁5次后红灯亮。

而同时东西方向路口的绿灯亮,东西方向开始通车,延时10秒后,东西路口的绿灯熄灭,而黄灯开始闪烁。

闪烁5次后,在切换到南北路口的绿灯亮,东西路口的红灯亮。

之后重复上述过程。

三、实验电路:四、程序框图:五、程序清单:ORG 4000H ;定义程序存放区域的起始地址START: CLR P1.0 ;红灯亮LOOP: SETB P1.1SETB P1.2CLR P1.5SETB P1.6SETB P1.7ACALL DELAYSSETB P1.0 ;南北绿灯亮,东西红灯亮CLR P1.2ACALL DELAYL2 ;长延时20sMOV R3,#5 ;南北黄灯闪烁5次,东西红灯亮YELLOW1: ;南北黄灯亮,东西红灯亮CLR P1.1SETB P1.2ACALL DELAYS ;短延时;南北黄灯灭,东西红灯亮SETB P1.1ACALL DELAYS ;短延时DJNZ R3,YELLOW1;南北红灯亮,东西绿灯亮CLR P1.0SETB P1.5CLR P1.7ACALL DELAYL1 ;长延时10sMOV R3,#5 ;南北红灯亮,东西黄灯闪烁五次YELLOW2:CLR P1.6 ;东西黄灯亮SETB P1.7ACALL DELAYS ;短延时SETB P1.6 ;南北红灯灭,东西黄灯亮ACALL DELAYS ;短延时DJNZ R3,YELLOW2AJMP LOOP ;循环DELAYL2:MOV R4,#200 ;长延迟20sDELAY1: MOV R5,#200DELAY2: MOV R6,#250DELAY3: DJNZ R6,DELAY3DJNZ R5,DELAY2DJNZ R4,DELAY1RETDELAYS: MOV R4,#10 ;短延迟1sDELAY4: MOV R5,#200DELAY5: MOV R6,#250DELAY6: DJNZ R6,DELAY6DJNZ R5,DELAY5DJNZ R4,DELAY4RETDELAYL1:MOV R4,#100 ;长延迟10sDELAY7: MOV R5,#200DELAY8: MOV R6,#250DELAY9: DJNZ R6,DELAY9DJNZ R5,DELAY8DJNZ R4,DELAY7六、LST文件A51 MACRO ASSEMBLER LED04/21/2010 16:50:30 PAGE 1MACRO ASSEMBLER A51 V7.01OBJECT MODULE PLACED IN LED.OBJASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE LED.asm SET(SMALL) DEBUG EPLOC OBJ LINE SOURCE0000 1 ORG 0000H230000 7590DE 4 START: MOV P1,#11011110B0003 1155 5 CALL DALY1 ;0.5S0005 7590DB 6 MOV P1,#11011011B0008 1133 7 CALL DALY ;20S000A 7805 8 MOV R0,#5H000C 74DD 9 LOOP1: MOV A,#11011101B000E F590 10 MOV P1,A0010 1155 11 CALL DALY1 ;0.-5S0012 74DF 12 MOV A,#11011111B0014 F590 13 MOV P1,A0016 1155 14 CALL DALY10018 D8F2 15 DJNZ R0,LOOP1001A 747E 16 MOV A,#01111110B001C F590 17 MOV P1,A001E 1144 18 CALL DALY2 ;10S0020 7805 19 MOV R0,#5H0022 74BE 20 LOOP2: MOV A,#10111110B0024 F590 21 MOV P1,A0026 1155 22 CALL DALY10028 74FE 23 MOV A,#11111110B002A F590 24 MOV P1,A002C 1155 25 CALL DALY1002E D8F2 26 DJNZ R0,LOOP20030 020000 27 LJMP START2829 ;20S0033 7C64 30 DALY:MOV R4,#1000035 7B64 31 DELAY1:MOV R3,#1000037 7A14 32 DELAY2:MOV R2,#200039 792D 33 DELAY3:MOV R1,#45003B D9FE 34 DELAY4:DJNZ R1,DELAY4003D DAFA 35 DJNZ R2,DELAY3003F DBF6 36 DJNZ R3,DELAY20041 DCF2 37 DJNZ R4,DELAY10043 22 38 RET3940 ;10S0044 7C64 41 DALY2:MOV R4,#1000046 7B64 42 DEAY1:MOV R3,#1000048 7A0A 43 DEAY2:MOV R2,#10004A 792D 44 DEAY3:MOV R1,#45004C D9FE 45 DEAY4:DJNZ R1,DEAY4004E DAFA 46 DJNZ R2,DEAY30050 DBF6 47 DJNZ R3,DEAY20052 DCF2 48 DJNZ R4,DEAY10054 22 49 RET5051 ;0.5S0055 7C64 52 DALY1:MOV R4,#1000057 7B64 53 DEY1:MOV R3,#1000059 7A19 54 DEY2:MOV R2,#25005B DAFE 55 DEY3: DJNZ R2,DEY3005D DBFA 56 DJNZ R3,DEY2005F DCF6 57 DJNZ R4,DEY10061 22 58 RETA51 MACRO ASSEMBLER LED 04/22/2010 16:20:30 PAGE 25960 ENDA51 MACRO ASSEMBLER LED 04/21/2010 16:50:30 PAGE 3SYMBOL TABLE LISTING------ ----- -------N A M E T Y P E V A L U E ATTRIBUTESDALY . . . . . . . C ADDR 0033H ADALY1. . . . . . . C ADDR 0055H ADALY2. . . . . . . C ADDR 0044H ADEAY1. . . . . . . C ADDR 0046H ADEAY2. . . . . . . C ADDR 0048H ADEAY3. . . . . . . C ADDR 004AH ADEAY4. . . . . . . C ADDR 004CH ADELAY1 . . . . . . C ADDR 0035H ADELAY2 . . . . . . C ADDR 0037H ADELAY3 . . . . . . C ADDR 0039H ADELAY4 . . . . . . C ADDR 003BH ADEY1 . . . . . . . C ADDR 0057H ADEY2 . . . . . . . C ADDR 0059H ADEY3 . . . . . . . C ADDR 005BH ALOOP1. . . . . . . C ADDR 000CH ALOOP2. . . . . . . C ADDR 0022H AP1 . . . . . . . . D ADDR 0090H ASTART. . . . . . . C ADDR 0000H AREGISTER BANK(S) USED: 0ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S) 七、实验步骤:(1)根据书中设计流程图编写源程序(见实验程序)(2)用keil软件仿真:(3)更改参数:(4)下载:1.正确连接实验仪与主机的RS-232通信电缆和电源2.把实验仪的工作模式选择开关切换到LOAD处,复位系统使实验仪工作于下载状态3.运行DPFlash下载软件4.把实验仪的工作模式选择开关切换到RUN处,复位系统使实验仪工作观察发光二极管的运行情况。

单片机软件延时程序的设计

单片机软件延时程序的设计

单片机软件延时程序的设计一、单片机软件延时的基本原理单片机执行指令需要一定的时间,通过编写一系列无实际功能的指令循环,让单片机在这段时间内持续执行这些指令,从而实现延时的效果。

延时的时间长度取决于所使用的单片机型号、晶振频率以及所编写的指令数量和类型。

以常见的 51 单片机为例,假设其晶振频率为 12MHz,一个机器周期等于 12 个时钟周期,那么执行一条单周期指令的时间约为1μs。

通过编写一定数量的这种单周期指令的循环,就可以实现不同时长的延时。

二、软件延时程序的设计方法1、简单的空操作延时这是最基本的延时方法,通过使用空操作指令“NOP”来实现。

以下是一个简单的示例:```cvoid delay_nop(unsigned int n){unsigned int i;for (i = 0; i < n; i++){_nop_();}}```这种方法的延时时间较短,而且不太精确,因为实际的延时时间还会受到编译器优化等因素的影响。

2、基于循环的延时通过使用循环来执行一定数量的指令,从而实现较长时间的延时。

以下是一个基于循环的延时函数示例:```cvoid delay_ms(unsigned int ms){unsigned int i, j;for (i = 0; i < ms; i++){for (j = 0; j < 120; j++)_nop_();}}}```在这个示例中,通过内外两层循环来增加延时的时间。

需要注意的是,这里的循环次数是根据实验和估算得出的,实际的延时时间可能会有一定的偏差。

3、更精确的延时为了实现更精确的延时,可以根据单片机的机器周期和指令执行时间来精确计算延时的循环次数。

例如,对于12MHz 晶振的51 单片机,要实现 1ms 的延时,可以这样计算:1ms =1000μs,一个机器周期为1μs,执行一条指令需要 1 到 4 个机器周期。

假设平均每条指令需要 2 个机器周期,那么要实现1000μs的延时,大约需要执行 2000 条指令。

单片机延迟程序的原理是

单片机延迟程序的原理是

单片机延迟程序的原理是单片机延迟程序的原理是通过控制单片机内部的定时器和计数器来实现延时功能。

单片机的内部通常包含有定时/计数器模块,通过设置定时器的初始值和计数器的工作方式,就可以实现不同的时间延迟。

在单片机的编程中,常用的延迟实现方法有软件延迟和硬件延迟两种。

首先来看软件延迟的实现原理。

软件延迟是通过循环执行一定的指令周期来实现延迟的。

在单片机中,每条指令所需的时间是固定的,所以通过多次执行一条指令或者一组指令来实现时间上的延迟。

比如,在一些简单的单片机中,可以通过循环执行空指令NOP来实现延迟。

但是软件延迟有一个明显的缺点就是无法精确控制延迟时间,因为受到单片机的工作频率和指令周期的影响,延迟时间的精确性较差。

另一种方法是硬件延迟,即通过单片机内部的定时/计数器模块来实现延迟。

在单片机中,通常有一个或多个定时/计数器模块,可以通过设置定时器的初始值和工作模式来实现固定时间的延迟。

定时器会在设定的时间内不断计数,当计数值达到设定的阈值时,会触发定时器中断,从而完成延迟的功能。

具体来说,实现单片机延迟程序的原理包括以下几个步骤:1. 初始化定时器:首先需要对单片机内部的定时/计数器模块进行初始化,包括设置定时器的工作模式、计数方式、初始值等参数。

这些参数会直接影响到延迟时间的精确性和实现方式。

2. 启动定时器:设置好定时器的各项参数后,需要启动定时器开始计数,这时定时器会根据设置的工作模式和初始值不断进行计数。

3. 等待定时器中断:在定时器工作的过程中,单片机会继续执行其他的指令和任务。

在需要延迟的地方,可以设置一个中断服务程序,当定时器计数达到设定的阈值时,会触发定时器中断,从而中断当前任务,执行相应的延迟操作。

4. 完成延迟任务:当定时器中断被触发时,可以在中断服务程序中进行相应的延迟任务,比如改变某个端口的状态、执行某个操作等。

5. 重置定时器:延迟任务完成后,需要重新设置定时器的初始值并重新启动定时器,以备下一次的延迟使用。

单片机延时子程序

单片机延时子程序

单片机延时子程序下面几个是单片机的延时程序(包括asm和C程序,都是我在学单片机的过程中用到的),在单片机延时程序中应考虑所使用的晶振的频率,在51系列的单片机中我们常用的是和的晶振,而在AVR单片机上常用的有和的晶振所以在网上查找程序时如果涉及到精确延时则应该注意晶振的频率是多大。

软件延时:(asm)晶振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,LOOP4定时器延时:晶振12MHZ,延时1s,定时器0工作方式为方式1DELAY1:MOV R7,#0AH ;; 晶振12MHZ,延时秒AJMP DELAYDELAY2:MOV R7,#14H ;; 晶振12MHZ,延时1秒 DELAY:CLR EX0MOV TMOD,#01H ;设置定时器的工作方式为方式1MOV TL0,#0B0H ;给定时器设置计数初始值MOV TH0,#3CHSETB TR0 ;开启定时器 HERE:JBC TF0,NEXT1SJMP HERENEXT1:MOV TL0,#0B0HMOV TH0,#3CHDJNZ R7,HERECLR TR0 ;定时器要软件清零SETB EX0RETC语言延时程序:10ms延时子程序(12MHZ)void delay10ms(void){unsigned char i,j,k;for(i=5;i>0;i--)for(j=4;j>0;j--)for(k=248;k>0;k--); }1s延时子程序(12MHZ)void delay1s(void){unsigned char h,i,j,k;for(h=5;h>0;h--)for(i=4;i>0;i--)for(j=116;j>0;j--)for(k=214;k>0;k--); }200ms延时子程序(12MHZ)void delay200ms(void){unsigned char i,j,k;for(i=5;i>0;i--)for(j=132;j>0;j--)for(k=150;k>0;k--); }500ms延时子程序程序: (12MHZ)void delay500ms(void){unsigned char i,j,k;for(i=15;i>0;i--)for(j=202;j>0;j--)for(k=81;k>0;k--);}下面是用了的晶振的几个延时程序(用定时0的工作模式1):(1)延时void delay_0_9ms(void){TMOD=0x01; /*定时器0工作在模式1下(16位计数器)*/ TH0=0xfd;TL0=0xa8;TR0=1; /*启动定时器*/while(TF0==0);TR0=0;}(2)延时1MSvoid delay_1ms(void){TMOD=0x01; /*定时器0工作在模式1下(16位计数器)*/TH0=0xfd;TL0=0x65;TR0=1; /*启动定时器*/while(TF0==0);TR0=0;}(3)延时void delay_4_5ms(void){TMOD=0x01; /*定时器0工作在模式1下(16位计数器)*/TH0=0xf4;TL0=0x48;TR0=1; /*启动定时器*/while(TF0==0);TR0=0;}在用定时器做延时程序时如果懒得计算定时器计数的初始值可以在网上找一个专门用来做延时的小软件。

延时子程序——精选推荐

延时子程序——精选推荐

用C51编写单片机延时函数参考了51单片机Keil C 延时程序的简单研究,自己也亲身测试和计算了一些已有的延时函数。

这里假定单片机是时钟频率为12MHz,则一个机器周期为:1us.参考了51单片机Keil C 延时程序的简单研究后,我们可知道,在Keil C中获得最为准确的延时函数将是void delay(unsigned char t){while(--t);}反汇编代码如下:执行DJNZ指令需要2个机器周期,RET指令同样需要2个机器周期,根据输入t,在不计算调用delay()所需时间的情况下,具体时间延时如下:t Delay Time (us)1 2×1+2 =42 2×2+2=6N 2×N+2=2(N+1)当在main函数中调用delay(1)时,进行反汇编如下:调用delay()时,多执行了两条指令,其中MOV R, #data需要1个机器周期,LJMP需要2个机器周期,即调用delay()需要3us.Keil C仿真截图与计算过程:加上调用时间,准确的计算时间延时与Keil C仿真对比如下:(可见,仿真结果和计算结果是很接近的)t Delay Time (us) 仿真11.0592Mhz时钟(us)1 3+2×1+2 =7 | 7.7(实际) 7.602 3+2×2+2=9 | 9.9 9.76N 3+2×N+2=2N+5 | (2N+5)*1.1/3 11 | 12.1 11.941535 | 38.5 37.981205 | 225.5 222.44255515 | 566.5 558.81也就是说,这个延时函数的精度为2us,最小的时间延时为7us,最大的时间延时为3+255×2+2=515us.实际中使用11.0592MHz的时钟,这个延时函数的精度将为2.2us,最小时间延时为7.7us, 最大时间延时为566.5us.这个时间延时函数,对于与DS18B20进行单总线通信,已经足够准确了。

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

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

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

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

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

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

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

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

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。

单片机延时程序

单片机延时程序

要想随心所欲地编写自己需要的延时程序,你首先必须了解延时程序每行代码的运行次数,再结合具体单片机的机器周期来计算。

比如,传统的MSC-51系列单片机(如89S51、89C2051等),如果晶体为12MHz,那么机器周期为1uS-------------------------------------------程序分析例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)的成立。

HT单片机延时子程序设计

HT单片机延时子程序设计

HT单片机延时子程序设计
(一)概述
延时指的是控制系统中,在触发开关发出开关信号之后,时间处于一定的状态之前,系统处于延时期,这段时间内不进行任何有效的操作。

延时编程是单片机应用程序的常用编程,它可以根据用户的需求在一定时间段内控制系统的动作。

AVR单片机定时器硬件的可编程功能可以满足用户的大多数延时要求,但是有时需要用户自己编写延时程序。

延时子程序的设计,结合ATmega 128单片机定时器的主要寄存器和定时/计数功能,以及定时/计数具体原理,提出了一种延时子程序设计的思路。

1、延时子程序的思路
延时子程序的思路是在确定定时/计数功能的基础上,利用单片机的定时器功能,通过计算预设时间内的CPU循环次数来实现延时操作。

具体步骤如下:
(1)定义延时时间t;
(2)使用定时/计数功能来实现定时/计数;
(3)计算CPU需要循环的次数;
(4)根据CPU循环的次数,写出延时子程序;
(5)通过程序运行来调试延时子程序,实现延时操作。

2、延时子程序的具体设计
延时子程序的设计基于ATmega 128单片机定时器0的特性,主要参考以下指标:
(1)主频:16MHz;。

单片机延时程序分析

单片机延时程序分析

单片机延时程序分析
1.软件延时:
软件延时是最简单的延时方式之一,它通过循环执行一定次数的空操
作来达到延时的效果。

具体操作步骤如下:
-确定单片机的主频,比如一般的单片机主频为12MHz。

软件延时的优点是简单易懂,缺点是延时精度较低,受到单片机主频
和指令执行时间的影响。

2.硬件定时器延时:
硬件定时器延时是利用单片机内部的定时器模块来实现精确的延时操作。

具体操作步骤如下:
-配置定时器的工作模式,一般有定时模式、计数模式等。

选择合适
的模式来满足需求。

-设置定时器的初始值,比如将定时器的初值设置为0。

-开启定时器,并等待定时器溢出。

当定时器的计数值达到最大计数
值时,定时器会溢出,产生中断信号。

-在定时器中断服务程序(ISR)中进行需要延时的操作。

硬件定时器延时的优点是精度高,延时时间准确可控,缺点是配置和
使用相对复杂,占用部分单片机资源。

综上所述,单片机延时程序的实现方法有软件延时和硬件定时器延时
两种常见方式,根据具体的应用需求选择合适的方式。

软件延时简单易懂,
适用于一般的延时需求;硬件定时器延时精度高,可以实现精确控制,适用于一些对时间要求较高的应用场景。

单片机延时子程序

单片机延时子程序

单片机延时子程序单片机延时是指在程序运行过程中,程序须要暂停一段时间,以便执行下一个任务。

延时所耗费的时间必须是可靠的,否则将导致程序运行出错。

单片机延时分为软件延时和硬件延时两种,其中软件延时是指在程序运行过程中使用延时程序实现延时,而硬件延时则是利用定时器等硬件设备来实现延时。

软件延时子程序是指在程序中使用循环语句实现延迟。

程序中使用循环语句,通过循环次数来控制延迟时间,这种延迟实现方法简单易用,但由于循环次数的不同,延迟时间精度也难以保证。

下面介绍一种常用的软件延时子程序,可以实现毫秒级的精度。

软件延时子程序的实现方法软件延时子程序是利用单片机内部的计时器来实现延时,计时器的计数值越大,延时的时间越长。

方法如下:(1)首先,需要定义计时器要计数的时钟周期。

(2)然后,选定一个比较合适的计数次数。

(3)计算出计数器的计数值。

(4)在程序中使用循环语句来实现延时。

;-----------------------------------------;软件延迟程序;入口:X--DelayCnt(需要延时时间);出口:none;-----------------------------------------Delay1ms: mov R2,#13 ;初始化计数值Delay_Loop1: mov R1,#32 ;初始化计数值Delay_Loop2: djnz R1,$ ;32次循环耗费 4.56usdjnz R2,Delay_Loop2djnz R0,Delay_Loop1ret ;延时结束,退出;-----------------------------------------该代码在STC89C52单片机上进行实验,延迟时间为1毫秒,计数值为13。

代码中使用两个循环语句,根据计数值进行循环次数限制,循环次数越多,延时时间越长。

由于不同单片机的晶振频率不同,计算计数值时需要考虑晶振频率。

例如,若晶振频率为11.0592MHz,则计数值应为153。

51单片机各种汇编延时子程序大集合

51单片机各种汇编延时子程序大集合

各种汇编延时程序大集合在论坛上看到不少不错的延时程序,整理如下共同分享:精确延时计算公式:延时时间=[(2*第一层循环+3)*第二层循环+3]*第三层循环+5-------------------------------------------------------------------------------- ;延时5秒左右DELAY5S:PUSH 04HPUSH 05HPUSH 06HMOV R4,#50DELAY5S_0:MOV R5,#200DELAY5S_1:MOV R6,#245DJNZ R6,$DJNZ R5,DELAY5S_1DJNZ R4,DELAY5S_0POP 06HPOP 05HPOP 04HRET--------------------------------------------------------------------------------;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,#100djnz r3,$djnz r2,del1djnz 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;RET--------------------------------------------------------------------------------DELAY_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,DELAY10MSRET--------------------------------------------------------------------------------DELAY_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_MSDELAY_5MS: ;5MSMOV R2,#2;===================================DELAY_MS:CALL DELAY2400DJNZ R2,DELAY_MSRET;===================================DELAY2400: ;10x244+4=2447/1.024=2390MOV R0,#244 ;1DELAY24001:MUL AB ;4MUL AB ;4DJNZ R0,DELAY24001 ;2RET--------------------------------------------------------------------------------DELAY: ;延时子程序(1秒)MOV R0,#0AHDELAY1: MOV R1,#00HDELAY2: MOV R2,#0B2HDJNZ R2,$DJNZ R1,DELAY2DJNZ R0,DELAY1RETMOV R2,#10 ;延时1秒LCALL DELAYMOV R2,#50 ;延时5秒LCALL DELAYDELAY: ;延时子程序PUSH R2PUSH R1PUSH R0DELAY1: MOV R1,#00HDELAY2: MOV R0,#0B2HDJNZ R0,$DJNZ R1,DELAY2 ;延时 100 mSDJNZ R2,DELAY1POP R0POP R1POP R2RET-------------------------------------------------------------------------------- 1:DEL: MOV R7, #200DEL1: MOV R6, #123NOPDEL2: DJNZ R6, DEL2DJNZ R7, DEL1RET是50.001ms 算法是:0.001ms+200*0.001ms+200*0.001ms+200*123*0.002ms+200*0.002ms;(123*2+4)*200+1--------------------------------------------------------------------------------2: DEL: MOV R7, #200DEL1: MOV R6, #123DEL2:NOPDJNZ R6,DEL2DJNZ R7,DEL1RET--------------------------------------------------------------------------------D500MS:PUSH PSWSETB RS0MOV R7,#200D51: MOV R6,#250D52: NOPNOPNOPNOPDJNZ R6,D52DJNZ R7,D51POP PSWRET--------------------------------------------------------------------------------DELAY: ;延时1毫秒PUSH PSWSETB RS0MOV R7,#50D1: MOV R6,#10D2: DJNZ R6,$DJNZ R7,D1POP PSWRET--------------------------------------------------------------------------------ORG 0LJMP MAINORG 000BHLJMP CTC0MAIN: MO。

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

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

例如
在交通灯的控制程序中,需要控制红灯亮的时间持续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。

相关文档
最新文档