51 单片机 定时器 延时1s函数

合集下载

延时1us程序12mhz晶振c语言,51单片机KeilC延时程序的简单(晶振12MHz,一。。。

延时1us程序12mhz晶振c语言,51单片机KeilC延时程序的简单(晶振12MHz,一。。。

延时1us程序12mhz晶振c语⾔,51单⽚机KeilC延时程序的简单(晶振12MHz,⼀。

⼀. 500ms延时⼦程序void delay500ms(void){unsignedchari,j,k;for(i=15;i>0;i--)for(j=202;j>0;j--)for(k=81;k>0;k--);}产⽣的汇编:C:0x0800 7F0F MOV R7,#0x0FC:0x0802 7ECA MOV R6,#0xCAC:0x0804 7D51 MOV R5,#0x51C:0x0806 DDFE DJNZ R5,C:0806C:0x0808 DEFA DJNZ R6,C:0804C:0x080A DFF6 DJNZ R7,C:0802C:0x080C 22 RET计算分析:程序共有三层循环⼀层循环n:R5*2 = 81*2 = 162us DJNZ 2us⼆层循环m:R6*(n+3) = 202*165 = 33330us DJNZ 2us + R5赋值1us = 3us三层循环: R7*(m+3) = 15*33333 = 499995us DJNZ 2us + R6赋值1us = 3us循环外: 5us⼦程序调⽤2us +⼦程序返回2us + R7赋值1us = 5us延时总时间=三层循环+循环外= 499995+5 = 500000us =500ms计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5⼆. 200ms延时⼦程序void delay200ms(void){unsignedchari,j,k;for(i=5;i>0;i--)for(j=132;j>0;j--)for(k=150;k>0;k--);}产⽣的汇编C:0x0800 7F05 MOV R7,#0x05C:0x0802 7E84 MOV R6,#0x84C:0x080C 22 RET三. 10ms延时⼦程序void delay10ms(void){unsignedchari,j,k;for(i=5;i>0;i--)for(j=4;j>0;j--)for(k=248;k>0;k--);}产⽣的汇编C:0x0800 7F05 MOV R7,#0x05C:0x0802 7E04 MOV R6,#0x04C:0x0804 7DF8 MOV R5,#0xF8C:0x0806 DDFE DJNZ R5,C:0806C:0x0808 DEFA DJNZ R6,C:0804C:0x080A DFF6 DJNZ R7,C:0802C:0x080C 22 RET四. 1s延时⼦程序void delay1s(void){unsignedcharh,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--); }对1s延时的验证:1.设置仿真的晶振为12MHz2.在延时函数设置断点3.单步运⾏程序,到达延时函数的⼊⼝4.先记下进⼊延时函数的时间5.step out跳出函数,记下此时时间,两个时间相减即为延时函数运⾏时间函数运⾏时间=1.00041400-0.00041600≈1s产⽣的汇编C:0x0808 DCFE DJNZ R4,C:0808C:0x080A DDFA DJNZ R5,C:0806C:0x080C DEF6 DJNZ R6,C:0804C:0x080E DFF2 DJNZ R7,C:0802C:0x0810 22 RET在精确延时的计算当中,最容易让⼈忽略的是计算循环外的那部分延时,在对时间要求不⾼的场合,这部分对程序不会造成影响. void mDelay(unsigned int Delay) //Delay = 1000 时间为1S{unsignedinti;for(;Delay>0;Delay--){for(i=0;i<124;i ){;}}}void waitms(inti){charm;for( ; i ;i--){for(m = 203; m ; m--){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}}}延时1ms的函数时钟频率12MHzunsigned intsleepTime;unsingedchar inSleep = 0;void sleepService(void)}void isr_timer(void) //假定定时器中断1ms 中断⼀次。

单片机延时一秒

单片机延时一秒
DELAY:MOV R4,#10 ;延时子程序,12M 晶振延时1.002秒 L3: MOV R2 ,#200 L1: MOV R3 ,#249 L2: DJNZ R3 ,L2 DJNZ R2 ,L1 DJNZ R4 ,L3 RET 计算方法如下: [(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 参考文章: 延时子程序的延时计算问题
DELAY1MS: ;误差 0us MOV R7,#01H
DL1: MOV R6,#8EH
DL0: MOV R5,#02H DJNZ R5,$ DJNZ R6,DL0
DJNZ R7,DL1 RET 补充: 上一个是晶振12的 这个是11.0592的 DELAY1MS: ;误差 -0.651041666667us MOV R6,#66H DL0: MOV R5,#03H DJNZ R5,$ DJNZ R6,DL0 RET 追问: MOV 30H #8 D1:MOV 31H #250 D2:MOV 32H #250 D3:DJNZ 32H D3 DJNZ 31H D2 DJNZ 30H D1 我这样写对吗? 回答: 这么写 具体延时多少 可以用软件设置断点的方法 验证
BL2: CALL DEX1 CPL BEEP DJNZ R6,BL2 MOV R5,#15 CALL DELAY_BL RET DEX1:
MOV R7,#90 DE2: NOP DJNZ R7,DE2 RET ;------------------------------------------- DELAY_BL:

51单片机汇编延时程序算法详解

51单片机汇编延时程序算法详解

51 单片机汇编延时程序算法详解
51 单片机汇编延时程序算法详解
将以12MHZ 晶振为例,详细讲解MCS-51 单片机中汇编程序延时的精确
算法。

指令周期、机器周期与时钟周期
指令周期:CPU 执行一条指令所需要的时间称为指令周期,它是以机器周期为单位的,指令不同,所需的机器周期也不同。

时钟周期:也称为振荡周期,一个时钟周期=晶振的倒数。

MCS-51 单片机的一个机器周期=6 个状态周期=12 个时钟周期。

MCS-51 单片机的指令有单字节、双字节和三字节的,它们的指令周期不
尽相同,一个单周期指令包含一个机器周期,即12 个时钟周期,所以一条单周期指令被执行所占时间为12*(1/12000000)=1&mu;s。

扩展阅读:单片机有
哪些延时方法详细介绍
程序分析
例1 50ms 延时子程序:。

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,并设置定时器中断。

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

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

单片机C51延时时间怎样计算

单片机C51延时时间怎样计算

C程序中可‎使用不同类‎型的变量来‎进行延时设‎计。

经实验测试‎,使用uns‎i gned‎ char类‎型具有比u‎n sign‎e d int更优‎化的代码,在使用时应‎该使用un‎si gne‎d char作‎为延时变量‎。

以某晶振为‎12MHz‎的单片机为‎例,晶振为12‎MH z即一‎个机器周期‎为1us。

一. 500ms‎延时子程序‎程序:void delay‎500ms‎(void){unsig‎n ed char i,j,k;for(i=15;i>0;i--)for(j=202;j>0;j--)for(k=81;k>0;k--);}计算分析:程序共有三‎层循环一层循环n‎:R5*2 = 81*2 = 162us‎DJNZ 2us二层循环m‎:R6*(n+3) = 202*165 = 33330‎u s DJNZ 2us + R5赋值1us = 3us三层循环: R7*(m+3) = 15*33333‎= 49999‎5us DJNZ 2us + R6赋值1us = 3us循环外: 5us 子程序调用‎ 2us + 子程序返回‎ 2us + R7赋值1us = 5us延时总时间‎ =三层循环+ 循环外= 49999‎5+5 = 50000‎0us =500ms‎计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5二. 200ms‎延时子程序‎程序:void delay‎200ms‎(void){unsig‎n ed char i,j,k;for(i=5;i>0;i--)for(j=132;j>0;j--)for(k=150;k>0;k--); }三. 10ms延‎时子程序程序:void delay‎10ms(void){unsig‎n ed char i,j,k;for(i=5;i>0;i--)for(j=4;j>0;j--)for(k=248;k>0;k--); }四. 1s延时子‎程序程序:void delay‎1s(void){unsig‎n ed 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--);}参考链接:http://www.picav‎/news/2010-04/2106.htm摘要实际的单片‎机应用系统‎开发过程中‎,由于程序功‎能的需要,经常编写各‎种延时程序‎,延时时间从‎数微秒到数‎秒不等,对于许多C‎51开发者‎特别是初学‎者编制非常‎精确的延时‎程序有一定‎难度。

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延时函数*************************/

51单片机延时函数

51单片机延时函数

51单片机延时函数
151单片机延时函数
51单片机是一种常用的微控制器,它可以实现一系列功能,如定时器,定时器中断等。

随着科技的发展,许多人需要使用单片机来实现特定功能,而51单片机是最受欢迎的也是最知名的。

本文旨在介绍51单片机延时函数的实现方法。

1.1时钟
任何有效的51单片机使用的延时函数都受时钟的控制。

由于50单片机本身的频率有限,为了让计算机更有效地运行,我们需要精确设置时钟频率。

由于时钟频率的不同,51单片机的延时函数也有所不同。

1.2延时函数的实现
51单片机的延时函数是用来延迟任务的一种方法。

延时函数可以延迟任务的执行,并且可以按照用户设定的起点和终点执行任务。

51单片机使用指令延时来实现延时函数。

指令延时就是指通过控制51单片机内部时钟,来让程序暂停一段指定时间。

这样,我们就可以实现受时钟控制的延时函数。

1.3延时函数的实际应用
51单片机的延时函数可以用来实现许多不同的功能,如断电保护,延时启动,定时控制等。

由于这些函数可以精确控制任务的执
行,可以适应复杂的工作环境。

同时,51单片机还可以实现节能,使系统能够更加稳定可靠。

2结论
51单片机延时函数是51单片机应用中最基础的功能之一。

该函数可以满足不同用户的需求,帮助产品在实际应用中更好地发挥作用,同时还可以实现节能。

51单片机c语言延时

51单片机c语言延时

1,_nop_() 适用于us级的少量延时标准的C语言中没有空语句。

但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果。

这在汇编语言中很容易实现,写几个nop就行了。

在keil C51中,直接调用库函数:#include<intrins.h> //声明了void _nop_(void);_nop_(); //产生一条NOP指令作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒。

NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。

2,一般延时大于10us一,定义的C51中循环变量,尽量采用无符号字符型变量。

二,在FOR循环语句中,尽量采用变量减减来做循环。

三,在do…while,while语句中,循环体内变量也采用减减方法这因为在C51编译器中,对不同的循环方法,采用不同的指令来完成的例:unsigned char i;for(i=255;i>0;i--);用keil C51编译后MOV09H,#0FFHLOOP:DJNZ09H,LOOP指令相当简洁,也很好计算精确的延时时间。

3,延时更长,达到MS级,这时需要嵌套循环循环嵌套的方法常用于达到ms级的延时。

对于循环语句同样可以采用for,do…while,while结构来完成,每个循环体内的变量仍然采用无符号字符变量。

例:unsigned char i,jfor(i=255;i>0;i--)for(j=255;j>0;j--);或unsigned char i,ji=255;do{j=255;do{j--}while(j);i--;}while(i);或unsigned char i,ji=255;while(i){j=255;while(j){j--};i--;}下面给出有关在C51中延时子程序设计时要注意的问题(一些经验之谈)1、在C51中进行精确的延时子程序设计时,尽量不要或少在延时子程序中定义局部变量,所有的延时子程序中变量通过有参函数传递。

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个机器周期。

51单片机延时函数

51单片机延时函数

C程序中可使用不同类型的变量来进行延时设计。

经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。

以某晶振为12MHz 的单片机为例,晶振为12MHz即一个机器周期为1us。

一. 500ms延时子程序程序: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--);}计算分析:程序共有三层循环一层循环n:R5*2 = 81*2 = 162us DJNZ 2us二层循环m:R6*(n+3) = 202*165 = 33330us DJNZ2us + R5赋值 1us = 3us三层循环: R7*(m+3) = 15*33333 = 499995us DJNZ 2us + R6赋值1us = 3us循环外: 5us子程序调用2us + 子程序返回 2us + R7赋值 1us = 5us延时总时间= 三层循环+ 循环外= 499995+5 = 500000us =500ms计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5二. 200ms延时子程序程序:{unsigned char i,j,k;for(i=5;i>0;i--)for(j=132;j>0;j --)for(k=150;k>0;k --);}三. 10ms延时子程序程序:{unsigned char i,j,k;for(i=5;i>0;i--)for(j=4;j>0;j--)for(k=248;k>0;k --);}四. 1s延时子程序程序: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 --);}关于单片机C语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而本函数克服了以上缺点,能够精确计数出要延时值且精确达到1us,本举例所用CPU为STC12C5412系列12倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。

