找回密码
 立即注册

QQ登录

只需一步,快速开始

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

淘宝上买的433M无线模块,程序电路都有了没反应啊!

  [复制链接]
跳转到指定楼层
楼主
就是这个东西电路很简单:
功能是发射模块通过无线模块发送到接收模块单片机(按钮实现),接收单片机点亮对应的一个LED。
把无线模块去掉,直接在两单片机RXD和TXD接导线,能成功。
问题是无线模块接上没法用啊!
菜鸟求教,有酬谢!



QQ图片20160102234916.png (63.11 KB, 下载次数: 160)

原理图

原理图
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:101558 发表于 2016-1-3 10:45 | 只看该作者
Proteus仿真图单刀双掷开关连接TXD、RXD,能成功。。。程序应该没问题吧。。。

QQ图片20160103104239.png (75.58 KB, 下载次数: 115)

Proteus仿真

Proteus仿真

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:79544 发表于 2016-1-3 14:20 | 只看该作者
无线模块要求晶振和PWM频率要求很严格再就是干扰。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:101558 发表于 2016-1-3 15:48 | 只看该作者
腾飞的龙 发表于 2016-1-3 14:20
无线模块要求晶振和PWM频率要求很严格再就是干扰。

那岂不是要做很多附加的滤波整形电路?我的天线是没接的,淘宝客服说天线不接可以传50m.

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:79544 发表于 2016-1-3 17:05 | 只看该作者
反正我做315M解码的时候很费劲,有的遥控能解出码有的就不行,很多原因的

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:101558 发表于 2016-1-4 20:07 | 只看该作者
腾飞的龙 发表于 2016-1-3 17:05
反正我做315M解码的时候很费劲,有的遥控能解出码有的就不行,很多原因的

示波器能测信号,不过只有100mvpp.单片机能识别出高低电平吗?完全没辙了,做了个天线也没反应

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

7#
ID:79544 发表于 2016-1-5 08:55 | 只看该作者
sgiter 发表于 2016-1-4 20:07
示波器能测信号,不过只有100mvpp.单片机能识别出高低电平吗?完全没辙了,做了个天线也没反应

这是我解
  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit DATA=P3^3;
  6. sbit rs=P3^6;          //1602引脚定义
  7. sbit rw=P3^5;
  8. sbit e=P3^7;
  9. uchar dat,num;

  10. uchar code table[]="0123456789ABCDEF";
  11. uchar code table1[]="Receive:";        //液晶固定部分显示
  12. uchar code table2[]="Re_data:0x";

  13. void write_data (uchar dat);         //1602写数据
  14. void write_com (uchar com);         //1602写命令
  15. uchar pow(uchar n,uchar m);//n的m次方函数
  16. uchar receive(void);                          //接收处理函数  
  17. void gd();                        //液晶固定部分显示

  18. void delay (uint xms)        //1602延时
  19. {
  20.         uint i,j;
  21.         for (i = xms; i > 0; i--)
  22.         for (j = 110; j > 0; j--);
  23. }

  24. void delay1(uchar t)//延时程序
  25. {
  26.         uchar n;
  27.         for(;t>0;t--)
  28.         for(n=40;n>0;n--);  
  29. }

  30. uchar pow(uchar n,uchar m)//n的m次方函数
  31. {
  32.         uchar t,result=1;
  33.         for(t=0;t<m;t++)
  34.         {result=n*result;}
  35.         return result;
  36. }

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

  46. /*1602液晶代码部分        ------------------------------ */
  47. void write_com (uchar com)        //写命令
  48. {
  49.         rs = 0;
  50.         rw = 0;
  51.         P0 = com;
  52.         delay (5);
  53.         e = 1;
  54.         delay (5);
  55.         e = 0;
  56. }

  57. void write_data (uchar dat)         //写数据
  58. {
  59.         rs = 1;
  60.         rw = 0;
  61.         P0 = dat;
  62.         delay (5);
  63.         e = 1;
  64.         delay (5);
  65.         e = 0;
  66. }

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

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

  152. void display(uchar dat)        //液晶数据显示
  153. {
  154.     uchar a,b;
  155. a=dat/16;
  156. b=dat%16;
  157. if(a>9)
  158. a=a+0;
  159. if(b>9)
  160. b=b+0;
  161. write_com(0x80+0x4A);
  162. write_data(table[a]);delay(5);
  163. write_data(table[b]);delay(5);
  164. }

  165. void main()
  166. {
  167. init_1602();        //1602初始化
  168. while(1)
  169. {
  170. dat=receive();
  171. if(dat)                                  //显示
  172. {
  173.       write_com(0x80+0x08);
  174.   write_data('O');delay(5);
  175.   write_data('K');delay(5);
  176.   write_data('!');delay(5);
  177.   display(dat);
  178. }
  179. else
  180. {
  181.       write_com(0x80+0x08);
  182.   write_data('N');delay(5);
  183.   write_data('O');delay(5);
  184.   write_data('!');delay(5);
  185.   write_com(0x80+0x4A);
  186.   write_data(' ');delay(5);
  187.   write_data(' ');delay(5);
  188. }
  189. }
  190. }
复制代码
码的51程序在1602上显示
回复

使用道具 举报

8#
ID:79544 发表于 2016-1-5 08:57 | 只看该作者
sgiter 发表于 2016-1-4 20:07
示波器能测信号,不过只有100mvpp.单片机能识别出高低电平吗?完全没辙了,做了个天线也没反应

还有这个你
  1. /**********************************************************
  2.                         315M无线解码51程序  
  3.         无线码宽电平脉冲时间1.8ms,低电平脉冲时间600us,
  4.         同步码低电平时间18.6ms lcd1602显示码值
  5.           MCU:STC12C5a60s2,11.0591MHzOSC,
  6.                 大数码管实验板调试通过
  7. ***************************************************/

  8. #include <stc12c5a60s2.h>
  9. #define  uchar unsigned char  
  10. #define  uint unsigned int  
  11. #define _rlcar_(RX)  CY=RX&0X80//RX带进位左移1位,数据放入ACC
  12. sbit WUXIAN=P3^3;
  13. sbit led=P1^3;
  14. sbit lcdrs=P3^6;
  15. sbit lcdrw=P3^5;
  16. sbit lcden=P3^7;
  17. sbit beep=P1^7;//蜂鸣器
  18. uchar code Tab[]={'0','1','2','3','4','5','6','7','8',//大写
  19. '9','A','B','C','D','E','F'};
  20. uchar code Tab1[]="315M WU XIAN JMA";//315无线解码
  21. uchar code Tab2[]="MA ZHI:";//码值
  22. uchar disp[8];

  23. uchar bdata wx_data0,wx_data1,wx_data2;  //存储24位无线数据
  24. uchar data wx_code0,wx_code1,wx_code2;  
  25. uchar data wx_count,wxcount_buf;   //低电平时间计数器
  26. uchar data wx_bit;       //无线码位数
  27. uchar data t_10ms;
  28. uchar data t_50ms;  
  29. bit tb_flag;        //同步码接收成功标志
  30. bit wx_ok;         //无线码接收成功标志  
  31. bit wx_sta;         //无线信号输入脚的高低电平状态

  32. void write_dat(uchar dat);
  33. void display();//显示函数;
  34. void irwork();//数据分离
  35. void decode();

  36. void delay(uint z) //延时子程序
  37. {
  38.           uint x,y;
  39.           for(x=z;x>0;x--)
  40.      for(y=220;y>0;y--);
  41. }
  42. void write_com(uchar com)//定义一个带参数的写命令子程序
  43. {
  44.          lcdrs=0; //1602的rs为0时,接收命令,为1时接收数据
  45.          P0=com;//把void write_com(uchar com)中的COM中的数据给P0口
  46.          delay(2);
  47.          lcden=1;
  48.          delay(2);
  49.          lcden=0;
  50.          delay(2);
  51. }
  52. void init_1602()//定义一个初始化子程序
  53. {
  54.         uchar i;
  55.          lcden=0;
  56.          lcdrw=0;
  57.          write_com(0x38);//调用 write_com子程序并把0x38赋给P0口,显示模式打开
  58. //         write_com(0x0f);//调用 write_com子程序并把“开显示,显示光标,光标闪烁”指令码赋给P0口
  59.          write_com(0x06);//调用 write_com子程序并把“地址指针加1,整屏不移动”指令码赋给P0口
  60.          //write_com(0x80+0x10);//数据指针初始化,让指针指向可显示的最右端
  61.          write_com(0x80);//数据指针初始化,让指针指向最左端,显示从第一行开始
  62.          write_com(0x01);//调用 write_com子程序并把"清零指"令码赋给P0口
  63.         write_com(0x0c);//不显示光标
  64.         write_com(0x81);
  65.         for(i=0;i<16;i++)
  66.         {
  67.                 write_dat(Tab1[i]);
  68.                  delay(2);
  69.         }
  70.         write_com(0x80+0x40);
  71.         for(i=0;i<7;i++)
  72.         {
  73.                 write_dat(Tab2[i]);
  74.                  delay(2);
  75.         }
  76. }

  77. void write_dat(uchar dat)//定义一个带参数的写数据子程序
  78. {
  79.          lcdrs=1; //1602的rs为0时,接收命令,为1时接收数据
  80.          P0=dat;//把void write_shu(uchar shu)中的COM中的数据给P0口
  81.          delay(2);
  82.          lcden=1;
  83.          delay(2);
  84.          lcden=0;
  85.          delay(2);
  86. }

  87. void mcu_initialize()
  88. {   
  89.         WDT_CONTR=0x00;       //关闭看门狗   
  90.         AUXR=0;         //定时器0和1设为传统8051速度,12分频   
  91. //        P0=0;     
  92.         TR0=0;   
  93.         TH0 = 0xa4;//11.0592M //100us中断一次
  94.         TL0 = 0x00;
  95. //TH0=0x9c;//12M//100us中断一次
  96. //TL0=0x00;         
  97.         TMOD|=0x02;        //设置T0为自动装入的8位定时器  
  98.         ET0=1;          //允许T0中断  
  99.         EA=1;   
  100.         TR0=1;         //启动T0
  101. }
  102. void main()
  103. {     
  104.         mcu_initialize();
  105.          init_1602();
  106.         while(1)
  107.         {
  108.        
  109.                
  110.         }  
  111. }
  112. void decode()
  113. {   
  114.         if(WUXIAN)
  115.         {           //检测无线I/O口为高      
  116.                 if(!wx_sta)
  117.                 {   
  118.                         wx_sta=1;          //无线信号从低变高   
  119.                         wxcount_buf=wx_count;         
  120.                         if(tb_flag)
  121.                         {         //同步码标志为1      
  122.                                 if((0x02<wxcount_buf)&&(wxcount_buf<0x08))
  123.                                 {           //低电平脉宽范围在200us到800us之间      
  124.                                         CY=1;            
  125.                                 }
  126.                                 else
  127.                                 if((0x0d<wxcount_buf)&&(wxcount_buf<0x14))
  128.                                 {     //低电平脉宽范围在1.3ms到2ms之间      
  129.                                         CY=0;            
  130.                                 }      
  131.                                 else
  132.                                 {        //干扰码      
  133.                                         loop2:wx_count=0;      
  134.                                         wx_bit=0;        
  135.                                         wxcount_buf=0;
  136.                                         tb_flag=0;      
  137.                                         return;      
  138.                                 }      
  139.                                 _rlcar_(wx_data0);//移位寄存器,接收一位数据
  140.                                 wx_data0=ACC;   
  141.                                 _rlcar_(wx_data1);   
  142.                                 wx_data1=ACC;     
  143.                                 _rlcar_(wx_data2);   
  144.                                 wx_data2=ACC;
  145.                                 if(++wx_bit==24)
  146.                                 {      //接收完24位码,接收成功标志wx_ok置1      
  147.                                         tb_flag=0;      
  148.                                         wx_bit=0;      
  149.                                         wx_ok=1;      
  150.                                         wx_code0=wx_data0;
  151.                                         wx_code1=wx_data1;
  152.                                         wx_code2=wx_data2;
  153.                                         irwork();
  154.                                         display();                   
  155.                                 //        P0=wx_code0;      //p1口接LED显示数据   
  156.                                 }      
  157.                         }
  158.                         else
  159.                         {        
  160.                                 if((0x87<wxcount_buf)&&(wxcount_buf<0xc8))      
  161.                                 tb_flag=1;//抵电平脉宽范围在13.5ms到20ms之间,把同步码标志置1   
  162.                                 else      
  163.                                 goto loop2;      
  164.                         }     
  165.                 }  
  166.         }
  167.         else
  168.         {   
  169.                 if(wx_sta)
  170.                 {     
  171.                 wx_count=0; //无线信号从高变低,清零低电平脉宽计数器   
  172.                 wx_sta=0;         
  173.                 }      
  174.                 else     
  175.                 wx_count++; //无线信号为低电平,低电平脉宽计数器加1     
  176.         }
  177. }
  178. void irwork()//数据分离
  179. {
  180.          disp[0]=wx_code0/16;//取高四位
  181.          disp[1]=wx_code0%16;//取低四位
  182.          disp[2]=wx_code1/16;//取高四位
  183.          disp[3]=wx_code1%16;//取低四位
  184.          disp[4]=wx_code2/16;//取高四位
  185.          disp[5]=wx_code2%16;//取低四位
  186. //         disp[6]=ircode[3]/16;//取高四位
  187. //         disp[7]=ircode[3]%16;//取低四位
  188. }
  189. void display()//显示函数
  190. {
  191.          write_com(0x80+0x48);
  192.          write_dat(Tab[disp[0]]);
  193.          write_dat(Tab[disp[1]]);
  194.          write_dat(Tab[disp[2]]);
  195.          write_dat(Tab[disp[3]]);
  196.          write_dat(Tab[disp[4]]);
  197.          write_dat(Tab[disp[5]]);
  198. //         write_dat(Tab[disp[6]]);
  199. //         write_dat(Tab[disp[7]]);
  200. }
  201. void timer0_isr() interrupt 1
  202. {  
  203.         decode();   
  204.         if(++t_10ms>=100)
  205.         {         //P3.7口接的LED以0.5s的速度闪烁   
  206.                 t_10ms=0;   
  207.                 if(++t_50ms>=50)
  208.                 {   
  209.                         led=!led;   
  210.                         t_50ms=0;   
  211.                 }
  212.         }  
  213.                
  214. }
