標(biāo)題:
單片機(jī)紅外遙控鍵值讀取器程序
[打印本頁(yè)]
作者:
gzyanbo
時(shí)間:
2021-2-3 17:56
標(biāo)題:
單片機(jī)紅外遙控鍵值讀取器程序
/********************************************************************************
* 描述: *
* 數(shù)碼管顯示 遙控鍵值讀取器 *
* 遙控器接p3.2 *
* *
* *
* *
*******************************************************************************/
#include <reg51.h>
#include <intrins.h>
#define NOP() _nop_() /* 定義空指令 */
//譯碼器管腳定義
sbit LS138A=P2^2; //管腳定義
sbit LS138B=P2^3;
sbit LS138C=P2^4;
sbit RELAY= P2^0; //繼電器驅(qū)動(dòng)線
sbit RELAY1= P2^1; //繼電器驅(qū)動(dòng)線
sbit RELAY2= P2^5; //繼電器驅(qū)動(dòng)線
sbit RELAY3= P2^6; //繼電器驅(qū)動(dòng)線
sbit RELAY4= P2^7; //繼電器驅(qū)動(dòng)線
unsigned char Y0;
//此表為 LED 的字模, 共陰數(shù)碼管 0-9 -
unsigned char code Disp_Tab[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
unsigned long LedOut[5],LedNumVal;
extern unsigned char IRCOM[7];
void delay(unsigned int i); //函數(shù)聲名
void display(unsigned char Key_Val);
extern void IRInit(); //extern 是引用IR.C中的函數(shù)
main()
{
IRInit();
while(1)
{
//顯示紅外鍵碼
display(IRCOM[2]);
}
}
void delay(unsigned int i)
{
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
void display(unsigned char Key_Val)
{
unsigned char i;
/********以下將鍵值送到LED數(shù)碼管顯示*************/
LedNumVal=Key_Val; //把鍵值送到LedNumVal變量中
LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
LedOut[1]=Disp_Tab[LedNumVal%1000/100];
LedOut[2]=Disp_Tab[LedNumVal%100/10]; //十位
LedOut[3]=Disp_Tab[LedNumVal%10]; //個(gè)位
for(i=0; i<4; i++)
{
P0 = LedOut[i] ;
switch(i)
{ //138譯碼
case 3:LS138A=0; LS138B=0; LS138C=0; break;
case 2:LS138A=1; LS138B=0; LS138C=0; break;
case 1:LS138A=0; LS138B=1; LS138C=0; break;
case 0:LS138A=1; LS138B=1; LS138C=0; break;
}
delay(100);
}
P0 = 0;
Y0=0;
switch(IRCOM[2])
{
case 0x16: Y0=0x01; break;
case 0x0c: Y0=0x02; break;
case 0x08: Y0=0x03; break;
case 0x42: Y0=0x04; break;
case 0x18: 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: RELAY=1; break;
case 0x14: RELAY=1; break;
case 0x51: RELAY=0; break;
}
if(Y0==0x01)RELAY=0;//打開(kāi)繼電器
else RELAY=1;
if(Y0==0x02)RELAY1=0;
else RELAY1=1; //關(guān)閉繼電器
if(Y0==0x03)RELAY2=0;
else RELAY2=1;
if(Y0==0x04)RELAY3=0;
else RELAY3=1;
if(Y0==0x05)RELAY4=0;
else RELAY4=1;
}
復(fù)制代碼
/********************************************************************************
* 描述: *
* 數(shù)碼管顯示 遙控鍵值讀取器 *
* 遙控器接p3.2 *
* 現(xiàn)象:當(dāng)按遙控器時(shí),按下事 數(shù)碼管會(huì)有閃爍,為什么會(huì)閃爍呢 *
* *
* 連接方法:使用紅外功能時(shí) J1跳線短接 *
*****************************************************************************8**/
#include <reg51.h>
sbit IRIN = P3^2; //紅外接收器數(shù)據(jù)線
void IRdelay(char x); //x*0.14MS
void beep();
unsigned char IRCOM[7];
extern unsigned char Y0;
extern void display(unsigned char Key_Val);
/*******************************************************************/
void IRInit()
{
IE |= 0x81; //允許總中斷中斷,使能 INT0 外部中斷
TCON |= 0x01; //觸發(fā)方式為脈沖負(fù)邊沿觸發(fā)
IRIN=1; //I/O口初始化
}
/**********************************************************/
void IR_IN(void) interrupt 0
{
unsigned char j,k,N=0;
EX0 = 0;
IRdelay(5);
if (IRIN==1)
{ EX0 =1;
return;
}
//確認(rèn)IR信號(hào)出現(xiàn)
while (!IRIN) //等IR變?yōu)楦唠娖剑^(guò)9ms的前導(dǎo)低電平信號(hào)。
{IRdelay(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)。
{IRdelay(1);}
while (!IRIN) //等 IR 變?yōu)楦唠娖?br />
{IRdelay(1);}
while (IRIN) //計(jì)算IR高電平時(shí)長(zhǎng)
{
IRdelay(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;
}
EX0 = 1;
}
/**********************************************************/
void IRdelay(unsigned char x) //x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1