microEC 发表于 2023-1-13 13:52:46

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

我跟着冲哥的视频开始学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;

        }
       
}



梁工 发表于 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);
      
}

microEC 发表于 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倍

电子DIY小家 发表于 2023-1-13 16:23:07

首先:你吓得我赶紧打开了我的程序看了一眼,我没写错呀:o
其次:如果想要一个固定的准确的延时又不想自己计算的话,可以用这个ISP软件在线生成

microEC 发表于 2023-1-14 11:09:52

电子DIY小家 发表于 2023-1-13 16:23
首先:你吓得我赶紧打开了我的程序看了一眼,我没写错呀
其次:如果想要一个固定的准确的延时又不想自己计 ...

感谢,

123 发表于 2023-3-26 21:40:37

具体多长时间可以用示波器或逻辑分析仪捕捉。
页: [1]
查看完整版本: 我的delay_ms延时的时间不准,500ms大约有7.5秒。