新手常用单片机延时程序

合集下载

STC12系列单片机C语言的延时程序

STC12系列单片机C语言的延时程序

STC12系列单片机C语言的延时程序本举例所用CPU 为STC12C5412 系列12 倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。

共有三条延时函数说明如下:函数调用分两级:一级是小于10US 的延时,二级是大于10US 的延时//====================小于10US 的【用1US 级延时】====================//----------微秒级延时---------for(i=X;i>X;i--) 延时时间=(3+5*X)/12 提示(单位us, X 不能大于255)//================大于10US0;Ms--)for(i=26;i>0;i--);}i=[(延时值-1.75)*12/Ms-15]/4 如想延时60US 则i=[(60-1.75)*12/6-15]/4=25.375≈26; 修改i 的值=26,再调用上面的【10US 级延时函数】Delay10us(6); 则就精确延时60US;如果想延时64US 可以用这二种函数组合来用: Delay10us(6); for(i=9;i>X;i--) 共延时64US//============== 对于大于20Ms 的可用中断来实现程序运行比较好===============中断用定时器0, 1Ms 中断:void timer0(void) interrupt 1{ TL0=(0xffff-1000+2)% 0x100;TH0=(0xffff-1000+2)/0x100; //每毫秒执行一次if(DelayMs_1>0) DelayMs_1--;//大于20Ms 延时程序}函数调用void DelayMs(uint a)//延时 a 乘以1(ms)的时间。

{ DelayMs_1=a; while(DelayMs_1);}如果延时50Ms 则函数值为DelayMs(50)tips:感谢大家的阅读,本文由我司收集整编。

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

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

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

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

单片机延时程序

单片机延时程序

实验一单片机延时程序实验一、实验目的与要求:在使用4MH在外部晶体振荡器的PIC16F877A上用软件设计一个20ms的软件延时子程序。

另外,还要求用MPLAB的软件模拟器及其附带的软件工具窗口stopwatch观测延时程序执行的时间。

二、实验内容:1.硬件电路设计:本实验中用的是软件延时,利用循环来实现延时功能。

电路就用了单片机的原本电路。

没有用到其他的功能模块,单片机与ICD3相连接。

2.软件设计思路:单片机软件延时的前提和根底是每条指令的执行时间是固定的,且大局部指令的执行时间是一样的。

这要求对每条指令所花费的指令周期〔Tcy〕做到心中有数。

指令集中5条无条件跳转指令GOTO,CALL.RETURN,RETLW和RETFIE,由于它们必然引起程序跳转,造成流水线中断,因此肯定将占用2个指令周期。

而其他4条有可能引起程序跳转的条件跳转指令DECFSZ,INCFSZ,BTFSC和,BTFSS的执行时间,需要占用2个指令周期,当条件为假不发生跳转时,仅占用1个指令周期。

其余所有指令都只用1个指令周期。

每个指令周期Tcy的时间长度,计算方法:如果采用4MHz 的外部晶体〔fosc=4 MHz〕,那么PIC中档单片机的指令周期Tcy为1us,这是一个整数。

而采用其他频率的外部晶体时,指令周期时间将反比于外部晶体频率。

至于软件延时的构造和实现方法,其实可以采用任何指令和构造,因为只是通过执行指令消耗时间。

但通常情况下有两个选择延时程序构造的原那么:(1)执行指令周期数计算方便。

如果含有太多复杂的条件跳转循环等构造势必会造成指令周期的计算困难,甚至可能造成执行所造成的软件延时时间不等。

(2)不能占用太多的程序空间。

试想用20000个NOP指令来实现20ms的延时,显然是可以的,但是这样做浪费了整整一个页的程序存储器,得不偿失,而通过适当的循环构造,重复执行某些一样的程序是比拟合理的方法。

因此,软件延时程序一般采用以下方法:如果延时时间短〔微妙级别〕,可以连续插入几条NOP指令;如果延时时间长〔几个毫秒级别〕,那么可以使用双嵌套循环的方法来实现。

单片机几个典型延时函数

单片机几个典型延时函数

