1、红外线解码心得和解码程序试用期小结尊敬的江苏三恒科技集团领导: 您好! 我叫程克辉,毕业于西北师范大学知行学院,电子信息工程专业。在试用期的两个多月里,我在工程中心软件项目部实习工作,我很荣幸,能跟着*副总经理学习与专业相关的电子知识,收获不少!这两个多月在任总的指导下,我成功的了解、计算了:BT151可控硅、LM2940(1安恒流调节器)、LM317三端可调正稳压器集成电路、LM2674电源高效降压稳压转换器、13F-11网络隔离变压器、光耦开关、继电器、SC50462红外遥控发射模块、SM3XX0/3XX1红外接收头等电子元器件。在任总的指导下和上面的学习我跟着任总学习“煤矿防爆显示系统”
2、的电路设计、模块学习,也成功的用c语言成功的编写控制该系统的c程序,由于公司没有人用c对红外解码程序的编写,故在任总的悉心指导下,几经努力终于编写成功并且能稳定的通过硬件的测试。硬件部分:1、 外部12V电源转换成5V模块。由LM2674器件实现2、 外部1A恒流源模块。由LM317和LM2940实现3、 五个独立按键控制继电器模块。由光耦开关实现4、 继电器动作模块。5、 红外接收模块。由SM3XX0/3XX1红外接收头实现6、 外部的四路光端机、视频转换器、光缆传输、摄像头、画面分割器、网络视频等模块试用期的期间,由于刚来啥器件都没有,每每遇到困难的时候我就及时向*主任汇报,在张主任积极帮
3、助下我的问题往往能很快的得到解决。特别感谢张主任的无私支持和关怀!在红外线解码的c程序设计上,我面临着很大的困难,在学校根本就没有接触过红外线的解码,因为红外线是一种看不到摸不着的东西,且我们公司的红外线发射器用的是杭州士兰电子的器件很特殊。它没有引导码只有16位的用户码和按键的数据码,这样写出来的c解码程序就很容易受到外部红外线的干扰。在程序初始化和有红外脉冲时能接收16位的0脉冲,即使解码出错也能有00H的码进入。还好最后在我用数码管把红外线解出来的码显示出来,这样一切问题就迎刃而解了!程序能成功调试并通过硬件测试。以上是我的试用期小结,在试用期中不足的地方望领导同事及时指出,以便于本人及
4、时改正!两个月体会到三恒的精神,知道了集团的发展潜力!万分幸运,我能成为三恒的一员!此致!敬礼! 二零一一年九月七日红外线解码程序和公司具体项目要求程序:#include/#include#define uint unsigned int /宏定义#define uchar unsigned charuchar num;uchar irtime,startflag,bitnum,irreceok;uchar irdata16,ircode2;uchar irprosok;uchar n;sbit key1=P33; /独立按键定义sbit key2=P34;sbit key3=P35;sbit
5、 key4=P36;sbit key5=P37;sbit key6=P20; /继电器端口定义sbit key7=P21;sbit key8=P22;sbit key9=P23;sbit key10=P24;void irmove(); /动作函数的申明void delay(uint z) /延时子函数 uint x,y; for(x=z;x0;x-) for(y=110;y0;y-);void keyskay() if(key1=0) delay(5); /消抖 if(key1=0) /如果键1确实按下 P2=0xff; key6=0; / 继电器1动作显示器显示第一屏画面 while(!k
6、ey1); delay(5); while(!key1); else if(key2=0) delay(5); if(key2=0) / 如果键2确实按下 P2=0xff; key7=0; / 继电器2动作显示器显示第二屏画面 while(!key2); delay(5); while(!key2); else if(key3=0) delay(5); if(key3=0) /如果键3确实按下 P2=0xff; key8=0; / 继电器3动作显示器显示第三屏画面 while(!key3); delay(5); while(!key3); else if(key4=0) delay(5); i
7、f(key4=0) / 如果键4确实按下 P2=0xff; key9=0; / 继电器4动作显示器显示第四屏画面 while(!key4); delay(5); while(!key4); else if(key5=0) delay(5); if(key5=0) / 如果键5确实按下 P2=0xff; key10=0; / 继电器5动作显示器四路画面同时显示 while(!key5); delay(5); while(!key5); /*选择定时器模式、启动定时器、开中断的初始化*/void time0init(void) TMOD=0x02; TH0=0x00; TL0=0x00; ET0=
8、1; EA=1; TR0=1;/*外部中断0初始化*/void int0init() IT0=1; EX0=1; EA=1;/*读取用户码、数据码并且判断0、1*/void irpros() uchar k,i,j;/变量定义 uchar value; k=0; /从第一个读取的时间开始判断0、1 for(j=0;j2;j+) /因为是16位的码,顾只需要用两个字节保存用户码和数据码 for(i=0;i1;/因为是从高位读取遥控器发送的数据,顾要右移吧第一次读的数据位送到最低位 if(irdatak6)/每进来一次进行判断读取的时间值是不是1 value=value | 0x80; /是1就用
9、或运算把读取数置1 k+; /往下读取下一个时间值 ircodej=value;/把二进制的码存到一个数组中 irprosok=1; /数据从时间值处理到二进制值成功/*根据读取的二进制数据码判断哪一个继电器工作*/void irmove() switch(ircode1) case 0x01: /如果数据码是01H就显示第一屏 P2=0xff; key6=0; break; case 0x09: /如果数据码是09H就显示第2屏 P2=0xff; key7=0; break; case 0x05: /如果数据码是05H就显示第3屏 P2=0xff; key8=0; break; case 0
10、x0d: /如果数据码是0dH就显示第4屏 if(n=1) break;/第二次进来就自动退出 P2=0xff; key9=0; n=1; while(ircode1=0x0d); delay(5); while(ircode1=0x0d); break; if(ircode1=0x0d&n=1) /如果数据码是0dH并且键按下了两次就四屏同时显示 P2=0xff; key10=0; n=0; while(n); delay(100); while(n); void main() time0init(); int0init(); while(1) /使程序一直运行 keyskay(); /按键
11、优先 if(irreceok)/如果接收到红外并且16位接收成功就进入时间值的处理转换成二进制 irpros(); /时间值转换成二进制函数 irreceok=0; if(irprosok) /如果时间值转化成二进制成功处理就进入才开中断、定时 irprosok=0; TR0=1; EX0=1; irmove();/成功判断数据码并且相关的继电器动作 delay(100); /延时200ms进行红外判断并且避开外部红外干扰 void timer0() interrupt 1 irtime+;/255字符型最大、对每一个脉冲自动计时void int0() interrupt 0 if(start
12、flag=1) /红外接收标志 irdatabitnum=irtime; /把每一个脉冲的时间用一个数组存储 irtime=0; /一个脉冲接收结束就对时间归零初始化 bitnum+; /数组单元往后计数 if(bitnum=16) /如果接收的码正好是16位的码就执行下面的操作 bitnum=0; /为下一个脉冲准备,对数组初始化 irreceok=1; /红外接收OK EX0=0; / 关闭外部中断避免外部干扰 TR0=0;/停止计时不再读取遥控器发来的脉冲,到这个脉冲解码完成才开启进行下一个脉冲计时 else /如果有下降延进来红外接收标志位不是1就进入 startflag=1; /置1 irtime=0;/脉冲时间计时归零
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1