延迟循环有问题 不知如何修改

我设置了p34-p36延迟循环6000-9000毫秒
但是这玩意40秒才亮一次


#include <reg52.h>
#include <stdlib.h>

sbit EN = P1^6;               //使能    
sbit A1 = P1^7;
sbit B1 = P1^5;

sbit Key1 = P1^0;
sbit Key2 = P1^1;                //按键
sbit Key3 = P1^2;                //按键

sbit Key4 = P3^7;             //按键!
sbit Key5 = P3^5;             //按键!
sbit Key6 = P3^4;             //按键!
sbit Key7 = P3^6;             //按键!

void delay_ms(unsigned int time_ms) {
    unsigned int i, j;
    for (i = 0; i < time_ms; i++) {
        for (j = 0; j < 1000; j++) {
            // 指令延迟
        }
    }
}

unsigned int generate_random_delay() {
    srand(TL0); // 使用定时器 TL0 的值作为种子
    return (rand() % 3001) + 6000; // 在6000到9000毫秒之间生成随机延迟时间
}

void D_MS(void){
    unsigned int i = 80;     //速度 (快60-10000慢)(B-04螺距为3mm时600=200转/分钟,即每秒滑块走10mm)(B-05螺距为2mm时500=250转/分钟,即8.3mm/S)
    for(; i > 0; i--) {       //(B-05螺距为2mm时1200=100转/分钟,即3.3mm/S)(B-05螺距为2mm时2200=25转/分钟,即2mm/S)
        delay_ms(1);
    }        
}

void RRM(void){    
    EN = 1;  
    A1 = 1;
    D_MS();
    B1 = 1;
    D_MS();
    A1 = 0;
    D_MS();
    B1 = 0;
    D_MS();    
    EN = 0;
}

void LLM(void){    
    EN = 1;
    B1 = 0;
    D_MS();
    A1 = 0;
    D_MS();
    B1 = 1;
    D_MS();
    A1 = 1;
    D_MS();
    EN = 0;
}

void main() {
    A1 = 0;
    B1 = 0;
    EN = 0; 
    while(1) {
        if(Key2 == 0) {
            delay_ms(20); // 按键去抖动
            if(Key2 == 0) {
                RRM();
            }
            while(Key2 == 0) {} // 等待按键释放
        }
        if(Key3 == 0) {
            delay_ms(20); // 按键去抖动
            if(Key3 == 0) {
                LLM();
            }
            while(Key3 == 0) {} // 等待按键释放
        }
        if(Key4 == 0) {
            delay_ms(20); // 按键去抖动
            if(Key4 == 0) {
                RRM();
            }
            while(Key4 == 0) {} // 等待按键释放
        }
        if(Key5 == 0) {
            delay_ms(20); // 按键去抖动
            if(Key5 == 0) {
                LLM();
            }
            while(Key5 == 0) {} // 等待按键释放
        }

        delay_ms(1);

        Key7 = 0;
        delay_ms(600);
        Key7 = 1;

        delay_ms(1);

        Key6 = 0;
        delay_ms(600);
        Key6 = 1;

        delay_ms(generate_random_delay());
    }
}


引用 皆我百晓生 小程序回复内容作答:

在你的代码中,延迟函数 delay_ms 中有两个嵌套的循环,用于实现时间延迟。目前,你使用的是一个固定的延迟时间 delay_ms(1)。这会导致每次循环的延迟时间非常短,导致亮灯时间间隔很短,大约40秒才亮一次。

解决方法是通过修改 delay_ms 函数来实现所需的延迟时间。你可以使用定时器来生成精确的延迟时间。

以下是修改后的代码示例:

void delay_ms(unsigned int time_ms) {
    // 使用定时器 T0 来实现延迟
    TMOD |= 0x01; // 设置 T0 为模式 116 位定时器
    TH0 = (65536 - 922); // 设置计数初值,用于延迟大约 1ms
    TL0 = (65536 - 922);
    TR0 = 1; // 启动定时器
    while (time_ms > 0) {
        while (TF0 == 0) {} // 等待定时器溢出
        TR0 = 0; // 停止定时器
        TF0 = 0; // 清除溢出标志
        TH0 = (65536 - 922); // 重新设置初值
        TL0 = (65536 - 922);
        time_ms--; // 减少剩余延迟时间
        TR0 = 1; // 启动定时器
    }
    TR0 = 0; // 停止定时器
}

在这个修改后的 delay_ms 函数中,我们使用了定时器 T0 来实现精确的延迟时间。通过设置计数初值为 (65536 - 922),每次定时器溢出大约需要 1ms 的时间。通过循环等待定时器溢出,并在溢出时重新设置初值,可以实现精确的延迟时间。

通过使用这个修改后的延迟函数,在你的主循环中调用 delay_ms 函数时,可以获得所需的延迟时间,以达到你想要的效果。

【相关推荐】



  • 这篇博客: 老九学堂C语言笔记中的 P34 6.1 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    · · 什么是数组:
    数组是一个变量,由数据类型相同的一组元素组成。(内存中的一串连续的空间)
    数组只有一个名称,即标识符(用来表示数组的变量名);
    元素的下标标明了元素在数组中的位置,从0开始;
    数组中的每个元素都可以通过下标来访问;
    数组长度固定不变,避免数组越界;

    · · 数组的结构和基本要素:
    ① 标识符:数组的名称,用于区分不同的数组
    ② 数组元素:向数组中存放的数据
    ③ 元素下标:对数组元素进行编号
    ④ 元素类型:数组元素的数据类型


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^