设单片机晶振为12MHZ,写出延时约1s函数及延时时间的计算依据或原理
时间: 2024-09-20 10:04:19 浏览: 82
在单片机中,定时器/计数器常常用于实现延时功能,尤其是在没有外部硬件如RTC(Real-Time Clock)的情况下。由于12MHz晶振频率很高,我们通常会利用其分频来得到我们需要的较低频率,比如1秒等于大约12000000次周期。
一种常见的做法是使用单片机的某个定时器,比如8051系列的Timer 0,它的工作模式可以配置成自动重装模式。我们可以设定定时器初值为(12MHz / (1000 * 机器周期)) - 1,这样当定时器溢出(达到设定的最大值并从零开始计数)时,实际上已经过去了大约1秒的时间。
下面是一个基于8051的简单延时函数示例,假设机器周期为Tcy(对于8051而言,通常取1us):
```c
void delay_ms(unsigned long ms)
{
unsigned long count;
// 计算1秒的定时器初值(这里假设Tcy=1us)
count = (12000000 / 1000) - 1;
// 如果需要1s的延迟,ms参数应为1000
if (ms > 1000) {
ms = 1000; // 假设只支持1s精度的延时
}
// 设置定时器初值
TMOD |= 0x01; // Timer0启用模式1
TH0 = count / Tcy; // 高字节存储
TL0 = count % Tcy; // 低字节存储
do {
// 等待定时器溢出
} while((TH0 != TL0) && (TF0 == 0)); // TF0是定时器溢出标志位
}
阅读全文