|
首先得知道你遙控器按鍵的鍵值。我的是09,所以我程序用的09
#include <reg51.h>
#include <intrins.h>
#define NOP() _nop_() /* 定義空指令 */
#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(void);
sbit IRIN = P3^2; //紅外接收器數(shù)據(jù)線
sbit LED= P1^4; //LED驅(qū)動(dòng)線
sbit BEEP = P1^5; //蜂鳴器驅(qū)動(dòng)線
uchar IRCOM[7];
unsigned char Y0;
main()
{
uchar m;
IE = 0x81; //允許總中斷中斷,使能 INT0 外部中斷
TCON = 0x01; //觸發(fā)方式為脈沖負(fù)邊沿觸發(fā)
IRIN=1; //I/O口初始化
BEEP=1;
LED=1;
delay1(10); //延時(shí)
while(1);
void IR_IN(void) interrupt 0 //外部中斷服務(wù)程序
{
unsigned char j,k,N=0;
EX0 = 0;
delay(15);
if (IRIN==1)
{ EX0 =1;
return;
}
//確認(rèn)IR信號(hào)出現(xiàn)
while (!IRIN) //等IR變?yōu)楦唠娖剑^(guò)9ms的前導(dǎo)低電平信號(hào)。
{delay(1);}
for (j=0;j<4;j++) //收集四組數(shù)據(jù)
{
for (k=0;k<8;k++) //每組數(shù)據(jù)有8位
{
while (IRIN) //等 IR 變?yōu)榈碗娖剑^(guò)4.5ms的前導(dǎo)高電平信號(hào)。
{delay(1);}
while (!IRIN) //等 IR 變?yōu)楦唠娖?br />
{delay(1);}
while (IRIN) //計(jì)算IR高電平時(shí)長(zhǎng)
{
delay(1);
N++;
if (N>=30)
{ EX0=1;
return;} //0.14ms計(jì)數(shù)過(guò)長(zhǎng)自動(dòng)離開(kāi)。
} //高電平計(jì)數(shù)完畢
IRCOM[j]=IRCOM[j] >> 1; //數(shù)據(jù)最高位補(bǔ)“0”
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //數(shù)據(jù)最高位補(bǔ)“1”
N=0;
}//end for k
}//end for j
if (IRCOM[2]!=~IRCOM[3])
{ EX0=1;
return; }
IRCOM[5]=IRCOM[2] & 0x0F; //取鍵碼的低四位
IRCOM[6]=IRCOM[2] >> 4; //右移4次,高四位變?yōu)榈退奈?br />
if(IRCOM[5]>9)
{ IRCOM[5]=IRCOM[5]+0x37;}
else
IRCOM[5]=IRCOM[5]+0x30;
if(IRCOM[6]>9)
{ IRCOM[6]=IRCOM[6]+0x37;}
else
IRCOM[6]=IRCOM[6]+0x30;
lcd_pos(0x4b);
lcd_wdat(IRCOM[6]); //第一位數(shù)顯示
lcd_pos(0x4c);
lcd_wdat(IRCOM[5]); //第二位數(shù)顯示
Y0=0;
switch(IRCOM[2])
{
case 0x09: Y0=0x01; break;
case 0x1D: Y0=0x02; break;
case 0x1F: Y0=0x03; break;
case 0x0D: Y0=0x04; break;
case 0x19: Y0=0x05; break;
case 0x1B: Y0=0x06; break;
case 0x11: Y0=0x07; break;
case 0x15: Y0=0x08; break;
case 0x17: Y0=0x09; break;
case 0x13: Y0=0x0a; break;
case 0x14: Y0=0x0b; break;
case 0x51: Y0=0x0c; break;
}
if(Y0&0x01)LED=0; //打開(kāi)繼電器
else LED=1; //關(guān)閉繼電器
beep();
EX0 = 1;
}
/**********************************************************/
void beep(void)
{
unsigned char i;
for (i=0;i<100;i++)
{
delay(4);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //關(guān)閉蜂鳴器
}
/**********************************************************/
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_();
}
}
}
|
評(píng)分
-
查看全部評(píng)分
|