找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4770|回复: 35
收起左侧

每个按键的红外接收码长度不同,单片机程序应该以什么方式去接收呢

  [复制链接]
回帖奖励 50 黑币 回复本帖可获得 50 黑币奖励! 每人限 1 次
ID:388929 发表于 2020-6-17 17:30 | 显示全部楼层 |阅读模式
单片机开发板上的遥控是发一个起始码后跟着32位数据,例程上是用判断的方法,>=32位就相当于接收完成,跳到下一步,但我用手头上另一个遥控器,发出来的码是有5位6位7位8位9位,,,,四种位长,请问一下有哪些方法可以达到识别不同位长?谢谢
回复

使用道具 举报

ID:123289 发表于 2020-6-17 18:30 | 显示全部楼层
估计一个间隔时间,超过这个值就判为一个键值结束了。

评分

参与人数 1黑币 +10 收起 理由
billaj + 10 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:220661 发表于 2020-6-17 19:15 | 显示全部楼层
红外协议一般都有起始和结尾字符或者特殊的电平。
回复

使用道具 举报

ID:782419 发表于 2020-6-17 20:03 | 显示全部楼层
最近刚学到红外协议,感觉特别难受,用的是NEC协议,当然红外协议还有好多种,但是开发板附带的课程上教的是NEC协议。数据格式由引导码、用户码,用户反码、按键码、按键反码和停止位。接收数据的时候好像是一个8位的4个元素的数组,识别按键码就取出数组中的固定元素就可以了,目前我也只是照着书把找码抄下来,就这样也抄错了好几处,对代码就用了好长时间,学单片机到了协议感觉就像到了夜里,很难熬,学着感觉很费劲,时序在老师看来很简单,可是我看着感觉很麻烦,可能再坚持学懂就好了吧!
回复

使用道具 举报

ID:388929 发表于 2020-6-18 09:35 | 显示全部楼层
我现在在尝试沙发的方法,因为我也只能想到这个方法了,有进展再来更新,希望有经验的朋友可以分享一下,谢谢
回复

使用道具 举报

ID:388929 发表于 2020-6-18 09:39 | 显示全部楼层
我用的PT2210芯片,出来的不是标准码,所以不能按位数来接收呢
123.png
回复

使用道具 举报

ID:781089 发表于 2020-6-18 12:44 | 显示全部楼层
用个计数器来判断位长?
回复

使用道具 举报

ID:783333 发表于 2020-6-18 15:57 | 显示全部楼层
插眼,等待大佬回复
回复

使用道具 举报

ID:782419 发表于 2020-6-18 16:41 | 显示全部楼层
在红外通信程序中,有很多判断退出的部分,都是超时退出,发送一位数据的时间不会超过一个数值,超过的话就说明结束了。0的时间,1的时间,引导码的时间都是有限的,每一位的时间更短,如果一定时间的高电平的话,比如20ms的高电平,是不是证明一个字节发送完了。
回复

使用道具 举报

ID:783377 发表于 2020-6-18 16:51 | 显示全部楼层
书上有代码,按照那上面就行
回复

使用道具 举报

ID:388929 发表于 2020-6-19 09:23 | 显示全部楼层
wuzhenm 发表于 2020-6-18 16:51
书上有代码,按照那上面就行

哪本书???现在百度出来的都是标准NEC码呢,,,
回复

使用道具 举报

ID:388929 发表于 2020-6-19 10:43 | 显示全部楼层
billaj 发表于 2020-6-19 09:23
哪本书???现在百度出来的都是标准NEC码呢,,,

关键是现在测出来的不是标准码。。。我不是已经说了吗,还上图了
回复

使用道具 举报

ID:401564 发表于 2020-6-19 11:33 | 显示全部楼层
你这个IC用的是RC-5码的协议,所以,这和NEC的是不同的
你要先去看一下RC-5协议,它是以高电平的先后顺序来识别0和1的,而NEC协议是时间长短来识别0和1的
每次接收到一个字节就变量加1,接收完成就知道长度是多少了
超过一个周期的时间电平没有变化,红外是肯定没有接收的了
RC-5的周期是1.778mS,你可以设定为3mS之内没有电平变化就认为是已经没有接收了

评分

参与人数 1黑币 +12 收起 理由
billaj + 12 很给力!

查看全部评分

回复

使用道具 举报

ID:388929 发表于 2020-6-19 14:04 | 显示全部楼层
Y_G_G 发表于 2020-6-19 11:33
你这个IC用的是RC-5码的协议,所以,这和NEC的是不同的
你要先去看一下RC-5协议,它是以高电平的先后顺序来识 ...

谢谢你,我也看了下RC-5的协议,的确如你所说,我得再研究研究,感谢你的回答
回复

使用道具 举报

ID:642999 发表于 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();
}
        }
}

评分

参与人数 1黑币 +12 收起 理由
billaj + 12 共享资料的黑币奖励!虽然没用上你的程序,.

查看全部评分

回复

使用道具 举报

ID:600952 发表于 2020-6-26 13:48 | 显示全部楼层
协议不知道就上网查查呗,
https://wenku.baidu.com/view/380a8bddb14e852458fb57e7.html
这个是RC-5码的协议,建议再看看datasheet
回复

使用道具 举报

ID:788495 发表于 2020-6-27 09:45 | 显示全部楼层
刚好这里不会,准备学习,等待大佬解决
回复

使用道具 举报

ID:388929 发表于 2020-7-4 08:33 | 显示全部楼层
15411 发表于 2020-6-20 19:35
保证可用,你只要把0x...换成你要到按键值,当然可以用2,8,10,16进制都行
这是程序:
#include

谢谢你,我已经自己写了,我用的是stm8的单片机
回复

使用道具 举报

ID:388929 发表于 2020-7-4 08:35 | 显示全部楼层
qujiuhe 发表于 2020-6-26 13:48
协议不知道就上网查查呗,
https://wenku.baidu.com/view/380a8bddb14e852458fb57e7.html
这个是RC-5码的 ...

是的,我刚开始不知道红外码有好多种,所以就按着NEC协议写代码了,所以有几个按键有重码,于是我就很奇怪了
回复

使用道具 举报

ID:388929 发表于 2020-7-4 08:38 | 显示全部楼层
谢谢各位的回复,在这我终结一下话题吧,看了RC-5的协议后我最终写出来了,就是时序问题,外部中断判断收接,定时器解码,就这么解决了,谢谢各位
回复

使用道具 举报

ID:61069 发表于 2020-7-4 08:42 | 显示全部楼层
红外协议有停止的判断吗
回复

使用道具 举报

ID:388929 发表于 2020-7-4 10:35 | 显示全部楼层
吹哥来了 发表于 2020-7-4 08:42
红外协议有停止的判断吗

什么叫停止的判断???我估计红外协议里的数据位数都是固定的,所以你读完总位数就可以暂停跳出了呀
回复

使用道具 举报

ID:633896 发表于 2020-7-7 11:14 | 显示全部楼层
我不太懂这个 ,如果要是判断的话 可以用 if  else if 分别判断这样可以吗?
回复

使用道具 举报

ID:801878 发表于 2020-7-28 10:14 | 显示全部楼层
IC用的是RC-5码的协议,所以,这和NEC的是不同的
回复

使用道具 举报

ID:808700 发表于 2020-7-28 11:31 | 显示全部楼层
看那个产品的说明书,特别是时序图,
回复

使用道具 举报

ID:275449 发表于 2020-7-28 13:27 | 显示全部楼层
空闲中断法最合适的    当超过1ms(视情况定) 没有接受到新的数据位后  就当做接收完成
回复

使用道具 举报

ID:609524 发表于 2020-7-28 15:05 | 显示全部楼层
billaj 发表于 2020-6-19 09:23
哪本书???现在百度出来的都是标准NEC码呢,,,

l楼主用的是433m吗
回复

使用道具 举报

ID:809311 发表于 2020-8-8 17:15 | 显示全部楼层
编程啊,代码可以买到。
回复

使用道具 举报

ID:388929 发表于 2020-8-8 18:01 | 显示全部楼层
杨天想 发表于 2020-7-28 15:05
l楼主用的是433m吗

433m是什么东东???
回复

使用道具 举报

ID:388929 发表于 2020-8-8 18:03 | 显示全部楼层
魏海龙 发表于 2020-7-7 11:14
我不太懂这个 ,如果要是判断的话 可以用 if  else if 分别判断这样可以吗?

要判断时间,不能单纯用IF的
回复

使用道具 举报

ID:388929 发表于 2020-8-8 18:04 | 显示全部楼层
Roy-2010 发表于 2020-8-8 17:15
编程啊,代码可以买到。

大哥,买就不用到这发贴求助啦
回复

使用道具 举报

ID:388929 发表于 2020-8-8 18:05 | 显示全部楼层
12345678110 发表于 2020-7-28 13:27
空闲中断法最合适的    当超过1ms(视情况定) 没有接受到新的数据位后  就当做接收完成

协议说是多少时间就定多少时间就可以了
回复

使用道具 举报

ID:106821 发表于 2020-9-16 11:49 | 显示全部楼层
添加起始和结束标志符
回复

使用道具 举报

ID:582903 发表于 2020-9-16 15:09 | 显示全部楼层
给通讯定义结束符
回复

使用道具 举报

ID:235954 发表于 2020-9-17 08:11 | 显示全部楼层
计算波长的时间,试着按照波形高电平的宽度进行判断
回复

使用道具 举报

ID:582903 发表于 2020-9-17 11:24 | 显示全部楼层
看协议,注意时序判断
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表