📄 saa3010.c
字号:
#include<reg51.h>
#include<intrins.h>
#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,k2,k3;
void YkInit(void); //遥控接收初始化
unsigned char YkGetcode(void); //返回遥控码
void display(void);
//bit YkTest(void); //检查有无遥控信号
sbit LE1=P2^7;
sbit A=P2^0;
sbit BB=P2^1;
sbit C=P2^2;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//0,1,2,3,4,5,6,7
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};//8,9,A,B,C,D,E,F,-
void delay1(int ms)
{
unsigned char y;
while(ms--)
{
for(y = 0; y<250; y++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
void main(void)
{
YkInit();
P2=0xff;
P0=0xff;
while(1)
{
k2=ykcode/16;
k3=ykcode%16;
if (ykok) //数码显示
{
display();
}
}
}
void display(void)
{
LE1=1;
A=0;
BB=0;
C=0;
P0=table[k2];
delay1(1);
A=1;
BB=0;
C=0;
P0=table[k3];
delay1(1);
P0=0x00;
LE1=0;
delay1(1);
}
void YkInit(void) //遥控接收初始化
{
EA=1; //开总中断
TMOD=0x11; //TMOD T0,T1均选用方式1(16位定时)
SCON=0x00;
TH1=0;
TL1=0;
IE|=0x89; //EA=1;ET1=1;EX0=1;
IP|=0x01; //PX0=1;
TCON |= 0x41; //TR1=1;IT0=1;
ykbnum=0;
ykcodetemp=0;
ykdelay=0;
}
//bit YkTest(void) //检查有无遥控信号
//{
// return(ykok);
//}
void intx0() interrupt 0 using 2 //遥控使用外部中断0,接P3.2口
{
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 //遥控使用定时计数器1
{
if(ykdelay)
{
ykdelay--;
EX0=0;
} //ykdelay不为0暂停接收
else
{
if(ykbnum==13) //遥控码最后一位为0,补0
{
ykcode=ykcodetemp*=2;
ykdelay=3;
EX0=0; //暂停接收
ykok=1; //遥控数据有效
}
else if(ykbnum==14) //遥控码最后一位为1,不用补
{
ykcode=ykcodetemp;
ykdelay=3;
EX0=0; //暂停接收
ykok=1; //遥控数据有效
}
else
EX0=1; //ykbnum不为13,14接收无效,继续接收
ykbnum=0;
ykcodetemp=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -