1ms延时程序

合集下载

不同晶振 延时1MS程序

不同晶振 延时1MS程序

不同晶振频率时1MS延时程序测试时间:2011.06.21测试人:陆周使用仪器:RIGOL-DS1022C-D示波器所用MCU:STC12C5608AD(适合STC中1T系列单片机)/********************(STC12C5608AD 11.0592MHZ z=1时精确延时1ms)***************/void delay_1ms(uint z){uint x,y;for(x=z; x>0; x--)for(y=848; y>0; y--);}/********************(STC12C5608AD 12MHZ z=1时精确延时1ms)*******************/void delay_1ms(uint z){uint x,y;for(x=z; x>0; x--)for(y=920; y>0; y--);/********************(STC12C5608AD 3.579545MHZ z=1时精确延时1ms)**************/void delay_1ms(uint z){uint x,y;for(x=z; x>0; x--)for(y=274; y>0; y--);}/********************(STC12C5608AD 4MHZ z=1时精确延时1ms)********************/void delay_1ms(uint z){uint x,y;for(x=z; x>0; x--)for(y=306; y>0; y--);}/********************(STC12C5608AD 4.096MHZ z=1时精确延时1ms)****************/void delay_1ms(uint z){uint x,y;for(x=z; x>0; x--)for(y=314; y>0; y--);}/********************(STC12C5608AD 4.9152MHZ z=1时精确延时1ms)****************/void delay_1ms(uint z){uint x,y;for(x=z; x>0; x--)for(y=376; y>0; y--);}/********************(STC12C5608AD 7.3728MHZ z=1时精确延时1ms)****************/void delay_1ms(uint z){uint x,y;for(x=z; x>0; x--)for(y=565; y>0; y--);}/********************(STC12C5608AD 7.6MHZ z=1时精确延时1ms)*******************/void delay_1ms(uint z){uint x,y;for(x=z; x>0; x--)for(y=583; y>0; y--);}/********************(STC12C5608AD 8MHZ z=1时精确延时1ms)********************/void delay_1ms(uint z){uint x,y;for(x=z; x>0; x--)for(y=615; y>0; y--);}/********************(STC12C5608AD 9.6MHZ z=1时精确延时1ms)******************/void delay_1ms(uint z){uint x,y;for(x=z; x>0; x--)for(y=736; y>0; y--);}/********************(STC12C5608AD 10.245MHZ z=1时精确延时1ms)****************/void delay_1ms(uint z){uint x,y;for(x=z; x>0; x--)for(y=786; y>0; y--);}}/******************(STC12C5608AD 14.31818MHZ z=1时精确延时1ms)***************/void delay_1ms(uint z){uint x,y;for(x=z; x>0; x--)for(y=1098; y>0; y--);}/********************(STC12C5608AD 16MHZ z=1时精确延时1ms)*******************/void delay_1ms(uint z){uint x,y;for(x=z; x>0; x--)for(y=1228; y>0; y--);}/******************(STC12C5608AD 16.384MHZ z=1时精确延时1ms)******************/void delay_1ms(uint z){uint x,y;for(x=z; x>0; x--)for(y=1258; y>0; y--);}/********************(STC12C5608AD 18MHZ z=1时精确延时1ms)********************/void delay_1ms(uint z){uint x,y;for(x=z; x>0; x--)for(y=1380; y>0; y--);}/********************(STC12C5608AD 22.1184MHZ z=1时精确延时1ms)***************/void delay_1ms(uint z){uint x,y;for(x=z; x>0; x--)for(y=1696; y>0; y--);}/********************(STC12C5608AD 24MHZ z=1时精确延时1ms)********************/void delay_1ms(uint z){uint x,y;for(x=z; x>0; x--)for(y=1845; y>0; y--);}/********************(STC12C5608AD 25MHZ z=1时精确延时1ms)********************/void delay_1ms(uint z){uint x,y;for(x=z; x>0; x--)for(y=1920; y>0; y--);}/********************(STC12C5608AD 36MHZ z=1时精确延时1ms)********************/void delay_1ms(uint z){uint x,y;for(x=z; x>0; x--)for(y=2760; y>0; y--);}。

