delay函数在C语言中如何正确使用?

99ANYc3cd6
预计阅读时长 13 分钟
位置: 首页 C语言 正文

C语言标准库中并没有一个叫做 delay 的标准函数。

c语言delay函数怎么用
(图片来源网络,侵删)

这个函数通常出现在特定的编译器或开发环境中,最常见的是 Turbo C(一个非常古老的DOS环境C编译器),在嵌入式系统开发中,我们也常常自己编写类似的延时函数。

delay 函数的用法取决于你使用的开发环境,下面我将分两种情况来详细说明:


在Turbo C等老式编译器中使用(#include <dos.h>

如果你正在使用像 Turbo C 或 Borland C++ 这样的编译器,那么你可以直接使用 delay 函数,它的原型定义在 dos.h 头文件中。

函数原型

void delay(unsigned int milliseconds);

功能

让程序暂停执行指定的毫秒数。

c语言delay函数怎么用
(图片来源网络,侵删)

参数

  • milliseconds: 一个无符号整型,代表你希望延迟的毫秒数。

返回值

无。

头文件

#include <dos.h>

示例代码

下面的代码会在控制台打印 "Hello!",然后暂停2秒(2000毫秒),再打印 "World!"。

#include <stdio.h>
#include <dos.h> // 必须包含这个头文件
int main() {
    printf("Hello!");
    // 暂停2000毫秒,也就是2秒
    delay(2000);
    printf(" World!\n");
    return 0;
}

重要注意事项

  • 精度问题delay 函数的精度并不高,它依赖于系统的时钟中断,实际延迟时间可能比你设定的要长一些。
  • 环境限制:这是DOS时代的产物,在现代的 Windows、Linux 或 macOS 环境下的标准C编译器(如 GCC、Clang、MSVC)中,无法使用这个函数,如果你尝试在 VS Code 或 Dev-C++ 中使用,会编译报错。

在现代开发环境(如嵌入式、Linux、Windows)中实现延时

在现代C语言开发中,我们需要自己实现延时功能,主要有两种方法:软件延时硬件延时

方法A:软件延时(不精确,简单易用)

这种方法通过执行一个空循环来消耗时间,从而达到延时的目的,精度取决于CPU的运行速度,所以是不可移植的。

c语言delay函数怎么用
(图片来源网络,侵删)

简单的空循环延时

最简单的延时就是一个 forwhile 空循环。

void simple_delay(int milliseconds) {
    // 这个循环的迭代次数需要根据你的CPU频率来调整
    // 这是一个非常粗略的估计,在不同机器上效果完全不同
    for (int i = 0; i < milliseconds * 1000; i++) {
        // 空操作,什么也不做
    }
}

缺点:延时时间不确定,CPU占用率高,不推荐在生产代码中使用。

使用 <unistd.h> (Linux/Unix/macOS) 和 <windows.h> (Windows)

更规范的方法是使用操作系统提供的API函数。

在 Linux/Unix/macOS 环境下: 使用 usleep 函数(微秒级延时)或 nanosleep 函数(纳秒级延时)。

  • 头文件:#include <unistd.h>
  • usleep 函数原型:int usleep(useconds_t useconds); (参数单位是微秒,1秒 = 1,000,000微秒)
#include <stdio.h>
#include <unistd.h> // Linux/macOS下的头文件
int main() {
    printf("Hello!");
    // 暂停2,000,000微秒,即2秒
    usleep(2000000); 
    printf(" World!\n");
    return 0;
}

在 Windows 环境下: 使用 Sleep 函数(注意首字母大写)。

  • 头文件:#include <windows.h>
  • Sleep 函数原型:void Sleep(DWORD milliseconds); (参数单位是毫秒)
#include <stdio.h>
#include <windows.h> // Windows下的头文件
int main() {
    printf("Hello!");
    // 暂停2000毫秒,即2秒
    Sleep(2000);
    printf(" World!\n");
    return 0;
}

方法B:硬件延时(精确,常用于嵌入式系统)

在单片机(如STM32, Arduino, 51单片机)等嵌入式开发中,我们通常使用硬件定时器来实现精确的延时,这是最专业、最可靠的方法。

其基本原理是:

  1. 配置定时器:设置一个定时器,让它以某个固定的频率(每1微秒计数一次)向上计数。
  2. 启动定时器:启动定时器并让它从0开始计数。
  3. 等待中断/查询状态:程序可以进入低功耗模式等待定时器溢出中断,或者通过循环查询定时器的计数值是否达到预设值。
  4. 停止定时器:当达到预设的延时时间后,停止定时器,延时结束。

示例(概念性代码,以STM32 HAL库为例):

#include "stm32f1xx_hal.h" // 假设使用STM32 HAL库
// 使用硬件定时器精确延时1毫秒
void precise_delay_1ms() {
    // 假设我们使用TIM2,并已提前配置好
    __HAL_TIM_SET_COUNTER(&htim2, 0); // 计数器清零
    HAL_TIM_Base_Start(&htim2);       // 启动定时器
    // 等待直到计数器达到1000(假设定时器配置为1us计数一次)
    while (__HAL_TIM_GET_COUNTER(&htim2) < 1000);
    HAL_TIM_Base_Stop(&htim2); // 停止定时器
}

这种方法的优点是非常精确,并且CPU在等待时可以进入睡眠模式,不消耗资源


总结与对比

方法 精度 可移植性 CPU占用 适用场景
Turbo C delay() 差(仅DOS环境) 学习历史代码,DOS游戏开发
空循环 for 极差 不推荐,仅用于快速演示
usleep() / Sleep() 好(需区分OS) 低(可让出CPU) 应用程序开发(桌面、服务器)
硬件定时器 最高 差(依赖硬件) 最低(可休眠) 嵌入式系统、单片机开发

给你的建议:

  1. 如果你在做课程作业,老师要求用 delay:那很可能是在 Turbo C 环境下,直接 #include <dos.h> 然后调用即可。
  2. 如果你在做Windows桌面应用:使用 #include <windows.h>Sleep() 函数。
  3. 如果你在做Linux/Unix服务器或脚本:使用 #include <unistd.h>usleep() 函数。
  4. 如果你在做单片机或嵌入式开发请务必学习并使用硬件定时器来实现延时,这是最规范、最可靠的做法。
-- 展开阅读全文 --
头像
谭浩强C语言入门TXT哪里能下载?
« 上一篇 今天
Linux下C语言编程实例如何快速上手?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]