找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

红外遥控接收解码程序(用内时钟中断做)

[复制链接]
admin 发表于 2012-9-2 05:55:39 | 显示全部楼层 |阅读模式

本文包含原理图、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;
}
}
}

}
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-24 02:12 , Processed in 0.055393 second(s), 11 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表