我正在使用 Keil C 编写我的程序。我有一些问题,我已经被困了很长时间,我的程序将使用遥控器切换 SSR(固态继电器)。我的程序是如何工作的:首先,有一个学习按钮,它将学习遥控器的任何红外信号,并将存储在“数据”中。当我再次按下遥控器时,它会将数据存储到“TempDATA”中。然后我的程序将比较两者并检查是否有错误。如果没有错误,它将切换 SSR 并且绿色 LED 将亮起。如果有任何错误,它将打开红色 LED。
但是,问题在于,它会触发 3 次而不是一次。因此,当没有错误时,它将打开 SSR 'ON,OFF,ON'。如果再次按下遥控器按钮,SSR 将“关闭、打开、关闭”。如果有任何错误,它将显示 'EEE' 而不是 1 '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。所以它只会在我按下遥控器按钮而不按下学习按钮时进行比较。