同红外发射是一个道理,用你的数据合成调频 |
cqqwing 发表于 2018-6-18 23:45 嗯 这层楼的 回答不错 一看就懂。但是我有点不明白,协议里面,为什么要加个下降沿呢?有了头码,0码,1码,结束码不就可以了吗?不会是为了加强一步坑干扰吧,那可以不用了。 |
while(RX==1); ![]() if(m>5&&m<15)b=0; if(m>15&&m<25)b=2; while(RX==0); m=0; |
lsqm18 发表于 2018-6-19 14:25 有,照搬照抄是不能用的, |
百度上搜索有呢 |
维超 发表于 2018-4-24 17:07 我手上用的模块和楼主的一样, 不带编解码芯片的。 这个程序有些看不懂呢,每个人写程序的习惯和手法不太一样,基本是边靠猜想,边理解,但对于这个理解实在不够深, 我这里也写了个遥控程序,请帮忙看下是否有错,本意是发射端按下任意一个按键, 接收端对应的LED 能亮,但是我写好了,也烧写到单片机里去,就是没反应,看来好半天也没检查出来问题 编码前先定义的协议规则定义如下: 下降沿: 1ms的高电平,随后500us的低电平。v0 起始位: 4ms的高电平,随后4ms的低电平。v2 数据1: 2ms的高电平,随后500us的低电平。v1 数据0: 1ms的高电平,随后500us的低电平。v3 结束位:4ms的低电平。 以上是通信协议规则,只要收发双方都遵循该协议规则, 则实现对接收端的多路控制。 //发射模块c程序 #include<reg52.h> #define uchar unsigned char sbit key0=P3^4; sbit key1=P3^5; sbit key2=P3^6; sbit key3=P3^7; sbit TX=P2^0; uchar m; void v0(); void v1(); void v2(); void v3(); void delay_315(); void main() { uchar i; bit dong=0; //开定时器0中断 TMOD=0X01; TH0=(65536-100)/256; TL0=(65536-100)%256; EA=1; ET0=1; TR0=1; TX=0; while(1) //发送指令0 { if(key0==0) { delay_315(); while(key0==0){v3();v2();v0();v0();v0();m=0;while(m<40);} dong=1; } if(key1==0) //发送指令1 { delay_315(); while(key1==0){v3();v2();v0();v0();v1();m=0;while(m<40);} dong=1; } if(key2==0) { delay_315(); while(key2==0){v3();v2();v0();v1();v0();m=0;while(m<40);} dong=1; } if(key3==0) { delay_315(); while(key3==0){v3();v2();v0();v1();v1();m=0;while(m<40);} dong=1; } if(dong==1) { dong=0; for(i=0;i<5;i++){v3();v2();v1();v0();v0();m=0;while(m<40);} } } } void timer0() interrupt 1 { TH0=(65536-100)/256; TL0=(65536-100)%256; m++; TF0=0; } void v0() // 1MS高电平 500us低电平 { m=0; while(m<10) TX=1; m=0; while(m<5) TX=0; } void v1() // 2MS高电平 500us低电平 { m=0; while(m<20) TX=1; m=0; while(m<5) TX=0; } void v2() // 4MS高电平 4ms低电平 { m=0; while(m<40) TX=1; m=0; while(m<40) TX=0; } void v3() // 1MS高电平 500us低电平 { m=0; while(m<10) TX=1; m=0; while(m<5) TX=0; } void delay_315() { uchar i,j; for(i=0;i<10;i++) for(j=0;j<110;j++); } //接收程序 接收程序 接收程序 #include<reg52.h> #define uchar unsigned char sbit RX=P3^3; sbit red0=P0^0; sbit red1=P0^1; sbit red2=P0^2; sbit red3=P0^3; sbit red4=P0^4; uchar m; bit n; void main() { uchar a,b,c,p,x,y; //定义存取的数据 TMOD=0X01; TH0=(65536-100)/256; //开定时器0 TL0=(65536-100)%256; EA=1; ET0=1; TR0=1; EX1=1; IT1=1; P0=0XFF; p=5; x=0; while(1) { if(n==1) { while(RX==0); //读取协议下降沿 m=0; EX1=0; while(RX==1); if(m>35&&m<45) //读取协议起始位高电平 { m=0; while(RX==0); if(m>35&&m<45) //读取协议起始位低电平 { m=0; while(RX==1); //读取数据1 if(m>5&&m<15)a=0; if(m>15&&m<25)a=4; while(RX==0); m=0; while(RX==1); //读取数据2 if(m>5&&m<15)b=0; if(m>15&&m<25)b=2; while(RX==0); m=0; while(RX==1); //读取数据3 if(m>5&&m<15)c=0; if(m>15&&m<25)c=1; while(RX==0); m=0; p=a+b+c; x++; if(x==1)y=p; if(x==2) //连续收到两次数据才进入匹配 { x=0; if(y==p) { switch(p) { case 0:red0=0;red1=1;red2=1;red3=1;red4=1; break; case 1:red0=1;red1=0;red2=1;red3=1;red4=1; break; case 2:red0=1;red1=1;red2=0;red3=1;red4=1; break; case 3:red0=1;red1=1;red2=1;red3=0;red4=1; break; case 4:red0=1;red1=1;red2=1;red3=1;red4=0; break; } } } } } } } } void INT_1() interrupt 2 { n=1; } void timer0() interrupt 1 { TH0=(65536-100)/256; TL0=(65536-100)%256; m++; TF0=0; } |
//声明:资源来自热心分享的某大大。感谢他的分享。自个验证其正确性 //自适应频率的2262解码代码 晶振11.0592到22.1184MHZ #include"AT89x52.h" #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit shou = P3^2; //========================================================================= void InitTimer0(void) { TMOD = 0x11; //定时器1,定时器0用模式1 16位计时用,12T EA = 1; ET0 = 1; ET1=1; } //======================================================================== void main(void) { InitTimer0(); EX0=1; while(1); } //======================================================================== void ex0(void) interrupt 0 { bit err=0; uchar i,tl,th,ma1,ma2,ma3; uchar TimeCount; uint l,m; EX0=0; TR1=1; i=0; if(TimeCount>0)//当按键按下释放后该值不在赋值就同通过递减直到该值等于0 { TimeCount--;//等于0后表示按键释放 } while(shou==0); while(i<24) { while(shou==0); //等待高电平到来 tl=TL1; th=TH1; TH1=TL1=0; //记录低电平长度并初始化高电平头 l=th; l=((l<<8)+tl); if(i==0) //处理低电平 { if(l>2360) { //确认是引导头 m=l/31; } else //不符合规则(出错) { i=0; TR1=0; TH1=TL1=0; err=1; break; } } else { if(((l>(m-(m/4)))&&(l<(m+(m/4))))||((l>((m*3)-(m/2)))&&(l<((m*3)+(m/2))))); else { i=0; TR1=0; TH1=TL1=0; err=1; break; } } while(shou==1); //等待低电平到来 th=TH1; tl=TL1; TH1=TL1=0; l=th; l=((l<<8)+tl); // if((l>460)&&(l<760)) //短为0 短610 if(((l>(m-(m/4)))&&(l<(m+(m/4))))) { i++; ma1<<=1; //纠正了LZ的高低位相反问题 } // else if((l>1577)&&(l<1977)) //长为1 长1777 else if(((l>((m*3)-(m/2)))&&(l<((m*3)+(m/2))))) { i++; ma1<<=1; //纠正了LZ的高低位相反问题 ma1+=1; //纠正了LZ的高低位相反问题 } else //不符合规则出错 { i=0; TR1=0; TH1=TL1=0; err=1; break; } if(i==8) { ma3=ma1; //SBUF=ma3; //P1=ma3; } if(i==16) { ma2=ma1; //SBUF=ma2; //P1=ma2; } if(i==24)////解码成功结束 { if(TimeCount==0)//为0表示是新的一次按下对其进行处理,如过该值大于0表示已经按下不在处理 { ACC=ma1; if(ACC==0xC0) //P1=0xef; P1_0=~P1_0; if(ACC==0x30) //P1=0xdf; P1_1=~P1_1; if(ACC==0x0c) //P1=0xbf; P1_2=~P1_2; if(ACC==0x03) //P0=0x7f; P1_3=~P1_3; } TimeCount=30;//防止按键没放开直在取反,保证按1次只做1次处理 } } TR1=0; TH1=0; TL1=0; EX0=1; } |
有人吗,求大佬路过时·,顺便回复一下 |