新闻中心

EEPW首页>嵌入式系统>设计应用> 基于8952单片机的红外解码(TC9012F编码)

基于8952单片机的红外解码(TC9012F编码)

作者: 时间:2016-11-28 来源:网络 收藏

irpro_ok=0;//处理完成标志清零

}


void ircordpro(void)//红外码值处理函数
{
unsigned char i, j, k;
unsigned char cord,value;

k=1;//从1开始,是引导码以后的一帧所有数据
for(i=0;i<4;i++)//处理4个字节
{
for(j=0;j<8;j++) //处理1个字节8位
{
cord=irdata[k];
if(cord>7)//电平宽度大于某个值,可以判断为1(2.25ms)时间范围要大点,否则重复按键出现混乱
{
value|=0x80;//若为1则赋值
}
//其余情况可以判断为0(是不是证明了,irdata接收的是引导码之后的一帧所有电平?)
else
{
value=value;//若判断为0则不变(移位后自然为0)
}
if(j<7)
{
value>>=1;//为什么|0X01 与<<1配合,不行。因为最后完成值要求最先写入的最低位,用这个想法会反过来。
}
k++;
}
ircord[i]=value;
value=0;
} irpro_ok=1;//处理完毕标志位置1

}

/////////////////////////////////////////////////////////////////

void main(void)
{
EX0init(); //初始化中断

TIM0init();//初始化定时器0
while(1)//主循环
{
if(irok)
{
ircordpro();//码值处理
irok=0;
}

if(irpro_ok)//step press key
{
ir_work();//码值识别散转
}
}
}
程序基础来自已有程序,在看完下面的说明后,就可以移植了,毕竟同一个解码标准,都是大同小异,甚至就算不同解码标准也仅仅是判断编码的时间要求上长短不同。但为什么这是经过我自己消化的呢,这里有个非常有趣的问题。

在我单独实验红外模块的时候(也就是上面的源程序),能够正常运行。但是移植入开启了T2中断的大程序里之后,红外部分一点反应也没有。在接下来的调试过程中,因为不会使用DEBUG进入外部中断,在不断地比对程序中浪费了许多时间。当我使用LED调试法时(把P1=0x55;插入任意想要检验的程序行,亮了就证明程序走到了这里),亮与不亮在这里分界了(红色标记):

void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数
{
unsigned chari;
bit startflag;

if(startflag)
{
TR0=0;
if(irtime<38&&irtime>=34)

i=0;
TR0=1;
irdata[i]=irtime;

irtime=0;
i++;
if(i==33)
{
irok=1;
i=0;
}

}

恰好最近有重温static定义变量的特点,不然可能死得不明不白。因为抱着单独运行正常,移植整合之后也正常的想法,源程序的static unsigned char i;被我改为了uchar i;(我在自己程序里已做#define uchar unsigned char)。

答案清楚了:因为我不允许任何配角程序打扰T2时钟工作,所以设置了最高优先级(PT2=1;),这样每次外部中断0里面局部变量i的累加会被打断,如果不能保值,就每次都被撤销和重新构建,或许永远达不到(i==33)要求。static按我的理解,最大的作用就是能够保持上一次的值,至于其他作用印象就不大深刻了。

哈哈,有意思,记住中断里的局部变量定义 unsigned chari;要改为static unsigned char i;


上一页 1 2 下一页

评论


技术专区

关闭