自制电脑红外遥控接收器

上传人:d**** 文档编号:206497360 上传时间:2023-05-04 格式:DOCX 页数:13 大小:112.72KB
收藏 版权申诉 举报 下载
自制电脑红外遥控接收器_第1页
第1页 / 共13页
自制电脑红外遥控接收器_第2页
第2页 / 共13页
自制电脑红外遥控接收器_第3页
第3页 / 共13页
资源描述:

《自制电脑红外遥控接收器》由会员分享,可在线阅读,更多相关《自制电脑红外遥控接收器(13页珍藏版)》请在装配图网上搜索。

1、自制电脑红外遥控接收器(PC软解码)网上有很多介绍红外遥控接收器制作的文章,但其中大部分是用单片进行红外解 码,然后再通过串口或USB把解码后的按键信息传入到PC的。这样的电路制作 起来,不仅造价相对偏高,而且需要对单片编程,这会令大部分软件开发爱好者 望而却步。最近看到一篇仅需要7个简单元器件的红外接收器,只需拿起烙铁,不需硬件编 程就可以制作完成,原理图如下:红外接牧头LlS0038xOUT9针串口由原理图我们可知,红外接收头把接收的红外信号转换为高低电平通过串口的D SR管脚传入到PC, PC软件通过对DSR高低电平信号的时间曲线进行分析,从而 获得相对应的按键信息。红外遥控器一般采用脉

2、宽调制的串行码,经38kHz的载频把红外信号发射出去。 其编码信息一般由三部分组成:引导码、地址码和数据码。一般信号长度大约1 00ms左右,持续按键则重复发送(中间会有10ms以上的间歇)。常态下,红外接收头的输出(OUT)都是高电平,引导码信号首先会令红外接收头 输出一个大约10ms左右的低电平(不同遥控器有不同的时延),这可令接收设 备从容判定信号的到来,而后面的地址码和数据码其电平高低变化就相对较快 了,大概在几十或几百个微秒之间。PC红外遥控软件一般选用Girder,在使用之前需要安装“SFH-56 plugin for Girder”这个插件(文件名igor SFH-56P lug

3、.dll),否则不能正常处理我们 这种电路的红外接收器信号。可悲的是我至今没找到这个插件,网上提供的很多 链接都是坏的。即使找到了这个插件,要想在我们自己编写的程序中使用也是困难的,因为Gir der并没有为我们开发者提供API接口。既然Girder能用软件实现红外解码,我们为什么不能呢?凡事都要开动大脑, 积极行动才对,下面就是我自己焊接的一个红外接收器(元器件是在中发买的, 一共不到10元钱,还富裕好多电阻、电容!)(图下方的红外遥控器的接收器是基于USB的,仅支持Vista以上版本,并且不 支持个人开发,不过今天它终于发挥了它应有的作用。当然用电视或VCD遥控器 也是可以的)硬件有了,但

4、程序该从何编起呢?1、由于接收到的红外信号在微秒级别中变化,对系统实时性要求较高,所以具 备垃圾回收功能,实时性没有保证的C#,似乎完不成这种信号的接收功能,所 以我们选择的是VC,由它实现高优先级的线程去进行信号接收。2、由于红外遥控信号是脉宽调制的串行码,所以我们需要采集信号的宽度,显 然采用一般的时钟函数来获取时间间隔是不可行的,因为精度太低,所以我们需 用采用多媒体时钟和高精度计时的API函数。3、一般我们按键持续时间为几秒钟,并且由于按键发出前有一个10ms左右的引 导信号,所以我们的程序很容易判断出信号起始点,这样我们一次仅需要接收一 定量的原始数据就可以完成初步信号采集工作。4、

5、对于我们的红外接收程序来说并不需要实际解码出红外信号到底包含了那些 具体的信息,只要其能够区分出红外遥控上的各个按键就行。5、由于红接收器是通过串口 RTS管脚供电,且通过DSR传递红外信号的,所以 我们的程序即使不接收数据,也要打开串口,不过仅需要处理RTS和DSR管脚的 信号即可。好了,动手去做,下面是用VC实现的一个DLL,其功能就是接收并记录红外信 号的持续时间。核心代码如下:DWORD WINAPI ThreadProc(LPVOID pParam)LARGE_INTEGER litmp;LONGLONG QPart1,QPart2;double dfFreq;int iTime=0

6、; /微秒/获得计数器的时钟频率QueryPerformanceFrequency(&litmp);dfFreq = (double) 1000000.0/li tmp.QuadPar t;DWORD ModemState,oldModemState二MS_DSR_ON;/EV_BREAK or EV_CTS or EV_DSR or EV_ERR or EV_RING or EV_RLSD or EV_RXCHAR or EV_RXFLAG or EV_TXEMPTY/SetCommMask(HSC_COM_Handle,EV_DSR);/DWORD EvtMask,dwError;/COM

7、STAT cs;while(HSC_Thread_RunFlag)/等待DSR信号发生变化/WaitCommEvent(HSC_COM_Handle, &EvtMask, &HSC_Ovread);/ClearCommError(HSC_COM_Handle,&dwError,&cs);/获得DSR的状态GetCommModemStatus(HSC_COM_Handle, &ModemState);ModemState = (ModemState & MS_DSR_0N); if(ModemState = oldModemState) continue;oldModemState二ModemS

