单片机延迟函数
单片机精确毫秒延时函数

单片机精确毫秒延时函数单片机精确毫秒延时函数实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。
今天主要介绍软件延时以及单片机精确毫秒延时函数。
单片机的周期介绍在电子技术中,脉冲信号是一个按一定电压幅度,一定时间间隔连续发出的脉冲信号。
脉冲信号之间的时间间隔称为周期;而将在单位时间(如1秒)内所产生的脉冲个数称为频率。
频率是描述周期性循环信号(包括脉冲信号)在单位时间内所出现的脉冲数量多少的计量名称;频率的标准计量单位是Hz(赫)。
电脑中的系统时钟就是一个典型的频率相当精确和稳定的脉冲信号发生器。
指令周期:CPU执行一条指令所需要的时间称为指令周期,它是以机器周期为单位的,指令不同,所需的机器周期也不同。
对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。
对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。
通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令。
时钟周期:也称为振荡周期,一个时钟周期= 晶振的倒数。
对于单片机时钟周期,时钟周期是单片机的基本时间单位,两个振荡周期(时钟周期)组成一个状态周期。
机器周期:单片机的基本操作周期,在一个操作周期内,单片机完成一项基本操作,如取指令、存储器读/写等。
机器周期=6个状态周期=12个时钟周期。
51单片机的指令有单字节、双字节和三字节的,它们的指令周期不尽相同,一个单周期指令包含一个机器周期,即12个时钟周期,所以一条单周期指令被执行所占时间为12*(1/ 晶振频率)= x s。
常用单片机的晶振为11.0592MHz,12MHz,24MHz。
其中11.0592MHz 的晶振更容易产生各种标准的波特率,后两种的一个机器周期分别为1 s和2 s,便于精确延时。
51单片机C程序标准延时函数

51单片机C程序标准延时函数在此,我用的是12M晶振,一个时钟周期是1/12us,一个机器周期为12个时钟周期,则机器周期为1us,而51单片机执行一条语句,为1,2,4个机器周期不等,根据语句的长度来定,一般为1个机器周期。
而_nop_()为一条空语句,执行一次需要一个机器周期。
1us#include<intrins.h>_nop_();执行了一条_nop_();所以延时为1us;10usvoid delay10us(){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}执行了6条_nop_(),延时6us,主函数调用delay10us 时,先执行了LCALL指令2us,然后执行6条_nop_()语句6us,最后执行一条RET指令2us,所以总共延时10us。
100usvoid delay100us(){delay10us();delay10us();delay10us();delay10us();delay10us();delay10us();delay10us();delay10us();delay10us();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}与上面的一样,主函数调用delay100us();先执行了LCALL语句2us,再调用9个delay10us()函数90us,然后执行了6条_nop_()语句6us,最后执行了一条RET语句2us,总共100us。
1msvoid delay1ms(){f=1;TH0=0xe1;TL0=0X13;TR0=1;while(f);}void T0_3() interrupt 1{TR0=0;f=0;}这里就直接用51单片机内部定时器延时了,如果用_nop_();如果要做到微妙不差,那程序就太长了。
这里我用的是定时器0的方式0,13位定时器,这里为了方便,我就没就EA=1;ET0=1;TM0D=0X00;写在延时函数里。
51 单片机 定时器 延时1s函数

