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

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-01-10 20:43:38

11

主题

58

回帖

917

积分

高级会员

积分
917
发表于 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;

        }
       
}



回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 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);
      
}
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-01-10 20:43:38

11

主题

58

回帖

917

积分

高级会员

积分
917
发表于 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倍
  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

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

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

11

主题

58

回帖

917

积分

高级会员

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

感谢,
  • 打卡等级:以坛为家II
  • 打卡总天数:469
  • 最近打卡:2025-05-03 11:38:32
已绑定手机

20

主题

106

回帖

679

积分

高级会员

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

本版积分规则

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

GMT+8, 2025-5-3 15:14 , Processed in 0.116592 second(s), 84 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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