📄 ird.c.bak
字号:
/*
单片机红外遥控试验
赵亮
zhaoliang_0801@dl.cn
说明: 由于这个试验不是我的原创,所以没有过多的发言权,
我只是在网上找到了程序,修改之后,用到了我的板子上
试验结果,使用SAA3010 遥控器,板子上焊接红外接收头
注意一定要在接收头的电源也地端一定要接上滤波电容
我接的是一个10uf和一个104,效果还可以。
数据线接到单片机的 外部中断0(P32)
2007-4-12 9:47
加入了 数码管显示,按下0~9之后,会有对应的显示
试验现象:按下遥控器上的0~9按键,对应的P2口
会有二进制的指示。
*/
#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; //遥控数据有效标志
uchar ykbnum; //遥控已接收位数
uchar ykbtc; //遥控中断时 ykbtc=TH1
uchar ykdelay; //遥控延时接收
bdata uchar ykcodetemp; //遥控临时码
sbit ykcodetemp0=ykcodetemp^0;
unsigned char temp;
void YkInit(void); //遥控接收初始化
unsigned char YkGetcode(void); //返回遥控码
bit YkTest(void); //检查有无遥控信号
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,补0
{
ykcode=ykcodetemp*=2;
ykdelay=3;
EX0=0; // stop receive
ykok=1; // data valid
}
else if(ykbnum==14) //遥控码最后一位为1,不用补
{
ykcode=ykcodetemp;
ykdelay=3;
EX0=0; // stop receive
ykok=1; // data valid
}
else
EX0=1; // continue to receive
ykbnum=0;
ykcodetemp=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -