標(biāo)題: 請(qǐng)教433M無線遙控調(diào)試問題 [打印本頁]

作者: primoliuyang    時(shí)間: 2019-11-6 10:27
標(biāo)題: 請(qǐng)教433M無線遙控調(diào)試問題
請(qǐng)教各位論壇大神

我在學(xué)習(xí)433 遙控時(shí)不知怎麼調(diào)試(單片機(jī)使用的是STC89C52RC)
兩種接收模塊芯片WS480L  SYN531R
網(wǎng)上買的,賣家只提供了IC規(guī)格書,其他的他也不清楚
請(qǐng)教模塊數(shù)據(jù)輸出端直接接單片機(jī)IO口嗎?數(shù)據(jù)引腳有兩個(gè),用萬用表測(cè)時(shí)導(dǎo)通的。
我用WS480L 模塊輸出端接NPN三極管基極,驅(qū)動(dòng)LED,LED光線一直較暗閃爍,按下遙控時(shí)LED閃爍光線較強(qiáng)。這樣模塊是好的嗎?
SYN531R用手捏住數(shù)據(jù)線時(shí),現(xiàn)象同WS480L ,不捏住時(shí)沒反應(yīng),中間使用20cm的杜邦線連接的。


遙控器參數(shù)如下:
遙控發(fā)送為25位(不知是否還需要引導(dǎo)位,提供的波形圖上沒有引導(dǎo)位)
地址位(8)+地址位(8)+數(shù)據(jù)位(8)+結(jié)束位(1)
每楨間隔12ms
數(shù)據(jù)先高后低
0: 0.4ms+1.2ms
1:1.2ms+0.4ms
原解碼思路是用中斷檢測(cè)數(shù)據(jù)上升跳變沿啟動(dòng)定時(shí)器,定時(shí)器0.8ms時(shí)檢測(cè)數(shù)據(jù)口,記錄數(shù)據(jù)並關(guān)閉定時(shí)器。等待25位數(shù)據(jù)接收完成標(biāo)誌數(shù)據(jù)接收完成位,後提取數(shù)據(jù)再比對(duì)數(shù)據(jù)判斷按鍵值
現(xiàn)無數(shù)據(jù)時(shí)數(shù)據(jù)口一直在變化(LED閃爍),如此上面思路可能行不通了

請(qǐng)教大神們?nèi)绾握{(diào)試,如分幾步,每步做什麼,怎麼判斷,解碼思路。網(wǎng)上論壇也看過相關(guān)資料,還是一頭霧水
望各位幫忙解惑。謝謝!

5_739_1497914_568_800.jpg (50.26 KB, 下載次數(shù): 38)

5_739_1497914_568_800.jpg

WS480L.jpg (41.46 KB, 下載次數(shù): 34)

WS480L.jpg

作者: xuyaqi    時(shí)間: 2019-11-10 10:59
既然買到的是模塊就按模塊的說明來調(diào)試,有載波時(shí)DO輸出高電平,沒有收到載波時(shí)輸出無規(guī)則方波。
作者: angmall    時(shí)間: 2019-11-10 11:40
我給你來個(gè)程序參考

  1. /*
  2. 這是解碼的51程序在1602上顯示

  3. */
  4. #include <reg52.h>
  5. #include <intrins.h>
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8. sbit DATA=P3^3;     //DO輸出
  9. sbit rs=P3^6;          //1602引腳定義
  10. sbit rw=P3^5;
  11. sbit e=P3^7;
  12. uchar dat,num;

  13. uchar code table[]="0123456789ABCDEF";
  14. uchar code table1[]="Receive:";        //液晶固定部分顯示
  15. uchar code table2[]="Re_data:0x";

  16. void write_data (uchar dat);         //1602寫數(shù)據(jù)
  17. void write_com (uchar com);         //1602寫命令
  18. uchar pow(uchar n,uchar m);//n的m次方函數(shù)
  19. uchar receive(void);                          //接收處理函數(shù)  
  20. void gd();                        //液晶固定部分顯示

  21. void delay (uint xms)        //1602延時(shí)
  22. {
  23.         uint i,j;
  24.         for (i = xms; i > 0; i--)
  25.            for (j = 110; j > 0; j--);
  26. }

  27. void delay1(uchar t)//延時(shí)程序
  28. {
  29.         uchar n;
  30.         for(;t>0;t--)
  31.            for(n=40;n>0;n--);  
  32. }

  33. uchar pow(uchar n,uchar m)//n的m次方函數(shù)
  34. {
  35.         uchar t,result=1;
  36.         for(t=0;t<m;t++)
  37.         {result=n*result;}
  38.         return result;
  39. }

  40. void init_1602()
  41. {
  42.         e = 0;        //1602初始化
  43.         write_com (0x38);
  44.         write_com (0x0c);
  45.         write_com (0x06);
  46.         write_com (0x01);
  47.         gd();
  48. }

  49. /*1602液晶代碼部分        ------------------------------ */
  50. void write_com (uchar com)        //寫命令
  51. {
  52.         rs = 0;
  53.         rw = 0;
  54.         P0 = com;
  55.         delay (5);
  56.         e = 1;
  57.         delay (5);
  58.         e = 0;
  59. }

  60. void write_data (uchar dat)         //寫數(shù)據(jù)
  61. {
  62.         rs = 1;
  63.         rw = 0;
  64.         P0 = dat;
  65.         delay (5);
  66.         e = 1;
  67.         delay (5);
  68.         e = 0;
  69. }

  70. void gd()        //液晶固定部分顯示
  71. {
  72.         write_com(0x80);
  73.         for(num=0;num<8;num++)
  74.         {
  75.                 write_data(table1[num]);
  76.                 delay(5);
  77.         }
  78.         write_com(0x80+0x40);
  79.         for(num=0;num<10;num++)
  80.         {
  81.                 write_data(table2[num]);
  82.                 delay(5);
  83.         }
  84. }

  85. uchar receive(void)//接收處理函數(shù)
  86. {
  87.         uchar guid=0,result[12],i,key=0,res=0,t,time=0;
  88.         while(1)//捕獲前導(dǎo)命令
  89.         {
  90.                 while(DATA==1)
  91.                 {
  92.                         t++;
  93.                         if(t>=90)
  94.                         {
  95.                                
  96.                                 delay1(100);
  97.                                 return 0;
  98.                         }
  99.                 }//防止錯(cuò)誤數(shù)據(jù)導(dǎo)致的死循環(huán)
  100.                 if(t>=60&&t<95)
  101.                 {
  102.                         t=0;
  103.                         key++;
  104.                         time=0;
  105.                         if(key>3)
  106.                         break;
  107.                 }//獲得前導(dǎo)命令跳出循環(huán),清除計(jì)時(shí)信號(hào)
  108.                 else
  109.                 if(time>100)
  110.                 {
  111.                        
  112.                         delay1(100);
  113.                         return 0;
  114.                 }//長0,錯(cuò)誤信號(hào)返回0
  115.                 else {t=0;time++;}//計(jì)時(shí)壘加,清除t
  116.         }  
  117.         t=0;
  118.         time=0;
  119.         for(i=1;i<13;)             //校驗(yàn)碼及數(shù)據(jù)的接收共12位數(shù)據(jù)
  120.         {
  121.                 while(DATA==1)
  122.                 {
  123.                         t++;
  124.                         if(t>=95)
  125.                         {
  126.                                
  127.                                 delay1(100);
  128.                                 return 0;
  129.                         }
  130.                 }//防止錯(cuò)誤信號(hào)導(dǎo)致的死循環(huán)
  131.                 if(t>=60&&t<95)
  132.                 {
  133.                         t=0;i=1;time=0;
  134.                 }//去除多余的前導(dǎo)命令
  135.                 else
  136.                 if(t>=28&&t<60)
  137.                 {
  138.                         result[i-1]=1;i++;time=0;
  139.                 }//捕獲數(shù)據(jù)1
  140.                 else
  141.                 if(t>0&&t<27)
  142.                 {result[i-1]=0;i++;time=0;}//捕獲數(shù)據(jù)0
  143.                 if(time>100)
  144.                 return 0; //消除長0的干擾確保數(shù)據(jù)正確
  145.                 t=0;   //清零
  146.                 time++;//計(jì)時(shí)        
  147.         }
  148.         if(result[0]==1&&result[1]==0&&result[2]==1&&result[3]==0)//判斷校驗(yàn)碼
  149.         for(i=0;i<8;i++)
  150.         {
  151.                 res+=pow(2,i)*result[11-i];
  152.         }//將結(jié)果轉(zhuǎn)換為十進(jìn)制數(shù)據(jù)
  153.         return res;//返回得到的結(jié)果
  154. }

  155. void display(uchar dat)        //液晶數(shù)據(jù)顯示
  156. {
  157.         uchar a,b;
  158.         a=dat/16;
  159.         b=dat%16;
  160.         if(a>9)
  161.         a=a+0;
  162.         if(b>9)
  163.         b=b+0;
  164.         write_com(0x80+0x4A);
  165.         write_data(table[a]);delay(5);
  166.         write_data(table[b]);delay(5);
  167. }

  168. void main()
  169. {
  170.         init_1602();        //1602初始化
  171.         while(1)
  172.         {
  173.                 dat=receive();
  174.                 if(dat)                                  //顯示
  175.                 {
  176.                         write_com(0x80+0x08);
  177.                         write_data('O');delay(5);
  178.                         write_data('K');delay(5);
  179.                         write_data('!');delay(5);
  180.                         display(dat);
  181.                 }
  182.                 else
  183.                 {
  184.                         write_com(0x80+0x08);
  185.                         write_data('N');delay(5);
  186.                         write_data('O');delay(5);
  187.                         write_data('!');delay(5);
  188.                         write_com(0x80+0x4A);
  189.                         write_data(' ');delay(5);
  190.                         write_data(' ');delay(5);
  191.                 }
  192.         }
  193. }

復(fù)制代碼


作者: liuhailan5757    時(shí)間: 2019-11-15 20:07
angmall 發(fā)表于 2019-11-10 11:40
我給你來個(gè)程序參考

請(qǐng)教一下  您寫的這個(gè)參考程序 ,在主程序的while(1)中 用到了那么多delay(5),那解碼的成功率是不是會(huì)很低呢,我的理解啊,假如剛好在write_data('N');delay(5);這里我按下遙控器,是不是下面還有好幾個(gè)delay(5),當(dāng)再次運(yùn)行到 dat=receive();data端檢測(cè)到的電平一定不是正確的了,那不是解碼就錯(cuò)誤了呢
作者: pcbboy    時(shí)間: 2019-11-16 08:50
你這是按紅外線編碼的吧,有沒試過直接發(fā)串口數(shù)據(jù)啊,我也是猜測(cè)的,這樣進(jìn)串口解碼方便些。




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