1ms延时程序
- 格式:docx
- 大小:12.60 KB
- 文档页数:1
不同晶振频率时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--);}。
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 微秒的时间。
现在的单片机有很多种型号,但在每个型号的单片机器件手册中都会详细说明执行各种指令所需的机器周期,了解以上概念后,那么可以依据单片机器件手册中的指令执行周期和单片机所用晶振频率来完成需要精确延时时间的延时程序。
二、延时指令在单片机编程里面并没有真正的延时指令,从上面的概念中我们知道单片机每执行一条指令都需要一定的时间,所以要达到延时的效果,只须让单片机不断地执行没有具体实际意义的指令,从而达到了延时的效果。
一、单片机晶振的作用与原理单片机晶振是单片机系统中的一个重要部件,它通过振荡产生稳定的时钟信号,为单片机的运行提供基准。
在单片机系统中,晶振的频率对系统的稳定性、精度和速度有着重要的影响。
二、晶振频率为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.毫秒级的延时延时1ms;void delay_1ms(void){unsigned int i;for(i=1;i<(unsigned int)(xtal*143-2);i++);}在上式中,xtal为晶振频率,单位为MHz. AVR 延时程序当晶振频率为8M时,延时函数软件仿真的结果为1000.25μs.当晶振频率为4M 时,延时函数软件仿真结果为999.5μs. AVR 延时程序如果需要准确的1ms延时时间,则本计算公式只供参考,应通过软件仿真后,再确定循环的次数及循环初值,并且循环中还必须关闭全局中断,防止中断影响延时函数的延时时间。
下面的函数可以获得1ms的整数倍的延时时间:void delay(unsigned int n){unsigned int i;for(i=0;idelay_1ms();}如果需要准确的延时时间,则本计算公式只供参考,应通过软件仿真后,再确定循环的次数及循环初值. AVR 延时程序2.微秒延时晶振4M,编辑器ICCAVR,芯片mega16//最大延时时间131.072msvoid delay(unsigned int i) //延时时间T=2*(i+1)us其中1={while(--i);}晶振频率为8MHz时1μs延时函数:AVR 延时程序void delay_1us(void){asm("nop");}当然也可以使用宏定义来实现1μs延时:#define delay_1us();asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");as m("nop")如果小于1μs的延时,只有使用宏定义实现,当然,也可以直接插入在线汇编asm("nop"); 语句实现延时。
延时程序设计延时程序设计1. 简介2. 原理延时程序设计的原理是通过使程序暂停一段时间来实现延迟效果。
一般来说,计算机程序的执行速度非常快,可以在很短时间内完成大量的计算和操作。
有些情况下,我们希望程序在执行过程中能够暂停一段时间,以便等待输入、控制程序的执行节奏或实现特定功能。
延时程序设计的实现原理有多种,常见的包括基于硬件定时器的延时、基于软件循环的延时和基于系统调用的延时。
3. 方法3.1 基于硬件定时器的延时基于硬件定时器的延时是指通过控制计算机内部的硬件定时器来实现延时效果。
具体实现方式因计算机硬件平台而异,但一般都涉及配置定时器的频率和计数器的值。
通过设置定时器的频率和计数器的值,可以控制定时器中断的触发时间,从而实现延时效果。
3.2 基于软件循环的延时基于软件循环的延时是指通过让程序在一个循环中反复执行无意义的操作来实现延时效果。
具体实现方式包括使用空循环、使用轮询等。
在软件循环的延时中,程序执行时间的长短直接影响延时效果。
3.3 基于系统调用的延时基于系统调用的延时是指通过调用操作系统提供的延时函数来实现延时效果。
具体实现方式因操作系统而异,但一般涉及调用操作系统提供的函数,如`sleep`、`usleep`或`nanosleep`等。
通过调用这些函数,可以使程序暂停一段时间,从而实现延时效果。
4. 注意事项在进行延时程序设计时,需要注意以下事项:延时时间的选择:根据具体需求和应用场景选择合适的延时时间。
延时方式的选择:根据实际情况选择合适的延时方式,如硬件定时器、软件循环或系统调用。
延时程序的影响:延时程序可能会影响程序的响应性能和资源利用率,需要综合考虑延时程度和程序性能的平衡。
并发与延时:在多线程或多任务环境下,延时程序可能会对程序的并发性和调度产生影响,需要注意并发安全和调度策略。
5.延时程序设计是一种常用的技术,用于控制程序执行中的延迟时间。
通过选择合适的延时时间和延时方式,可以实现各种时间相关的功能。