0

我在 Keil uVision 中使用 8051 处理器、AT89C51CC03 板和编码 C。

我正在尝试创建一个循环来检查我的按钮是否被按下并将程序发送回主代码的开头。

该按钮位于任意引脚上,即 P0_0。如果该引脚变为low = 0,我希望程序跳回代码的开头。

到目前为止,我想出的唯一想法是:

if (P0_0 == 0) {
  /* Reset */
} else {
  /* Body of the rest of the program */
}

我认为这不会令人满意地完成我的过程,因为在 if 运行我的代码主体之前我不会再查看重置按钮,并且如果遇到错误或故障,它可能无法返回重置。

4

3 回答 3

1

我不确定您的应用程序,但这可能只是您遇到相同问题的几个功能中的第一个:我如何让电路板一次做多个事情?有很多解决方案,但一个好的开始是superloop。Michael Pont 写了一本不错的嵌入式 C 编程入门书,名为Embedded C。从他的大学网站上可以找到他关于这个主题的讲座的一些 笔记。

归结起来,您的程序流程应如下所示:

initialization_stuff();
other_inititialization_stuff();

while(1)
{
    do_something();
    do_something_else();
    do_something_also();
} // do it again!

这些do_something()功能是您的应用程序实际上打算做的事情。您可能会阅读一些传感器,对其做出决定,然后将您的决定结果付诸实践。在几乎所有嵌入式应用程序中,您都想再做一次。该程序将继续运行,直到有人拔掉它。您将在循环中检查该按钮行(if您在上面编写的语句,尽管没有else) 。while(1)

您要执行的此特定操作(软件重置)在您的设备上并不简单。没有可以戳的寄存器来引发重置。最好只在 RST 上连接一个接地的按钮。然后,您甚至不必担心对其进行编程。但如果您必须在软件中执行此操作,请查看 ARM 的此文档。你不能再打电话main()了:

void reset (void)
{
    ((void (code *) (void)) 0x0000) ();
}

这不会重置您的外围设备,但至少会重新初始化您的代码。

于 2013-10-18T22:24:47.993 回答
1

复位处理器(对于没有 Softreset() 函数的处理器)的解决方案是启用看门狗并允许看门狗定时器溢出,从而获得复位并跳转到主函数。

看门狗定时器应设置为比随后的循环更快地溢出。

例如:

while( 1 )
{
    if (P0_0 == 0) 
    {
        /* Reset */
        Enable_Watchdog();    // WDT set to overflow between 5 - 10ms
        DelayMs(50);
    } 
    else  
    {
        /* Body of the rest of the program */
        DoSomething();
        DoSomethingElse();
        AndSoOn();
    }
}
于 2013-10-23T21:55:07.767 回答
1

通常你会在RST引脚和地之间连接你的复位按钮。该RST引脚应使用弱上拉电阻保持高电平,但是当您按下按钮时,它将将该引脚接地并执行硬复位。

如果您无法重新连接按钮,则可以将该引脚引导至中断。然后在您的中断中,您可以触发处理器的软复位。这不需要等待当前函数完成。

正如菲尔在上面指出的那样,无论如何,您很可能希望在您的顶层设置一个超级循环。自己调用 main 一点也不正常。

于 2013-10-19T02:07:01.887 回答