欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 每個按鍵的紅外接收碼長度不同,單片機程序應該以什么方式去接收呢 [打印本頁]

作者: billaj    時間: 2020-6-17 17:30
標題: 每個按鍵的紅外接收碼長度不同,單片機程序應該以什么方式去接收呢
單片機開發板上的遙控是發一個起始碼后跟著32位數據,例程上是用判斷的方法,>=32位就相當于接收完成,跳到下一步,但我用手頭上另一個遙控器,發出來的碼是有5位6位7位8位9位,,,,四種位長,請問一下有哪些方法可以達到識別不同位長?謝謝
作者: yzwzfyz    時間: 2020-6-17 18:30
估計一個間隔時間,超過這個值就判為一個鍵值結束了。
作者: gongnn    時間: 2020-6-17 19:15
紅外協議一般都有起始和結尾字符或者特殊的電平。
作者: wufeng391    時間: 2020-6-17 20:03
最近剛學到紅外協議,感覺特別難受,用的是NEC協議,當然紅外協議還有好多種,但是開發板附帶的課程上教的是NEC協議。數據格式由引導碼、用戶碼,用戶反碼、按鍵碼、按鍵反碼和停止位。接收數據的時候好像是一個8位的4個元素的數組,識別按鍵碼就取出數組中的固定元素就可以了,目前我也只是照著書把找碼抄下來,就這樣也抄錯了好幾處,對代碼就用了好長時間,學單片機到了協議感覺就像到了夜里,很難熬,學著感覺很費勁,時序在老師看來很簡單,可是我看著感覺很麻煩,可能再堅持學懂就好了吧!
作者: billaj    時間: 2020-6-18 09:35
我現在在嘗試沙發的方法,因為我也只能想到這個方法了,有進展再來更新,希望有經驗的朋友可以分享一下,謝謝
作者: billaj    時間: 2020-6-18 09:39
我用的PT2210芯片,出來的不是標準碼,所以不能按位數來接收呢

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

123.png

作者: Allenwell    時間: 2020-6-18 12:44
用個計數器來判斷位長?
作者: ymb    時間: 2020-6-18 15:57
插眼,等待大佬回復
作者: wufeng391    時間: 2020-6-18 16:41
在紅外通信程序中,有很多判斷退出的部分,都是超時退出,發送一位數據的時間不會超過一個數值,超過的話就說明結束了。0的時間,1的時間,引導碼的時間都是有限的,每一位的時間更短,如果一定時間的高電平的話,比如20ms的高電平,是不是證明一個字節發送完了。
作者: wuzhenm    時間: 2020-6-18 16:51
書上有代碼,按照那上面就行
作者: billaj    時間: 2020-6-19 09:23
wuzhenm 發表于 2020-6-18 16:51
書上有代碼,按照那上面就行

哪本書???現在百度出來的都是標準NEC碼呢,,,
作者: billaj    時間: 2020-6-19 10:43
billaj 發表于 2020-6-19 09:23
哪本書???現在百度出來的都是標準NEC碼呢,,,

關鍵是現在測出來的不是標準碼。。。我不是已經說了嗎,還上圖了
作者: Y_G_G    時間: 2020-6-19 11:33
你這個IC用的是RC-5碼的協議,所以,這和NEC的是不同的
你要先去看一下RC-5協議,它是以高電平的先后順序來識別0和1的,而NEC協議是時間長短來識別0和1的
每次接收到一個字節就變量加1,接收完成就知道長度是多少了
超過一個周期的時間電平沒有變化,紅外是肯定沒有接收的了
RC-5的周期是1.778mS,你可以設定為3mS之內沒有電平變化就認為是已經沒有接收了


作者: billaj    時間: 2020-6-19 14:04
Y_G_G 發表于 2020-6-19 11:33
你這個IC用的是RC-5碼的協議,所以,這和NEC的是不同的
你要先去看一下RC-5協議,它是以高電平的先后順序來識 ...

