|
發布時間: 2018-4-24 14:30
正文摘要:淘寶上買的,兩塊錢的無線模塊 買了沒研究透,不會用 ,求一個最最簡單的控制程序(控制一個流水燈的就行),(怕難的我就看不懂了) 在這里提前謝謝大佬了 |
| 同紅外發射是一個道理,用你的數據合成調頻 |
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; } |
| 有人嗎,求大佬路過時·,順便回復一下 |