找回密码
 立即注册
查看: 1737|回复: 11

STC8h的Delay延时函数 | 已解决

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:493
  • 最近打卡:2025-07-01 00:00:17
已绑定手机

31

主题

142

回帖

1849

积分

金牌会员

积分
1849
发表于 2024-5-18 22:55:22 | 显示全部楼层 |阅读模式
本帖最后由 未元星系 于 2024-5-26 12:44 编辑

STC8H8K64U的毫秒延时函数只能精确在1-255ms吗
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:582
  • 最近打卡:2025-07-02 00:07:39

11

主题

1204

回帖

5606

积分

论坛元老

积分
5606
发表于 2024-5-19 00:19:56 | 显示全部楼层
你可以用这个啊。精确在1-65535ms


/*********************************************
                程序名称        :延时函数
*********************************************/

//#define MAIN_Fosc 48000000L        //定义主时钟
//#define MAIN_Fosc 44236800L        //定义主时钟
//#define MAIN_Fosc 40000000L        //定义主时钟
//#define MAIN_Fosc 36864000L        //定义主时钟
//#define MAIN_Fosc 35000000L        //定义主时钟
//#define MAIN_Fosc 33177600L        //定义主时钟
//#define MAIN_Fosc 30000000L        //定义主时钟
//#define MAIN_Fosc 27000000L        //定义主时钟
//#define MAIN_Fosc 24000000L        //定义主时钟
//#define MAIN_Fosc 22118400L        //定义主时钟
//#define MAIN_Fosc 20000000L        //定义主时钟
//#define MAIN_Fosc 18432000L        //定义主时钟
#define MAIN_Fosc 12000000L        //定义主时钟
//#define MAIN_Fosc 11059200L        //定义主时钟
//#define MAIN_Fosc 6000000L        //定义主时钟
//#define MAIN_Fosc 5529600L        //定义主时钟

void Delay(unsigned int ms)                //注:ms_max=65536
{
    unsigned int i;
    do
    {
//            i=MAIN_Fosc/96000L;                //STC89/90_12T
//            i=MAIN_Fosc/48000L;                //STC89/90_6T
//            i=MAIN_Fosc/14000;                //STC12
//            i=MAIN_Fosc/13000;                //STC15
            i=MAIN_Fosc/10000;                //STC8
//            i=MAIN_Fosc/6030;                 //STC32
            while(--i)        ;
            }
    while(--ms);
}
回复 支持 2 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:351
  • 最近打卡:2025-06-29 00:53:31
已绑定手机

14

主题

600

回帖

2267

积分

荣誉版主

积分
2267
发表于 2024-5-19 00:33:51 | 显示全部楼层
时钟不同,能延时的范围也不同,还有分频,这些都有关系.修改一下看看
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:581
  • 最近打卡:2025-07-01 07:54:52

116

主题

2040

回帖

5905

积分

论坛元老

积分
5905
发表于 2024-5-19 08:01:56 | 显示全部楼层
angm*** 发表于 2024-5-19 00:19
你可以用这个啊。精确在1-65535ms

好资料,先收藏,谢谢分享!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:483
  • 最近打卡:2025-07-02 00:02:29
已绑定手机

19

主题

3233

回帖

5357

积分

论坛元老

积分
5357
发表于 2024-5-19 08:02:23 来自手机 | 显示全部楼层
这个不错只要有主频就可以计算延时
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:519
  • 最近打卡:2025-07-01 21:48:45

23

主题

184

回帖

1761

积分

金牌会员

积分
1761
发表于 2024-5-19 10:29:25 | 显示全部楼层
很好的万能延时函数,收藏了。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:456
  • 最近打卡:2025-07-02 02:44:02
已绑定手机

17

主题

713

回帖

1403

积分

金牌会员

积分
1403
发表于 2024-5-19 10:45:04 | 显示全部楼层
还是用定时器+计数器比较好
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:114
  • 最近打卡:2025-07-01 08:26:02

741

主题

1万

回帖

1万

积分

管理员

积分
17304
发表于 2024-5-19 11:12:01 | 显示全部楼层
截图202405191111035873.jpg


截图202405191111588170.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:219
  • 最近打卡:2025-06-27 10:56:19
已绑定手机

36

主题

563

回帖

1980

积分

荣誉版主

积分
1980
发表于 2024-5-19 11:53:58 | 显示全部楼层
如果只是临时需要延时,直接可以把库函数中的unsigned char里把char改成int,这样肯定比255大,不会出现溢出。
如果使用延时函数,有相对高的要求,可以参考以下三种方案:
第一种,在常用的主频确定的情况下,用STC-ISP里的“软件延时计数器”,分别生成1us和1ms的精确延时,然后改写成对应的Delay_us和Delay_ms函数,如下:
void Delay1ms(void)        //@22.1184MHz
{
        u8 data i, j;

        _nop_();
        _nop_();
        i = 22;
        j = 128;
        do
        {
                while (--j);
        } while (--i);
}

void Delay_ms(u16 ms)
{
    u16 i;
    for(i=0;i<ms;i++)
    {
        Delay1ms();
    }
}

第二种:把一个不经常用的定时器,改写成延时函数,可以实现非常精准的延时。
第三种:二楼那位的回答。

每一种方式都各有优略,但还是推荐第一种,毕竟初学者一般从开始点灯到后期整板成一个小项目,基本不会过多的去改变主频。利用官方isp生成相对精准且可靠的延时满足使用即可。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:493
  • 最近打卡:2025-07-01 00:00:17
已绑定手机

31

主题

142

回帖

1849

积分

金牌会员

积分
1849
发表于 2024-5-19 13:11:28 | 显示全部楼层
Yim_*** 发表于 2024-5-19 11:53
如果只是临时需要延时,直接可以把库函数中的unsigned char里把char改成int,这样肯定比255大,不会出现溢 ...

谢谢大佬,很有帮助

点评

客气  详情 回复 发表于 2024-5-19 18:29
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-7-2 06:58 , Processed in 0.152133 second(s), 121 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表