謝謝你,我也看了下RC-5的協議,的確如你所說,我得再研究研究,感謝你的回答
作者: 15411    時間: 2020-6-20 19:35
保證可用,你只要把0x...換成你要到按鍵值,當然可以用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
////////////////////////&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();
}
        }
}
作者: daocheng    時間: 2020-6-26 13:48
協議不知道就上網查查唄,
https://wenku.baidu.com/view/380a8bddb14e852458fb57e7.html
這個是RC-5碼的協議,建議再看看datasheet
作者: 2043383875arche    時間: 2020-6-27 09:45
剛好這里不會,準備學習,等待大佬解決
作者: billaj    時間: 2020-7-4 08:33
15411 發表于 2020-6-20 19:35
保證可用,你只要把0x...換成你要到按鍵值,當然可以用2,8,10,16進制都行
這是程序:
#include

謝謝你,我已經自己寫了,我用的是stm8的單片機
作者: billaj    時間: 2020-7-4 08:35
qujiuhe 發表于 2020-6-26 13:48
協議不知道就上網查查唄,
https://wenku.baidu.com/view/380a8bddb14e852458fb57e7.html
這個是RC-5碼的 ...

是的,我剛開始不知道紅外碼有好多種,所以就按著NEC協議寫代碼了,所以有幾個按鍵有重碼,于是我就很奇怪了
作者: billaj    時間: 2020-7-4 08:38
謝謝各位的回復,在這我終結一下話題吧,看了RC-5的協議后我最終寫出來了,就是時序問題,外部中斷判斷收接,定時器解碼,就這么解決了,謝謝各位
作者: 吹哥來了    時間: 2020-7-4 08:42
紅外協議有停止的判斷嗎
作者: billaj    時間: 2020-7-4 10:35
吹哥來了 發表于 2020-7-4 08:42
紅外協議有停止的判斷嗎

什么叫停止的判斷???我估計紅外協議里的數據位數都是固定的,所以你讀完總位數就可以暫停跳出了呀
作者: 魏海龍    時間: 2020-7-7 11:14
我不太懂這個 ,如果要是判斷的話 可以用 if  else if 分別判斷這樣可以嗎?

作者: 樂兒翅    時間: 2020-7-28 10:14
IC用的是RC-5碼的協議,所以,這和NEC的是不同的
作者: lxbhcy    時間: 2020-7-28 11:31
看那個產品的說明書,特別是時序圖,
作者: 12345678110    時間: 2020-7-28 13:27
空閑中斷法最合適的    當超過1ms(視情況定) 沒有接受到新的數據位后  就當做接收完成
作者: 楊天想    時間: 2020-7-28 15:05
billaj 發表于 2020-6-19 09:23
哪本書???現在百度出來的都是標準NEC碼呢,,,

l樓主用的是433m嗎
作者: Roy-2010    時間: 2020-8-8 17:15
編程啊,代碼可以買到。
作者: billaj    時間: 2020-8-8 18:01
楊天想 發表于 2020-7-28 15:05
l樓主用的是433m嗎

433m是什么東東???
作者: billaj    時間: 2020-8-8 18:03
魏海龍 發表于 2020-7-7 11:14
我不太懂這個 ,如果要是判斷的話 可以用 if  else if 分別判斷這樣可以嗎?

要判斷時間,不能單純用IF的
作者: billaj    時間: 2020-8-8 18:04
Roy-2010 發表于 2020-8-8 17:15
編程啊,代碼可以買到。

大哥,買就不用到這發貼求助啦
作者: billaj    時間: 2020-8-8 18:05
12345678110 發表于 2020-7-28 13:27
空閑中斷法最合適的    當超過1ms(視情況定) 沒有接受到新的數據位后  就當做接收完成

協議說是多少時間就定多少時間就可以了
作者: gfshao    時間: 2020-9-16 11:49
添加起始和結束標志符
作者: gf.shao    時間: 2020-9-16 15:09
給通訊定義結束符
作者: 梁廷明    時間: 2020-9-17 08:11
計算波長的時間,試著按照波形高電平的寬度進行判斷
作者: gf.shao    時間: 2020-9-17 11:24
看協議,注意時序判斷




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1