資源描述:
《遙控接收器制作過程》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、實用文檔自制電腦紅外遙控接收器(PC軟解碼)網(wǎng)上有很多介紹紅外遙控接收器制作的文章,但其中大部分是用單片進(jìn)行紅外解碼,然后再通過串口或USB把解碼后的按鍵信息傳入到PC的。這樣的電路制作起來,不僅造價相對偏高,而且需要對單片編程,這會令大部分軟件開發(fā)愛好者望而卻步。最近看到一篇僅需要7個簡單元器件的紅外接收器,只需拿起烙鐵,不需硬件編程就可以制作完成,原理圖如下:由原理圖我們可知,紅外接收頭把接收的紅外信號轉(zhuǎn)換為高低電平通過串口的DSR管腳傳入到PC,PC軟件通過對DSR高低電平信號的時間曲線進(jìn)行分析,從而獲得相對應(yīng)的按鍵信息。紅外遙控器一般采用脈寬調(diào)制的串行
2、碼,經(jīng)38kHz的載頻把紅外信號發(fā)射出去。其編碼信息一般由三部分組成:引導(dǎo)碼、地址碼和數(shù)據(jù)碼。一般信號長度大約100ms左右,持續(xù)按鍵則重復(fù)發(fā)送(中間會有10ms以上的間歇)。常態(tài)下,紅外接收頭的輸出(OUT)都是高電平,引導(dǎo)碼信號首先會令紅外接收頭輸出一個大約10ms左右的低電平(不同遙控器有不同的時延),這可令接收設(shè)備從容判定信號的到來,而后面的地址碼和數(shù)據(jù)碼其電平高低變化就相對較快了,大概在幾十或幾百個微秒之間。大全實用文檔PC紅外遙控軟件一般選用Girder,在使用之前需要安裝“SFH-56pluginforGirder”這個插件(文件名"igorSF
3、H-56Plug.dll"),否則不能正常處理我們這種電路的紅外接收器信號??杀氖俏抑两駴]找到這個插件,網(wǎng)上提供的很多鏈接都是壞的。即使找到了這個插件,要想在我們自己編寫的程序中使用也是困難的,因為Girder并沒有為我們開發(fā)者提供API接口。既然Girder能用軟件實現(xiàn)紅外解碼,我們?yōu)槭裁床荒苣??凡事都要開動大腦,積極行動才對,下面就是我自己焊接的一個紅外接收器(元器件是在中發(fā)買的,一共不到10元錢,還富裕好多電阻、電容?。▓D下方的紅外遙控器的接收器是基于USB的,僅支持Vista以上版本,并且不支持個人開發(fā),不過今天它終于發(fā)揮了它應(yīng)有的作用。當(dāng)然用電視
4、或VCD遙控器也是可以的)硬件有了,但程序該從何編起呢?大全實用文檔1、由于接收到的紅外信號在微秒級別中變化,對系統(tǒng)實時性要求較高,所以具備垃圾回收功能,實時性沒有保證的C#,似乎完不成這種信號的接收功能,所以我們選擇的是VC,由它實現(xiàn)高優(yōu)先級的線程去進(jìn)行信號接收。2、由于紅外遙控信號是脈寬調(diào)制的串行碼,所以我們需要采集信號的寬度,顯然采用一般的時鐘函數(shù)來獲取時間間隔是不可行的,因為精度太低,所以我們需用采用多媒體時鐘和高精度計時的API函數(shù)。3、一般我們按鍵持續(xù)時間為幾秒鐘,并且由于按鍵發(fā)出前有一個10ms左右的引導(dǎo)信號,所以我們的程序很容易判斷出信號起始點
5、,這樣我們一次僅需要接收一定量的原始數(shù)據(jù)就可以完成初步信號采集工作。4、對于我們的紅外接收程序來說并不需要實際解碼出紅外信號到底包含了那些具體的信息,只要其能夠區(qū)分出紅外遙控上的各個按鍵就行。5、由于紅接收器是通過串口RTS管腳供電,且通過DSR傳遞紅外信號的,所以我們的程序即使不接收數(shù)據(jù),也要打開串口,不過僅需要處理RTS和DSR管腳的信號即可。好了,動手去做,下面是用VC實現(xiàn)的一個DLL,其功能就是接收并記錄紅外信號的持續(xù)時間。核心代碼如下:DWORD?WINAPI?ThreadProc(LPVOID?pParam){????LARGE_INTEGER?l
6、itmp;?????LONGLONG?QPart1,QPart2;?????double?dfFreq;????int?iTime=0;??//微秒大全實用文檔????//?獲得計數(shù)器的時鐘頻率?????QueryPerformanceFrequency(&litmp);?????dfFreq?=?(double)1000000.0/litmp.QuadPart;????????????DWORD?ModemState,oldModemState=MS_DSR_ON;????????//EV_BREAK?or?EV_CTS?or?EV_DSR?or?EV_ER
7、R?or?EV_RING?or?EV_RLSD?or?EV_RXCHAR?or?EV_RXFLAG?or?EV_TXEMPTY????//SetCommMask(HSC_COM_Handle,EV_DSR);????//DWORD?EvtMask,dwError;????//COMSTAT?cs;???????while(HSC_Thread_RunFlag)????{????????//等待DSR信號發(fā)生變化????????//WaitCommEvent(HSC_COM_Handle,&EvtMask,&HSC_Ovread);????????//Clear
8、CommError(HSC_COM_H