【问题标题】:How do I create a push button software reset for my 8051, AT89C51CC03 board micro-controller in C?如何用 C 语言为我的 8051、AT89C51CC03 板微控制器创建按钮软件复位?
【发布时间】:2026-02-07 11:25:01
【问题描述】:

我使用的是 8051 处理器,AT89C51CC03 板,并在 Keil uVision 中编码 C。

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

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

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

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

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

【问题讨论】:

  • 您可以使用P3.2/INT0P3.3/INT1 引脚代替您的按钮吗?还是这块板子做完了,不能再接线了?

标签: c microcontroller 8051


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我不确定您的应用程序,但这可能只是您遇到相同问题的几个功能中的第一个:我如何让电路板一次做多个事情?有很多解决方案,但最好从 superloop 开始。 Michael Pont 为名为 Embedded C 的嵌入式 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() 函数是您的应用程序实际上打算做的事情。您可能会阅读一些传感器,对其做出决定,然后将您的决定结果付诸实践。在几乎所有嵌入式应用程序中,您都想再做一次。该程序将继续运行,直到有人拔掉它。您将在while(1) 循环中检查该按钮行(您在上面编写的if 语句,尽管没有else)。

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

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

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

    【讨论】:

      【解决方案3】:

      复位处理器(对于没有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();
          }
      }
      

      【讨论】: