找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6881|回復(fù): 35
打印 上一主題 下一主題
收起左側(cè)

每個(gè)按鍵的紅外接收碼長(zhǎng)度不同,單片機(jī)程序應(yīng)該以什么方式去接收呢

  [復(fù)制鏈接]
回帖獎(jiǎng)勵(lì) 50 黑幣 回復(fù)本帖可獲得 50 黑幣獎(jiǎng)勵(lì)! 每人限 1 次
跳轉(zhuǎn)到指定樓層
樓主
單片機(jī)開(kāi)發(fā)板上的遙控是發(fā)一個(gè)起始碼后跟著32位數(shù)據(jù),例程上是用判斷的方法,>=32位就相當(dāng)于接收完成,跳到下一步,但我用手頭上另一個(gè)遙控器,發(fā)出來(lái)的碼是有5位6位7位8位9位,,,,四種位長(zhǎng),請(qǐng)問(wèn)一下有哪些方法可以達(dá)到識(shí)別不同位長(zhǎng)?謝謝
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:123289 發(fā)表于 2020-6-17 18:30 | 只看該作者
估計(jì)一個(gè)間隔時(shí)間,超過(guò)這個(gè)值就判為一個(gè)鍵值結(jié)束了。

評(píng)分

參與人數(shù) 1黑幣 +10 收起 理由
billaj + 10 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

板凳
ID:220661 發(fā)表于 2020-6-17 19:15 | 只看該作者
紅外協(xié)議一般都有起始和結(jié)尾字符或者特殊的電平。
回復(fù)

使用道具 舉報(bào)

地板
ID:782419 發(fā)表于 2020-6-17 20:03 | 只看該作者
最近剛學(xué)到紅外協(xié)議,感覺(jué)特別難受,用的是NEC協(xié)議,當(dāng)然紅外協(xié)議還有好多種,但是開(kāi)發(fā)板附帶的課程上教的是NEC協(xié)議。數(shù)據(jù)格式由引導(dǎo)碼、用戶碼,用戶反碼、按鍵碼、按鍵反碼和停止位。接收數(shù)據(jù)的時(shí)候好像是一個(gè)8位的4個(gè)元素的數(shù)組,識(shí)別按鍵碼就取出數(shù)組中的固定元素就可以了,目前我也只是照著書(shū)把找碼抄下來(lái),就這樣也抄錯(cuò)了好幾處,對(duì)代碼就用了好長(zhǎng)時(shí)間,學(xué)單片機(jī)到了協(xié)議感覺(jué)就像到了夜里,很難熬,學(xué)著感覺(jué)很費(fèi)勁,時(shí)序在老師看來(lái)很簡(jiǎn)單,可是我看著感覺(jué)很麻煩,可能再堅(jiān)持學(xué)懂就好了吧!
回復(fù)

使用道具 舉報(bào)

5#
ID:388929 發(fā)表于 2020-6-18 09:35 | 只看該作者
我現(xiàn)在在嘗試沙發(fā)的方法,因?yàn)槲乙仓荒芟氲竭@個(gè)方法了,有進(jìn)展再來(lái)更新,希望有經(jīng)驗(yàn)的朋友可以分享一下,謝謝
回復(fù)

使用道具 舉報(bào)

6#
ID:388929 發(fā)表于 2020-6-18 09:39 | 只看該作者
我用的PT2210芯片,出來(lái)的不是標(biāo)準(zhǔn)碼,所以不能按位數(shù)來(lái)接收呢

123.png (4.07 KB, 下載次數(shù): 101)

123.png
回復(fù)

使用道具 舉報(bào)

7#
ID:781089 發(fā)表于 2020-6-18 12:44 | 只看該作者
用個(gè)計(jì)數(shù)器來(lái)判斷位長(zhǎng)?
回復(fù)

使用道具 舉報(bào)

8#
ID:783333 發(fā)表于 2020-6-18 15:57 | 只看該作者
插眼,等待大佬回復(fù)
回復(fù)

使用道具 舉報(bào)

9#
ID:782419 發(fā)表于 2020-6-18 16:41 | 只看該作者
在紅外通信程序中,有很多判斷退出的部分,都是超時(shí)退出,發(fā)送一位數(shù)據(jù)的時(shí)間不會(huì)超過(guò)一個(gè)數(shù)值,超過(guò)的話就說(shuō)明結(jié)束了。0的時(shí)間,1的時(shí)間,引導(dǎo)碼的時(shí)間都是有限的,每一位的時(shí)間更短,如果一定時(shí)間的高電平的話,比如20ms的高電平,是不是證明一個(gè)字節(jié)發(fā)送完了。
回復(fù)

使用道具 舉報(bào)

10#
ID:783377 發(fā)表于 2020-6-18 16:51 | 只看該作者
書(shū)上有代碼,按照那上面就行
回復(fù)

使用道具 舉報(bào)

11#
ID:388929 發(fā)表于 2020-6-19 09:23 | 只看該作者
wuzhenm 發(fā)表于 2020-6-18 16:51
書(shū)上有代碼,按照那上面就行

