单片机汇编语言延时函数时间该如何计算?

单片机汇编语言延时函数时间该如何计算?,第1张

第一个延时,mov指令一个时钟,第二个DJNZ跳转是三个时钟,不跳转两个时钟,从255(0FFH)开始每次减一,255次,共2553-1=764次,最后一次不跳转,只有两个时钟,所以减一,再加上第一条指令的一个时钟,结果是255个时钟,如果时钟周期是一微秒,那么延时了255微秒。第二个延时程序有两个循环,结果是(765+3)765个时钟,再乘以时钟周期就是延时时间了。自己分析吧。

首先确定要拍摄的现实时间,如:要拍摄现实时间的2个小时的过程,想让做出来的视频有5分钟,首先得知道一般视频的帧速率是1秒24帧,即一秒24个画面,那么可以来进行如下计算:

首先拍摄的视频是5分钟长度,即:300秒,

300秒乘24=7200帧,即需要7200张照片,2个小时的现实时间,即2×60×60=7200秒,

在7200秒里拍出7200张照片即:7200秒÷7200张=1秒,得出间隔时间是一秒。

譬如花蕾的开放约需3天3夜,即72小时。

每半小时拍它的一个画幅,以顺序记录开花动作的微变,共计拍摄144个画幅,再通过放映机按正常频率放映(每秒24幅),在6秒钟之内,重现3天3夜的开花过程

扩展资料:

延时摄影又叫缩时摄影(英语:Time-lapsephotography),又称缩时录影。是以一种将时间压缩的拍摄技术,目前也多叫作缩时录影。

延时摄影拍摄主要以自然风光和城市人文以及生物活动为主。自然界中如细胞分裂、卵的孵化、日蚀月蚀、云彩变幻、天文、地理、城市变化、城市生活、交通、科研等多种题材的拍摄。

拍摄设备的选用:一般情况下,我们用5d或者6d来拍摄,镜头具体看拍摄的新场景,一般选用大广角和长焦镜头来拍摄。用RAW格式拍摄,然后带一根快门线,稳定结实的三脚架。

测光模式:建议大家使用全面/平均测光(矩阵测光、权衡式测光),因为延时摄影的拍摄时间很长,而且期间景物不断变化

若是选用中央重点测光或点测光,可能产生测光失误,造成亮部过亮或暗部过暗的问题。

参考资料:

百度百科-延时摄影

单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时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--) ;

}

}2SysTick 定时器延时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))

{

while (1);

}

time_delay=nms;//读取定时时间

while(time_delay);

SysTick->CTRL=0x00; //关闭计数器

SysTick->VAL =0X00; //清空计数器

}

//延时nus

void delay_us(volatile unsigned long nus)

{

//SYSTICK分频--1us的系统时钟中断

if (SysTick_Config(SystemFrequency/1000000))

{

while (1);

}

time_delay=nus;//读取定时时间

while(time_delay);

SysTick->CTRL=0x00; //关闭计数器

SysTick->VAL =0X00; //清空计数器

} //在中断中将time_delay递减。实现延时void

SysTick_Handler(void)

{

if(time_delay)

time_delay--;

DelayMS(300)表示希望系统delay 300毫秒,系统有自己的RTC,根据硬件的晶振(Hz)可以计算出一次振荡大约多少耗时,这样就能大约算出1ms需要多少次振荡;

简单比喻一次振荡需要1us,那1ms就是1000次振荡,300ms就是300x1000次振荡,这样就能大概的计算出300ms delay;

这得看你的CPU运行一条指令得多久,像单片机89C51一般一条1us。

C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言;

尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台;

二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的国际标准语法,称为ANSI C,作为C语言最初的标准。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13063328.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-30
下一篇 2023-05-30

发表评论

登录后才能评论

评论列表(0条)

保存