软件延时:(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,延时0.5秒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--);}下面是用了8.0000MHZ的晶振的几个延时程序(用定时0的工作模式1):(1)延时0.9MSvoid 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)延时4.5msvoid delay_4_5ms(void){TMOD=0x01; /*定时器0工作在模式1下(16位计数器)*/ TH0=0xf4;TL0=0x48;TR0=1; /*启动定时器*/while(TF0==0);TR0=0;}。

Keil C51程序设计中几种精确延时方法

Keil C51程序设计中几种精确延时方法

Keil C51程序设计中几种精确延时方法摘要实际的单片机应用系统开发过程中,由于程序功能的需要,经常编写各种延时程序,延时时间从数微秒到数秒不等,对于许多C51开发者特别是初学者编制非常精确的延时程序有一定难度。

本文从实际应用出发,讨论几种实用的编制精确延时程序和计算程序执行时间的方法,并给出各种方法使用的详细步骤,以便读者能够很好地掌握理解。

关键词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个机器周期)。

在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。

51单片机延时函数

51单片机延时函数

51单片机延时函数在嵌入式系统开发中,51单片机因其易于学习和使用、成本低廉等优点被广泛使用。

在51单片机的程序设计中,延时函数是一个常见的需求。

通过延时函数,我们可以控制程序的执行速度,实现定时器功能,或者在需要的时候进行延时操作。

本文将介绍51单片机中常见的延时函数及其实现方法。

一、使用for循环延时这种方法不精确,但是对于要求不高的场合,可以用来估算延时。

cvoid delay(unsigned int time){unsigned int i,j;for(i=0;i<time;i++)for(j=0;j<1275;j++);}这个延时函数的原理是:在第一个for循环中,我们循环了指定的时间次数(time次),然后在每一次循环中,我们又循环了1275次。

这样,整个函数的执行时间就是time乘以1275,大致上形成了一个延时效果。

但是需要注意的是,这种方法因为硬件和编译器的不同,延时时间会有很大差异,所以只适用于对延时时间要求不精确的场合。

二、使用while循环延时这种方法比使用for循环延时更精确一些,但是同样因为硬件和编译器的不同,延时时间会有差异。

cvoid delay(unsigned int time){unsigned int i;while(time--)for(i=0;i<1275;i++);}这个延时函数的原理是:我们先进入一个while循环,在这个循环中,我们循环指定的时间次数(time次)。

然后在每一次循环中,我们又循环了1275次。

这样,整个函数的执行时间就是time乘以1275,大致上形成了一个延时效果。

但是需要注意的是,这种方法因为硬件和编译器的不同,延时时间会有差异,所以只适用于对延时时间要求不精确的场合。

三、使用定时器0实现精确延时这种方法需要在单片机中开启定时器0,并设置定时器中断。

在中断服务程序中,我们进行相应的操作来实现精确的延时。

这种方法需要使用到单片机的定时器中断功能,相对复杂一些,但是可以实现精确的延时。

51单片机延时程序