51 单片机定时器延时1s函数1.引言1.1 概述本文介绍了51单片机中的定时器功能以及如何通过定时器实现延时1秒的函数。
在单片机应用中,定时器是一种非常重要且常用的功能模块之一。
它能够精确计时,并可用于实现周期性的任务触发、计时、脉冲输出等功能。
本文首先将对51单片机进行简要介绍,包括其基本概念、结构和特点。
随后,重点讲解了定时器的基本原理和功能。
定时器通常由一个计数器和一组控制寄存器组成,通过预设计数器的初值和控制寄存器的配置来实现不同的计时功能。
接着,本文详细介绍了如何通过编程实现一个延时1秒的函数。
延时函数是单片机开发中常用的功能,通过定时器的计时功能可以实现精确的延时控制。
本文将以C语言为例,介绍延时函数的编写步骤和原理,并给出示例代码和详细的说明。
最后,本文对所述内容进行了总结,并展望了定时器在单片机应用中的广泛应用前景。
通过学习定时器的相关知识和掌握延时函数的编写方法,我们可以更好地应用定时器功能,提高单片机应用的效率和精确性。
综上所述,通过本文的学习,读者可全面了解51单片机中定时器的功能和应用,并能够掌握延时函数的编写方法,为单片机应用开发提供一定的参考和指导。
1.2 文章结构本文以51单片机定时器功能为主题,旨在介绍如何使用定时器进行延时操作。
文章分为引言、正文和结论三个主要部分。
在引言部分,首先会对文章的背景进行概述,介绍单片机的基本概念和应用领域。
然后,给出本文的整体结构,并阐述文章的目的和意义。
正文部分将分为两个小节。
在2.1节中,将对单片机进行详细介绍,包括其构造与工作原理。
这部分的内容将帮助读者全面了解单片机的基本知识,为后续的定时器功能介绍打下基础。
2.2节将重点介绍定时器的功能和特点。
这部分将涵盖定时器的基本原理、工作模式以及在实际应用中的使用方法。
同时,还将详细讲解如何使用定时器进行1秒钟的延时操作,包括具体的代码实现和注意事项。
结论部分将对全文进行总结,并强调定时器的重要性和应用前景。
转用C51编写单片机延时函数

转用C51编写单片机延时函数这里假定单片机是时钟频率为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=4 22×2+2=6 N2×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.0592 Mhz时钟(us)1 3+2×1+2=7|7.7(实际)7.60 23+2×2+2=9|9.9 9.76 N3+2×N+2=2N+5|(2N+5)*1.1/3 11|12.1 11.94 15 35|38.5 37.98 100 205|225.5 222.44 255515|566.5 558.81也就是说,这个延时函数的精度为2us,最小的时间延时为7us,最大的时间延时为3+255×2+2=515us.实际中使用11.0592 MHz的时钟,这个延时函数的精度将为2.2us,最小时间延时为7.7us,最大时间延时为566.5us.这个时间延时函数,对于与DS18B20进行单总线通信,已经足够准确了。
现在,我们将时钟换成11.0592 MHz这个实际用到的频率,每个机器周期约为1.1us.现在让我们来分析一下这个之前用过的延时函数://延时函数,对于11.0592 MHz时钟,例i=10,则大概延时10ms.void delayMs(unsigned int i){unsigned int j;while(i--){for(j=0;j 125;j++);}}它的反汇编代码如下:分析:T表示一个机器周期(调用时间相对于这个ms级的延时来说,可忽略不计)1 C:0000 MOV A,R7;1T 2DEC R7;1T低8位字节减1 3MOV R2,0x06;2T 4JNZ C:0007;2T若低8位字节不为0,则跳到C:0007 5DEC R6;1T低8位字节为0,则高8位字节减1 6C:0007 ORL A,R2;1T 7JZ C:001D;2T若高8位也减为0,则RET 8CLR A;1T A清零9 MOV R4,A;1T R4放高位10 MOV R5,A;1T R5放低位11 C:000D CLR C;1T C清零12 MOV A,R5;1T 13 SUBB A,#0x7d;1T A=A-125 14 MOV A,R4;1T 15 SUBB A,#0x00;1T A16 JNC C:0000;2T A为零则跳到C:0000 17 INC R5;1T R5增1 18 CJNE R5,#0x00,C:001B;2T R5 0,跳转到C:000D 19 INC R4;1T 20 C:001B SJMP C:000D;2T 21 C:001D RET对于delayMs(1),执行到第7行就跳到21行,共需时12T,即13.2us对于delayMs(2),需时9T+13T+124×10T+7T+12T=9T+13T+1240T+7T+12T=1281T=1409.1 us.对于delayMs(3),需时9T×(3-1)+(13T+124×10T+7T)×(3-1)+12T=1269T×(3-1)+12T=2550T=2805us.对于delayMs(N),N 1,需时1269T×(N-1)+12T=1269NT-1257T=(1395.9 N-1382.7)us.利用Keil C仿真delayMs(1)=0.00166558 s=1.67ms截图如下:由分析可知具体的计算延时时间与Keil C仿真延时对比如下:i Time Delay仿真延时1 13.2us 1.67ms 21409.1 us 3.31ms 32805us 4.96ms N(1395.9 N-1382.7)us 10 12.6ms 16.50ms 20 26.5ms 32.98ms 30 40.5ms 49.46ms 50 68.4ms 82.43ms 100 138.2ms 164.84 ms 200 277.8ms 329.56 ms 500696.6ms 824.13 ms 1000 1394.5 ms 1648.54 ms 1500 2092.5 ms 2472.34 ms 2000 2790.4 ms 3296.47 ms 55.6ms 8.26ms 73 100.5ms 120.34 ms 720 1003.7 ms=1s 1186.74 ms计算delayMs(10)得到延时时间为:12576.3 us约等于12.6ms,接近我们认为的10ms。
单片机几个典型延时函数