哪本書(shū)???現(xiàn)在百度出來(lái)的都是標(biāo)準(zhǔn)NEC碼呢,,,
回復(fù)

使用道具 舉報(bào)

12#
ID:388929 發(fā)表于 2020-6-19 10:43 | 只看該作者
billaj 發(fā)表于 2020-6-19 09:23
哪本書(shū)???現(xiàn)在百度出來(lái)的都是標(biāo)準(zhǔn)NEC碼呢,,,

關(guān)鍵是現(xiàn)在測(cè)出來(lái)的不是標(biāo)準(zhǔn)碼。。。我不是已經(jīng)說(shuō)了嗎,還上圖了
回復(fù)

使用道具 舉報(bào)

13#
ID:401564 發(fā)表于 2020-6-19 11:33 | 只看該作者
你這個(gè)IC用的是RC-5碼的協(xié)議,所以,這和NEC的是不同的
你要先去看一下RC-5協(xié)議,它是以高電平的先后順序來(lái)識(shí)別0和1的,而NEC協(xié)議是時(shí)間長(zhǎng)短來(lái)識(shí)別0和1的
每次接收到一個(gè)字節(jié)就變量加1,接收完成就知道長(zhǎng)度是多少了
超過(guò)一個(gè)周期的時(shí)間電平?jīng)]有變化,紅外是肯定沒(méi)有接收的了
RC-5的周期是1.778mS,你可以設(shè)定為3mS之內(nèi)沒(méi)有電平變化就認(rèn)為是已經(jīng)沒(méi)有接收了

評(píng)分

參與人數(shù) 1黑幣 +12 收起 理由
billaj + 12 很給力!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

14#
ID:388929 發(fā)表于 2020-6-19 14:04 | 只看該作者
Y_G_G 發(fā)表于 2020-6-19 11:33
你這個(gè)IC用的是RC-5碼的協(xié)議,所以,這和NEC的是不同的
你要先去看一下RC-5協(xié)議,它是以高電平的先后順序來(lái)識(shí) ...

謝謝你,我也看了下RC-5的協(xié)議,的確如你所說(shuō),我得再研究研究,感謝你的回答
回復(fù)

使用道具 舉報(bào)

15#
ID:642999 發(fā)表于 2020-6-20 19:35 | 只看該作者
保證可用,你只要把0x...換成你要到按鍵值,當(dāng)然可以用2,8,10,16進(jìn)制都行
這是程序:
#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
////////////////////////&Aring;&Uuml;&Acirc;í
case 0x07:                     //×ó&Ograve;&AElig;
{
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:                     //&Oacute;&Ograve;&Ograve;&AElig;
{
        led=0x01;
        delay(50000);
        while(1)
        {
                for(i=0;i<8;i++)         
                {
                        led=_crol_(led,1);
                        delay(50000);
                }
        }
}
break;
case 0x40:                //&Iacute;&acirc;
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:        //&Agrave;&iuml;
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;
///////////////////////&Aring;&Uuml;&Acirc;í

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:              //·&micro;&raquo;&Oslash;
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;//&Egrave;&laquo;&sup1;&Oslash;
case 0x47:P1=0xFF;break;//&Egrave;&laquo;&iquest;&ordf;
case 0x44:fu=~fu;//&cedil;&acute;&Icirc;&raquo;
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();
}
        }
}

評(píng)分

參與人數(shù) 1黑幣 +12 收起 理由
billaj + 12 共享資料的黑幣獎(jiǎng)勵(lì)!雖然沒(méi)用上你的程序,.

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

16#
ID:600952 發(fā)表于 2020-6-26 13:48 | 只看該作者
協(xié)議不知道就上網(wǎng)查查唄,
https://wenku.baidu.com/view/380a8bddb14e852458fb57e7.html
這個(gè)是RC-5碼的協(xié)議,建議再看看datasheet
回復(fù)

使用道具 舉報(bào)

17#
ID:788495 發(fā)表于 2020-6-27 09:45 | 只看該作者
剛好這里不會(huì),準(zhǔn)備學(xué)習(xí),等待大佬解決
回復(fù)

使用道具 舉報(bào)

18#
ID:388929 發(fā)表于 2020-7-4 08:33 | 只看該作者
15411 發(fā)表于 2020-6-20 19:35
保證可用,你只要把0x...換成你要到按鍵值,當(dāng)然可以用2,8,10,16進(jìn)制都行
這是程序:
#include

謝謝你,我已經(jīng)自己寫(xiě)了,我用的是stm8的單片機(jī)
回復(fù)

使用道具 舉報(bào)

19#
ID:388929 發(fā)表于 2020-7-4 08:35 | 只看該作者
qujiuhe 發(fā)表于 2020-6-26 13:48
協(xié)議不知道就上網(wǎng)查查唄,
https://wenku.baidu.com/view/380a8bddb14e852458fb57e7.html
這個(gè)是RC-5碼的 ...

