?? ird.c.bak
字號(hào):
/*
單片機(jī)紅外遙控試驗(yàn)
趙亮
zhaoliang_0801@dl.cn
說(shuō)明: 由于這個(gè)試驗(yàn)不是我的原創(chuàng),所以沒有過(guò)多的發(fā)言權(quán),
我只是在網(wǎng)上找到了程序,修改之后,用到了我的板子上
試驗(yàn)結(jié)果,使用SAA3010 遙控器,板子上焊接紅外接收頭
注意一定要在接收頭的電源也地端一定要接上濾波電容
我接的是一個(gè)10uf和一個(gè)104,效果還可以。
數(shù)據(jù)線接到單片機(jī)的 外部中斷0(P32)
2007-4-12 9:47
加入了 數(shù)碼管顯示,按下0~9之后,會(huì)有對(duì)應(yīng)的顯示
試驗(yàn)現(xiàn)象:按下遙控器上的0~9按鍵,對(duì)應(yīng)的P2口
會(huì)有二進(jìn)制的指示。
*/
#include "reg51.h"
#include "intrins.h"
unsigned char leddata[]= {
0x03, //"0"
0x9F, //"1"
0x25, //"2"
0x0D, //"3"
0x99, //"4"
0x49, //"5"
0x41, //"6"
0x1F, //"7"
0x01, //"8"
0x09, //"9"
0x11, //"A"
0xC1, //"B"
0x63, //"C"
0x85, //"D"
0x61, //"E"
0x71, //"F"
0x91, //"H"
0xE3, //"L"
0x13, //"n"
0x83, //"u"
0x31, //"P"
0xC5, //"o"
0xFD, //"-"
0xFF, //off
};
sbit SM_1 = P1^6;
sbit SM_2 = P1^7;
#define uchar unsigned char
uchar ykcode; //遙控碼(14位的最后8位)
bit ykok; //遙控?cái)?shù)據(jù)有效標(biāo)志
uchar ykbnum; //遙控已接收位數(shù)
uchar ykbtc; //遙控中斷時(shí) ykbtc=TH1
uchar ykdelay; //遙控延時(shí)接收
bdata uchar ykcodetemp; //遙控臨時(shí)碼
sbit ykcodetemp0=ykcodetemp^0;
unsigned char temp;
void YkInit(void); //遙控接收初始化
unsigned char YkGetcode(void); //返回遙控碼
bit YkTest(void); //檢查有無(wú)遙控信號(hào)
void main(void)
{
YkInit();
SM_1 = 1;
SM_2 = 0;
SBUF = 0xff;
while(1)
{
unsigned char i;
if (ykok)
{
temp=ykcode;
//P2=ykcode;
SBUF = leddata[temp];
for(i=0;i<100;i++);
}
}
}
void YkInit(void)
{
EA=1;
TMOD=0x11; //TMOD T0,T1 mode 1
SCON=0x00;
TH1=0;
TL1=0;
IE|=0x89;
IP|=0x01;
TCON |= 0x41;
ykbnum=0;
ykcodetemp=0;
ykdelay=0;
}
bit YkTest(void)
{
return(ykok);
}
void intx0() interrupt 0 using 2 // use ext int 0 P32
{
ykbtc=TH1;TH1=0;TL1=0;TR1=1;ET1=1;
switch(ykbnum)
{
case(0):
ykbnum=1;
break;
case(1):
if(ykbtc==6)
ykbnum=2;
else
ykbnum=0;
break;
case(2):
if(ykbtc==6||ykbtc==9)
ykbnum=3;
else
ykbnum=0;
break;
case(3):
if(ykbtc==9||ykbtc==6)
ykbnum=4;
else
ykbnum=0;
break;
default:
if(ykbnum<7)
{
if(ykbtc==6)
ykbnum++;
else
ykbnum=0;
}
else
{
if(ykbtc==6)
{
if(ykcodetemp0)
ykcodetemp=ykcodetemp*2+1;
else
ykcodetemp=ykcodetemp*2;
ykbnum++;
}
else if(ykbtc==9)
{
if(ykcodetemp0)
{
ykbnum++;
ykcodetemp=ykcodetemp*2;
}
else
{
ykbnum+=2;
ykcodetemp=ykcodetemp*2;
ykcodetemp=ykcodetemp*2+1;
}
}
else if(ykbtc>11&&ykbtc<15)
{
ykbnum+=2;
ykcodetemp=ykcodetemp*2;
ykcodetemp=ykcodetemp*2+1;
}
else if(ykbtc>30)
EX0=1;
else
ykbnum=0;
}
}
}
void intt1() interrupt 3 using 3 //Use timer1
{
if(ykdelay)
{
ykdelay--;
EX0=0;
} //ykdelay !=0 stop receive
else
{
if(ykbnum==13) //遙控碼最后一位為0,補(bǔ)0
{
ykcode=ykcodetemp*=2;
ykdelay=3;
EX0=0; // stop receive
ykok=1; // data valid
}
else if(ykbnum==14) //遙控碼最后一位為1,不用補(bǔ)
{
ykcode=ykcodetemp;
ykdelay=3;
EX0=0; // stop receive
ykok=1; // data valid
}
else
EX0=1; // continue to receive
ykbnum=0;
ykcodetemp=0;
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -