单片机c语言延时10ms
时间: 2024-11-09 17:11:15 浏览: 24
单片机C语言的延时计算.doc
在单片机上使用C语言实现10毫秒(ms)的延时,通常会利用定时器或者空操作循环(delay loop)来实现。这里我将给出两个常见的方法:
1. **利用定时器中断**:
如果你的单片机有可用的定时器资源,并且支持中断功能,可以设置定时器工作模式,在到达设定的时间点时引发中断。例如,在ATmega328P(Arduino Uno)上,可以使用Timer1进行10ms延时:
```c
#include <avr/io.h>
#include <util/delay.h>
void delay_ms(uint16_t ms) {
TCCR1B |= (1 << CS10); // 使用Prescaler 1:1024
OCR1A = MSB(ms * F_CPU / 1000000 - 1); // 设置OCR1A为延时时间对应的定时器值
TIMSK1 |= (1 << OCIE1A); // 开启OC1A中断
sei(); // 启动全局中断
while(!(TIFR1 & (1 << OCF1A))); // 等待计数溢出
TIMSK1 &= ~(1 << OCIE1A); // 关闭中断
}
```
其中`F_CPU`是CPU频率,`MSB()`函数返回整数的最高位。
2. **空操作延迟(Delay Loop)**:
如果没有硬件定时器,你可以通过循环加上微妙级的延迟来模拟。这虽然效率较低,但对于简单的延时足够了:
```c
#define DELAY_US(x) for(uint8_t i=0; i<(x)*1000UL; ++i)
void delay_ms(uint16_t ms) {
DELAY_US(ms*10);
}
```
这里假设一个微秒(us)大约等于1μs。
阅读全文