关于红外线遥控器信号的接受
时间:10-02
整理:3721RD
点击:
大家好,小弟写了一个关于接受红外线遥控的程序。因本人不知道该遥控器的代码,故添加了串口程序进行查看。但发现我无论按什么键,代码都是F。不知道小弟哪里写错了。请各位大神指点一下,谢谢!
#include<reg52.h>
#include<intrins.h>
#define har unsigned char
#define chen unsigned int
sbit hw=P3^2;
har num1,flg;
har a,z,i,k,temp;
har table[4]={0};
chen num;
void delay(har d)
{
har x,y;
for(x=20;x>0;x--)
for(y=d;y>0;y--);
}
void chuan(har num)
{
ES=0;
SBUF=num;
while(!TI);
TI=0;
ES=1;
}
void main()
{
TMOD=0x22;//定时器0与1的工作方式
TH0=0xd7;//赋值
TL0=0xd7;
TH1=0xe6;
TL1=0xe6;
P2=0xff;
EA=1; //开总中断
ET0=0;//开定时器0中断
ET1=0; //关闭定时器1中断,无用
TR1=1;
SM0=0; //设定串口工作方式为1
SM1=1;
EX0=1; //开外部中断
ES=1;//开串口中断
REN=1; //开串口接收
IT0=1;
hw=1;
while(1)
{
P2=0xff;
EX0=1;
}
}
void ex0() interrupt 0
{
EX0=0;
delay(2);
num=0;
P2=0;
if(hw==0)
{
P2=~P2;
TR0=1;//定时器0开始工作
while((hw==0)&&(num<160))//在剩下的8ms内,检测是否是持续的低电平
{
if(TF0==1)
{
num++;
TF0=0;
}
}
if(num>=159)
{
TR0=0;
chuan(num);
num=0;
}
else
{
TR0=0;
num=0;
return;
}
}
else
return;
delay(2);
if(hw==1) //在剩下的4ms内,检测是否是持续的高电平
{
P2=~P2;
TR0=1;
while((hw==1)&&num<90)
{
if(TF0==1)
{
num++;
TF0=0;
}
}
if(num>=80)
{
TR0=0;
chuan(num);
num=0;
}
else
{
TR0=0;
num=0;
return;
}
}
else
return;
num=0;
for(k=0;k<4;k++) //检测红外信号
{
TR0=1;
for(i=0;i<8;i++)
{
P2=~P2;
while((hw==0)&&num<14)//持续检测700us的低电平
{
if(TF0==1)
{
num++;
TF0=0;
}
}
while((hw==1)&&num<27)//从700us-1350us的高电平,
{
if(TF0==1)
{
num++;
TF0=0;
}
}
if(hw==1) //当1.35ms后还是高电平时,该位为1
{
a=1;
while((hw==1)&&num<50)//等待“1”剩余的时间
{
if(TF0==1)
{
num++;
TF0=0;
}
}
num=0;
}
else
{
a=0;
num=0;
}
temp=temp|a;
temp=_cror_(temp,1);
}
table[k]=temp;
}
TR0=0;
num=0;
for(k=0;k<4;k++) //把检测到的红外信号发送给PC
{
SBUF=table[k];
while(!TI);
TI=0;
P2=~P2;
}
EX0=1;
}
#include<reg52.h>
#include<intrins.h>
#define har unsigned char
#define chen unsigned int
sbit hw=P3^2;
har num1,flg;
har a,z,i,k,temp;
har table[4]={0};
chen num;
void delay(har d)
{
har x,y;
for(x=20;x>0;x--)
for(y=d;y>0;y--);
}
void chuan(har num)
{
ES=0;
SBUF=num;
while(!TI);
TI=0;
ES=1;
}
void main()
{
TMOD=0x22;//定时器0与1的工作方式
TH0=0xd7;//赋值
TL0=0xd7;
TH1=0xe6;
TL1=0xe6;
P2=0xff;
EA=1; //开总中断
ET0=0;//开定时器0中断
ET1=0; //关闭定时器1中断,无用
TR1=1;
SM0=0; //设定串口工作方式为1
SM1=1;
EX0=1; //开外部中断
ES=1;//开串口中断
REN=1; //开串口接收
IT0=1;
hw=1;
while(1)
{
P2=0xff;
EX0=1;
}
}
void ex0() interrupt 0
{
EX0=0;
delay(2);
num=0;
P2=0;
if(hw==0)
{
P2=~P2;
TR0=1;//定时器0开始工作
while((hw==0)&&(num<160))//在剩下的8ms内,检测是否是持续的低电平
{
if(TF0==1)
{
num++;
TF0=0;
}
}
if(num>=159)
{
TR0=0;
chuan(num);
num=0;
}
else
{
TR0=0;
num=0;
return;
}
}
else
return;
delay(2);
if(hw==1) //在剩下的4ms内,检测是否是持续的高电平
{
P2=~P2;
TR0=1;
while((hw==1)&&num<90)
{
if(TF0==1)
{
num++;
TF0=0;
}
}
if(num>=80)
{
TR0=0;
chuan(num);
num=0;
}
else
{
TR0=0;
num=0;
return;
}
}
else
return;
num=0;
for(k=0;k<4;k++) //检测红外信号
{
TR0=1;
for(i=0;i<8;i++)
{
P2=~P2;
while((hw==0)&&num<14)//持续检测700us的低电平
{
if(TF0==1)
{
num++;
TF0=0;
}
}
while((hw==1)&&num<27)//从700us-1350us的高电平,
{
if(TF0==1)
{
num++;
TF0=0;
}
}
if(hw==1) //当1.35ms后还是高电平时,该位为1
{
a=1;
while((hw==1)&&num<50)//等待“1”剩余的时间
{
if(TF0==1)
{
num++;
TF0=0;
}
}
num=0;
}
else
{
a=0;
num=0;
}
temp=temp|a;
temp=_cror_(temp,1);
}
table[k]=temp;
}
TR0=0;
num=0;
for(k=0;k<4;k++) //把检测到的红外信号发送给PC
{
SBUF=table[k];
while(!TI);
TI=0;
P2=~P2;
}
EX0=1;
}