當前位置:編程學習大全網 - 編程語言 - 51單片機紅外解碼C程序

51單片機紅外解碼C程序

單片機采用外部中斷P3.3管腳和紅外接收頭的信號線相連,中斷方式為邊沿觸發方式。並用定時器0計算中斷的間隔時間,來區分前導碼、二進制的“1”、“0”碼。並將8位操作碼提取出來在數碼管上顯示。

// 解碼值在Im[2]中,當IrOK=1時解碼有效。?

/* 51單片機紅外遙控解碼程序 */

//用遙控器對準紅外接收頭,按下遙控器按鍵,在數碼管前兩位上就會顯示對應按鍵的編碼

#include <reg52.h>

#define uchar unsigned char?

sbit dula=P2^6;

sbit wela=P2^7;

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar f;

#define Imax 14000 //此處為晶振為11.0592時的取值,?

#define Imin 8000 //如用其它頻率的晶振時,

#define Inum1 1450 //要改變相應的取值。

#define Inum2 700?

#define Inum3 3000

unsigned char Im[4]={0x00,0x00,0x00,0x00};

uchar show[2]={0,0};

unsigned long m,Tc;

unsigned char IrOK;

void delay(uchar i)

{

uchar j,k;?

for(j=i;j>0;j--)

for(k=125;k>0;k--);

}

void display()

{

dula=0;

P0=table[show[0]];

dula=1;

dula=0;

wela=0;

P0=0xfe;

wela=1;

wela=0;

delay(5);

P0=table[show[1]];

dula=1;

dula=0;

P0=0xfd;

wela=1;

wela=0;

delay(5);

} //外部中斷解碼程序

void intersvr1(void) interrupt 2 using 1

{

Tc=TH0*256+TL0;? //提取中斷時間間隔時長

TH0=0;?

TL0=0;? //定時中斷重新置零

if((Tc>Imin)&&(Tc<Imax))

{?

m=0;

f=1;

return;

}? //找到啟始碼

if(f==1)

{

if(Tc>Inum1&&Tc<Inum3)?

{

Im[m/8]=Im[m/8]>>1|0x80; m++;?

? }

? if(Tc>Inum2&&Tc<Inum1)?

{

?Im[m/8]=Im[m/8]>>1; m++; //取碼

}

if(m==32)?

{

m=0;?

f=0;

if(Im[2]==~Im[3])?

{

IrOK=1;?

}

else IrOK=0;? //取碼完成後判斷讀碼是否正確

}

//準備讀下壹碼

}

}

/*演示主程序*/

void main(void)

{

unsigned int? a;

m=0;

f=0;

EA=1;

IT1=1;EX1=1;

TMOD=0x11;?

TH0=0;TL0=0;

TR0=1;//ET0=1;

while(1)

{

if(IrOK==1)?

{

show[1]=Im[2] & 0x0F; //取鍵碼的低四位

show[0]=Im[2] >> 4; ?

IrOK=0;

}

for(a=100;a>0;a--)

?{

display();

}

}

}

解碼程序這個就能實現

  • 上一篇:CAD如何將形狀導入CDR?用CAD將形狀導入Coreldraw的過程
  • 下一篇:大學醫學細胞生物學知識點
  • copyright 2024編程學習大全網