51单片机延时程序

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--);
//
void delay(uint t)
{
for (;t>0;t--);
}
1ms延时子程序(12MHZ)
void delay1ms(uint p)//12mhz
{ uchar i,j;
for(i=0;i<p;i++)
{
for(j=0;j<124;j++)
{;}
在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意,C51编写的中断服务程序编译后会自动加上PUSH ACC、PUSH PSW、POP PSW和POP ACC语句,执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。
}
void Delay10us( ) //12mhz
{
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
}
/*****************11us延时函数*************************/

Keil C51精确延时程序(C语言)

Keil C51精确延时程序(C语言)

Keil C51精确延时程序程序说明如下:振荡频率:12MHz机器周期=12/振荡频率=12/12000000=1us#include <reg52.h>void delay1(unsigned char i){ while(--i);}说明:delay1程序为:延时时间=(2*i+2)*机器周期。

i=1~255。

void delay2(unsigned char i){ while(i--);}说明:delay2程序为:延时时间=(6*i+2)*机器周期。

i=1~255。

void main (void){unsigned char m;delay1(10); //赋值并调延时程序delay1说明:本句为赋值并调用Delayus1:延时时间=(1+2)*机器周期。

全部延时时间为:延时时间=(1+2+2*i+2)*机器周期。

i=1~255。

本例:延时时间=(1+2+2*10+2)*1us=25usdelay2(10); //赋值并调延时程序delay2说明:本句为赋值并调用Delayus2:延时时间=(1+2)*机器周期。

全部延时时间为:延时时间=(1+2+6*i+2)*机器周期。

i=1~255。

本例:延时时间=(1+2+6*10+2)*1us=65usm=10; //赋值,m=1~255while(--m) ; //计算,延时时间=2*m*机器周期说明:本两句为赋值并计算。

全部延时时间为:延时时间=(1+2*m)*机器周期。

m=1~255。

本例:延时时间=(1+2*10)*1us=25uswhile(1);}。

51单片机延时程序

51单片机延时程序

51单片机延时程序51单片机延时程序应用单片机的时候,经常会遇到需要短时间延时的情况。

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

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

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

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

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

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

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

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

那么存在r0里的数就是(20-2)/2。

用这种方法,可以非常方便的实现256us 以下时间的延时。

如果需要更长时间,可以使用两层嵌套。

而且精度可以达到2us,一般来说,这已经足够了。

现在,应用更广泛的毫无疑问是Keil的C编译器。

相对汇编来说,C固然有很多优点,比如程序易维护,便于理解,适合大的项目。

但缺点(我觉得这是C的唯一一个缺点了)就是实时性没有保证,无法预测代码执行的指令周期。

因而在实时性要求高的场合,还需要汇编和C的联合应用。

但是是不是这样一个延时程序,也需要用汇编来实现呢?为了找到这个答案,我做了一个实验。

用C语言实现延时程序,首先想到的就是C常用的循环语句。

下面这段代码是我经常在网上看到的:void delay2(unsigned char i){for(; i != 0; i--);到底这段代码能达到多高的精度呢?为了直接衡量这段代码的效果,我把 Keil C 根据这段代码产生的汇编代码找了出来:; FUNCTION _delay2 (BEGIN); SOURCE LINE # 18;---- Variable i assigned to Register R7 ----; SOURCE LINE # 19; SOURCE LINE # 200000 ?C0007:0000 EF MOV A,R70001 6003 JZ ?C00100003 1F DEC R70004 80FA SJMP ?C0007; SOURCE LINE # 210006 ?C0010:0006 22 RET; FUNCTION _delay2 (END)真是不看不知道~~~一看才知道这个延时程序是多么的不准点~~~光看主要的那四条语句,就需要6个机器周期。

8051单片机精确延时程序

8051单片机精确延时程序
{
TM/启动定时器0
ET0=0x00;//禁止定时中断
while(t!=0)//循环次数t
{
TH0=0xFC;
TL0=0x66;//设置计数初值
while(TF0!=1);//查询计数器溢出标志位
TF0=0;//溢出后清零
t--;
}
}
此外,还用excel制作了一个计算计数初值的的小工具,输入晶振和需要延
延时函数
voiddelay(unsignedintt)//延时tms
{
TMOD=0x01;//设置工作模式
TR0=1;//启动定时器0
ET0=0x00;//禁止定时中断
while(t!=0)//循环次数t
{
TH0=0xFC;
TL0=0x66;//设置计数初值
while(TF0!=1);//查询计数器溢出标志位
TF0=0;//溢出后清零
t--;
}
}
此外,还用excel制作了一个计算计数初值的的小工具,输入晶振和需要延
时的最小单位,就自动计算出计算初值,并转换为16进制(用DEC2HEX函
数)
tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!
时的最小单位,就自动计算出计算初值,并转换为16进制(用DEC2HEX函
数)
各种教材都喜欢用for循环再嵌套一个for循环来实现延时,下列是通过定时
器来延时;
delay(t)表示延时tms;
也可以通过定时器中断的方式来延时,但是每次延时的时间非常有限,对于
11.0592MHz的晶振,每次中断延时只有约71ms.
8051单片机精确延时程序
各种教材都喜欢用for循环再嵌套一个for循环来实现延时,下列是通过定

单片机的几种延时函数

单片机的几种延时函数

单片机的几种延时函数摘要实际的单片机应用系统开发过程中,由于程序功能的需要,经常编写各种延时程序,延时时间从数微秒到数秒不等,对于许多C51开发者特别是初学者编制非常精确的延时程序有一定难度。

本文从实际应用出发,讨论几种实用的编制精确延时程序和计算程序执行时间的方法,并给出各种方法使用的详细步骤,以便读者能够很好地掌握理解。

关键词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个机器周期)。

在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。

使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。

单片机C语言延时计算

单片机C语言延时计算

单片机C语言延时计算单片机是一种集成电路芯片,内部集成了微处理器、存储器、输入输出接口等主要部件。

C语言是常用的单片机编程语言,可以通过编写C程序来实现单片机的控制和功能。

在单片机编程中,延时是一种常用的操作,用于控制程序执行过程中的时间间隔。

延时的实现方法有多种,可以使用循环遍历、定时器、外部中断等方式。

在循环遍历的延时方法中,可以通过设定一个循环次数来实现延时。

具体的延时时间与循环的次数成正比关系。

例如,在一个8位单片机中,循环一次大约需要4个机器周期,因此可以通过适当设置循环次数来达到需要的延时时间。

但是,使用循环遍历的延时方法会占用CPU资源,可能会影响其他任务的执行。

另一种常用的延时方法是使用定时器。

单片机内部通常集成了一个或多个定时器,可以通过设置定时器的初值和工作模式来实现精确的延时。

例如,可以通过设置定时器的计数值和工作频率来计算出延时的时间。

在定时器工作期间,单片机可以继续执行其他任务,不会占用过多的CPU资源。

除了循环遍历和定时器方法外,还可以使用外部中断的方式来实现延时。

具体的实现方法是通过外部信号触发中断,并在中断处理程序中实现延时功能。

这种方法可以根据外部信号的频率和工作模式来调整延时时间。

在单片机编程中,为了提高代码的可读性和可重用性,可以将延时操作封装成函数。

例如,可以定义一个名为delay的函数,函数的参数为延时的时间(单位为毫秒),函数内部通过循环遍历、定时器或外部中断的方式实现延时。

延时的时间计算可以考虑单片机的工作频率、机器周期以及延时的时间要求。

单片机的工作频率可以由时钟源来决定,一般可以通过设置分频系数来调整。

机器周期是单片机执行一条指令所需的时间,通过单片机的数据手册可以查到相关的数据。

根据单片机的工作频率和机器周期,可以计算出所需的循环次数或定时器计数值。

在使用延时功能时需要注意延时时间的准确性和可调性。

准确性是指延时的实际时间与预期时间之间的误差,通过调整循环次数或定时器计数值可以实现较高的准确性。

51单片机精确延时源程序

51单片机精确延时源程序
NOP
RET
(2)C语言:
void delay100s(void) //误差 -0.000000016117us
{
unsigned char a,b,c,d;
for(d=114;d>0;d--)
for(c=221;c>0;c--)
for(b=215;b>0;b--)
DJNZ R5,$
DJNZ R6,DL0
III
棋影淘宝店:QQ:149034219
RET
(2)C语言:
void delay1ms(void) //误差 0us
{
unsigned char a,b;
V
棋影淘宝店:QQ:149034219
}
6、延时
100S:
(1)汇编语言:
DELAY100S: ;误差 0us
MOV R4,#1EH
DL2:
MOV R7,#0E7H
DL1:
MOV R6,#0E5H
DL0:
MOV R5,#1EH
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
DJNZ R4,DL2
MOV R5,#02H
DJNZ R5,$
RET
(2)C语言:
void delay100s(void) //误差 0us
{
unsigned char a,b,c,d,n;
for(b=199;b>0;b--)
for(a=1;a>0;a--);
}
2、延时
10MS:
(1)汇编语言:
DELAY10MS: ;误差 0us

单片机延时子程序

单片机延时子程序

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

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

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

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

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

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

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

方法如下:(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。

单片机delay函数用法

单片机delay函数用法

单片机delay函数用法单片机(delay)函数是单片机中最基础、最常用的函数之一。

在单片机编程中,Delay函数可以实现延时功能,在控制单元完成一定的操作时,需要一定的时间才能完成下一步操作,Delay函数可以用来延迟程序执行的时间。

Delay函数的使用方法Delay函数的使用方法很简单,只需要在程序中调用就可以实现延时。

下面简单介绍一下Delay函数的使用方法。

1. 通过循环计数实现Delay函数使用循环计数实现Delay函数的方法是最常用的方法。

例如,当我们需要让程序延迟2秒钟时,我们可以在程序中加入以下代码:void delay(unsigned int i){while(i--);}其中,Delay函数的参数i表示延时的时间,单位为毫秒(ms)。

使用Delay函数时,需要将延时时间转换为循环计数的次数。

2. 使用定时器实现Delay函数除了使用循环计数实现Delay函数之外,我们还可以利用单片机中的定时器来实现Delay函数。

通过定时器,我们可以实现更精确的延时时间,而且可以并行运行其他程序。

例如,要实现2秒钟的延时,可以使用以下代码://初始化定时器void Timer_Init(){TCON &= 0xFC; //定时器T0不使用溢出中断TMOD &= 0xF0; //选择为模式1,仅用TR0打开启动。

TH0 = 0xB1; //给定时器赋初值,定时1msTL0 = 0xE0;TR0 = 1; //打开定时器}//Delay函数void Delay(unsigned int i){while(i--){while(!TF0); //等待定时器溢出中断TF0 = 0; //清除溢出标志位TH0 = 0xB1; //给定时器赋初值,定时1msTL0 = 0xE0;}}在使用定时器实现Delay函数时,需要先对定时器进行初始化。

在上面的代码中,使用了定时器T0,设置了定时器的工作模式为模式1,即16位自动重载计数器,在每次计数完成后,自动重新从初值重新计数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
_NOP_( );
_NOP_( );
}
/*****************11us延时函数*************************/
//
void delay(uint t)
{
for (;t0;t--);
}
1ms延时子程序(12MHZ)
void delay1ms(uint p)//12mhz
DELAY:CLR EX0
MOV TMOD,#01H ;设置定时器的工作方式为方式1
MOV TL0,#0B0H ;给定时器设置计数初始值
MOV TH0,#3CH
SETB TR0;开启定时器
HERE:JBC TF0,NEXT1
SJMP HERE
NEXT1:MOV TL0,#0B0H
MOVTH0,#3CH
DJNZ R7,HERE
CLR TR0;定时器要软件清零
SETB EX0
RET
C语言延时程序:
void delay_18B20(unsigned inti)
{
while(i--);
}
void Delay10us( )//12mhz
{
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
延时则应该注意晶振的频率是多大。
软件延时:(asm)
晶振12MHZ,延时1秒
程序如下:
DELAY:MOV 72H,#100
LOOP3:MOV 71H,#100
LOOP1:MOV 70H,#47
LOOP0JNZ 70H,LOOP0
NOP
DJNZ 71H,LOOP1
MOV 70H,#46
LOOP2JNZ 70H,LOOP2
NOP
DJNZ 72H,LOOP3
MOV 70H,#48
LOOP4JNZ 70H,LOOP4
定时器延时:
晶振12MHZ,延时1s,定时器0工作方式为方式1
DELAY1:MOV R7,#0AH ;;晶振12MHZ,延时0.5秒
AJMP DELAY
DELAY2:MOV R7,#14H ;;晶振12MHZ,延时1秒
新手常用单片机延时程序
单片机延时程序(适合初学者)
下面几个是单片机的延时程序(包括asm和C程序,都是我在学单片机的过
程中用到的),在单片机延时程序中应考虑所使用的晶振的频率,在51系列的单
片机中我们常用的是11.0592MHz和12.0000MHz的晶振,而在AVR单片机上
常用的有8.000MHz和4.000MH的晶振所以在网上查找程序时r(i=0;i
{
for(j=0;j124;j++)
{;}
}
}
函数功能:延时20ms的子程序tips:感谢大家的阅读,本文由我司收集整编。
仅供参阅!
相关文档
最新文档