看协议,注意时序判断 |
计算波长的时间,试着按照波形高电平的宽度进行判断 |
给通讯定义结束符 |
添加起始和结束标志符 |
12345678110 发表于 2020-7-28 13:27 协议说是多少时间就定多少时间就可以了 |
Roy-2010 发表于 2020-8-8 17:15 大哥,买就不用到这发贴求助啦 |
魏海龙 发表于 2020-7-7 11:14 要判断时间,不能单纯用IF的 |
杨天想 发表于 2020-7-28 15:05 433m是什么东东??? |
编程啊,代码可以买到。 |
billaj 发表于 2020-6-19 09:23 l楼主用的是433m吗 |
空闲中断法最合适的 当超过1ms(视情况定) 没有接受到新的数据位后 就当做接收完成 |
看那个产品的说明书,特别是时序图, |
IC用的是RC-5码的协议,所以,这和NEC的是不同的 |
我不太懂这个 ,如果要是判断的话 可以用 if else if 分别判断这样可以吗? |
吹哥来了 发表于 2020-7-4 08:42 什么叫停止的判断???我估计红外协议里的数据位数都是固定的,所以你读完总位数就可以暂停跳出了呀 |
红外协议有停止的判断吗 |
谢谢各位的回复,在这我终结一下话题吧,看了RC-5的协议后我最终写出来了,就是时序问题,外部中断判断收接,定时器解码,就这么解决了,谢谢各位 |
qujiuhe 发表于 2020-6-26 13:48 是的,我刚开始不知道红外码有好多种,所以就按着NEC协议写代码了,所以有几个按键有重码,于是我就很奇怪了 |
15411 发表于 2020-6-20 19:35 谢谢你,我已经自己写了,我用的是stm8的单片机 |
刚好这里不会,准备学习,等待大佬解决 |
协议不知道就上网查查呗, https://wenku.baidu.com/view/380a8bddb14e852458fb57e7.html 这个是RC-5码的协议,建议再看看datasheet |
保证可用,你只要把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 ////////////////////////ÅÜÂí 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(); } } } |
Y_G_G 发表于 2020-6-19 11:33 谢谢你,我也看了下RC-5的协议,的确如你所说,我得再研究研究,感谢你的回答 |
billaj 发表于 2020-6-19 09:23 关键是现在测出来的不是标准码。。。我不是已经说了吗,还上图了 |
wuzhenm 发表于 2020-6-18 16:51 哪本书???现在百度出来的都是标准NEC码呢,,, |
书上有代码,按照那上面就行 |
在红外通信程序中,有很多判断退出的部分,都是超时退出,发送一位数据的时间不会超过一个数值,超过的话就说明结束了。0的时间,1的时间,引导码的时间都是有限的,每一位的时间更短,如果一定时间的高电平的话,比如20ms的高电平,是不是证明一个字节发送完了。 |
插眼,等待大佬回复 |
用个计数器来判断位长? |
我现在在尝试沙发的方法,因为我也只能想到这个方法了,有进展再来更新,希望有经验的朋友可以分享一下,谢谢 |
最近刚学到红外协议,感觉特别难受,用的是NEC协议,当然红外协议还有好多种,但是开发板附带的课程上教的是NEC协议。数据格式由引导码、用户码,用户反码、按键码、按键反码和停止位。接收数据的时候好像是一个8位的4个元素的数组,识别按键码就取出数组中的固定元素就可以了,目前我也只是照着书把找码抄下来,就这样也抄错了好几处,对代码就用了好长时间,学单片机到了协议感觉就像到了夜里,很难熬,学着感觉很费劲,时序在老师看来很简单,可是我看着感觉很麻烦,可能再坚持学懂就好了吧! |
红外协议一般都有起始和结尾字符或者特殊的电平。 |