编写延时函数的简单方法

编写延时函数的简单方法
编写延时函数的简单方法

编写延时函数的简单方法

如果从keil里看了c语言的反汇编代码然后根据晶振和指令计算延时的时间这样虽然非常的准确但是相当的麻烦而且容易搞错,我这里介绍一个最简单的方法.

可以验证你的延时函数

这里用一个例程详细介绍一下。

过程参考如下:

在编译器下建立一个新项目,也可以利用已有项目。此过程中需要注意,单片机晶振的选择,因为for循环里指令的执行时间和晶振有直接关系,本例中晶振使用11.0592M。

编写一段关于延时的函数,主要利用for循环,代码如下:

void delay_ms(unsigned int ms)

{

unsigned int i;

unsigned char j;

for(i=0;i

{

for(j=0;j<200;j++);

for(j=0;j<102;j++);

}

}

其中ms是输入参数,如果输入1,就是要求程序延时1ms。

j变量是调整程序运行的时间参数。调整j的数值,使1次循环的时间在1ms。

将此程序编译通过,然后利用软件仿真,调整时间。

下面这个sec就是程序运行到现在的这一行所用的时间。

两次时间差就是延时函数使用的时间,如果与1ms相差比较多,用户可以调整j 参数的值,使延时时间尽量接近1ms。如增大j的值for(j=0;j<105;j++);

此方法得出延时函数,在晶振不同的情况下,延时时间会不准。软件调试结果,这个程序的延时时间为:1.01779ms,一般的单片机系统中都可以应用。

下面来说说汇编的传统计算方法:

指令周期、机器周期与时钟周期

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

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

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

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

了解了上面这些我们来看一个例子

;============延时1秒子程序========================

DELAY_1S:;延时子程序,12M晶振延时1.002035秒

MOV R4,#10

L3:MOV R2,#200;1指令周期

L1:MOV R3,#249;1指令周期

L2:DJNZ R3,L2;2指令周期

DJNZ R2,L1;2指令周期

DJNZ R4,L3;2指令周期

RET;2指令周期

;循环体延时时间:

[(249*2+1+2)*200+1+2]*10*12/12000000=1.002030s

;加上ACALL指令和第一条mov指令以及最后一条RET指令算出来整个函数的时间为1.002035s

;================================================

通常选用的是11.0592MHZ的晶振:

[(249*2+1+2)*200+1+2]*10*12/11059200=1.08727213541666666.. .S

汇编延时子程序的延时计算问题

对于程序

DELAY:MOV R0,#00H

DELAY1:MOV R1,#0B3H

DJNZ R1,$

DJNZ R0,DELAY1

查指令表可知MOV一个机器周期,DJNZ指令需用两个机器周期,而一个机器周期时间长度为12/11.0592MHz,所以该段程序执行时间为:

((0B3×2+1+2)×256+1)×12÷11059200=100.2789mS

第一层:DJNZ R1,$:执行了B3H次,一次两个周期,所以为0B3×2;

第二层:MOV R1,#0B3H为一个周期,DJNZ R0,DELAY1为两个周期,这样循环一次就是0B3×2+1+2个周期;第二层的执行次数本来是255次,但因为赋首值为0,而DJNZ是先减1,再比较的,所以就应该是256次。

这样的话,整个循环执行完应该是(0B3×2+1+2)×256+1次。再加上开始赋值这一句,就是((0B3×2+1+2)×256+1)了

还说明一下:

nop指令或者_nop_();函数占一个机器周期,在stc单片机的12T模式下一个机器周期是一个振荡周期的12分频,如果你的晶振是12MHZ,那你的一个机器周期就是1微秒.一个nop指令的执行时间也就是1US

当在6T模式(下载的时候可选择模式)下12M晶振的时候,一个nop就是0.5US 了.

条件与循环函数

5.4.3 条件分支函数 条件分支函数用于测试其表达式的值,然后根据其结果执行相应的操作。AutoLISP提供了两个条件函数,即IF与COND语句。使用它们可以控制程序的流向,实现分支结构。 5.4.3.1 if函数 调用格式:(If<测试表达式><THEN表达式>[<ELSE表达式>]) 功能:先对<测试表达式>进行求值,如果结果为非nil,则执行<THEN表达式>,并把其求值结果作为If函数的调用返回值;如果<测试表达式>的求值结果为nil,且任选项<ELSE表达式>存在,则执行<ELSE表达式>,且返回其求值结果。如果<ELSE表达式>不存在,则返回nil。 如果if函数中的<THEN表达式>和<ELSE表达式>为多个表达式组成,必须用progn控制。 (progn <标准表>……)该函数按顺序对每个<标准表>进行求值,并返回最后哪个<标准表>的值。例如: (if (<= a b) (progn (setq a (+ a 10)) (setq b (- b 10)) ) ) 比较: (if (<= a b) (setq a (+ a 10)) (setq b (- b 10)) ) 5.4.3.2 cond函数 调用格式:(cond(<测试表达式1><结果1>) (<测试表达式2><结果2>) …… [(<T><结果 n>)] ) 功能:自顶向下逐个测试每个条件分支。每个分支表仅第一个元素<测试表达式>被求值。如果求值中遇到了非nil的值,则立即执行该成功分支中的<结果>部分,后面的其他分支不再被求值,并把其逻辑上最后一个表达式的值作为

结果返回。 说明: l)cond函数取任意数目的表作为参数。每个表称为一个分支,每个分支中包含一个<测试表达式>,也可能包括测试成功的<结果>部分。其中测试部分是一个S表达式,结果部分可以有多个S表达式。 2)如果所有分支的测试值都为nil,或者一个分支也不存在,cond函数则返回nil。 3)如果成功的分支表中只有一个元素,即只有<测试表达式>而没有<结果>部分,那么<测试表达式>的值即为返回结果。 4)为了增强程序的易读性,一般在cond函数的最后一个分支表中用T作为测试式,它就好像一个收容器,凡是不能满足上面任一测试式的情况都收容在这个分支来执行。(如打印考试成绩) 5.5 循环结构 循环结构在AntoLISP程序中应用很广泛,所谓循环结构就是通过“测试一求值一测试”的方法,使一些表达式被重复执行,直到满足测试条件为止。AutoLISP主要提供了两个具有明显测试条件的循环控制函数,即while与repeat。还有一些函数并不具有明显测试条件,但函数内部也是在反复执行某个操作,如 foreach与 mapcar函数。 5.5.1 while函数 调用格式:(while <测试表达式> [<表达式>…]) 功能:函数先对<测试表达式>求值,如果它不是nil,则对其他表达式求值,然后又重新对<测试表达式>求值,并重复上述过程,直到<测试表达式>的值为nil为止。函数返回最后一次循环的最后一个表达式的求值结果。 While函数的语法结构如图所示。 While函数的语法结构

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_( );

