我正在使用Keil C編寫我的程序。我遇到了一些問題,我被拖了很多年,我的程序會用遙控器切換SSR(固態繼電器)。我的程序如何工作:首先,有一個學習按鈕,它將學習遙控器的任何紅外信號,並將它存儲在「數據」中。當我再次按下遙控器時,它會將數據存儲到「TempDATA」中。然後我的程序會比較兩者並檢查是否有錯誤。如果沒有錯誤,它將切換SSR並且綠色LED將亮起。如果有任何錯誤,它將打開紅色LED。關於切換SSR的問題
但問題是,它會觸發3次而不是一次。所以,當沒有錯誤時,它會打開SSR'ON,OFF,ON'。如果再次按下遙控器按鈕,則SSR將「關閉,開啓,關閉」。如果有任何錯誤,它將顯示'EEE'而不是'E'。我如何解決這個問題?
/***********************Problem Solved************************/
通過在添加延遲:
while(1)
{
if(Data_Ready) //Data_Ready = 1
{
/*insert delay here*/
Data_Ready = 0;
Result = 1;
for(j=0;j<30;j++)
.
.
.
的問題就解決了。
/****************************************MAIN*******************************************/
void main(void)
{
unsigned char Result=0;
unsigned int j;
unsigned int x =0;
TMOD = 0x21; //Enable Timer 1 for 2nd Serial Port & Timer0
TH1 = 0xFD; //9600 Baud Rate
SCON0 = 0x50;
SSR = 0;
Learn = 0;
RedLED = 0;
GreenLED= 0;
IE = 0x84; //Enable External Interrupt 1
IT1 = 1; //Set External Interrupt 1 to Edge Triggered.
while(1)
{
if(Data_Ready) //Data_Ready = 1
{
Data_Ready = 0;
Result = 1;
for(j=0;j<30;j++) //Loop 30 times
{
if(DATA[j] != TempDATA[j]) //Compare DATA to TempDATA
{
Result = 0;
break; //break from loop
}
}//end for
if(Result)
{
Result = 0;
GreenLED = 1; //Turn ON GreenLED
RedLED = 0; //Turn OFF RedLED
SSR = ~SSR; //Toggle SSR to ON and OFF
SerialTx('S');
SerialTx('S');
SerialTx('R');
}
else
{
Result = 0;
RedLED = 1; //Turn ON RedLED
GreenLED = 0; //Turn OFF GreenLED
SerialTx('E'); //Print E on MTK to show Error
}
}//end if
}//end while
}//end main
當我按下遙控器按鈕而沒有按下「學習」按鈕時,Data_Ready被設置爲1。所以它只會比較我按遙控器按鈕時沒有按下「學習」按鈕。
你嘗試過在調試器中運行? –
@MitchWheat是的,它工作得很好。 – xrainxfallx
作爲一邊,請不要評論一個循環「//循環30次」 –