红外线解码心得和解码程序.docx

上传人:b****6 文档编号:4767651 上传时间:2022-12-08 格式:DOCX 页数:9 大小:17.89KB
下载 相关 举报
红外线解码心得和解码程序.docx_第1页
第1页 / 共9页
红外线解码心得和解码程序.docx_第2页
第2页 / 共9页
红外线解码心得和解码程序.docx_第3页
第3页 / 共9页
红外线解码心得和解码程序.docx_第4页
第4页 / 共9页
红外线解码心得和解码程序.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

红外线解码心得和解码程序.docx

《红外线解码心得和解码程序.docx》由会员分享,可在线阅读,更多相关《红外线解码心得和解码程序.docx(9页珍藏版)》请在冰豆网上搜索。

红外线解码心得和解码程序.docx

红外线解码心得和解码程序

试用期小结

尊敬的江苏三恒科技集团领导:

您好!

我叫程克辉,毕业于西北师范大学知行学院,电子信息工程专业。

在试用期的两个多月里,我在工程中心软件项目部实习工作,我很荣幸,能跟着***副总经理学习与专业相关的电子知识,收获不少!

这两个多月在任总的指导下,我成功的了解、计算了:

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;//脉冲时间计时归零

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1