|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
紅外線解碼程序真的那么難編嗎? |
| 作者:ihafd 欄目:單片機(jī) |
我編個紅外解碼程序.用NB9148作為紅外發(fā)射的編碼(帶調(diào)制的),紅外接收頭(帶解調(diào)的)接MCS S51的 外部中斷O .但老是沒法解碼,請指教. 解碼方法如下: 定時器0的定時時間為0.42ms、定時方式1、INT0為負(fù)沿觸發(fā)。當(dāng)?shù)谝晃粩?shù)據(jù)到來時,觸發(fā)INT0中斷,產(chǎn)生中斷。在INT0中斷服務(wù)程序中關(guān)外中斷0,啟動定時器0,0.42ms后,定時器中斷,讀數(shù)據(jù)。此時正好在該位數(shù)據(jù)的中間,以后定時器定時時間設(shè)定為0.84ms每中斷2次讀一位數(shù)據(jù),讀完12位數(shù)據(jù)后,將數(shù)據(jù)保存在MSB LSB中,延時40位,再讀12位數(shù)據(jù),若讀出的12位數(shù)據(jù)和前面的相同,則進(jìn)行校驗、解碼,。以上任何一步不能通過則放棄此次接收結(jié)果。 程序如下: // 紅處接收程序 /// #include<REG51.H> typedef unsigned CHAR uCHAR; sbit in=P3^2; //接紅處接收頭的輸出端。 sbit symbol=P1^0; //接收失敗標(biāo)志位。 uCHAR bdata MSB, LSB; //接收寄存器。 sbit DD=MSB^7; //定時中斷標(biāo)志位。 sbit C1=MSB^3; sbit C2=MSB^2; sbit C3=MSB^1; sbit H=MSB^0; sbit S1=LSB^7; sbit S2=LSB^6; sbit D1=LSB^5; sbit D2=LSB^4; sbit D3=LSB^3; sbit D4=LSB^2; sbit D5=LSB^1; sbit D6=LSB^0; uCHAR codedata,conut,add; //全局變量。 main() { uCHAR tempcode1,tempcode2,tempcode3,tempcode4; TMOD=0x01; //定時器0,方式1。 IT0=1; // 外部中斷0, 下降沿觸發(fā)。 IE=0x83; //允許外部中斷和定時器0中斷。 TH0=0xFE; //1a=0.4219ms 定時; [ 12MHZ 晶振 ] TL0=0x5A; // while(1) { while(!IE0); //等待外部中斷的到來。 for(add=0;add<24;add++) { DD=1; while(DD==1); //等待定時器中斷。 TH0=0xFC; //2a=0.8438ms定時; TL0=0xB4; // } tempcode1=MSB; tempcode2=LSB; for(add=0;add<40;add++) { DD=1; while(DD==1); //等待定時器中斷。 TH0=0xFC; //2a=0.8438ms定時 TL0=0xB4; // } for(add=0;add<24;add++) { DD=1; while(DD==1); //等待定時器中斷。 TH0=0xFC; //2a=0.8438ms定時。 TL0=0xB4; // } tempcode3=MSB; tempcode4=LSB; if((tempcode1==tempcode3)&(tempcode2==tempcode4)) //較驗接收的正吳。 { codedata=tempcode2; P2=codedata; //若接收正確,在P2口作指示。 } else symbol=0; //接收失敗標(biāo)專。 EX0=1; while(1); } } void int0() interrupt 0 //外部中斷子程序。 { TR0=1; //打開定時器0 EX0=0; //關(guān)閉外部中斷。 } void time0() interrupt 1 //定時器0中斷子程序。 { SWITCH(add) { case 0:C1=in;break; case 2:C2=in;break; case 4:C3=in;break; case 6:H=in;break; case 8:S1=in;break; case 10:S2=in;break; case 12:D1=in;break; case 14:D2=in;break; case 16:D3=in;break; case 18:D4=in;break; case 20:D5=in;break; case 22:D6=in;break; default:break; } DD=0; } |
| 2樓: | >>參與討論 |
| 作者: 滌綸 于 2006/4/12 18:42:00 發(fā)布:
/轉(zhuǎn) 到這里看看吧 * - 本貼最后修改時間:2006-4-12 18:43:42 修改者:滌綸 |
|
| 3樓: | >>參與討論 |
| 作者: ihafd 于 2006/4/12 19:23:00 發(fā)布:
滌綸 謝謝你! 匠人的那個基于狀態(tài)機(jī)的紅外線解碼程序我看不懂啊!! 還有其它嗎? |
|
| 4樓: | >>參與討論 |
| 作者: ihafd 于 2006/4/13 8:21:00 發(fā)布:
請大家?guī)蛶兔? 謝謝. |
|
| 5樓: | >>參與討論 |
| 作者: lufeijian 于 2006/4/13 9:55:00 發(fā)布:
樓主的思路和方向就不對了! |
|
| 6樓: | >>參與討論 |
| 作者: dcp 于 2006/4/13 10:38:00 發(fā)布:
這樣能解出來就厲害了 |
|
| 7樓: | >>參與討論 |
| 作者: ihafd 于 2006/4/15 13:02:00 發(fā)布:
請問思路應(yīng)該怎樣才對. 謝謝! |
|
| 8樓: | >>參與討論 |
| 作者: djx 于 2006/4/15 13:33:00 發(fā)布:
不要定時器計時,直接用循環(huán)延時. |
|
| 9樓: | >>參與討論 |
| 作者: wswh2o 于 2006/4/17 9:13:00 發(fā)布:
定時器也行吧. |
|
| 10樓: | >>參與討論 |
| 作者: voynich 于 2006/4/17 9:56:00 發(fā)布:
定時器可以的1 定時時間要在不影響程序運(yùn)行的情況下,足夠的小,否則解碼的誤碼率偏高! |
|
| 11樓: | >>參與討論 |
| 作者: dcp 于 2006/4/17 12:52:00 發(fā)布:
用定時器做個133us的定時中斷 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |