在C51环境下编写一个带有实参的延迟1毫秒的延时子函数。
时间: 2024-09-23 16:08:39 浏览: 40
C/C++中关于局部函数中更新实参指针的方法
在C51环境中,由于缺乏标准库中的`delay()`函数,我们通常需要利用定时器和中断机制来实现大约1毫秒的延时。以下是一个简单的示例,假设使用了8051单片机的定时器T0,并且外部晶振频率已知:
```c
#include <reg51.h>
// 假设外部晶振频率是12MHz
#define DELAY_MS 1 // 1毫秒延迟
void delay_ms(uint8_t ms) {
uint16_t start_tick;
// 开启定时器T0计数
TMOD = 0x01; // T0工作模式2:13位自动重装定时器
TH0 = 0xFD; // 设置初始计数值为251,使得计数溢出后能触发中断(12MHz下约等于1.06ms)
TR0 = 1;
// 获取当前定时器值作为起始点
start_tick = TF0;
// 进入无限循环等待定时器溢出
while (TF0 == 0);
// 计算并等待剩余的延迟时间
for (uint8_t i = ms - 1; i > 0; i--) {
if (TF0 == 0) {
__nop(); // 添加无操作指令来填充CPU周期,避免频繁检查TF0
}
}
// 清除定时器标志
TF0 = 0;
}
阅读全文