复制代码
都试试吧

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

9#
ID:101558 发表于 2016-1-7 21:08 | 只看该作者
目前的问题是接收无线模块的输出信号电压无法驱动单片机,幅度很小。。谢谢你啦

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

10#
ID:48413 发表于 2016-1-7 21:47 | 只看该作者
不好说原因太多了

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

11#
ID:114868 发表于 2016-4-21 11:23 | 只看该作者
腾飞的龙 发表于 2016-1-5 08:55
这是我解码的51程序在1602上显示

你好,请问接收处理函数里面的变量t代表的是什么啊?

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

12#
ID:157531 发表于 2017-1-3 17:03 | 只看该作者
本帖最后由 qiu7854867 于 2017-1-3 17:21 编辑
腾飞的龙 发表于 2016-1-5 08:55
这是我解码的51程序在1602上显示

在不 这个代码用多大的晶振,,  我用11.0592M晶振  315M模块端口有数据输出,,但是单片机貌似没检测到 1602显示 NO!,0X     会不会存在电压匹配问题   我在程序中增加DATA如果高就亮LED灯,但是LED灯就没亮过  求指教  
回复

使用道具 举报

13#
ID:210330 发表于 2017-6-12 09:54 | 只看该作者
刚看到你的这个帖子,可能你的问题已经解决。我还是给你分析一下原因,因为你的这个问题比较普遍,很多做研发的容易遇到这个问题,这个模块不知道是那个公司做的,是用的480接收芯片,很多公司在做,成本便宜也比较简单,输出有很多杂波干扰,需要程序来处理一下,模块应该是没有问题的,看你的电路图,是硬件接口连接有问题,因为这种ASK模块的输入和输出接口平时为0电平,你的TX和RX平时是高电平,连接后把电平拉的不正常,输出的信号电压就不正常了,导致不解码。
回复

使用道具 举报

14#
ID:145141 发表于 2017-7-12 08:21 | 只看该作者
好高能的东西,最近也在研究这个,可惜未能入门...
回复

使用道具 举报

15#
ID:218365 发表于 2017-9-20 08:16 | 只看该作者
315无线,做个标记
回复

使用道具 举报

16#
ID:152715 发表于 2017-12-19 22:20 | 只看该作者
学习学习
回复

使用道具 举报

17#
ID:330116 发表于 2018-5-17 09:40 | 只看该作者
您好,您的发射码程序是怎样编码的呢,能不能分享一下
回复

使用道具 举报

18#
ID:343047 发表于 2018-6-1 18:23 来自手机 | 只看该作者
原因是多方面的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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