📄 irda2.c
字号:
//---红外接收---
//-----头文件引用-----
#include<reg51.h>
#include<absacc.h>
#include<intrins.h>
//-----宏声明-----
#define C8279 XBYTE[0xF239] //定义8279命令口地址
#define D8279 XBYTE[0xF238] //定义8279数据口地址
#define uchar unsigned char
#define uint unsigned int
//-----变量定义-----
uchar code ledseg[]={ 0x3f,0x06,0x5b,0x4F,0x66,0x6D,0x7D,0x07,0x7F,//显示'0,1,2,3,4,5,6,7,8'
0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,0x40};//'9,a,b,c,d,e,f, ,-'
uchar idata diss[8]; //定义显示缓冲区
uchar idata jsdat[4]={0x00,0xff,0x00,0x00}; //定义接收数组
uint time0,time1,time2; //时间存储变量
bit bdata yesdatbz=0,yesredatbz=0; //定义接收数据、持续码标志
sbit JSCOM=P1^7; //定义接收口
//-----初始化-----
void first()
{
C8279=0x00; //置8279工作方式
C8279=0x2f; //置键盘扫描速率
C8279=0xc1; //清除LED显示
while(C8279&0x80); //等待清除结束
TMOD=0x10; //置定时器工作方式
ET1=1;
EA=1;
TL1=0;
TH1=0;
}
//-----中断-----
void ctc0() interrupt 3
{}
//-----显示-----
void disp()
{
uchar i;
for(i=0;i<8;i++)
{
C8279=i+0x80;
D8279=ledseg[diss[i]];
}
}
//-----等待显示------
void dis0()
{
uchar i;
for(i=0;i<8;i++)
{
diss[i]=0x11;
}
diss[2]=0x10;
diss[3]=0x10;
disp();
}
//-----负跳变-----
void tb1_0()
{
while(1)
{
if(JSCOM==1)
{
while(JSCOM==1);
return;
}
}
}
//-----跳变-----
void tb()
{
if(JSCOM==1)
{
while(JSCOM==1);
return;
}
else
{
while(JSCOM==0);
return;
}
}
//-----毛刺处理-----
void mc()
{
uint timeval;
do
{
tb();
time2=TH1*256+TL1;
timeval=time2-time1;
if(timeval>200) //判时间是否小于200us
{
return;
}
else
{
tb();
time1=TH1*256+TL1;
}
}while(timeval<200);
}
//-----接收引导码-----
void yindao()
{
uint timeval;
do
{
tb1_0(); //等待负跳变
TR1=1; //开定时器
time0=TH1*256+TL1; //读定时器初始值
tb(); //等待跳变
time1=TH1*256+TL1; //读定时器值
timeval=time1-time0; //时间处理
}while((timeval<8000)||(timeval>10000));//判时间是否在引导码9200us(L)左右
}
//-----数据接收子程序-----
void read(void)
{
uchar i,k;
uint timeval;
yindao(); //判引导码
time0=time1; //时间值迭代
tb(); //等待跳变
time1=TH1*256+TL1; //读定时器值
mc(); //毛刺处理
timeval=time1-time0;
if((timeval>3800)&&(timeval<4800)) //判时间是否在引导码4400us(H)范围内
{
for(k=0;k<4;k++)
{
for(i=0;i<8;i++)
{
time0=time1; //时间值迭代
time1=time2;
mc(); //毛刺处理
timeval=time1-time0;
if((timeval>300)&&(timeval<900))//判时间是否在数据码680us(L)范围内
{
time0=time1; //时间值迭代
time1=time2;
mc(); //毛刺处理
timeval=time1-time0;
if((timeval>200)&&(timeval<800))//判时间是否在数据码500us(H)范围内
{
jsdat[k]=_cror_(jsdat[k],1); //数据接收保存
jsdat[k]=jsdat[k]&0x7f; //为数据码500us(H),置0
}
else
{
if((timeval>1000)&&(timeval<2000))//判时间是否在数据码1600uS(H)范围内
{
jsdat[k]=_cror_(jsdat[k],1); //数据接收保存
jsdat[k]=jsdat[k]|0x80; //为数据码1600us(H),置1
}
else
{
yesdatbz=0; //置无数据接收标志
yesredatbz=0;
return;
}
}
}
else
{
yesdatbz=0; //置无数据接收标志
yesredatbz=0;
return;
}
}
}
yesdatbz=1; //置接收到数据标志
return;
}
else
{
if((timeval>1700)&&(timeval<2500))
{
yesredatbz=1; //置持续码标志
return;
}
else
{
yesdatbz=0; //置无数据接收标志
yesredatbz=0;
}
}
}
//-----接收显示处理-----
void disdeal()
{
if(yesdatbz==1)
{
if(jsdat[2]==~jsdat[3])//接收数据校验
{
diss[7]=jsdat[0]/16;//数据送显示缓冲区
diss[6]=jsdat[0]%16;
diss[5]=jsdat[1]/16;
diss[4]=jsdat[1]%16;
diss[1]=jsdat[2]/16;
diss[0]=jsdat[2]%16;
}
else
{
diss[1]=0x11;
diss[0]=0x11;
}
}
else
{
if(yesredatbz==1)//接收持续码处理
{
return;
}
else
{
diss[1]=0x11;
diss[0]=0x11;
}
}
}
//-----延时子程序------
void delay()
{
unsigned int k,j;
for(k=0;k<200;k++)
{
for(j=0;j<500;j++);
}
}
//-----主程序-----
main()
{
first(); //初始化
while(1)
{
dis0(); //等待显示
read(); //接收
disdeal(); //接收处理
disp(); //显示
delay(); //延时
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -