单片机中delay函数精确延时多少ms?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单片机中delay函数精确延时多少ms?相关的知识,希望对你有一定的参考价值。
参考技术A单片机中的delay()的单位时间不是系统提供的,而是用户自己编制的。
如果用循环语句实现的循环,没法计算,但是可以通过软件仿真看到具体时间,但是一般精精确延时是没法用循环语句实现的。
如果想精确延时,一般需要用到定时器,延时时间与晶振有关系,单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。
最长的延时时间可达216=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。
扩展资料
单片机C语言程序中延时函数delay的原理是:仅仅执行一些,没有实质性影响的所谓“无意义指令”,比如做比大小啊,做某个int的自加运算啊之类的。
单片机的有些程序需要调用延时程序,合理的安排循环次数以及空操作的个数方法:用汇编的话就根据你的当前晶振频率去推算你的指令周期,然后结合需要延迟的时间。
编写延迟程序,用C的话还是要看最后生成的汇编码是什么样的了。最简单的方法就是写好程序以后再编译器里软仿真看时间。
单片机C语言延时需注意的问题:
标准的C语言中没有空语句。但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果。这在汇编语言中很容易实现,写几个nop就行了。
在keil C51中,直接调用库函数:
#include // 声明了void _nop_(void);
_nop_(); // 产生一条NOP指令
作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒。NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。对于延时比较长的,要求在大于10us,采用C51中的循环语句来实现。
NRF51822自学笔记 流水灯
最近在学nrf51822这个板子,下载程序点灯啥的零零碎碎弄了一天……例程blinky_example中包含了gpio.h和delay.c
看main.c之前我先看了这两个,例程里应用了一个简单不精确的延时函数,用循环内延时微秒函数实现延时毫秒,挺有意思的……
- void nrf_delay_ms(uint32_t volatile number_of_ms)
- {
- while(number_of_ms != 0)
- {
- number_of_ms--;
- nrf_delay_us(999);
- }
- }
void nrf_delay_ms(uint32_t volatile number_of_ms) { while(number_of_ms != 0) { number_of_ms--; nrf_delay_us(999); } }
- int main(void)
- {
- uint8_t output_state = 0;
- // Configure LED-pins as outputs
- nrf_gpio_range_cfg_output(LED_START,LED_STOP);
- while(true)
- {
- nrf_gpio_port_write(LED_PORT, 1 << (output_state + LED_OFFSET));
- output_state = (output_state + 1) &STATE_MASK;
- nrf_delay_ms(100);
- }
- }
int main(void) { uint8_t output_state = 0; // Configure LED-pins as outputs nrf_gpio_range_cfg_output(LED_START,LED_STOP); while(true) { nrf_gpio_port_write(LED_PORT, 1 << (output_state + LED_OFFSET)); output_state = (output_state + 1) &STATE_MASK; nrf_delay_ms(100); } }
LED_OFFSET=2,也就是说nrf_gpio_port_write()STATE_MASK,每经历一次while循环output_state的值加1,第二次循环中便有1<<3=1000,初始化了第二个灯gpio pin 19。
STATE_MASK即为取其最后一位,所以在这个条件下,修改LED_START和LED_STOP的值(修改初始化范围)最多只能点亮18,19两个灯,若要点亮其他灯(最多仍然两个)则需修改LED_OFFSET的值,来改变你第一个要点亮的灯。
若要点亮多个灯则需修改STATE_MASK的值,若改为0x07即0111,会看到五个灯流水点亮0.0~
以上是关于单片机中delay函数精确延时多少ms?的主要内容,如果未能解决你的问题,请参考以下文章