红外线解码心得与解码程序.docx
《红外线解码心得与解码程序.docx》由会员分享,可在线阅读,更多相关《红外线解码心得与解码程序.docx(9页珍藏版)》请在冰豆网上搜索。
红外线解码心得与解码程序
试用期小结
尊敬的江苏三恒科技集团领导:
您好!
我叫程克辉,毕业于西北师范大学知行学院,电子信息工程专业。
在试用期的两个多月里,我在工程中心软件项目部实习工作,我很荣幸,能跟着***副总经理学习与专业相关的电子知识,收获不少!
这两个多月在任总的指导下,我成功的了解、计算了:
BT151可控硅、LM2940(1安恒流调节器)、LM317三端可调正稳压器集成电路、LM2674电源高效降压稳压转换器、13F-11网络隔离变压器、光耦开关、继电器、SC50462红外遥控发射模块、SM3XX0/3XX1红外接收头等电子元器件。
在任总的指导下和上面的学习我跟着任总学习“煤矿防爆显示系统”的电路设计、模块学习,也成功的用c语言成功的编写控制该系统的c程序,由于公司没有人用c对红外解码程序的编写,故在任总的悉心指导下,几经努力终于编写成功并且能稳定的通过硬件的测试。
硬件部分:
1、外部12V电源转换成5V模块。
由LM2674器件实现
2、外部1A恒流源模块。
由LM317和LM2940实现
3、五个独立按键控制继电器模块。
由光耦开关实现
4、继电器动作模块。
5、红外接收模块。
由SM3XX0/3XX1红外接收头实现
6、外部的四路光端机、视频转换器、光缆传输、摄像头、画面分割器、网络视频等模块
试用期的期间,由于刚来啥器件都没有,每每遇到困难的时候我就及时向***主任汇报,在张主任积极帮助下我的问题往往能很快的得到解决。
特别感谢张主任的无私支持和关怀!
在红外线解码的c程序设计上,我面临着很大的困难,在学校根本就没有接触过红外线的解码,因为红外线是一种看不到摸不着的东西,且我们公司的红外线发射器用的是杭州士兰电子的器件很特殊。
它没有引导码只有16位的用户码和按键的数据码,这样写出来的c解码程序就很容易受到外部红外线的干扰。
在程序初始化和有红外脉冲时能接收16位的0脉冲,即使解码出错也能有00H的码进入。
还好最后在我用数码管把红外线解出来的码显示出来,这样一切问题就迎刃而解了!
程序能成功调试并通过硬件测试。
以上是我的试用期小结,在试用期中不足的地方望领导同事及时指出,以便于本人及时改正!
两个月体会到三恒的精神,知道了集团的发展潜力!
万分幸运,我能成为三恒的一员!
此致!
敬礼!
二零一一年九月七日
红外线解码程序和公司具体项目要求程序:
#include
//#include
#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>0;y--);
}
voidkeyskay()
{
if(key1==0)
{
delay(5);//消抖
if(key1==0)//如果键1确实按下
{
P2=0xff;
key6=0;//继电器1动作显示器显示第一屏画面
}
while(!
key1);
delay(5);
while(!
key1);
}
elseif(key2==0)
{
delay(5);
if(key2==0)//如果键2确实按下
{
P2=0xff;
key7=0;//继电器2动作显示器显示第二屏画面
}
while(!
key2);
delay(5);
while(!
key2);
}
elseif(key3==0)
{
delay(5);
if(key3==0)//如果键3确实按下
{
P2=0xff;
key8=0;//继电器3动作显示器显示第三屏画面
}
while(!
key3);
delay(5);
while(!
key3);
}
elseif(key4==0)
{
delay(5);
if(key4==0)//如果键4确实按下
{
P2=0xff;
key9=0;//继电器4动作显示器显示第四屏画面
}
while(!
key4);
delay(5);
while(!
key4);
}
elseif(key5==0)
{
delay(5);
if(key5==0)//如果键5确实按下
{
P2=0xff;
key10=0;//继电器5动作显示器四路画面同时显示
}
while(!
key5);
delay(5);
while(!
key5);
}
}
/*****选择定时器模式、启动定时器、开中断的初始化*********/
voidtime0init(void)
{
TMOD=0x02;
TH0=0x00;
TL0=0x00;
ET0=1;
EA=1;
TR0=1;
}
/**********外部中断0初始化**************/
voidint0init()
{
IT0=1;
EX0=1;
EA=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就显示第一屏
P2=0xff;
key6=0;
break;
case0x09:
//如果数据码是09H就显示第2屏
P2=0xff;
key7=0;
break;
case0x05:
//如果数据码是05H就显示第3屏
P2=0xff;
key8=0;
break;
case0x0d:
//如果数据码是0dH就显示第4屏
if(n==1)
break;//第二次进来就自动退出
P2=0xff;
key9=0;
n=1;
while(ircode[1]==0x0d);
delay(5);
while(ircode[1]==0x0d);
break;
}
if(ircode[1]==0x0d&&n==1)//如果数据码是0dH并且键按下了两次就四屏同时显示
{
P2=0xff;
key10=0;
n=0;
while(n);
delay(100);
while(n);
}
}
voidmain()
{
time0init();
int0init();
while
(1)//使程序一直运行
{
keyskay();//按键优先
if(irreceok)//如果接收到红外并且16位接收成功就进入时间值的处理转换成二进制
{
irpros();//时间值转换成二进制函数
irreceok=0;
}
if(irprosok)//如果时间值转化成二进制成功处理就进入才开中断、定时
{
irprosok=0;
TR0=1;
EX0=1;
}
irmove();//成功判断数据码并且相关的继电器动作
delay(100);//延时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
irtime=0;//脉冲时间计时归零
}
}