找回密码
 立即注册
查看: 1674|回复: 5

我的delay_ms延时的时间不准,500ms大约有7.5秒。

[复制链接]
  • TA的每日心情
    开心
    2024-1-10 20:43
  • 签到天数: 2 天

    [LV.1]初来乍到

    5

    主题

    33

    回帖

    399

    积分

    中级会员

    积分
    399
    发表于 2023-1-13 13:52:46 | 显示全部楼层 |阅读模式
    我跟着冲哥的视频开始学STC32,因为用了某宝的其他家开发板,程序没有和冲哥的完全一样。
    但是delay_ms延时的时间不准,500ms大约有7.5秒。实在想不通。
    请高手帮忙看下。
    我感觉这几处是重要的。看了几遍,找不出问题。

    #define MAINFOSC 24000000UL


    void delay_ms (uint16_t ms)
    {
            uint16_t i;

            i = (uint16_t)(MAINFOSC / 6000UL);


            do
                    {
                    while (--i)
                            {
                            ;
                            }
                    }
            while (--ms);
           
    }
    调用

    delay_ms(500);

    整个程序如下。

    #include "stc.h"
    #include "usb.h"

    #define MAINFOSC 24000000UL

    char *USER_DEVICEDESC = NULL;
    char *USER_PRODUCTDESC = NULL;

    char *USER_STCISPCMD = "@STCISP#";

    volatile int a = 0;

    void delay_ms (uint16_t ms)
    {
            uint16_t i;

            i = (uint16_t)(MAINFOSC / 6000UL);


            do
                    {
                    while (--i)
                            {
                            ;
                            }
                    }
            while (--ms);
           
    }

    void main()
    {
            WTST = 0;
            EAXFR = 1;
            CKCON = 0;
           
            P0M1 = 0xFC;
            P0M0 = 0x00;
           
            P3M1 = 0x03;
            P3M0 = 0x00;       
           
            IRC48MCR = 0x80;
            while (!(IRC48MCR & 0x01));
           
            USBCLK = 0x00;//CDC
        USBCON = 0x90;
           
            usb_init();
           
            EA = 1;
           
            while (1)
            {
    //                for(a = 0;a < 30000;a++)
    //        {
    //                        ;
    //        }
                   
                   
                    if (DeviceState != DEVSTATE_CONFIGURED)
                    {
                            continue;
                    }
                   
                    if (bUsbOutReady)
                    {
                            usb_OUT_done();
                            a++;
                           
                            //printf_hid ("a=%d,%.3f\r\n",a,(0.0-(float)a));
                           
                    }
                   
    //                printf_hid ("a=%d\r\n",a);

                    delay_ms(500);
                    P00 ^= 1;
                    P01 ^= 1;

            }
           
    }



    回复 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    3004

    回帖

    6771

    积分

    超级版主

    积分
    6771
    发表于 2023-1-13 13:56:38 | 显示全部楼层
    延时程序不对,应该如下:
    void delay_ms (uint16_t ms)
    {
            uint16_t i;

            do
                    {
                  i = (uint16_t)(MAINFOSC / 6000UL);
                    while (--i);
                    }
            while (--ms);
          
    }
  • TA的每日心情
    开心
    2024-1-10 20:43
  • 签到天数: 2 天

    [LV.1]初来乍到

    5

    主题

    33

    回帖

    399

    积分

    中级会员

    积分
    399
     楼主| 发表于 2023-1-13 14:01:30 | 显示全部楼层
    本帖最后由 microEC 于 2023-1-13 14:03 编辑
    梁工 发表于 2023-1-13 13:56
    延时程序不对,应该如下:
    void delay_ms (uint16_t ms)
    {

    感谢!
    现在正常了,原来只赋值一次,后面循环时,从65535开始减,所以时间大了约15倍
  • TA的每日心情
    开心
    15 小时前
  • 签到天数: 97 天

    [LV.6]常住居民II

    40

    主题

    1004

    回帖

    6928

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    6928
    QQ
    发表于 2023-1-13 16:23:07 | 显示全部楼层
    首先:你吓得我赶紧打开了我的程序看了一眼,我没写错呀:o
    其次:如果想要一个固定的准确的延时又不想自己计算的话,可以用这个ISP软件在线生成
    1.png
  • TA的每日心情
    开心
    2024-1-10 20:43
  • 签到天数: 2 天

    [LV.1]初来乍到

    5

    主题

    33

    回帖

    399

    积分

    中级会员

    积分
    399
     楼主| 发表于 2023-1-14 11:09:52 | 显示全部楼层
    电子DIY小家 发表于 2023-1-13 16:23
    首先:你吓得我赶紧打开了我的程序看了一眼,我没写错呀
    其次:如果想要一个固定的准确的延时又不想自己计 ...

    感谢,
  • TA的每日心情

    18 小时前
  • 签到天数: 116 天

    [LV.6]常住居民II

    13

    主题

    46

    回帖

    1052

    积分

    金牌会员

    积分
    1052
    发表于 2023-3-26 21:40:37 | 显示全部楼层
    具体多长时间可以用示波器或逻辑分析仪捕捉。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2024-5-13 23:12 , Processed in 0.062709 second(s), 52 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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