是的,我剛開(kāi)始不知道紅外碼有好多種,所以就按著NEC協(xié)議寫(xiě)代碼了,所以有幾個(gè)按鍵有重碼,于是我就很奇怪了
回復(fù)

使用道具 舉報(bào)

20#
ID:388929 發(fā)表于 2020-7-4 08:38 | 只看該作者
謝謝各位的回復(fù),在這我終結(jié)一下話題吧,看了RC-5的協(xié)議后我最終寫(xiě)出來(lái)了,就是時(shí)序問(wèn)題,外部中斷判斷收接,定時(shí)器解碼,就這么解決了,謝謝各位
回復(fù)

使用道具 舉報(bào)

21#
ID:61069 發(fā)表于 2020-7-4 08:42 | 只看該作者
紅外協(xié)議有停止的判斷嗎
回復(fù)

使用道具 舉報(bào)

22#
ID:388929 發(fā)表于 2020-7-4 10:35 | 只看該作者
吹哥來(lái)了 發(fā)表于 2020-7-4 08:42
紅外協(xié)議有停止的判斷嗎

什么叫停止的判斷???我估計(jì)紅外協(xié)議里的數(shù)據(jù)位數(shù)都是固定的,所以你讀完總位數(shù)就可以暫停跳出了呀
回復(fù)

使用道具 舉報(bào)

23#
ID:633896 發(fā)表于 2020-7-7 11:14 | 只看該作者
我不太懂這個(gè) ,如果要是判斷的話 可以用 if  else if 分別判斷這樣可以嗎?
回復(fù)

使用道具 舉報(bào)

24#
ID:801878 發(fā)表于 2020-7-28 10:14 | 只看該作者
IC用的是RC-5碼的協(xié)議,所以,這和NEC的是不同的
回復(fù)

使用道具 舉報(bào)

25#
ID:808700 發(fā)表于 2020-7-28 11:31 | 只看該作者
看那個(gè)產(chǎn)品的說(shuō)明書(shū),特別是時(shí)序圖,
回復(fù)

使用道具 舉報(bào)

26#
ID:275449 發(fā)表于 2020-7-28 13:27 | 只看該作者
空閑中斷法最合適的    當(dāng)超過(guò)1ms(視情況定) 沒(méi)有接受到新的數(shù)據(jù)位后  就當(dāng)做接收完成
回復(fù)

使用道具 舉報(bào)

27#
ID:609524 發(fā)表于 2020-7-28 15:05 | 只看該作者
billaj 發(fā)表于 2020-6-19 09:23
哪本書(shū)???現(xiàn)在百度出來(lái)的都是標(biāo)準(zhǔn)NEC碼呢,,,

l樓主用的是433m嗎
回復(fù)

使用道具 舉報(bào)

28#
ID:809311 發(fā)表于 2020-8-8 17:15 | 只看該作者
編程啊,代碼可以買(mǎi)到。
回復(fù)

使用道具 舉報(bào)

29#
ID:388929 發(fā)表于 2020-8-8 18:01 | 只看該作者

433m是什么東東???
回復(fù)

使用道具 舉報(bào)

30#
ID:388929 發(fā)表于 2020-8-8 18:03 | 只看該作者
魏海龍 發(fā)表于 2020-7-7 11:14
我不太懂這個(gè) ,如果要是判斷的話 可以用 if  else if 分別判斷這樣可以嗎?

要判斷時(shí)間,不能單純用IF的
回復(fù)

使用道具 舉報(bào)

31#
ID:388929 發(fā)表于 2020-8-8 18:04 | 只看該作者
Roy-2010 發(fā)表于 2020-8-8 17:15
編程啊,代碼可以買(mǎi)到。

大哥,買(mǎi)就不用到這發(fā)貼求助啦
回復(fù)

使用道具 舉報(bào)

32#
ID:388929 發(fā)表于 2020-8-8 18:05 | 只看該作者
12345678110 發(fā)表于 2020-7-28 13:27
空閑中斷法最合適的    當(dāng)超過(guò)1ms(視情況定) 沒(méi)有接受到新的數(shù)據(jù)位后  就當(dāng)做接收完成

協(xié)議說(shuō)是多少時(shí)間就定多少時(shí)間就可以了
回復(fù)

使用道具 舉報(bào)

33#
ID:106821 發(fā)表于 2020-9-16 11:49 | 只看該作者
添加起始和結(jié)束標(biāo)志符
回復(fù)

使用道具 舉報(bào)

34#
ID:582903 發(fā)表于 2020-9-16 15:09 | 只看該作者
給通訊定義結(jié)束符
回復(fù)

使用道具 舉報(bào)

35#
ID:235954 發(fā)表于 2020-9-17 08:11 | 只看該作者
計(jì)算波長(zhǎng)的時(shí)間,試著按照波形高電平的寬度進(jìn)行判斷
回復(fù)

使用道具 舉報(bào)

36#
ID:582903 發(fā)表于 2020-9-17 11:24 | 只看該作者
看協(xié)議,注意時(shí)序判斷
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表