单片机延时子程序

单片机延时子程序

单片机延时子程序下面几个是单片机的延时程序(包括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;}在用定时器做延时程序时如果懒得计算定时器计数的初始值可以在网上找一个专门用来做延时的小软件。

51单片机软件延时分析和计算

51单片机软件延时分析和计算

51单片机软件延时分析朱铮南一、单片机的时钟周期和机器周期时钟周期也叫做振荡周期,是指为单片机提供时钟信号的振荡源的频率的倒数。

CPU可以完成一个独立的操作的最短时段叫做机器周期。

89C51等老一代单片机将振荡频率12分频后作为机器频率,所以机器周期是12个时钟周期的长度。

一般振荡频率为11.0592MHz,机器周期是1.085μs。

现在的高速单片机如STC15系列,工作在1T模式,即振荡频率不再分频,机器周期等于时钟周期。

振荡频率在从11.0592MHz 到33.1776MHz的范围内可以选择,如果振荡频率为30MHz,它的机器周期即为0.03333μs。

二、指令占用的机器周期每条指令执行时所要占用的机器周期不同,下面列出的是软件延时代码中经常用到的指令及这些指令占用的机器周期:软件延时就是利用循环来占用机器周期,达到延时的目的。

三、几种循环结构的比较为了比较几种循环结构,特意用C语言编写了以下几段主函数和延时子函数,在uVisi on2里建造可执行文件以后,点击菜单“调试”里的“开始/停止调试”,再点击“反汇编窗口”工具,就可以看由C语言编译成的汇编语言代码。

