51单片机写一个1毫秒的延时函数
时间: 2024-05-06 19:16:49 浏览: 114
51单片机的延时函数可以使用定时器来实现,以下是一个简单的实现方式:
首先,需要将定时器1配置为16位定时器,并设置定时器时钟源为系统时钟,计数器初值为65535,定时器模式为16位自动重载模式。然后,在延时函数中,将定时器1的计数器赋值为定时器初值减去延时时间所需的计数值,启动定时器1,等待定时器1计数完成后,关闭定时器1。
具体的代码实现如下:
```
void delay_ms(unsigned int ms)
{
TMOD &= 0xF0; // 将定时器1设置为16位定时器
TL1 = 0xFF; // 设置定时器1的计数器初值为65535
TH1 = 0xFF;
TR1 = 1; // 启动定时器1
while (ms--)
{
while (TF1 == 0); // 等待定时器1计数完成
TF1 = 0; // 清除定时器1的溢出标志
TL1 = 0xFF; // 重新设置定时器1的计数器初值为65535
TH1 = 0xFF;
}
TR1 = 0; // 关闭定时器1
}
```
使用该函数可以通过传入需要延时的毫秒数来实现相应的延时。例如,调用`delay_ms(1000)`即可实现1秒钟的延时。
相关问题
51单片机毫秒延时函数10us
在51单片机中,直接通过硬件计数器实现10us的超短延时通常是不可能的,因为它们的工作频率有限,比如常见的8MHz晶振。然而,如果你需要极短时间的延时,可以采用软件模拟的方式,利用中断机制来达到接近这个需求。
一种常见的做法是使用定时器T1的溢出中断,配合循环计数来逼近10us。以下是一个简单的示例,假设我们使用的是AT89S52这样的单片机:
```c
#include <reg52.h>
void delay_us(unsigned int us)
{
unsigned char count;
volatile unsigned char flag = 0;
// 设置定时器T1工作于模式1,外部时钟分频16
TMOD |= 0x1B; // TR1 = 1, TIF1 = 0, IT1 = 1 (16位自动重装)
TH1 = 0xFD; // 预设值等于高8位计数值,LO=0xFF
while (!flag) {
TF1 = 0; // 清除溢出标志
count = us * 8; // 约定每4个机器周期等于一个定时器周期,这里4微秒
do {
if (TF1 == 1) { // 到达溢出点,标志变为1
flag = 1;
break;
}
} while (--count);
}
}
void main()
{
delay_us(10); // 调用函数实现10us延迟
}
```
请注意,实际的延时精度可能会受到系统其他任务的影响,并非绝对精确的10us。如果对精度要求极高,可能需要更复杂的方案,如使用定时器寄存器做低级操作。
写一个51单片机的延时函数
以下是一个简单的51单片机的延时函数,使用的是循环计数的方法:
```c
void delay(unsigned int ms)
{
unsigned int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 125; j++);
}
```
其中,ms是需要延时的毫秒数,125是通过实验得到的比较准确的循环计数值,可以根据实际情况进行调整。在使用时,只需要调用delay函数并传入需要延时的毫秒数即可。例如,delay(1000)可以让程序延时1秒。
阅读全文