自制电脑红外遥控接收器

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

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

1、自制电脑红外遥控接收器(PC软解码)分类:嵌入式 智能家居 2009-10-14 09:52 4649人阅读 评论(9)收藏 举报网上有很多介绍红外遥控接收器制作的文章,但其中大部分是用单片进行红外解 码,然后再通过串口或USB把解码后的按键信息传入到 PC的。这样的电路制 作起来,不仅造价相对偏高,而且需要对单片编程,这会令大部分软件开发爱好 者望而却步。最近看到一篇仅需要7个简单元器件的红外接收器,只需拿起烙铁,不需硬件编 程就可以制作完成,原理图如下:红外按收头1I50038X9针串口由原理图我们可知,红外接收头把接收的红外信号转换为高低电平通过串口的DSR管脚传入到PC,PC软件通过对

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

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

4、个人开发,不过今天它终于发挥了它应有的作用。当然用电视或 VCD遥 控器也是可以的)硬件有了,但程序该从何编起呢?1、由于接收到的红外信号在微秒级别中变化,对系统实时性要求较高,所以具 备垃圾回收功能,实时性没有保证的 C#,似乎完不成这种信号的接收功能,所 以我们选择的是VC,由它实现高优先级的线程去进行信号接收。2、由于红外遥控信号是脉宽调制的串行码,所以我们需要采集信号的宽度,显然采用一般的时钟函数来获取时间间隔是不可行的,因为精度太低,所以我们需用采用多媒体时钟和高精度计时的 API函数。3、 一般我们按键持续时间为几秒钟,并且由于按键发出前有一个10ms左右的 引导信号,所以我们的程

5、序很容易判断出信号起始点, 这样我们一次仅需要接收 一定量的原始数据就可以完成初步信号米集工作。4、对于我们的红外接收程序来说并不需要实际解码出红外信号到底包含了那些 具体的信息,只要其能够区分出红外遥控上的各个按键就行。5、由于红接收器是通过串口 RTS管脚供电,且通过DSR传递红外信号的,所以我们的程序即使不接收数据,也要打开串口,不过仅需要处理RTS和DSR管脚的信号即可。好了,动手去做,下面是用VC实现的一个DLL,其功能就是接收并记录红外信 号的持续时间。核心代码如下:DWORD WINAPI ThreadProc(LPVOID pParam)LARGE_INTEGER litmp;

6、LONGLONG QPart1,QPart2;double dfFreq;int iTime=0; / 微秒/获得计数器的时钟频率QueryPerforma nceFreque ncy(&litmp);dfFreq = (double)1000000.0/litmp.QuadPart;DWORD ModemState,oldModemState=MS_DSR_ON;EV_BREAK or EV_CTS or EV_DSR or EV_ERR or EV_RING orEV_RLSD or EV_RXCHAR or EV_RXFLAG or EV_TXEMPTYSetCommMask(HSC_C

7、OM_Ha ndle,EV_DSR);/DWORD EvtMask,dwError;/COMSTAT cs;while(HSC_Thread_Ru nFlag)/等待DSR信号发生变化/WaitCommEve nt(HSC_COM_Ha ndle,&EvtMask,&HSC_Ovread);ClearCommError(HSC_COM_Ha ndle,&dwError,&cs);/获得DSR的状态GetCommModemStatus(HSC_COM_Ha ndle,&M odemState);ModemState = (ModemState & MS_DSR_ON); if(ModemStat

8、e = oldModemState)continue;oldModemState=ModemState;/清计数In terlockedExcha nge(&HSC_NUM,0);/开始接收数据if(HSC_State = 0 & ModemState = 0)QueryPerforma nceCo un ter(&litmp);QPart1 = litmp.QuadPart;HSC_State=1;/复位计数In terlockedExcha nge( &HSC_NUM,0);In terlockedExcha nge( &HSCn dex,0);/开启定时器HSC_TimerlD =tim