1. 第一种的延时子函数用的是do循环和--i结构,最外层有一层x循环,以便调用时可以指定延时时间的整倍数。

左边是C语言代码,右边是反汇编窗口显示的汇编代码截图。

汇编代码里红色的是对应的C语言语句,黑色的才是汇编代码,只有8行。

底下的两行是主函数,一行是实参赋值,另一行是对子函数的调用。

上面的6行是延时子函数,分别是两行赋值,三行寄存器减1非0跳转,最后一行是返回。

void delay(unsigned char x){unsigned char i, j;do{i = 2;j = 240;do{while (--j);} while (--i);}while(--x);}void main(){delay(1);}2. 第二种和第一种循环结构相同,仅将“--j”、“--i”变成了“j--”、“i--”。

51单片机精确延时程序大集合

51单片机精确延时程序大集合

51单片机精确延时程序大集合51单片机精确延时程序大集合以下程序说是精确延时,实际上都不对。

调用一次差个几微秒、几百微秒,一天下来差好几分钟。

加我的QQ群有精确版本哦,不同频率的晶振都适用。

群:383977592008-04-24 12:10:26,在论坛上看到不少不错的延时程序,整理如下共同分享:精确延时计算公式:延时时间=[(2*第一层循环+3)*第二层循环+3]*第三层循环+5;延时5秒左右DELAY5S:PUSH 04H;2个机器周期PUSH 05H;2个机器周期PUSH 06H;2个机器周期MOV R4,#50;1个机器周期DELAY5S_0:MOV R5,#200;1个机器周期DELAY5S_1:MOV R6,#245;1个机器周期DJNZ R6,$;2×245=490个机器周期DJNZ R5,DELAY5S_1;这条2个机器周期,这层循环包含R5×(490+1)+2×R5=98600个机器周期DJNZ R4,DELAY5S_0;这条2个机器周期,这层循环包含R4×(98600+1)+2×R4=4930150个机器周期POP 06H;2个机器周期POP 05H;2个机器周期POP 04H;2个机器周期RET;2个机器周期;(共2+2+2+1+4930150+2+2+2+2=4930165个机器周期);513微秒延时程序DELAY: MOV R2,#0FEH;1个机器周期JUZINAIYOU: DJNZ R2,JUZINAIYOU;2×R21即2×245RET;2个机器周期;(实际上是493个机器周期);10毫秒延时程序DL10MS: MOV R3,#14HDL10MS1:LCALL DELAYDJNZ R3,DL10MS1RET;(缺DELAY);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+5 DEL : MOV R5,#08HDEL1: MOV R6,#0FFHDEL2: MOV R7,#0FFHDJNZ R7,$DJNZ R6,DEL2DJNZ R5,DEL1RET;1秒延时子程序是以12MHz晶振DELAY: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秒=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: ;500MSMOV 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=2390 MOV R0,#244 ;1 DELAY24001:MUL AB ;4MUL AB ;4DJNZ R0,DELAY24001 ;2RETDELAY: ;延时子程序(1秒)MOV R0,#0AHDELAY1: MOV R1,#00HJUZINAIYOU: MOV R2,#0B2HDJNZ R2,$DJNZ R1,JUZINAIYOUDJNZ R0,DELAY1RETMOV R2,#10 ;延时1秒LCALL DELAYMOV R2,#50 ;延时5秒LCALL DELAYDELAY: ;延时子程序PUSH R2PUSH R1PUSH R0DELAY1: MOV R1,#00HJUZINAIYOU: MOV R0,#0B2HDJNZ R0,$DJNZ R1,JUZINAIYOU ;延时 100 mSDJNZ R2,DELAY1POP R0POP R1POP R2RET1: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+2 00*0.002ms ;(123*2+4)*200+12: DEL: MOV R7, #200 DEL1: MOV R6, #123 DEL2:NOPDJNZ R6,DEL2DJNZ R7,DEL1RETD500MS:PUSH PSWSETB RS0MOV R7,#200D51: MOV R6,#250D52: NOPNOPNOPNOPDJNZ R6,D52DJNZ R7,D51POP PSWRETDELAY: ;延时1毫秒PUSH PSW SETB RS0MOV R7,#50D1: MOV R6,#10D2: DJNZ R6,$DJNZ R7,D1POP PSWRETORG 0LJMP MAINORG 000BHLJMP CTC0MAIN: MOV SP, #50HCLR EAMOV TMOD, #01HMOV TH0,#3CHMOV TL0,#0B0HMOV R4, #10SETB ET0SETB EASETB TR0SJMP $ ;CTC0: MOV TH0, #3CHMOV TL0, #0B0HDJNZ R4, LPCPL P1.0MOV R4, #10LP: RETIEND; 定时器中断延时TMOD=0x01; /*定时器0工作在模式1下(16位计数器)*/TH0=0xfd;TL0=0x83;TR0=1; /*启动定时器*/TF0==0;TR0=0;等待中断;100ms定时,11.0592晶振他定时准确啊又不影响程序运行2008-06-10 13:50:46 来源:来于网络,服务大家作者:未知【大中小】点击:9 次下面几个是单片机的延时程序(包括asm和C程序,都是我在学单片机的过程中用到的),在单片机延时程序中应考虑所使用的晶振的频率,在51系列的单片机中我们常用的是11.0592MHz和12.0000MHz的晶振,而在AVR单片机上常用的有8.000MHz和4.000MH的晶振所以在网上查找程序时如果涉及到精确延时则应该注意晶振的频率是多大。

