|
在網上找了個程序,已修改了遙控鍵值,實現了按紅外遙控器1,2,3,4號鍵,對應學習板P2^0-P2^3 IO口LED燈點亮,熄滅。現在想修改為:4個LED燈對應按鍵號,只能亮一個,其它熄滅。比如按遙控器按1號鍵,對應P2^0燈亮;按2號鍵時,P2^1亮,其它熄滅。
本人水平有限,先謝謝了
程序如下:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
void delay(uchar x); //x*0.14MS
void delay1(int ms);
void beep();
sbit IRIN = P3^2; //紅外接收器數據線
sbit BEEP = P3^7; //蜂鳴器驅動線
sbit RELAY1= P2^0; //繼電器驅動線//繼電器驅動線
sbit RELAY2= P2^1;
sbit RELAY3= P2^2;
sbit RELAY4= P2^3;
uchar IRCOM[7];
main()
{
IRIN=1; //I/O口初始化
BEEP=1;
RELAY1=1;
delay1(10); //延時
IE = 0x81; //允許總中斷中斷,使能 INT0 外部中斷
TCON = 0x01; //觸發方式為脈沖負邊沿觸發
while(1);
} //end main
/**********************************************************/
void IR_IN() interrupt 0 using 0
{
unsigned char j,k,N=0;
EX0 = 0; //關掉外部中斷防止中斷的再次發生進入檢測引導碼階段(9ms的低電平4.5ms的高電平)
delay(15);
if (IRIN==1)
{ EX0 =1; //9ms的檢測檢測結束從新打開外部中斷
return;
}
//確認IR信號出現
while (!IRIN) //等IR變為高電平,跳過9ms的前導低電平信號。
{delay(1);}
for (j=0;j<4;j++) //收集四組數據
{
for (k=0;k<8;k++) //每組數據有8位
{
while (IRIN) //等 IR 變為低電平,跳過4.5ms的引導高電平信號。
{delay(1);}
while (!IRIN) //等 IR 變為高電平
{delay(1);}
while (IRIN) //計算IR高電平時長(0和1的低電平的時長一樣的,只要判斷高電平時長超過0.56ms并小于1.12ms為1否 則為0)
{
delay(1);
N++;
if (N>=30)
{
EX0=1;
return;
} //0.14ms計數過長自動離開。
} //高電平計數完畢
IRCOM[j]=IRCOM[j] >> 1; //數據最高位補“0”
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //高電平持續時間大于1.12ms則數據最高位補“1”
N=0;
}//end for k
}//end for j
if (IRCOM[2]!=~IRCOM[3]) // 判斷有沒有誤碼(有責放棄沒有判斷鍵碼)
{ EX0=1;
return;
}
switch(IRCOM[2])
{ // 顯示遙控上的字符按鍵
case 0x09:
RELAY1=!RELAY1;
break;
case 0x0c:
RELAY2=!RELAY2;
break;
case 0x0e:
RELAY3=!RELAY3;
break;
case 0x00:
RELAY4=!RELAY4;
}
beep();
EX0 = 1;
}
/**********************************************************/
void beep()
{
unsigned char i;
for (i=0;i<100;i++)
{
delay(4);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //關閉蜂鳴器
}
/**********************************************************/
void delay(unsigned char x) //x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
/**********************************************************/
void delay1(int ms)
{
unsigned char y;
while(ms--)
{
for(y = 0; y<250; y++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
|
|