各种延时程序

各种延时程序
;延时5秒左右
DELAY5S:PUSH 04H
PUSH 05H
PUSH 06H
MOV R4,#50
DELAY5S_0:MOV R5,#200
2*128*256*周期
2*256*10=5120
DJNZ R5,K1 ;2指令周期2*10=20
RET
;2指令周期21+10+2560+327680+655360+5120+20+2=990753
DELAY10MSA:
MOV R5,#247
DJNZ R5,$
DJNZ R4,DELAY10MSA
DJNZ R3,DELAY10MS
RET
DELAY_500MS: ;500500MS
MOV R2,#208
JMP DELAY_MS
JMP DELAY10MS
DELAY_100MS: ;100MS(11.0592mhz)
MOV R3,#10
JMP DELAY10MS
DELAY_10MS:
MOV R3,#1
DELAY10MS: ;去抖动10MS
(11.0592mhz)
MOV R4,#20
延时时间=[(2*第一层循环+3)*第二层循环+3]*第三层循环+5
另外,网上有很多计算延时的应用程序,我这也有几个,有需要的同学发邮件.
;约等于1秒1秒=1000000微秒
;这个算下来也只有0.998抄
T_0: MOV R7,#10;
D1: MOV R6,#200;
D2: MOV R5,#248;
DJNZ R5,$

C8051F单片机C程序精确延时的方法

C8051F单片机C程序精确延时的方法