软件延时:(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;}。
单片机延时函数

单⽚机延时函数1.51单⽚机延时,晶振为11.0592MHz(1)粗略延时void delay_ms(uint x){uint i,j;for(i=x;i>0:i--)for(j=110;j>0;j--);}(2)定时器延时void delay_ms(uint i){TMOD=0x01; //设置定时器⼯作模式while(i != 0){TR0=1; //开启定时器TH0=(65535-1000)/256; //赋初值TL0=(65535-1000)%256;while(TF0 != 1); //溢出标志TF0=0;i--;}TR0=0; //关闭定时器}2.stm32l151C8T6延时,外部晶振8MHz(1)粗略延时void delay_us(uint32_t time) //us延时{uint32_t i=4\*time;while(i--);}void delay_us(uint32_t time) //ms延时{uint32_t i=4000\*time;while(i--);}(2)使⽤nop延时通过使⽤__NOP()函数进⾏延时,因为使⽤了8M晶振4倍频,所以是32MHz,所以⼀个nop约等于1/32us,所以使⽤32个nop函数为⼀个us,然后根据需要的定时时间进⾏计算。
void delay_us(uint32_t time) //us延时{uint32_t i=0;for(i=0;i(3)利⽤SysTick延时void delay_init() //初始化{SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟fac_us=SystemCoreClock/8000000; //为系统时钟的1/8 4fac_ms=1000\*fac_us;}void delay_us(uint16_t nus) //延时us{uint32_t ui_tmp=0x00;SysTick->LOAD=nus\*fac_us;SysTick->VAL=0x00;SysTick->CTRL=0x01;do{ui_tmp=SysTick->CTRL;}while((ui_tmp&0x01) && (!(ui_tmp & (1<<16))));SysTick->CTRL=0x00;SysTick->VAL=0x00;}void delay_ms(uint16_t nms) //延时ms{uint32_t ui_tmp=0x00;SysTick->LOAD=nms\*fac_ms;SysTick->VAL=0x00;SysTick->CTRL=0x01;do{ui_tmp=SysTick->CTRL;}while((ui_tmp&0x01) && (!(ui_tmp&(1<<16))));SysTick->VAL=0x00;SysTick->CTRL=0x00;}void SysTick_Handler(void){flag=~flag;}(4)定时器延时void TIM3_Int_Init(uint16_t arr,uint16_t psc){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//设置在下⼀个更新事件装⼊活动的⾃动重装载寄存器周期的值,计数10000为1s;TIM_TimeBaseStructure.TIM_Period = arr;//设置⽤来作为TIMx时钟频率除数的预分频值,10kHz的计数频率TIM_TimeBaseStructure.TIM_Prescaler = psc;//设置时钟分割:TDIS = Tck_timTIM_TimeBaseStructure.TIM_ClockDivision = 0;//设置TIM向上计数模式TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//初始化TIMx的时间基数单位TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);//使能指定的TIM3中断,允许更新中断TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//TIM3中断NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;//抢占优先级 0 级NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//从优先级 3 级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//IRQ通道被使能NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//初始化外设NVIC寄存器NVIC_Init(&NVIC_InitStructure);//使能TIMx外设TIM_Cmd(TIM3,ENABLE);}void TIM3_IRQHandler(void){if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET) //检查指定的TIM中断发⽣与否 {TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除TIMx的中断待处理位if(flag==0){flag=1;GPIO_ResetBits(GPIOB,GPIO_Pin_0) ;}else{flag=0;GPIO_SetBits(GPIOB,GPIO_Pin_0);}}}注意:定时时间的计算定时器时钟为:CK_CLK预分频数值:PSC⾃动装载寄存器数值:ARR进⼊中断的次数:timet=time\*(ARR+1)\*(PSC+1)/(CK_CLK)。
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单片机延时函数
151单片机延时函数
51单片机是一种常用的微控制器,它可以实现一系列功能,如定时器,定时器中断等。
随着科技的发展,许多人需要使用单片机来实现特定功能,而51单片机是最受欢迎的也是最知名的。
本文旨在介绍51单片机延时函数的实现方法。
1.1时钟
任何有效的51单片机使用的延时函数都受时钟的控制。
由于50单片机本身的频率有限,为了让计算机更有效地运行,我们需要精确设置时钟频率。
由于时钟频率的不同,51单片机的延时函数也有所不同。
1.2延时函数的实现
51单片机的延时函数是用来延迟任务的一种方法。
延时函数可以延迟任务的执行,并且可以按照用户设定的起点和终点执行任务。
51单片机使用指令延时来实现延时函数。
指令延时就是指通过控制51单片机内部时钟,来让程序暂停一段指定时间。
这样,我们就可以实现受时钟控制的延时函数。
1.3延时函数的实际应用
51单片机的延时函数可以用来实现许多不同的功能,如断电保护,延时启动,定时控制等。
由于这些函数可以精确控制任务的执
行,可以适应复杂的工作环境。
同时,51单片机还可以实现节能,使系统能够更加稳定可靠。
2结论
51单片机延时函数是51单片机应用中最基础的功能之一。
该函数可以满足不同用户的需求,帮助产品在实际应用中更好地发挥作用,同时还可以实现节能。
单片机的几种延时函数
C:0x0011EEMOVA,R6//1T
C:0x0012C3CLRC//1T
C:0x00139FSUBBA,DlyT //1T
C:0x00145003JNCC:0019//2T
C:0x00160E INCR6//1T
C:0x001780F8SJMPC:0011//2T 可以看出,0x000F~0x0017一共8条语句,分析语句可以发现并不是每条语句都执行DlyT次。核心循环只有0x0011~0x0017共6条语句,总共8个机器周期,第1次循环先执行“CLR A”和“MOV R6,A”两条语句,需要2个机器周期,每循环1次需要8个机器周期,但最后1次循环需要5个机器周期。DlyT次核心循环语句消耗(2+DlyT×8+5)个机器周期,当系统采用12 MHz时,精度为7 μs。 当采用while (DlyT--)循环体时,DlyT的值存放在R7中。相对应的汇编代码如下: C:0x000FAE07MOVR6, R7//1T
void Dly1ms(void) {
unsigned int i,j;
while (1) {
T_point = 1;
for(i=0பைடு நூலகம்i<2;i++){
for(j=0;j<124;j++){;}
}
T_point = 0;
…
汇编语言程序段
…
#pragma endasm 延时函数可设置入口参数,可将参数定义为unsigned char、int或long型。根据参数与返回值的传递规则,这时参数和函数返回值位于R7、R7R6、R7R6R5中。在应用时应注意以下几点: ◆ #pragma asm、#pragma endasm不允许嵌套使用;
单片机的几种延时函数
摘要实际的单片机应用系统开发过程中,由于程序功能的需要,经常编写各种延时程序,延时时间从数微秒到数秒不等,对于许多C51开发者特别是初学者编制非常精确的延时程序有一定难度。
本文从实际应用出发,讨论几种实用的编制精确延时程序和计算程序执行时间的方法,并给出各种方法使用的详细步骤,以便读者能够很好地掌握理解。
关键词 Ke il C51 精确延时程序执行时间引言单片机因具有体积小、功能强、成本低以及便于实现分布式控制而有非常广泛的应用领域[1]。
单片机开发者在编制各种应用程序时经常会遇到实现精确延时的问题,比如按键去抖、数据传输等操作都要在程序中插入一段或几段延时,时间从几十微秒到几秒。
有时还要求有很高的精度,如使用单总线芯片D S18B20时,允许误差范围在十几微秒以内[2],否则,芯片无法工作。
用51汇编语言写程序时,这种问题很容易得到解决,而目前开发嵌入式系统软件的主流工具为C语言,用C51写延时程序时需要一些技巧[3]。
因此,在多年单片机开发经验的基础上,介绍几种实用的编制精确延时程序和计算程序执行时间的方法。
实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CP U的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。
1使用定时器/计数器实现精确延时单片机系统一般常选用11.059 2 MH z、12MHz或6 MHz晶振。
第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。
本程序中假设使用频率为12 MH z的晶振。
最长的延时时间可达216=65 536μs。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机延迟函数
/*************************************************************** ***************
12M 延时计算公式= 4.17+(n-1)*0.5 us
8M 延时计算公式= 6.25+(n-1)*0.75 us
7.3728M 延时计算公式= 6.78+(n-1)*0.81 us 或者6.51+(n-1)*0.82 us
4M 延时计算公式= 12.5+(n-1)*1.5 us
3.6864M 延时计算公式= 13.56+(n-1)*1.63 us
2M 延时计算公式= 25.00+(n-1)*3.0 us
1M 延时计算公式= 50.00+(n-1)*6.0 us
**************************************************************** ***************/
void delay (unsigned int n)
{
unsigned int i;
i = n;
while (i--)
;
}
}
/*************************************************************** ***************
12M 延时计算公式= 4.0+(n-1)*0.5 us
8M 延时计算公式= 6.0+(n-1)*0.75 us
7.3728M 延时计算公式= 6.51+(n-1)*0.81 us 或者6.51+(n-1)*0.82 us
4M 延时计算公式= 12.0+(n-1)*1.5 us
3.6864M 延时计算公式= 13.02+(n-1)*1.63 us
2M 延时计算公式= 24.00+(n-1)*3.0 us
1M 延时计算公式= 48.00+(n-1)*6.0 us
**************************************************************** ***************/
void delay (unsigned int n)
{
unsigned int i;
for (i=n;i>0;i--)
{
;
}
/*************************************************************** ***************
12M 延时计算公式= 4.08+(n-1)*0.5 us
8M 延时计算公式= 6.13+(n-1)*0.75 us
7.3728M 延时计算公式= 6.65+(n-1)*0.81 us 或者6.51+(n-1)*0.82 us
4M 延时计算公式= 12.25+(n-1)*1.5 us
3.6864M 延时计算公式= 13.29+(n-1)*1.63 us
2M 延时计算公式= 24.5+(n-1)*3.0 us
1M 延时计算公式= 49.0+(n-1)*6.0 us
**************************************************************** ***************/
void delay (unsigned int n)
{
unsigned int i;
for (i=0;i<n;i++);
}
/*************************************************************** ***************
12M 0.75us
8M 1.13us
7.3728M 1.22us
4M 2.25us
3.6864M 2.44us
2M 4.5us
1M 9.0us
**************************************************************** ***************/
void delay_1us (void)
{
NOP();
}
/*************************************************************** ***************
12M 延时计算公式= 1.92+(n-1)*0.5 us
8M 延时计算公式= 2.88+(n-1)*0.75 us
7.3728M 延时计算公式= 6.24+(n-1)*0.81 us 或者6.24+(n-1)*0.82 us
4M 延时计算公式= 5.75+(n-1)*1.5 us
3.6864M 延时计算公式= 6.24+(n-1)*1.63 us 或者6.24+(n-1)*1.62 us
2M 延时计算公式= 11.5 +(n-1)*3.0 us
1M 延时计算公式= 23.0+(n-1)*6.0 us
*********************************
**********************************************/
void delay (unsigned int n)
{
while (n--);
}
/*************************************************************** ****************
NOP();延时时间,这个就不用多说了吧
12M 0.083us
8M 0.125us
7.3728M 0.14us 0.27us
4M 0.25us
3.6864M 0.27us
2M 0.5us
1M 1.0us
**************************************************************** ***************/
/*************************************************************** ***************
8M 大约延时1000.25us
4M 大约延时999.5us
**************************************************************** **************/
void delay_1ms(void)
{
unsigned int i;
for(i=1;i<(unsigned int)(xtal*143-2);i++);//xtal为晶振大小,单位为MHz }。