Keil C を使用してプログラムを作成しています。私は何年もの間立ち往生してきたいくつかの問題を抱えており、私のプログラムはリモコンでSSR(ソリッドステートリレー)を切り替えます。私のプログラムの仕組み: まず、リモコンの赤外線信号を学習し、「DATA」に保存する学習ボタンがあります。リモコンをもう一度押すと、データが「TempDATA」に保存されます。私のプログラムは両方を比較し、エラーがあるかどうかを確認します。エラーがなければ、SSR をトグルし、緑色の LED が点灯します。エラーが発生すると、赤色の LED が点灯します。
ただし、問題は、1 回ではなく 3 回トリガーされることです。それで、エラーがなければ、SSRを「ON、OFF、ON」にします。リモコンのボタンをもう一度押すと、SSR は「オフ、オン、オフ」になります。また、エラーがある場合は、1 つの「E」ではなく「EEE」が表示されます。この問題を解決するにはどうすればよいですか?
/***********************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
Learnボタンを押さずにリモコンボタンを押すと、Data_Readyが1にセットされます。そのため、学習ボタンを押さずにリモコンのボタンを押した場合にのみ比較されます。