9、eSetEve nt(10,HSC_Accuracy,MMTimer,NULL,TIME_PERIODIC);con ti nue;/接收数据状态if(HSC_State = 1)QueryPerforma nceCo un ter(&litmp);QPart2 = litmp.QuadPart;/-if(ModemState = 0)iTime = (in t)(QPart2-QPart1)*dfFreq);elseiTime = (in t)(QPart1-QPart2)*dfFreq);if(HSC_l ndex HSC_BufferSize)*(HSC_Buffer+HSC_l nde

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

11、Int32 COM, Int32 delay, Int32 BufferSize);Dlllmport(DllPath)public static extern In t32 HSCE nd();Dlllmport(DIIPath)public static extern Int32 HSCData(int intData);我封装了一个类,一旦有按键信息,就会触发一个 Click事件。此外程序还具备 自学习功能,并且可以把学习后的结果序列化到一个 XML文件中去,这样下次 再按键就可以识别出键名了。主程序中测试代码如下:public partial class frmMa in : Form

12、YFHWCollect hw =n ull;in t hwData = null;public frmMai n()In itializeComp onen t();hw = new YFHWCollect(this, 1);hw.Click += new YFHWCollect.HWEve ntHa ndler(hw_Click);void hw_Click(object sen der, HWEve ntArgs e)stri ng strI nfo =;for (i nt j = 0; j e.lstDatai.Le ngth; j+)strI nfo += e.lstDataij.To

13、Stri ng() + ;strI nfo += /r/n;txtI nfo.Text = strI nfo;IblKeyName.Text = e.KeyName+ ( + (e.I nterval /10).ToStri ng() ms);hwData = e.Data;picBar.Refresh();private void btnCommand_Click(object sender, EventArgs e)if (bt nComma nd.Text = 开始)bt nComma nd.Text =停止;hw.Start();elsebt nComma nd.Text = 开始;h

14、w.E nd();private void btnStudy_Click(object sender, EventArgs e)hw.Study(txtKeyName.Text);private void picBar_Pa in t(object sen der, Pai ntEve ntArgs e)int width = picBar.Width, height = picBar.Height;/ 2, width, height / 2);if (hwData != n ull)float Len=0;foreach(i nt l in hwData)Len+=l;float dx =

15、 width / Len, DX=0;Pen p = new Pen(Color.Green);float Y=0, 丫仁 height/4,Y2=(float)(height*3.0/4.0);float X=0;for(int i=0;ihwData.Length;i+)Y = (i % 2)=0 ? Y2:Y1);DX = hwDatai * dx;+ DX, Y);X += DX;测试程序运行结果如下:工 益 ET 262T 滥25272T歴红外承控儔号叢杖测试l ro.fSc4 3 4 4 4 4 4 4-444 s 4 4 4 4 4 4-4-44 444 4 4 444暫 二!口

16、 ? s 8243 44 44 44 44 44 4(上面显示的数据为高电平和低电平的持续时间(低高低高),单位为 1/10毫秒)注意事项:1、红外遥控器按键偶数次和奇数次的编码是不同的,程序需要学习两次,才能 正常识别按键信息。2、 普通的USB转串口由于仅连接了 2、3、5管脚,所以不能正常使用,对比 较好的USB转串口(比如Moxa的三百多一根),虽然所有的管脚都引出了, 但是由于是通过USB转换的,所以响应时间很是问题,我就因为这个差一点功 亏一篑,幸好把程序又在 PC机跑了一遍。/获得DSR的状态GetCommModemStatus(HSC COM Han die,&M odemState);上面的指令如果采用的是 USB转串口,运行时间会是7ms左右,而用主板自带 串口仅是几个微秒,相差实在太大了。所以上面的红外接收器程序在没有自带串 口的笔记本上是无法正常工作的。源码下载地址: n/yefa n/SourceCode/YFHSCollectTest.rar分享到:上一篇:让榨汁机定时工作(C#+PLC)下一篇:自己动手焊制硬件开发板

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