第六章 相关函数的估计

6. 相关函数的估计(循环相关) 6.1. 相关函数与协方差函数 6.1.1. 自相关函数和自协方差函数 1、 自相关和自协方差函数的定义 相关函数是随机信号的二阶统计特征,它表示随机信号不同时刻取值的关联程度。 设随机信号)(t x 在时刻j i t t ,的取值是j i x x ,,则自相关函数的定义为 j i j i j i j i N n n j n i N j i j i x dx dx t t x x f x x x x N x x E t t R ??∑= ===∞ →),;,(1lim ] [),(1 ) ()( 式中,上角标“(n )”是样本的序号。 自协方差函数的定义与自相关函数的定义相似,只是先要减掉样本的均值函数再求乘积的数学期望。亦即: j i j i j i x j x i N n x n j x n i N x j x i j i x dx dx t t x x f m x m x m x m x N m x m x E t t C j i j i j i ??∑--= --=--==∞ →),;,())(() )((1lim )] )([(),(1 ) ()( 当过程平稳时,);,(),;,(τj i j i j i x x f t t x x f =。这时自相关函数和自协方差函数只是i j t t -=τ的函数,与j i t t ,的具体取值无关,因此可以记作)(τx R 和)(τx C 。 对于平稳且各态历经的随机信号,又可以取单一样本从时间意义上来求这些统计特性: 时间自相关函数为:

? + - ∞ →+=22 )()(1lim )(T T T x dt t x t x T R ττ 时间自协方差函数为: ? + - ∞ →-+-=22 ])(][)([1lim )(T T x x T x dt m t x m t x T C ττ 在信号处理过程中,有时会人为地引入复数信号。此时相应的定义变成 ][),(* j i j i x x x E t t R = )]()[(),(* j i x j x i j i x m x m x E t t C --= 式中,上角标*代表取共轭。 2、 自相关和自协方差函数的性质 自相关和自协方差函数的主要性质如下: (1) 对称性 当)(t x 时实函数时,)(τx R 和)(τx C 是实偶函数。即 ) ()(), ()()()(),()(* * ττττττττx x x x x x x x C C R R C C R R =-=-== 当)(t x 时复值函数时,)(τx R 和)(τx C 具有共轭对称性。即 )()(), ()(* * ττττx x x x C C R R =-=- (2) 极限值 )(, )()0(,)0(2=∞=∞==x x x x x x x C m R C D R σ (3) 不等式 当0≠τ时, )()0(), ()0(ττx x x x C C R R ≥≥ 因此, )0()()(x x x R R ττρ=

TMS320F2812delay 延时完整程序

TMS320F2812的延时程序(完整) .def _DSP28x_usDelay ;==================================================== ;Delay Function ;The C assembly call will look as follows: ; ; extern void Delay(long time); ; MOV AL,#LowLoopCount ; MOV AH,#HighLoopCount ; LCR _Delay ; ;Or as follows (if count is less then 16-bits): ; ; MOV ACC,#LoopCount ; LCR _Delay .global __DSP28x_usDelay _DSP28x_usDelay: SUB ACC,#1 NOP NOP BF _DSP28x_usDelay,GEQ ;; Loop if ACC >= 0 LRETR ;There is a 9/10 cycle overhead and each loop ;takes five cycles. The LoopCount is given by ;the following formula: ; DELAY_CPU_CYLES = 9 + 5*LoopCount ; LoopCount = (DELAY_CPU_CYCLES - 9) / 5 ;================================================== --

RE:我是这么调用的(C语言) extern void DSP28x_usDelay(long time); 在需要延时的地方加入 DSP28x_usDelay(0x100000);//根据延迟时间写入参数

STM32延时函数

#include #include "delay.h" ////////////////////////////////////////////////////////////////////////////////// //使用SysTick的普通计数模式对延迟进行管理 //包括delay_us,delay_ms //***************************************************************************** *** //V1.2修改说明 //修正了中断中调用出现死循环的错误 //防止延时不准确,采用do while结构! ////////////////////////////////////////////////////////////////////////////////// static u8 fac_us=0;//us延时倍乘数 static u16 fac_ms=0;//ms延时倍乘数 //初始化延迟函数 //SYSTICK的时钟固定为HCLK时钟的1/8 //SYSCLK:系统时钟 void delay_init(u8 SYSCLK) { SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟HCLK/8 fac_us=SYSCLK/8; fac_ms=(u16)fac_us*1000; } //延时nms //注意nms的范围 //SysTick->LOAD为24位寄存器,所以,最大延时为: //nms<=0xffffff*8*1000/SYSCLK //SYSCLK单位为Hz,nms单位为ms //对72M条件下,nms<=1864 void delay_ms(u16 nms) { u32 temp; SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit) SysTick->VAL =0x00; //清空计数器 SysTick->CTRL=0x01 ; //开始倒数 do { temp=SysTick->CTRL; } while(temp&0x01&&!(temp&(1<<16)));//等待时间到达 SysTick->CTRL=0x00; //关闭计数器 SysTick->VAL =0X00; //清空计数器 } //延时nus //nus为要延时的us数.

delay延时教程

delay延时教程(用的是12MHz晶振的MCS-51) 一、 1)NOP指令为单周期指令 2)DJNZ指令为双周期指令 3)mov指令为单周期指令 4)子程序调用(即LCALL指令)为双周期指令 5)ret为双周期指令 states是指令周期数, sec是时间,=指令周期×states,设置好晶振频率就是准确的了 调试>设置/取消断点”设置或移除断点,也可以用鼠标在该行双击实现同样的功能 二、编程最好: 1.尽量使用unsigned型的数据结构。 2.尽量使用char型,实在不够用再用int,然后才是long。 3.如果有可能,不要用浮点型。 4.使用简洁的代码,因为按照经验,简洁的C代码往往可以生成简洁的目标代码(虽说不是在所有的情况下都成立)。 5.在do…while,while语句中,循环体内变量也采用减减方法。 三、编辑注意: 1、在C51中进行精确的延时子程序设计时,尽量不要或少在延时子程序中定义局部变量,所有的延时子程序中变量通过有参函数传递。 2、在延时子程序设计时,采用do…while,结构做循环体要比for结构做循环体好。 3、在延时子程序设计时,要进行循环体嵌套时,采用先内循环,再减减比先减减,再内循环要好。 四、a:delaytime为us级 直接调用库函数: #include// 声明了void _nop_(void); _nop_(); // 产生一条NOP指令 作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒。 eg:可以在C文件中通过使用带_NOP_( )语句的函数实现,定义一系列不同的延时函数,如Delay10us( )、Delay25us( )、Delay40us( )等存放在一个自定义的C 文件中,需要时在主程序中直接调用。如延时10 μs的延时函数可编写如下: void Delay10us( ) { _NOP_( ); _NOP_( );

