少于 1 分钟阅读 次阅读

在 STC8 单片机中,要实现阻塞 CPU 进程的简单延时,可以直接使用官方的烧录工具 stc-isp 生成延时代码。

👉 下载地址STC 官方软件下载

使用 stc-isp 生成延时代码的方法

alt text

  1. 打开 stc-isp,选择“软件延时计算器”

  2. 选择指令集
    • 右侧会显示适用的芯片型号,需要找到所用芯片的指令集。
  3. 选择系统频率
    • 由于延时是通过简单的循环操作阻塞 CPU,而循环操作的速度与 CPU 频率相关,因此系统频率的选择必须与实际系统频率一致
    • STC8H 单片机中,内置 IRC(内部振荡时钟),烧录时应正确选择 “输入用户程序运行时的 IRC 频率”,确保与延时计算器中选择的频率一致。
  4. 生成的代码中使用了 _nop_(); 指令时需要引入 <intrins.h> 头文件
    • 否则会导致编译错误。
  5. 点击“生成”后,复制代码到程序中使用

封装延时函数

软件生成的延时代码考虑了入栈、出栈的消耗,但它无法直接指定任意时间的延时。因此,我们可以先生成 1ms 的延时代码,然后封装一个循环调用的函数,以实现任意毫秒的延时。

示例代码(STC8H,系统频率 20MHz)

#include "STC8H.h"
#include <intrins.h>

// 1ms 延时函数(由 stc-isp 生成)
void Delay1ms(void) //@20.000MHz
{
    unsigned char data i, j;
    i = 26;
    j = 247;
    do
    {
        while (--j);
    } while (--i);
}

// 封装的毫秒级延时函数
void Delay_ms(unsigned int ms)
{
    unsigned int cnt;
    for (cnt = 0; cnt < ms; cnt++)
    {
        Delay1ms();
    }
}

注意C语言优化等级

keil中的C语言优化等级应选择默认,否则像这种简单的空循环延时函数可能被编译器优化掉,达不到延时的效果。 alt text

留下评论