51单片机延时模块程序

51单片机延时模块程序

51单片机独立模块一、延时模块1、for循环延时void delayms(UINT8 ms){UINT8 x,y;for(x=ms;x>0;x--)for(y=112;y>0;y--);}2、while循环延时void delayms(UINT8 ms){UINT8 x;while(ms--)for(x=112;x>0;x--);}3、精确的单片机常用延时函数:(c代码误差0us 12M)(1)、延时0.5msvoid delay0.5ms(void) //误差 0us{unsigned char a,b;for(b=71;b>0;b--)for(a=2;a>0;a--);}(2)、延时1msvoid delay1ms(void) //误差 0us{unsigned char a,b,c;for(c=1;c>0;c--)for(b=142;b>0;b--)for(a=2;a>0;a--);}(3)、延时2msvoid delay2ms(void) //误差 0us{unsigned char a,b;for(b=4;b>0;b--)for(a=248;a>0;a--);_nop_; //if Keil,require use intrins.h}(4)、延时3msvoid delay3ms(void) //误差 0us{unsigned char a,b;for(b=111;b>0;b--)for(a=12;a>0;a--);}(5)、延时4msvoid delay4ms(void) //误差 0us{unsigned char a,b,c;for(c=7;c>0;c--)for(b=8;b>0;b--)for(a=34;a>0;a--);}(6)、延时5msvoid delay5ms(void) //误差 0us{unsigned char a,b;for(b=19;b>0;b--)for(a=130;a>0;a--);}(7)、延时10msvoid delay10ms(void) //误差 0us{unsigned char a,b,c; for(c=1;c>0;c--) for(b=38;b>0;b--)for(a=130;a>0;a--);}(8)、延时15msvoid delay15ms(void) //误差 0us{unsigned char a,b,c;for(c=1;c>0;c--)for(b=238;b>0;b--)for(a=30;a>0;a--);}(9)、延时20msvoid delay20ms(void) //误差 0us{unsigned char a,b;for(b=215;b>0;b--)for(a=45;a>0;a--);_nop_; //if Keil,require use intrins.h_nop_; //if Keil,require use intrins.h}(10)、延时50msvoid delay50ms(void) //误差 0us{unsigned char a,b;for(b=173;b>0;b--)for(a=143;a>0;a--);}(11)、延时100msvoid delay100ms(void) //误差 0us{unsigned char a,b,c;for(c=19;c>0;c--)for(b=20;b>0;b--)for(a=130;a>0;a--);}(12)、延时200msvoid delay200ms(void) //误差 0us{unsigned char a,b,c;for(c=4;c>0;c--)for(b=116;b>0;b--)for(a=214;a>0;a--);_nop_; //if Keil,require use intrins.h }(13)、延时500msvoid delay500ms(void) //误差 0us{unsigned char a,b,c;for(c=23;c>0;c--)for(b=152;b>0;b--)for(a=70;a>0;a--);}(14)、延时1000msvoid delay(void) //误差 0us{unsigned char a,b,c;for(c=167;c>0;c--)for(b=171;b>0;b--)for(a=16;a>0;a--);_nop_; //if Keil,require use intrins.h}。

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

51 单片机定时器延时1s函数1.引言1.1 概述本文介绍了51单片机中的定时器功能以及如何通过定时器实现延时1秒的函数。

在单片机应用中,定时器是一种非常重要且常用的功能模块之一。

它能够精确计时,并可用于实现周期性的任务触发、计时、脉冲输出等功能。

本文首先将对51单片机进行简要介绍,包括其基本概念、结构和特点。

随后,重点讲解了定时器的基本原理和功能。

定时器通常由一个计数器和一组控制寄存器组成,通过预设计数器的初值和控制寄存器的配置来实现不同的计时功能。

接着,本文详细介绍了如何通过编程实现一个延时1秒的函数。

延时函数是单片机开发中常用的功能,通过定时器的计时功能可以实现精确的延时控制。

本文将以C语言为例,介绍延时函数的编写步骤和原理,并给出示例代码和详细的说明。

最后,本文对所述内容进行了总结,并展望了定时器在单片机应用中的广泛应用前景。

通过学习定时器的相关知识和掌握延时函数的编写方法,我们可以更好地应用定时器功能,提高单片机应用的效率和精确性。

综上所述,通过本文的学习,读者可全面了解51单片机中定时器的功能和应用,并能够掌握延时函数的编写方法,为单片机应用开发提供一定的参考和指导。

1.2 文章结构本文以51单片机定时器功能为主题,旨在介绍如何使用定时器进行延时操作。

文章分为引言、正文和结论三个主要部分。

在引言部分,首先会对文章的背景进行概述,介绍单片机的基本概念和应用领域。

然后,给出本文的整体结构,并阐述文章的目的和意义。

正文部分将分为两个小节。

在2.1节中,将对单片机进行详细介绍,包括其构造与工作原理。

这部分的内容将帮助读者全面了解单片机的基本知识,为后续的定时器功能介绍打下基础。

2.2节将重点介绍定时器的功能和特点。

这部分将涵盖定时器的基本原理、工作模式以及在实际应用中的使用方法。

同时,还将详细讲解如何使用定时器进行1秒钟的延时操作,包括具体的代码实现和注意事项。

结论部分将对全文进行总结,并强调定时器的重要性和应用前景。

3.1节将简要概括本文的主要内容和关键点,同时提供对读者进一步深入学习的建议。

3.2节将探讨定时器在不同领域的应用前景,如自动化控制、物联网等,展示定时器在技术发展中的重要作用。

通过以上的文章结构,读者将逐步了解51单片机的基本知识、定时器的功能和使用方法,以及定时器在不同领域的应用前景。

希望本文能够帮助读者掌握定时器的使用技巧,为他们在项目开发和学习中提供一定的参考价值。

1.3 目的目的部分的内容可以是关于写这篇文章的目的和意义的解释和阐述。

下面是一个可能的内容:目的:本文的目的是通过介绍51单片机的定时器功能以及延时1秒的函数,帮助读者更好地理解单片机的基本原理和功能。

通过对定时器的详细介绍,读者能够了解到定时器在单片机中的重要作用,以及如何利用定时器来实现延时效果。

本文将提供相关的原理讲解、实例演示和代码实现,希望读者能够通过阅读本文,掌握51单片机的定时器功能以及如何编写延时1秒的函数。

通过了解和掌握单片机的定时器功能,读者可以在自己的项目中灵活应用定时器来实现各种功能。

无论是控制某个操作的时间间隔,还是实现对外部设备的时序控制,定时器都扮演着至关重要的角色。

因此,了解并熟练使用定时器功能对于单片机的开发和应用都具有重要的意义。

此外,掌握延时函数的编写也是十分重要的。

在实际开发过程中,我们经常需要控制两个动作之间的时间间隔,或者添加一定的延时以等待某个特定事件的发生。

编写延时1秒的函数不仅可以实现这些需求,还可以提高代码的可读性和可维护性。

通过本文的阅读,读者可以深入了解51单片机的定时器功能以及编写延时1秒的函数的基本原理和方法,为自己的单片机开发和应用打下坚实的基础。

另外,本文的知识也可以作为进一步学习其他单片机的定时器功能和时间控制的基础,有助于读者在未来的学习和实践中有更好的应用和创新。

2.正文2.1 单片机介绍单片机(Microcontroller,简称MCU)是一种集成电路芯片,它包含了处理器核心、存储器和各种外设接口,并且具备自主工作的能力。

作为一种集成度非常高的微型计算机系统,单片机广泛应用于嵌入式系统、电子设备和工业控制领域。

单片机的核心是一个微处理器,它可以执行各种计算和逻辑操作。

这些微处理器通常是使用精简指令集(RISC)架构设计的,这意味着它们具有相对较少的指令,并且执行速度较快。

单片机的存储器包括程序存储器(ROM)和数据存储器(RAM),它们用于存储程序代码和变量数据。

单片机具备的外设接口使得它可以与各种外部设备进行通信和控制。

这些外设接口可以是通用输入输出(GPIO)、串口通信、模拟到数字转换器(ADC)等。

通过这些接口,单片机可以连接和控制传感器、执行器、显示屏等外部设备,并且根据需要进行数据采集、处理、存储和输出。

在嵌入式系统中,单片机的功耗较低,体积较小,且成本相对较低。

这使得它成为许多电子设备的首选芯片。

无论是家用电器、汽车电子、智能家居,还是医疗设备、工业自动化等领域,单片机都发挥着重要的作用。

在本文中,我们将重点介绍51单片机。

51单片机是一种流行且广泛使用的8位单片机家族,它由英特尔公司在20世纪80年代初推出。

它的特点是简单易用、稳定可靠,并且具备广泛的软硬件支持。

由于51单片机的广泛应用和大量用户基础,它成为学习和开发嵌入式系统的理想选择。

总之,单片机是一种强大且多功能的微型计算机系统,它包含了处理器核心、存储器和各种外设接口。

51单片机作为其中的一种代表,具有广泛的应用前景和大量的用户基础。

在接下来的内容中,我们将深入探讨51单片机的定时器功能。

2.2 定时器功能介绍定时器是单片机中常见的一个功能模块,它能提供精确的计时和延时功能。

在51单片机中,定时器主要由一个或多个计数器组成,可根据需要配置不同的工作模式和计数范围,以适应各种应用场景。

2.2.1 定时器的工作原理定时器通过对计数器进行定时的计数操作来实现定时和延时功能。

在定时器的工作中,计数器的计数值会不断增加,当计数器的值达到设定的上限时,定时器将会触发相应的中断或输出信号。

这个上限值可以是定值,也可以是由程序动态设定的。

2.2.2 定时器的工作模式51单片机中的定时器可以在不同的工作模式下工作,常见的工作模式有定时模式和计数模式。

定时模式:定时模式下,定时器会按照预设的时间间隔进行计数,当计数值达到设定的上限时,定时器会触发中断或输出信号。

