|
發(fā)布時間: 2020-6-17 17:30
正文摘要:單片機開發(fā)板上的遙控是發(fā)一個起始碼后跟著32位數(shù)據(jù),例程上是用判斷的方法,>=32位就相當(dāng)于接收完成,跳到下一步,但我用手頭上另一個遙控器,發(fā)出來的碼是有5位6位7位8位9位,,,,四種位長,請問一下有哪些方 ... |
| 看協(xié)議,注意時序判斷 |
| 計算波長的時間,試著按照波形高電平的寬度進行判斷 |
| 給通訊定義結(jié)束符 |
| 添加起始和結(jié)束標(biāo)志符 |
12345678110 發(fā)表于 2020-7-28 13:27 協(xié)議說是多少時間就定多少時間就可以了 |
Roy-2010 發(fā)表于 2020-8-8 17:15 大哥,買就不用到這發(fā)貼求助啦 |
魏海龍 發(fā)表于 2020-7-7 11:14 要判斷時間,不能單純用IF的 |
楊天想 發(fā)表于 2020-7-28 15:05 433m是什么東東??? |
| 編程啊,代碼可以買到。 |
billaj 發(fā)表于 2020-6-19 09:23 l樓主用的是433m嗎 |
| 空閑中斷法最合適的 當(dāng)超過1ms(視情況定) 沒有接受到新的數(shù)據(jù)位后 就當(dāng)做接收完成 |
| 看那個產(chǎn)品的說明書,特別是時序圖, |
| IC用的是RC-5碼的協(xié)議,所以,這和NEC的是不同的 |
|
我不太懂這個 ,如果要是判斷的話 可以用 if else if 分別判斷這樣可以嗎? |
吹哥來了 發(fā)表于 2020-7-4 08:42 什么叫停止的判斷???我估計紅外協(xié)議里的數(shù)據(jù)位數(shù)都是固定的,所以你讀完總位數(shù)就可以暫停跳出了呀 |
| 紅外協(xié)議有停止的判斷嗎 |
| 謝謝各位的回復(fù),在這我終結(jié)一下話題吧,看了RC-5的協(xié)議后我最終寫出來了,就是時序問題,外部中斷判斷收接,定時器解碼,就這么解決了,謝謝各位 |
qujiuhe 發(fā)表于 2020-6-26 13:48 是的,我剛開始不知道紅外碼有好多種,所以就按著NEC協(xié)議寫代碼了,所以有幾個按鍵有重碼,于是我就很奇怪了 |
15411 發(fā)表于 2020-6-20 19:35 謝謝你,我已經(jīng)自己寫了,我用的是stm8的單片機 |
| 剛好這里不會,準(zhǔn)備學(xué)習(xí),等待大佬解決 |
|
協(xié)議不知道就上網(wǎng)查查唄, https://wenku.baidu.com/view/380a8bddb14e852458fb57e7.html 這個是RC-5碼的協(xié)議,建議再看看datasheet |
|
保證可用,你只要把0x...換成你要到按鍵值,當(dāng)然可以用2,8,10,16進制都行 這是程序: #include<reg51.h> #include<intrins.h> typedef unsigned int u16; typedef unsigned char u8; sbit IR=P3^2; #define led P1 sbit light1=P1^0; sbit light2=P1^1; sbit light3=P1^2; sbit light4=P1^3; sbit light5=P1^4; sbit light6=P1^5; sbit fu=P3^0; unsigned char irtime; bit irpro_ok,irok; char i,a; unsigned char IRcord[4]; unsigned char irdata[33]; void Ir_work(void); void Ircordpro(void); void tim0_isr (void) interrupt 1 using 1 { irtime++; } void EX0_ISR (void) interrupt 0 { static unsigned char i; static bit startflag; if(startflag) { if(irtime<63&&irtime>=33) i=0; irdata[i]=irtime; irtime=0; i++; if(i==33) { irok=1; i=0; } } else { irtime=0; startflag=1; } } void TIM0init(void) { TMOD=0x02; TH0=0x00; TL0=0x00; ET0=1; TR0=1; } void EX0init(void) { IT0 = 1; EX0 = 1; EA = 1; } void delay(u16 i) { while(i--); } void Delay1ms(unsigned int count) { unsigned int i,j; for(i=0;i<count;i++) for(j=0;j<120;j++); } void Ir_work(void) { switch(IRcord[2]) { case 0x0c:light1=~light1;break;//1 case 0x18:light2=~light2;break;//2 case 0x5e:light3=~light3;break;//3 case 0x08:light4=~light4;break;//4 case 0x1c:light5=~light5;break;//5 case 0x5a:light6=~light6;break;//6 ////////////////////////ÅÜÂí case 0x07: //×óÒÆ { IT0 = 1; EX0 = 1; EA = 1; led=0x01; a=0; delay(50000); while(1) { if(a==1) { break; } while(1) { if(a==0) { for(i=0;i<8;i++) { led=_cror_(led,1); delay(50000); } break;case 0x15:a=1; } if(a==1) { break; } } } } break; case 0x09: //ÓÒÒÆ { led=0x01; delay(50000); while(1) { for(i=0;i<8;i++) { led=_crol_(led,1); delay(50000); } } } break; case 0x40: //Íâ P1=0; while(1) { light3=1;light4=1;delay(10000); light3=0;light4=0;delay(10000); light2=1;light5=1;delay(10000); light2=0;light5=0;delay(10000); light1=1;light6=1;delay(10000); light1=0;light6=0;delay(10000); } break; case 0x19: //Àï P1=0; while(1) { light1=1;light6=1;delay(10000); light1=0;light6=0;delay(10000); light2=1;light5=1;delay(10000); light2=0;light5=0;delay(10000); light3=1;light4=1;delay(10000); light3=0;light4=0;delay(10000); } break; ///////////////////////ÅÜÂí case 0x42: //7 P1=0; light1=1;delay(30000);light3=1;delay(30000);light5=1;delay(10000); light2=1;delay(30000);light4=1;delay(30000);light6=1;break; case 0x52: //8 P1=0; light2=1;delay(30000);light4=1;delay(30000);light6=1;delay(10000); light1=1;delay(30000);light3=1;delay(30000);light5=1;break; case 0x4a://9 P1=0xFF;delay(50000);P1=0x00;;delay(50000); break; case 0x43: //·µ»Ø P1=0; { light1=1;light6=1;delay(10000); light1=0;light6=0;delay(10000); light2=1;light5=1;delay(10000); light2=0;light5=0;delay(10000); light3=1;light4=1;delay(10000); light3=0;light4=0;delay(10000); light2=1;light5=1;delay(10000); light2=0;light5=0;delay(10000); light1=1;light6=1;delay(10000); light1=0;light6=0;delay(10000); } break; case 0x16: //0 IR=0; break; case 0x0d: //C P1=0; light1=1;delay(30000);light1=0;delay(30000); light6=1;delay(30000);light6=0;delay(30000); light5=1;delay(30000);light5=0;delay(30000); light2=1;delay(30000);light2=0;delay(30000); light3=1;delay(30000);light3=0;delay(30000); light4=1;delay(30000);light4=0;delay(30000); break; case 0x45:P1=0x00;break;//È«¹Ø case 0x47:P1=0xFF;break;//È«¿ª case 0x44:fu=~fu;//¸´Î» default:break; } irpro_ok=0; } void Ircordpro(void) { unsigned char i, j, k,cord,value; k=1; for(i=0;i<4;i++) { for(j=1;j<=8;j++) { cord=irdata[k]; if(cord>7) value=value|0x80; if(j<8) { value>>=1; } k++; } IRcord[i]=value; value=0; } irpro_ok=1; } void main(void) { P1=0x00; fu=0; a=0; EX0init(); TIM0init(); while(1) { if(irok) { Ircordpro(); irok=0; } if(irpro_ok) { Ir_work(); } } } |
| 參與人數(shù) 1 | 黑幣 +12 | 收起 理由 |
|---|---|---|
|
| + 12 | 共享資料的黑幣獎勵!雖然沒用上你的程序,. |
Y_G_G 發(fā)表于 2020-6-19 11:33 謝謝你,我也看了下RC-5的協(xié)議,的確如你所說,我得再研究研究,感謝你的回答 |
|
你這個IC用的是RC-5碼的協(xié)議,所以,這和NEC的是不同的 你要先去看一下RC-5協(xié)議,它是以高電平的先后順序來識別0和1的,而NEC協(xié)議是時間長短來識別0和1的 每次接收到一個字節(jié)就變量加1,接收完成就知道長度是多少了 超過一個周期的時間電平?jīng)]有變化,紅外是肯定沒有接收的了 RC-5的周期是1.778mS,你可以設(shè)定為3mS之內(nèi)沒有電平變化就認為是已經(jīng)沒有接收了 |
| 參與人數(shù) 1 | 黑幣 +12 | 收起 理由 |
|---|---|---|
|
| + 12 | 很給力! |
billaj 發(fā)表于 2020-6-19 09:23 關(guān)鍵是現(xiàn)在測出來的不是標(biāo)準(zhǔn)碼。。。我不是已經(jīng)說了嗎,還上圖了 |
wuzhenm 發(fā)表于 2020-6-18 16:51 哪本書???現(xiàn)在百度出來的都是標(biāo)準(zhǔn)NEC碼呢,,, |
| 書上有代碼,按照那上面就行 |
| 在紅外通信程序中,有很多判斷退出的部分,都是超時退出,發(fā)送一位數(shù)據(jù)的時間不會超過一個數(shù)值,超過的話就說明結(jié)束了。0的時間,1的時間,引導(dǎo)碼的時間都是有限的,每一位的時間更短,如果一定時間的高電平的話,比如20ms的高電平,是不是證明一個字節(jié)發(fā)送完了。 |
| 插眼,等待大佬回復(fù) |
| 用個計數(shù)器來判斷位長? |
| 我現(xiàn)在在嘗試沙發(fā)的方法,因為我也只能想到這個方法了,有進展再來更新,希望有經(jīng)驗的朋友可以分享一下,謝謝 |
| 最近剛學(xué)到紅外協(xié)議,感覺特別難受,用的是NEC協(xié)議,當(dāng)然紅外協(xié)議還有好多種,但是開發(fā)板附帶的課程上教的是NEC協(xié)議。數(shù)據(jù)格式由引導(dǎo)碼、用戶碼,用戶反碼、按鍵碼、按鍵反碼和停止位。接收數(shù)據(jù)的時候好像是一個8位的4個元素的數(shù)組,識別按鍵碼就取出數(shù)組中的固定元素就可以了,目前我也只是照著書把找碼抄下來,就這樣也抄錯了好幾處,對代碼就用了好長時間,學(xué)單片機到了協(xié)議感覺就像到了夜里,很難熬,學(xué)著感覺很費勁,時序在老師看來很簡單,可是我看著感覺很麻煩,可能再堅持學(xué)懂就好了吧! |
| 紅外協(xié)議一般都有起始和結(jié)尾字符或者特殊的電平。 |
Powered by 單片機教程網(wǎng)