Embedded 针对8051的特定时间段执行

Embedded 针对8051的特定时间段执行,embedded,microcontroller,8051,mikroc,Embedded,Microcontroller,8051,Mikroc,请帮个忙 我正在使用MikroC编译器为8051微控制器编写一个程序,我试图找到一种方法来执行并重复主程序10秒,然后停止2秒 下面的代码只是一个示例,我需要每200毫秒切换端口2,重复10秒,然后停止2秒,然后重复此操作 void main() { P2 = 0xAE; while (1) { P2 = ~P2; Delay_ms(200); } } 谢谢您可以使用计数器测量时间:例如: #define MS_PER_TICK

请帮个忙

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

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

void main()
{
    P2 = 0xAE;

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

谢谢

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

#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;
        }
    }
}
#每勾200定义MS_
#在10中定义闪烁周期
#在\u S 2中定义暂停\u周期\u
#以刻度定义闪烁周期(每刻度闪烁周期*1000/MS)
#定义以刻度为单位的暂停周期(以刻度为单位的暂停周期*每刻度1000/MS)
真空总管(真空){
无符号字符记号=0;
P2=0xAE;
对于(;;){
延迟毫秒(每滴答毫秒);
ticks++;

如果(滴答声是
Delay_ms()一个MICC库的函数?你是否考虑过用计数器来测量10秒和2秒?BTW,你的源是不完整的,不能编译。谢谢你的回放。例子中的代码是正确的和测试的。MikroC有很多奇怪的东西。commands@Elia:您不能使用延迟来完成此操作,因为您不知道剩余的时间有多长您的代码需要执行。您需要一种测量时间或时钟滴答声的方法。最简单的方法可能是创建一个1毫秒定时器,它将以原子方式递增一个变量,然后在该变量大于10000时动作。@Groo这取决于所需的200毫秒精度。在显示的代码中,其他指令和循环的开销低于延迟,因此可以忽略不计。您使用的是哪个8051 mcu?非常感谢为了您的支持,我已经将它应用到我的代码中,它工作得非常完美,唯一的问题是它从未切换到案例(2)下面的代码这个近似值可能适用于简单的程序,但是未来来这里要求类似解决方案的读者可能会产生错误的印象,认为它通常是正确的。微控制器中的计时问题应该使用定时器来解决。我已经测试了通过串行端口发送文本消息的代码解决方案t,它是有效的perfectly@Groo没有查看
Delay_ms()的源代码
我们不知道它是如何延迟的。很可能有一个计时器的滴答声正好是1毫秒,就像水晶一样精确。程序的其余部分将需要远小于1毫秒的时间,这样就可以了。但正如前面所说,我们对准确度没有要求,这就是为什么我选择了尽可能接近OP代码的简单解决方案。@Elia使用串行通信会引入一些明显的延迟,这取决于波特率和发送的字符数。如果您满足您的要求,这很好,但请记住Groo所指的。