这种模式适用于需要定时操作的场景,如定时采样、定时发送信号等。

计数模式:计数模式下,定时器可以根据外部事件的触发进行计数操作,比如计算外部信号的脉冲个数等。

这种模式可以广泛应用于测量、计数等方面。

2.2.3 定时器的配置与使用在使用定时器前,我们需要对定时器进行配置,包括选择工作模式、设定计数范围、初始化计数器等。

具体的配置和使用方法可以根据不同的单片机型号和开发环境进行参考。

在51单片机中,定时器的配置主要通过相应的寄存器进行设置。

例如,TMOD寄存器用于设置定时器的工作模式,可以通过设置相应的位来选择不同的计数模式和定时模式;THx和TLx寄存器用于设置计数器的初始值和上限值。

使用定时器时,我们可以在程序中调用相应的定时器中断服务函数来实现定时器的功能。

通过设定合适的计数值和工作模式,我们可以实现延时、定时中断等相关操作。

2.2.4 定时器的应用场景定时器是单片机中常用的一个功能模块,它在各种应用场景中都有广泛的应用。

定时器常用于控制系统中需要按照一定时间间隔进行操作的场景,如周期性任务的执行、定时测量和定时控制等。

例如,定时器可以用于周期性检测传感器数据、定时采样模拟信号、定时发送数据等。

此外,定时器还可以用于测量脉冲个数、实现频率测量等计数应用。

比如,可以通过计数器来测量高速旋转物体的转速,或者测量信号的脉宽和周期。

总之,定时器作为单片机中重要的功能模块之一,具有精确的计时和延时功能,为各种应用场景提供了便利。

掌握并熟练使用定时器功能,对于提高单片机系统的实时性和精确性具有重要意义。

3.结论3.1 总结总结部分的内容应该包括对整篇文章所述内容的回顾和概括。

以下是一个可能的总结内容示例:在本文中,我们对51单片机的定时器功能进行了介绍和讨论。

首先,我们从单片机的基本概念开始,简要介绍了51单片机的特点和应用领域。

随后,我们着重介绍了定时器在单片机中的重要性和作用,详细解释了定时器的各种功能和工作原理。

通过本文的学习,我们了解到定时器在单片机中的广泛应用,如计时、延时等。

我们学会了如何使用51单片机的定时器功能,并掌握了编写延时1s函数的方法。

同时,我们也了解到定时器在实际应用中的一些技巧和注意事项。

总的来说,本文系统地介绍了51单片机的定时器功能,为读者提供了详实的理论知识和实际应用经验。

对于学习和使用单片机的人来说,本文提供了有价值的参考和指导。

希望读者通过阅读本文,能够更深入地了解定时器的原理和应用,并能够灵活运用该功能解决实际问题。

3.2 应用前景随着科技的不断发展,单片机的应用领域也逐渐扩大。

定时器功能作为单片机中的重要模块之一,其在各行各业中都有广泛的应用前景。

首先,定时器功能在工业自动化领域中扮演着至关重要的角色。

在生产线的控制系统中,定时器功能可以用来定时监测各个环节的状态,以实现精确的时间控制。

通过定时器的精确延时功能,可以确保生产线的运行顺利,提高生产效率。

其次,在智能家居领域,定时器功能也有着广泛的应用前景。

通过单片机的定时器功能,用户可以设定家电设备的开关时间,实现定时自动开关。

比如,用户可以设定定时器让电视在晚上10点自动关闭,从而节省能源。

另外,定时器还可以作为安防系统的一部分,通过设定定时器来控制摄像头的录像时间,保障家庭的安全。

此外,定时器功能在交通系统中也占据重要地位。

例如,交通信号灯系统利用定时器功能控制红绿灯的切换时间,实现交通流畅。

另外,定时器功能还可以被应用于公共交通工具的电子票务系统中,实现定时更新车票信息,提供准确的服务。

总之,单片机定时器功能的应用前景非常广阔。

无论是在工业自动化、智能家居还是交通系统中,定时器功能都扮演着重要的角色,为各行各业的发展提供了重要保障。

随着技术的不断进步和单片机应用的不断深入,相信定时器功能的应用前景将会更加广阔,为我们的生活带来更多的便利和效益。

相关文档
最新文档