我正在使用8051处理器,AT89C51CC03板,并在Keil uVision中编码C.
我正在尝试创建一个循环来检查我的按钮是否被按下并将程序发送回主代码的开头。
按钮位于任意引脚上,即P0_0。如果该引脚变为low = 0
,我希望程序跳回到代码的开头。
到目前为止,我提出的唯一想法是:
if (P0_0 == 0) {
/* Reset */
} else {
/* Body of the rest of the program */
}
我认为这不会令人满意地完成我的过程,因为我不会再看看重置按钮,直到我运行代码的主体,如果它遇到错误或故障,它可能不会回到重置。
答案 0 :(得分:1)
我不确定您的应用程序,但这可能只是您遇到同样问题的几个功能中的第一个:我如何让电路板一次做多件事?有很多解决方案,但一个好的解决方案是 superloop 。 Michael Pont为嵌入式C编程编写了一个名为 Embedded C 的decent introductory book。有一些 关于该大学notes from a lecture of his提供的主题website。
简而言之,您的程序流程应如下所示:
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的this documentation。您不能再次致电main()
:
void reset (void)
{
((void (code *) (void)) 0x0000) ();
}
这不会重置您的外围设备,但至少它会重新初始化您的代码。
答案 1 :(得分:1)
通常您会在RST
针脚和地面之间连接重置按钮。 RST
引脚应使用弱上拉电阻保持高电平,但按下按钮时,它会将此引脚接地并执行硬复位。
如果你不能重新连接按钮,你可以将该引脚导入中断。然后在您的中断中,您可以触发处理器的软复位。这不需要等待当前功能完成。
菲尔指出,无论如何,你很可能想要一个顶级的超级循环。你自己调用main是不正常的。
答案 2 :(得分: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();
}
}