2013-10-18 17 views
0

我正在使用8051處理器,AT89C51CC03板,並在Keil uVision中編碼C.如何在C中爲我的8051,AT89C51CC03板上微控制器創建按鈕軟件復位?

我想創建一個循環,檢查我的按鈕是否按下,並將程序發送回主代碼的開始。

該按鈕位於任意引腳上,即P0_0。如果該引腳變爲low = 0,我希望程序跳回到代碼的開頭。

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

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

我不認爲這會圓滿完成我的過程,我不會重置按鈕再看看,直到後,如果運行的主我的代碼體,如果它遇到錯誤或故障,它可能不會回到重置。

+0

您可以用'P3.2/INT0'或'P3.3/INT1'您的按鈕,而不是腳?或者這塊電路板完成了,不再有可能接線了? –

回答

1

我不確定您的應用程序,但這可能只是您遇到同樣問題的幾個功能中的第一個:我該如何讓該主板一次完成多件事?有很多解決方案,但最好從超級循環開始。 Michael Pont寫了一個decent introductory book嵌入式C編程,稱爲嵌入式C。關於可從他的大學website獲得的主題,有一些 notes from a lecture of his

歸結,你的程序的流程應該是這個樣子:

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)(); 
} 

這不會重置您的外設,但至少它會重新初始化代碼。

1

通常你會連接你的重置按鈕RST引腳和地面。 RST引腳應該用一個弱上拉電阻保持高電平,但是當您按下按鈕時,它會將該引腳接地並執行硬復位。

如果你不能重新連接按鈕,你可以將該引腳引導到一箇中斷。然後在您的中斷中,您可以觸發處理器的軟復位。這不需要等待當前的功能完成。

正如Phil指出的那樣,無論如何,你很可能會想要一個超級頂層。自己調用main是不正常的。

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(); 
    } 
}