单片机几个典型延时函数

软件延时:(asm) 晶振12MHZ,延时1秒 程序如下: DELAY:MOV 72H,#100 LOOP3:MOV 71H,#100 LOOP1:MOV 70H,#47 LOOP0:DJNZ 70H,LOOP0 NOP DJNZ 71H,LOOP1 MOV 70H,#46 LOOP2:DJNZ 70H,LOOP2 NOP DJNZ 72H,LOOP3 MOV 70H,#48 LOOP4:DJNZ 70H,LOOP4 定时器延时: 晶振12MHZ,延时1s,定时器0工作方式为方式1 DELAY1:MOV R7,#0AH ;;晶振12MHZ,延时0.5秒 AJMP DELAY DELAY2:MOV R7,#14H ;;晶振12MHZ,延时1秒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 MOV TH0,#3CH DJNZ R7,HERE CLR TR0 ;定时器要软件清零 SETB EX0 RET

C语言延时程序: 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--); }

循环平稳过程以及信号处理理论

循环平稳过程以及信号处理理论 绪论 ? 通信、遥测、雷达、声呐等系统中许多信号,其统计特征参数是时间变化的,这类信号称为循环平稳信号(cyclostationary signal) ? 例如调制信号,雷达扫描信号,还有一些自然的,如水文数据,海洋数据,人体心电图等都具有循环平稳性质。 ? W. A. Gardner*的谱相关理论是标志循环平稳信号处理理论的成熟,其数学工具是循环相关函数和循环谱相关函数。 ? *W. A. Gardner, L. E. Franks, Characterization of cyclostationary random signal processes, IEEE Trans Information Theory, 21: 4-14, 1975. ? F. Chapeau-Blondeau, X. Godivier; "Theory of stochastic resonance in signal transmission by static nonlinear systems"; Physical Review E 55, 1478-1495 (1997). ? X. Godivier, F. Chapeau-Blondeau; "Noise-assisted signal transmission by a nonlinear electronic comparator: Experiment and Theory"; Signal Processing 56, 293-303 (1997). ? F. Duan, F. Chapeau-Blondeau, D. Abbott; "Noise-enhanced SNR gain in parallel array of bistable oscillators"; Electronics Letters 42, 1008-1009 (2006). 2.1一般理论框架(动态静态系统都适合) 强调我们的系统划分规则静态指无记忆系统,而动态指有记忆的系统。 这里设任意一系统的输入为)()()(t t s t x η+=,)(t s 表示周期为s T 的周期信号,而)(t η是稳态随机噪声。 我们把系统输出)(t y 看成是它的非稳态均值)]([t y E 与围绕均值的稳定波动 )(?t y 的和,即 )]([)(?)(t y E t y t y += 2-1 由于输入信号)(t s 的周期性,系统输出)(t y 一般也是周期为s T 的循环平稳信号,非稳态均值)]([t y E 是周期s T 的确定性信号,那么引入傅里叶变换系数n Y

STM32的几种延时方法

STM32的几种延时方法(基于MDK固件库3.0,晶振8M) 单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us()和毫秒级delay_ms()。 1.普通延时法 这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来实现,不过要做的比较精准还是要下一番功夫。下面的代码是在网上搜到的,经测试延时比较精准。 //粗延时函数,微秒 void delay_us(u16 time) { u16 i=0; while(time--) { i=10; //自己定义 while(i--) ; } } //毫秒级的延时 void delay_ms(u16 time) { u16 i=0; while(time--) { i=12000; //自己定义 while(i--) ; } } 2.SysTick 定时器延时 CM3 内核的处理器,内部包含了一个SysTick定时器,SysTick是一个24 位的倒计数定时器,当计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。SysTick 在STM32 的参考手册里面介绍的很简单,其详细介绍,请参阅《Cortex-M3 权威指南》。 这里面也有两种方式实现: a.中断方式 如下,定义延时时间time_delay,SysTick_Config()定义中断时间段,在中断中递减time_delay,从而实现延时。 volatile unsigned long time_delay; // 延时时间,注意定义为全局变量 //延时n_ms void delay_ms(volatile unsigned long nms) { //SYSTICK分频--1ms的系统时钟中断 if (SysTick_Config(SystemFrequency/1000))

verilog编写的延时函数.docx

Verilog编写的延时函数 用quartus编译通过,并口用modelsim进彳亍了后仿真老师让编写一个程序实现开关的延吋控制,具体要求是开关量变高电平后延吋500ms输出波形PWM1变为高,在延时500msPWM2输出波形变为高,在延时500msPWM3输出变为高电平。 当开关量变为低电平时,一次延时500ms, PWM3, PWM2, PWM1 一次变为高电平。源程序如下: module testosc(osc_in, osc_out, clk_in, clk_out, input_signal, PWM1, PWM2, PWM3, sta rt, signal_buffcr); input osc_in, clk_in, input_signal; output PWM1, PWM2, PWM3, start; output osc_out, clk_out; output signal_buffer; reg PWM1, PWM2, PWM3, osc_out, clk_out, start ;//outl, out2, out3, out4, out5, out6, out7, out& out9, outlO, outll, outl2, outl3, outl4, outl5, outl6, outl7, outl8, outl9, out20, out21, out22, out23, out24, out25, out26,out27,out2& out29,out 30,out31,out32; rcg[10:0] count; regsignal_buffer; initial begin PWMl<=l,b0; PWM2<=rbO; PWM3<=rbO; start<=r bO; count〈二11' dO; signal_buffer<=r bO; end always @(osc_in) begin if (osc_in二二1) begin osc_out<=0; clk_out<=0; end el se begin osc_out〈二1; clk_out<=l; end end always ?(posedgeclkin)

AVR单片机常用的延时函数

AVR单片机常用的延时函数 /******************************************************************** *******/ //C header files:Delay function for AVR //MCU:ATmega8 or 16 or 32 //Version: 1.0beta //The author: /******************************************************************** *******/ #include void delay8RC_us(unsigned int time) //8Mhz内部RC震荡延时Xus { do { time--; } while(time>1); } void delay8RC_ms(unsigned int time) //8Mhz内部RC震荡延时Xms { while(time!=0) { delay8RC_us(1000); time--; } } /******************************************************************** **********/ void delay1M_1ms(void) //1Mhz延时1ms { unsigned char a,b,c; for(c=1;c>0;c--) for(b=142;b>0;b--) for(a=2;a>0;a--); } void delay1M_xms(unsigned int x) //1Mhz延时xms { unsigned int i; for(i=0;i

STM32的几种延时方法

STM32的几种延时方法(基于MDK固件库,晶振8M)单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us( )和毫秒级delay_ms( )。 1.普通延时法 这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来实现,不过要做的比较精准还是要下一番功夫。下面的代码是在网上搜到的,经测试延时比较精准。 断方式 如下,定义延时时间time_delay,SysTick_Config()定义中断时间段,在中断中递减time_delay,从而实现延时。 volatile unsigned long time_delay; 中断方式 主要仿照原子的《STM32不完全手册》。SYSTICK 的时钟固定为HCLK 时钟的1/8,在这里我们选用内部时钟源72M,所以SYSTICK的时钟为9M,即SYSTICK 定时器以9M的频率递减。SysTick 主要包含CTRL、LOAD、VAL、CALIB 等4 个寄存器, 程序如下,相当于查询法。 //仿原子延时,不进入systic中断

void delay_us(u32 nus) { u32 temp; SysTick->LOAD = 9*nus; SysTick->VAL=0X00;//清空计数器 SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源 do { temp=SysTick->CTRL;//读取当前倒计数值 }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达 SysTick->CTRL=0x00; //关闭计数器 SysTick->VAL =0X00; //清空计数器 } void delay_ms(u16 nms) { u32 temp; SysTick->LOAD = 9000*nms; SysTick->VAL=0X00;//清空计数器 SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源 do { temp=SysTick->CTRL;//读取当前倒计数值 }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达 SysTick->CTRL=0x00; //关闭计数器 SysTick->VAL =0X00; //清空计数器 } 三种方式各有利弊,第一种方式容易理解,但不太精准。第二种方式采用库函数,编写简单,由于中断的存在,不利于在其他中断中调用此延时函数。第三种方式直接操作寄存器,看起来比较繁琐,其实也不难,同时克服了以上两种方式的缺点,个人感觉比较好用。

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

C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时 应该使用unsigned char作为延时变量。以某晶振为12MHz的单片 机为例,晶振为12M H z即一个机器周期为1u s。一. 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 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) { unsigned char i,j,k; for(i=5;i>0;i--) for(j=132;j>0;j--) for(k=150;k>0;k--); } 三. 10ms延时子程序 程序: 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--);

CVAVR 软件中启动delay库,调用delay_ms()函数,自动带了喂狗程序

CV A VR 软件中启动delay.h库,调用delay_ms()函数,自动带了喂狗程序 近期在学习中发现个问题,CV A VR 中启动delay.h库,调用delay_ms()函数延时,系统怎么都不复位重启,即使打开看门狗熔丝位,看门狗也不会重启,找了很久原因,发现是调用调用系统自身带的delay_ms()函数引起的,换成自己的简单延时函数,问题就解决,看门狗可以正常工作,后面附带我自己写的简单延时函数。 后来查找问题,发现系统中的delay_ms()函数自带了喂狗程序,所以不会自动的重启,请大家放心使用,用延时函数看门狗不溢出是正常的。后面附带软件编辑后生产的汇编程序,一看就知道确实带了喂狗。 今天写出来供大家注意,不要犯我同样的问题。 /***************************************************** This program was produced by the CodeWizardA VR V1.25.9 Standard Chip type : A Tmega8L Program type : Application Clock frequency : 1.000000 MHz Memory model : Small External SRAM size : 0 Data Stack size : 256 *****************************************************/ #include #include // Declare your global variables here void main(void) { // Declare your local variables here // Input/Output Ports initialization // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0x00; // Port C initialization // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00; DDRC=0x00; // Port D initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T

单片机写延时程序的几种方法

单片机写延时程序的几种方法 1)空操作延時(12MHz) void delay10us() { _NOP_(); _NOP_(); _NOP_(); _NOP_(); _NOP_(); _NOP_(); } 2)循環延時 (12MHz) Void delay500ms() { unsigned char i,j,k; for(i=15;i>;0;i--) for(j=202;j>;0;j--) for(k=81;k>;0;k--); }

延時總時間=[(k*2+3)*j+3]*i+5 k*2+3=165 us 165*j+3=33333 us 33333*i+5=500000 us=500 ms 3)計時器中斷延時(工作方式2) (12MHz) #include; sbit led=P1^0; unsigned int num=0; void main() { TMOD=0x02; TH0=6; TL0=6; EA=1; ET0=1; TR0=1; while(1) { if(num==4000) { num=0;

led=~led; } } } void T0_time() interrupt 1 { num++; } 4)C程序嵌入組合語言延時 #pragma asm …… 組合語言程序段 …… #pragma endasm KEIL軟件仿真測量延時程序延時時間

這是前段事件總結之延時程序、由於不懂組合語言,故NO.4無程序。希望對你有幫助!!! 對於12MHz晶振,機器周期為1uS,在執行該for循環延時程式的時候 Void delay500ms() { unsigned char i,j,k; for(i=15;i>;0;i--) for(j=202;j>;0;j--) for(k=81;k>;0;k--); } 賦值需要1個機器周期,跳轉需要2個機器周期,執行一次for循環的空操作需要2個機器周期,那么,對於第三階循環 for(k=81;k>;0;k--);,從第二階跳轉到第三階需要2機器周期,賦值需要1個機器周期,執行81次則需要2*81個機器周期,執行一次二階for循環的事件為81*2+1+2;執行了220次,則(81*2+3)*220+3,執行15次一階循環,則 [(81*2+3)*220+3]*15,由於不需要從上階跳往下階,則只加賦值的一個機器周期,另外進入該延時子函數和跳出該函數均需要2個機器周期,故

延时计算

t=n*(分频/f) t:是你所需的延时时间 f:是你的系统时钟(SYSCLK) n:是你所求,用于设计延时函数的 程序如下: void myDelay30s() reentrant { unsigned inti,k; for(i=0;i<4000;i++) /*系统时钟我用的是24.576MHZ,分频是12分频,达到大约10s延时*/ for(k=0;k<8000;k++); } //n=i*k |评论 2012-2-18 20:03 47okey|十四级 debu(g调试),左侧有运行时间。在你要测试的延时子函数外设一断点,全速运行到此断点。记下时间,再单步运行一步,跳到下一步。再看左侧的运行时间,将这时间减去上一个时间,就是延时子函数的延时时间了。不知能不能上图。 追问 在delayms处设置断点,那么对应的汇编语言LCALL是否被执行呢?还有,问问您,在C8051F020单片机中,MOV指令都是多少指令周期呢?我在KEIL下仿真得出的结果,与我通过相应的汇编语言分析的时间,总是差了很多。 回答 C编译时,编译器都要先变成汇编。只想知道延时时间,汇编的你可以不去理会。只要看运行时间就好了。 at8051单片机12m晶振下,机器周期为1us,而c8051 2m晶振下为1us。keil 调试里频率默认为24m,你要设好晶振频率。

|评论 2012-2-23 11:17 kingranran|一级 参考C8051单片机内部计时器的工作模式,选用合适的计时器进行中断,可获得较高精度的延时 |评论 2012-2-29 20:56 衣鱼ccd1000|一级 要是精确延时的话就要用定时器,但定的时间不能太长,长了就要设一个变量累加来实现了; 要是不要求精确的话就用嵌套for函数延时,比较简单,但是程序复杂了就会增添不稳定因素,所以不推荐。 |评论

空函数(延时)

nop函数可以用来延时,请问1个NOP延时多少时间,怎么计算? 附一段说明: void _nop( void ); A NOP instruction is generated, before and behind the nop instruction the peephole is flushed. Code generation for _nop() is exactly the same as the following inline assembly. #pragma asm nop ; inline nop instruction #pragma endasm Returns nothing. value = P0; /* read from port P0 */ MOV R12,P0 _nop(); /* delay for one cycle */ NOP P1 = value; /* write to port P1 */ MOV P1,R12 单片机c语言中nop函数的使用方法和延时计算默认分类2010-08-28 15:39:40 阅读41 评论0 字号:大中小订阅. 标准的C语言中没有空语句。但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果。 这在汇编语言中很容易实现,写几个nop就行了。 在keil C51中,直接调用库函数: #include // 声明了void _nop_(void); _nop_(); // 产生一条NOP指令 作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP 指令,延时几微秒。 NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。 对于延时比较长的,要求在大于10us,采用C51中的循环语句来实现。 在选择C51中循环语句时,要注意以下几个问题 第一、定义的C51中循环变量,尽量采用无符号字符型变量。 第二、在FOR循环语句中,尽量采用变量减减来做循环。 第三、在do…while,while语句中,循环体内变量也采用减减方法。 这因为在C51编译器中,对不同的循环方法,采用不同的指令来完成的。

第六章 自相关

第六章 自相关 第一节 自相关的概念 一、自相关的概念 1.自相关的概念 在经典假定中,要求线性回归模型中随机误差项i ε满足无自相关,即 Cov(,)0i j εε= (i j ≠;,1,2,,i j n =L L ) 自相关就是指回归模型中随机误差之间相关,即 Cov(,)0i j εε≠ (i j ≠) 也可以称为序列相关。 2.一阶自相关与一阶自回归 若1Cov(,)0t t εε-≠,则称为随机误差序列存在一阶自相关。 这里主要讨论t ε,1t ε-满足下列关系的情况: t ε=ρ1t ε-+t ν 其中,11ρ-<<,t ν为误差项,且满足所有经典假定,即t ν 满足下列条件: (1)零期望()0t E ν=; (2)同方差2Var()t ννσ==常数; (3)无序列相关Cov(,)0t s νν=(t s ≠); (4)与1t ε-不相关1Cov(,)0t t εν-= 则称为t ε为一阶线性自相关,也称t ε为一阶自回归。 3.在t ε满足一阶自回归的形式下,关于t ε的特点 ()0t E ε=

2 22Var()1v t εσεσρ ===-常数 2Cov(,)s t t s εεερσ-= ()s t ≠ 可见当1Cov(,)0t t εε-≠时,且t ε=ρ1t ε-+t ν,即在t ε满足一阶自回归的形式时,t ε满足零期望假定,满足同方差假定,但不满足Cov(,)0t t s εε-= ()s t ≠的无自相关的假定。 令12(,)n εεεε=L ,将(6.1.5)式和(6.1.6)式用矩阵表示为: 2()T E εεεσ=Ω=221v σρ-2121231...1.....................1n n n n n ρρρρ ρρρρρ-----?????????????? 其中,ρ是自相关系数, 12Cov(,) t t εεερσ-== 二、自相关产生的原因 自相关产生的原因是多方面的,主要有: 1. 经济变量的惯性作用 2. 模型设定不当的影响 3. 一些随机干扰因素的影响 4. 数据处理的影响 自相关性产生的原因很多,比如,农产品供给反映出的一种“蛛网现象”,即供给对价格的反应滞后了一个时期,因为供给决策的实现需要时间。这种现象也会产生自相关性。另外,还要注意,自相关性一般出现在时间数列中,但在横截面数据中也可能产生自相关现象,这需要具体情况具体分析。 第二节 自相关的后果 一、存在自相关时OLS 估计的性质

各种延时函数

void delay(uint z){ uint x,y; for(x=100;x>0;x--) for(y=z;y>0;y--); } void delay02s(void) //延时0.2秒子程序 { unsigned char i,j,k; //定义3个无符号字符型数据。 for(i=20;i>0;i--) //作循环延时 for(j=20;j>0;j--) for(k=248;k>0;k--); } void delay10ms() { for(a=100;a>0;a--) for(b=225;b>0;b--); } void delay(unsigned char i) { for(j=i;j>0;j--) for(k=125;k>0;k--); } void Delay_xMs(unsigned int x) { unsigned int i,j; for( i =0;i < x;i++ ) { for( j =0;j<3;j++ ); } } void delay(uint count) //delay { uint i; while(count) {

i=200; while(i>0) i--; count--; } } void delay(uint x) { uint a,b; for(a=x;a>0;a--) for(b=10;b>0;b--); } void delay(int ms) { while(ms--) { uchar i; for(i=0;i<250;i++) { _nop_(); _nop_(); _nop_(); _nop_(); } } } void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }

相关文档
最新文档