编译情况相同。3种循环语句在Keil C51中具有不同编 译特点的原因在于它们的流程不同。do—while语句是先 执行后判断,while和for语句都是先判断后执行。进行
多层循环时,使用do—while语句具有更大的优势:编译的 汇编代码就如直接用汇编语言编写的程序,结构紧凑,编
译效率高,条件转移控制循环次数的过程简单。因此,虽
C8051F单片机是完全集成的混合信号系统级芯片 (S0c),其MCU系统控制器的内核是CIP一51微控制器。 CIP一51的指令集与标准8051指令集完全兼容。CIP一 51采用流水线指令结构,指令时序与标准805l不同: 70%指令的执行时间为l或2个系统时钟周期;所有指令 时序都以时钟周期计算;大多数指令执行所需的时钟周期 数与指令的字节数一致;条件转移指令在不发生转移时和 发生转移时的时钟周期数不同。同标准8051相比, C8051F单片机实现程序延时的方法更复杂些。
void SingleCircle(unsigned char t){ unsigned char X=t,Y 5 tl
t基金项目:福建省教育厅科技硬目(jB07277)。
do(

}while(一一t); while(x一一);
for(;y--一;); }
使用Keil C51 V7.50编译器编泽,得到的汇编代码如 下:
2丁+(7l+3)T·(X一1)+(,l+2)T=ZT+(行+3)T·X一1’
同理,可得Delay函数的延时时间: {2T+[2T+(咒+3)T·x—T+3T]·y一丁+3丁)·
£一1’+5丁={[4y+(咒+3)X·y+4]·£+4}·T 其中,5丁为返回指令RET的时钟周期数。考虑调用De- lay函数的LCALL指令(时钟周期数为4T)和参数传递的 MOV指令(时钟周期数为2n,则总延时时间t且为

51单片机的几种精确延时

51单片机的几种精确延时
的方法来实现,因此,循环嵌套的方法常用于达到ms级的延时。
对于循环语句同样可以采用for,do…while,while结构来完
成,每个循环体内的变量仍然采用无符号字符变量。
unsigned char i,j
for(i=255;i>0;i--)
for(j=255;j>0;j--);

unsigned char i,j
{unsigned char b,c;
b="j";
c="k";
do{
do{
do{k--};
while(k);
k="c";
j--;};
while(j);
j=b;
i--;};
while(i);
在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意,C51编写的中断服务程序编译后会自动加上PUSH ACC、PUSH PSW、POP PSW和POP ACC语句,执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。
51单片机的几种精确延时实现延时
51单片机的几种精确延时实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。
1使用定时器/计数器实现精确延时
单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1μs和2μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达216=65 536μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。

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

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

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

Keil C51程序设计中几种精确延时方法2008-04-03 08:48实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高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个机器周期。

这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。

2 软件延时与时间计算在很多情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延时。

下面介绍几种软件延时的方法。

2.1 短暂延时可以在C文件中通过使用带_NOP_( )语句的函数实现,定义一系列不同的延时函数,如Delay10us( )、Delay25us( )、Delay40us( )等存放在一个自定义的C文件中,需要时在主程序中直接调用。

如延时10 μs 的延时函数可编写如下:void Delay10us( ) {_NOP_( );_NOP_( );_NOP_( )_NOP_( );_NOP_( );_NOP_( );}Delay10us( )函数中共用了6个_NOP_( )语句,每个语句执行时间为1 μs。

汇编延时程序讲解

汇编延时程序讲解

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

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

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

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

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

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

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

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

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

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

·单片机晶振为12mhs延时1ms计算依据

·单片机晶振为12mhs延时1ms计算依据

一、单片机晶振的作用与原理单片机晶振是单片机系统中的一个重要部件,它通过振荡产生稳定的时钟信号,为单片机的运行提供基准。

在单片机系统中,晶振的频率对系统的稳定性、精度和速度有着重要的影响。

二、晶振频率为12MHz的延时计算在单片机系统中,为了实现延时操作,一般需要通过编程来控制计时器或者循环延时的方式来实现。

对于晶振频率为12MHz的单片机系统,延时1ms的计算依据如下:1. 首先需要计算出12MHz晶振的周期,即一个晶振振荡周期的时间。

12MHz晶振的周期为1/12MHz=0.0833us。

2. 接下来将1ms转换成晶振周期数。

1ms=1000us,将1000us除以0.0833us得到12000。

即延时1ms需要进行12000个晶振周期的振荡。

3. 最后根据单片机的指令周期和频率来确定代码延时的实现方法。

以常见的晶振频率为12MHz的单片机为例,根据单片机的指令周期(一般为1/12MHz=0.0833us)和延时周期数(12000),可以编写相应的延时函数或者循环来实现1ms的延时操作。

三、12MHz晶振延时1ms的应用场景在实际的单片机应用中,常常需要进行一定时间的延时操作,例如驱动液晶屏显示、控制外围设备响应等。

12MHz晶振延时1ms的应用场景包括但不限于:LED闪烁控制、按键消抖、舵机控制、多任务调度等。

四、晶振频率选择与延时精度的关系晶振频率的选择对延时精度有着直接的影响。

一般来说,晶振频率越高,对延时精度要求越高的应用场景,而对于一般的延时控制,12MHz的晶振已经能够满足大多数的要求。

延时的精度还受到单片机的指令执行速度的影响,需要在实际应用中进行综合考量与测试。

五、总结在单片机系统中,晶振的频率选择与延时操作密切相关,12MHz晶振延时1ms的计算依据可以帮助工程师们更好地进行单片机程序的设计与开发。

需要根据实际应用场景和需求来选择合适的晶振频率,并对延时精度进行充分的考量和测试,以确保单片机系统的稳定可靠性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
delay(3);//延时0.311ms,懂了吗?
delay(10);//延时1.011ms
delay(100);//延时10.011ms,数值很大的话,这误差就可以忽略不计了
/*******************************************************************************
*函数名: delay()
*函数功能:精确延时
*输入: x
*输出:无
*******************************************************************************/
一、
void delay(unsigned int x) //延时0.14ms,无误差(实测12mhz时延时0.12ms,
误差16us,此为网上较为精确的延时程序)
{
uchar i;
while(x--)
{ห้องสมุดไป่ตู้
for (i = 0; i<13; i++)
{}
}
}
二、
void delay(uint i)//12MHZ延时0.1ms,误差11us(调用子程序所需时间)
{uchar j,k;
for (j=i; j>0; j--)
for(k=0;k<30;k++);
}
注:误差都是由于调用子程序需要时间引起的,不是程序里面的误差,这是必然的,
不可避免的,所以单片机精灵的延时都是固定的延时程序(新手用延时,高手都是用定时器的)。
比如第二个程序:
delay(2);//误差仍未11us,即延时0.1×2+0.011=0.211ms
相关文档
最新文档