找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2074|回复: 4
打印 上一主题 下一主题
收起左侧

請教433M無線遙控调试问题

[复制链接]
跳转到指定楼层
楼主
請教各位論壇大神

我在學習433 遙控時不知怎麼調試(單片機使用的是STC89C52RC)
兩種接收模塊芯片WS480L  SYN531R
網上買的,賣家只提供了IC規格書,其他的他也不清楚
請教模塊數據輸出端直接接單片機IO口嗎?數據引腳有兩個,用萬用表測時導通的。
我用WS480L 模塊輸出端接NPN三極管基極,驅動LED,LED光線一直較暗閃爍,按下遙控時LED閃爍光線較強。這樣模塊是好的嗎?
SYN531R用手捏住數據線時,現象同WS480L ,不捏住時沒反應,中間使用20cm的杜邦線連接的。


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

請教大神們如何調試,如分幾步,每步做什麼,怎麼判斷,解碼思路。網上論壇也看過相關資料,還是一頭霧水
望各位幫忙解惑。謝謝!

5_739_1497914_568_800.jpg (50.26 KB, 下载次数: 27)

5_739_1497914_568_800.jpg

WS480L.jpg (41.46 KB, 下载次数: 25)

WS480L.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:94031 发表于 2019-11-10 10:59 | 只看该作者
既然买到的是模块就按模块的说明来调试,有载波时DO输出高电平,没有收到载波时输出无规则方波。
回复

使用道具 举报

板凳
ID:155507 发表于 2019-11-10 11:40 | 只看该作者
我给你来个程序参考

  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写数据
  17. void write_com (uchar com);         //1602写命令
  18. uchar pow(uchar n,uchar m);//n的m次方函数
  19. uchar receive(void);                          //接收处理函数  
  20. void gd();                        //液晶固定部分显示

  21. void delay (uint xms)        //1602延时
  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)//延时程序
  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次方函数
  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)         //写数据
  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)//接收处理函数
  86. {
  87.         uchar guid=0,result[12],i,key=0,res=0,t,time=0;
  88.         while(1)//捕获前导命令
  89.         {
  90.                 while(DATA==1)
  91.                 {
  92.                         t++;
  93.                         if(t>=90)
  94.                         {
  95.                                
  96.                                 delay1(100);
  97.                                 return 0;
  98.                         }
  99.                 }//防止错误数据导致的死循环
  100.                 if(t>=60&&t<95)
  101.                 {
  102.                         t=0;
  103.                         key++;
  104.                         time=0;
  105.                         if(key>3)
  106.                         break;
  107.                 }//获得前导命令跳出循环,清除计时信号
  108.                 else
  109.                 if(time>100)
  110.                 {
  111.                        
  112.                         delay1(100);
  113.                         return 0;
  114.                 }//长0,错误信号返回0
  115.                 else {t=0;time++;}//计时垒加,清除t
  116.         }  
  117.         t=0;
  118.         time=0;
  119.         for(i=1;i<13;)             //校验码及数据的接收共12位数据
  120.         {
  121.                 while(DATA==1)
  122.                 {
  123.                         t++;
  124.                         if(t>=95)
  125.                         {
  126.                                
  127.                                 delay1(100);
  128.                                 return 0;
  129.                         }
  130.                 }//防止错误信号导致的死循环
  131.                 if(t>=60&&t<95)
  132.                 {
  133.                         t=0;i=1;time=0;
  134.                 }//去除多余的前导命令
  135.                 else
  136.                 if(t>=28&&t<60)
  137.                 {
  138.                         result[i-1]=1;i++;time=0;
  139.                 }//捕获数据1
  140.                 else
  141.                 if(t>0&&t<27)
  142.                 {result[i-1]=0;i++;time=0;}//捕获数据0
  143.                 if(time>100)
  144.                 return 0; //消除长0的干扰确保数据正确
  145.                 t=0;   //清零
  146.                 time++;//计时        
  147.         }
  148.         if(result[0]==1&&result[1]==0&&result[2]==1&&result[3]==0)//判断校验码
  149.         for(i=0;i<8;i++)
  150.         {
  151.                 res+=pow(2,i)*result[11-i];
  152.         }//将结果转换为十进制数据
  153.         return res;//返回得到的结果
  154. }

  155. void display(uchar dat)        //液晶数据显示
  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. }

复制代码

回复

使用道具 举报

地板
ID:387856 发表于 2019-11-15 20:07 | 只看该作者
angmall 发表于 2019-11-10 11:40
我给你来个程序参考

请教一下  您写的这个参考程序 ,在主程序的while(1)中 用到了那么多delay(5),那解码的成功率是不是会很低呢,我的理解啊,假如刚好在write_data('N');delay(5);这里我按下遥控器,是不是下面还有好几个delay(5),当再次运行到 dat=receive();data端检测到的电平一定不是正确的了,那不是解码就错误了呢
回复

使用道具 举报

5#
ID:25310 发表于 2019-11-16 08:50 | 只看该作者
你这是按红外线编码的吧,有没试过直接发串口数据啊,我也是猜测的,这样进串口解码方便些。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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