本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
以往在单片机书上、网上所介绍的遥控器接收解码程序都是基于利用单片机的进入外部中断后所进行的程序解码。这此可以讲是个垃圾程序(因为核心技术高手没有外露),可以讲在解码红外线波形的同时,单片机的其他程序要停下来。对于大型工程是不允许的。
现特将利用内部时间中断时的时间差所做的红外线接收解码程序公开。本程序的要点是要将内部时钟中断设为125us,每次进中断则对相应的位进行比较低电平时间从而解码……
关键寄存器定义:static uchar codeTime; //码时间,用于以125us时间计时
static uchar HeadCode_Reced; //头码标志位
static uchar Ir_Dealed;
static uchar Irprot_LastState; //端口状态位
static uchar Receive_OK;
static uchar codeCnt; //数据码位
static uchar vData1; //1~4是分别用来放数据的
static uchar vData2;
static uchar vData3;
static uchar vData4;
/*内中断0 用于计时*/
void Timer0(void) interrupt 1 //开定时器0中断,工作于方式0,中断号为1
{
TH0=(65536-125)/256; //125ms出中断一次.
TL0=(65536-125)%256;
//====================================================================================
codeTime++;
if(codeTime>=80)
{
codeTime=80;
HeadCode_Reced=0;//80*125us=10ms时间未接收到低电平信号则清头码接收标志位
Ir_Dealed=0;
}
//-------------------------------------------------
P3_7=1; //先给该口付1
if(P3_7==1)
{
Irprot_LastState=1;//置接收端口为1状态标志
}
//---------------------------------------------------------------------
else //该口出现了低电平证明有可能是收到红外信号
{
if(Irprot_LastState) //出现低电平后如证实之前出现高电平,证明确实是有红外信号
{
Irprot_LastState=0;// 将接收状态清0
if(HeadCode_Reced)//查询是否已接收过头码。有就进入解码,无就进入头码(4.5ms计时)
{
vData4<<=1;
if(vData3&0x80){vData4|=0x01;}
vData3<<=1;
if(vData2&0x80){vData3|=0x01;}
vData2<<=1;
if(vData1&0x80){vData2|=0x01;}
vData1<<=1;
if(codeTime>15&&codeTime<21)//若头码已接收过,则判断当前接收的是1码或0码 //FTM2->8-<16-11(125*11=1.375,示波器读出0为0.8ms\1为1.6ms)
{ //HFJ->15-<21--11(125*15=1.875,示波器读出0为1.2ms\1为2.4ms)
vData1|=0x01; //两个下降沿之间的时间大于125us*11=1.375ms,条件满足则接收的为1码
}
else if(codeTime>6&&codeTime<12) //HFJ->6-<12
//FTN2->3-<8
{
vData1&=0xFE; ; //两个下降沿之间的时间小于125us*12=15ms条件不满足则接收的为0码
}
else
{
vData1=vData2=vData3=vData4=0;
HeadCode_Reced=0;
}
//-------------------------------------------------------------------------
codeCnt++;
if(codeCnt>=32) //一共接收32个信号位
{
codeCnt=0;
if(!Ir_Dealed)
{
Receive_OK=1;
}
}
codeTime=0; //接收完,将时间清0
//vData1=vData2=vData3=vData4=0;
}
else //头码总计时
{
if(codeTime>=80&&codeTime<120) //30 46(FTM2--3.750~5.750计的是低电平+高电平的总时间,即两个下降沿时间.示波器读出是4.9ms)
{ // 80 120(HFJ--10~15ms 计的是低电平+高电平的总时间,即两个下降沿时间.示波器读出是13.6ms)
HeadCode_Reced=1;
}
else
{
HeadCode_Reced=0;
}
codeCnt=0; //如果是第一次进入则将码计时时间codeTime与码位codeCnt清0
codeTime=0;
}
}
}
} |
|