【问题标题】:Executing for specific period of time for 8051执行 8051 的特定时间段
【发布时间】:2019-11-28 05:53:10
【问题描述】:

请帮个忙,

我正在使用 MikroC 编译器为 8051 微控制器编写程序,我试图找到一种方法来执行并重复主程序 10 秒,然后停止 2 秒

下面的代码只是一个示例,我需要每 200 毫秒切换两个端口,重复 10 秒,然后停止 2 秒,然后重复此操作。

void main()
{
    P2 = 0xAE;

    while (1) {
        P2 = ~P2;
        Delay_ms(200);
    }
}

谢谢

【问题讨论】:

  • Delay_ms()是MicroC库的函数吗?您是否考虑过使用计数器来测量 10 秒和 2 秒?顺便说一句,您的源代码不完整,无法编译。
  • 感谢您的重播。示例中的代码是正确的并且经过测试。 MikroC 有很多奇怪的命令
  • @Elia:您不能使用延迟来执行此操作,因为您不知道其余代码需要多长时间才能执行。您将需要一种测量时间或时钟滴答声的方法。最简单的方法可能是创建一个(比如说)1 ms 的计时器,它会自动增加一个变量,然后在这个变量大于 10000 时采取行动。
  • @Groo 取决于所需的 200 ms 精度。在显示的代码中,其他指令和循环的开销比延迟低很多,因此可以忽略不计。
  • 你用的是哪个 8051 mcu?

标签: embedded microcontroller 8051 mikroc


【解决方案1】:

您可以使用计数器来测量时间:例如:

#define MS_PER_TICK       200
#define BLINK_PERIOD_IN_S 10
#define PAUSE_PERIOD_IN_S 2

#define BLINK_PERIOD_IN_TICKS (BLINK_PERIOD_IN_S * 1000 / MS_PER_TICK)
#define PAUSE_PERIOD_IN_TICKS (PAUSE_PERIOD_IN_S * 1000 / MS_PER_TICK)

void main(void) {
    unsigned char ticks = 0;

    P2 = 0xAE;

    for (;;) {
        Delay_ms(MS_PER_TICK);
        ticks++;

        if (ticks <= BLINK_PERIOD_IN_TICKS) {
            P2 = ~P2;
        }
        if (ticks == BLINK_PERIOD_IN_TICKS + PAUSE_PERIOD_IN_TICKS) {
            ticks = 0;
        }
    }
}

【讨论】:

  • 非常感谢您的支持,我已经将它应用到我的代码中并且效果很好,唯一的问题是它永远不会切换到case(2)代码如下
  • 这个近似值可能适用于简单的程序,但未来的读者如果来这里寻求类似的解决方案,可能会产生错误的印象,认为它通常是正确的。微控制器中的时序问题需要使用定时器来解决。
  • 我已经测试了该解决方案的代码以通过串行端口发送文本消息,并且效果很好
  • @Groo 如果不查看Delay_ms() 的来源,我们不知道它是如何延迟的。很可能有一个计时器可以精确到 1 毫秒,就像晶体一样精确。程序的其余部分需要的时间远远少于 1 毫秒,所以没问题。但如前所述,我们对准确性没有要求,这就是为什么我选择了尽可能接近 OP 代码的简单解决方案。
  • @Elia 使用串行通信会引入一些明显的延迟,具体取决于波特率和发送的字符数。如果你满足你的要求就可以了,但请记住 Groo 指出的内容。
猜你喜欢
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 2010-12-31
  • 1970-01-01
相关资源
最近更新 更多