8、tate;/清计数InterlockedExchange(&HSC_NUM,0);/开始接收数据if(HSC_State = 0 & ModemState = 0)QueryPerformanceCounter(&litmp);QPartl 二 litmp.QuadPart;HSC_State=1;/复位计数InterlockedExchange(&HSC_NUM,O);InterlockedExchange(&HSC_Index,O);/开启定时器HSC_TimerID = timeSetEvent(lO,HSC_Accuracy,MMTi mer,NULL,TIME_PERIODIC);c

9、ontinue;/接收数据状态if(HSC_State = 1)QueryPerformanceCounter(&litmp);QPart2 = litmp.QuadPart;/-if(ModemState = 0)iTime = (in t)(QPar t2-QPar t1)* dfFreq);else iTime = (in t)(QPar tl-QPar t2) *dfFreq);if(HSC_Index HSC_BufferSize)*(HSC_Buffer+HSC_Index) = iTime;Interlockedlncrement(&HSC_Index);/-QPartl二QPa

10、rt2;return STILL_ACTIVE;如果采用WaitCommEvent函数,你会发现CPU使用时间会很低,不过它会让接收 程序无法正常退出,所以只好注释掉该函数了,此时你会发现CPU使用时间会很 高。原始数据一旦采集完毕,剩下的就由C#程序大显身手吧。C#中DLL的接口函数如下:const string DllPath = YFHSCollect.dll;Dlllmport(DllPath)public static extern Int32 HSCStart(Int32 COM, Int32 delay, Int3 2 BufferSize);Dlllmport(DllPath)

11、public static extern Int32 HSCEnd();DllImport(DllPath)public static extern Int32 HSCData(int intData);我封装了一个类,一旦有按键信息,就会触发一个Click事件。此外程序还具备 自学习功能,并且可以把学习后的结果序列化到一个XML文件中去,这样下次再 按键就可以识别出键名了。主程序中测试代码如下:public partial class frmMain : FormYFHWCollect hw =null;int hwData = null;public frmMain()Initi aliz

12、eCompone nt();hw = new YFHWCollec t(t his, 1);hw.Click += new YFHWCollect.HWEventHandler(hw_Click);void hw_Click(object sender, HWEventArgs e)string strlnfo =;for (int i 二 0; i e.ls tDat a.Cou nt; i+)for (int j = 0; j e.ls tDat ai.Leng th; j+)st rInfo += e.ls tDat aij.ToS tring() + ;strInfo += rn;tx

13、tin fo.Tex t 二 st rInfo;lblKeyName.Tex t 二 e.KeyName+ ( + (e.I nt erval /10).ToS tring() + ms);hwDa ta = e.Da ta;picBar.Refresh();private void btnCommand_Click(object sender, EventArgs e) if (btn Command.Tex t 二二开始)btn Command.Tex t 二停止;hw.S tart();elsebtn Command.Tex t 二开始; hw.End();EventArgs e)pri

14、vate void btnStudy_Click(object sender,hw.S tudy(txt KeyName.Tex t); private void picBar_Paint(object sender, PaintEventArgs e) int wid th = picBar.Wid th, heigh t 二 picBar.Heigh t;e.Graphics.DrawLine(new Pen(Color.Gray), 0, heigh t / 2 idth, heigh t / 2);if (hwData != null)float Len=0;foreach(int l

15、 in hwData)Len+=l;float dx = width / Len,DX=0;Pen p = new Pen(Color.Green);float Y=0, Y1二heigh t/4,Y2=(floa t)(heigh t* 3.0/4.0);float X=0;for(int i=0;i1 444444444444 444444444444444 444444444444445 3 14 4 44444444 4 4444 4 44 4444144-14 444 44444444444 41445344444444444444g 4 49445394i43 494444 498

16、044 494-44 W94&249444494454 49 44444S 54444S44 8 44046 4484吗8 44844444 暫444瞳红外遥控信号孫牧需试1Gl按键若;lfrftlok CTE*s)挣止About(上面显示的数据为高电平和低电平的持续时间(低高低高),单位为1/10毫秒)注意事项:1、红外遥控器按键偶数次和奇数次的编码是不同的,程序需要学习两次,才能 正常识别按键信息。2、普通的USB转串口由于仅连接了 2、3、5管脚,所以不能正常使用,对比较 好的USB转串口(比如Moxa的三百多一根),虽然所有的管脚都引出了,但是 由于是通过USB转换的,所以响应时间很是问题,我就因为这个差一点功亏一篑, 幸好把程序又在PC机跑了 一遍。/获得DSR的状态GetCommModemStatus(HSC_COM_Handle, &ModemState);上面的指令如果采用的是USB转串口,运行时间会是7ms左右,而用主板自带串 口仅是几个微秒,相差实在太大了。所以上面的红外接收器程序在没有自带串口 的笔记本上是无法正常工作的。源码下载地址: http:/www.sky ct Tes t.rar

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!