红外线解码心得和解码程序Word格式文档下载.docx
《红外线解码心得和解码程序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《红外线解码心得和解码程序Word格式文档下载.docx(9页珍藏版)》请在冰豆网上搜索。
特别感谢张主任的无私支持和关怀!
在红外线解码的c程序设计上,我面临着很大的困难,在学校根本就没有接触过红外线的解码,因为红外线是一种看不到摸不着的东西,且我们公司的红外线发射器用的是杭州士兰电子的器件很特殊。
它没有引导码只有16位的用户码和按键的数据码,这样写出来的c解码程序就很容易受到外部红外线的干扰。
在程序初始化和有红外脉冲时能接收16位的0脉冲,即使解码出错也能有00H的码进入。
还好最后在我用数码管把红外线解出来的码显示出来,这样一切问题就迎刃而解了!
程序能成功调试并通过硬件测试。
以上是我的试用期小结,在试用期中不足的地方望领导同事及时指出,以便于本人及时改正!
两个月体会到三恒的精神,知道了集团的发展潜力!
万分幸运,我能成为三恒的一员!
此致!
敬礼!
二零一一年九月七日
红外线解码程序和公司具体项目要求程序:
#include<
reg52.h>
//#include<
intrins.h>
#defineuintunsignedint//宏定义
#defineucharunsignedchar
ucharnum;
ucharirtime,startflag,bitnum,irreceok;
ucharirdata[16],ircode[2];
ucharirprosok;
ucharn;
sbitkey1=P3^3;
//独立按键定义
sbitkey2=P3^4;
sbitkey3=P3^5;
sbitkey4=P3^6;
sbitkey5=P3^7;
sbitkey6=P2^0;
//继电器端口定义
sbitkey7=P2^1;
sbitkey8=P2^2;
sbitkey9=P2^3;
sbitkey10=P2^4;
voidirmove();
//动作函数的申明
voiddelay(uintz)//延时子函数
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
voidkeyskay()
if(key1==0)
{
delay(5);
//消抖
if(key1==0)//如果键1确实按下
{
P2=0xff;
key6=0;
//继电器1动作显示器显示第一屏画面
}
while(!
key1);
}
elseif(key2==0)
if(key2==0)//如果键2确实按下
key7=0;
//继电器2动作显示器显示第二屏画面
key2);
elseif(key3==0)
if(key3==0)//如果键3确实按下
key8=0;
//继电器3动作显示器显示第三屏画面
key3);
elseif(key4==0)
if(key4==0)//如果键4确实按下
key9=0;
//继电器4动作显示器显示第四屏画面
key4);
elseif(key5==0)
if(key5==0)//如果键5确实按下
key10=0;
//继电器5动作显示器四路画面同时显示
key5);
/*****选择定时器模式、启动定时器、开中断的初始化*********/
voidtime0init(void)
TMOD=0x02;
TH0=0x00;
TL0=0x00;
ET0=1;
EA=1;
TR0=1;
/**********外部中断0初始化**************/
voidint0init()
IT0=1;
EX0=1;
/************读取用户码、数据码并且判断0、1***************/
voidirpros()
uchark,i,j;
//变量定义
ucharvalue;
k=0;
//从第一个读取的时间开始判断0、1
for(j=0;
j<
2;
j++)//因为是16位的码,顾只需要用两个字节保存用户码和数据码
for(i=0;
i<
8;
i++)//因为有8位二进制码,顾循环8次
value=value>
>
1;
//因为是从高位读取遥控器发送的数据,顾要右移吧第一次读的数据位送到最低位
if(irdata[k]>
6)//每进来一次进行判断读取的时间值是不是1
{
value=value|0x80;
//是1就用或运算把读取数置1
}
k++;
//往下读取下一个时间值
ircode[j]=value;
//把二进制的码存到一个数组中
irprosok=1;
//数据从时间值处理到二进制值成功
/**************根据读取的二进制数据码判断哪一个继电器工作*******************/
voidirmove()
switch(ircode[1])
case0x01:
//如果数据码是01H就显示第一屏
break;
case0x09:
//如果数据码是09H就显示第2屏
case0x05:
//如果数据码是05H就显示第3屏
case0x0d:
//如果数据码是0dH就显示第4屏
if(n==1)
break;
//第二次进来就自动退出
n=1;
while(ircode[1]==0x0d);
if(ircode[1]==0x0d&
&
n==1)//如果数据码是0dH并且键按下了两次就四屏同时显示
n=0;
while(n);
delay(100);
}
voidmain()
time0init();
int0init();
while
(1)//使程序一直运行
{
keyskay();
//按键优先
if(irreceok)//如果接收到红外并且16位接收成功就进入时间值的处理转换成二进制
irpros();
//时间值转换成二进制函数
irreceok=0;
if(irprosok)//如果时间值转化成二进制成功处理就进入才开中断、定时
irprosok=0;
TR0=1;
EX0=1;
irmove();
//成功判断数据码并且相关的继电器动作
//延时200ms进行红外判断并且避开外部红外干扰
voidtimer0()interrupt1
irtime++;
//255字符型最大、对每一个脉冲自动计时
voidint0()interrupt0
if(startflag==1)//红外接收标志
irdata[bitnum]=irtime;
//把每一个脉冲的时间用一个数组存储
irtime=0;
//一个脉冲接收结束就对时间归零初始化
bitnum++;
//数组单元往后计数
if(bitnum==16)//如果接收的码正好是16位的码就执行下面的操作
bitnum=0;
//为下一个脉冲准备,对数组初始化
irreceok=1;
//红外接收OK
EX0=0;
//关闭外部中断避免外部干扰
TR0=0;
//停止计时不再读取遥控器发来的脉冲,到这个脉冲解码完成才开启进行下一个脉冲计时
else//如果有下降延进来红外接收标志位不是1就进入
startflag=1;
//置1
//脉冲时间计时归零