单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9190|回复: 43
收起左侧

无线通讯之433MHZ单片机模拟2272解码

  [复制链接]
xueyunmicheng 发表于 2016-1-26 22:58 | 显示全部楼层 |阅读模式
在网上找了很多教程 范例程序 好像都会有那么一点点问题 不是接收不到数据 就是接收到错误的数据
不过还好 经过多次实验 终于接收到正确的 数据了  实验成果放送 供需要的人参考
单片机 stc89c58rd+  12mhz晶振

01.png

02.png

03.png

04.png


定时解码.rar (35.6 KB, 下载次数: 303)

评分

参与人数 3黑币 +95 收起 理由
15838831911 + 10
admin + 50 共享资料的黑币奖励!
暗光 + 35 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

51shakura 发表于 2016-1-27 10:55 | 显示全部楼层
屏不错。。。。51黑有你更精彩!!!
回复

使用道具 举报

 楼主| xueyunmicheng 发表于 2016-1-27 13:53 | 显示全部楼层

25元一个 淘了4个 嘿嘿 拆了一个 送人一个
回复

使用道具 举报

qq704661078 发表于 2016-1-27 17:15 来自手机 | 显示全部楼层
51黑有你更精彩!!!,看楼主的程序是一种享受,调理清晰,注释详细.
  1. #include <STC89C5xRC.H>
  2. #include <intrins.h>    //包含_nop_()延时函数
  3. #include <absacc.h>                //包含 CBYTE[]  
  4. #include <string.h>                // 包含 strlen (char *)函数
  5. #include "ASCII816.h"   //标准ASCII库

  6. #include "12864.h"        //液晶驱动
  7. #define uchar unsigned char
  8. #define uint  unsigned int


  9. sbit wux=P3^2;

  10. uchar D[3];  
  11. uint temp;
  12. uchar flag,flag1;

  13. uint kk[3];
  14. uint ka;
  15. uchar k;
  16. void jiema()//解码  
  17. {
  18.         uchar j,i;
  19.         TH0=0;                        //T0作为计时器使用   
  20.         TL0=0;                        //T0作为计时器使用   
  21.         ET0=0;                        //T0溢出不中断
  22.         while(wux);                //等待低电平
  23.         TR0=1;                        //检测到低电平开启T0计时
  24.         while(!wux)                //等待高电平
  25.         {
  26.                 if(TF0==1)                //等待高电平是T0产生溢出      
  27.                 {
  28.                         TF0=0;                //清除溢出标识
  29.                         flag1=1;        //接收错误标识置1  
  30.                         TR0=0;                //关闭T0计时
  31.                         break;                //跳出等待   
  32.                 }
  33.         }   
  34.          
  35.         if(flag1!=1)                        //如果接收正确      
  36.         {
  37.                 flag1=0;                        //清除接收正确标识
  38.                 TR0=0;                                //关闭计时   
  39.                 temp=TH0;                        //计时时间 = T0计时时间高8位
  40.                 temp=(temp<<8)+TL0;        //计时时间=计时时间左移8位 +  T0计时时间低8位 得到16位计时时间
  41.                 TH0=0;                                //清除T0计时时间高8位   
  42.                 TL0=0;                                //清除T0计时时间低8位
  43.                 if ((temp>10200) && (temp<11000))        //如果计时时间在10200us - 11000us之间 则判定为检测到正确的同步码
  44.                 {
  45.                         while(wux);                        //等待低电平
  46.                         TR0=1;                                //检测到低电平开启T0计时
  47.                         for(i=0;i<3;i++)        //数据接收 因为需要两位才能判定2262发送的数据是 0还是1 还是悬空码
  48.                                                                 //一共发送12位数据 地址1 + 地址2 + 数据 所以需要循环 3次
  49.                         {
  50.                                 for(j=8;j>0;j--)        //接收八位数据
  51.                                 {
  52.                                         while(!wux);        //等待高电平
  53.                                         TR0=0;                        //检测到高电平后关闭T0计时
  54.                                         temp=TH0;                         //计时时间 = T0计时时间高8位
  55.                                         temp=(temp<<8)+TL0;        //计时时间=计时时间左移8位 +  T0计时时间低8位 得到16位计时时间
  56.                                         TH0=0;   
  57.                                         TL0=0;                                //清除T0计时时间
  58.                                         D[i]=D[i]<<1;                //数据左移一位 然后在接收
  59.                                         if ((temp>200) && (temp<360))        //测低电平时间 如果为200us-360us之间 为0
  60.                                         {
  61.                                                 D[i]=D[i]|0X00;                                //0               
  62.                                         }
  63.                                         else if ((temp>800) && (temp<1100))        //测低电平时间 如果为800us-1100us之间 为1
  64.                                         {
  65.                                                 D[i]=D[i]|0X01;                                //1       
  66.                                         }
  67.                                         else if ((temp>1100)){return;}        //检测到大于1100us 则认为已经放开按键 防止产生误动作直接跳出
  68.                                         while(wux);                                                //等待低电平后开始计时
  69.                                         TR0=1;                                                        //检测到低电平开始记录下一个码低电平时间
  70.                                 }        
  71.                         }
  72.        
  73.                         if(k==0)        //判定一次接收结果
  74.                         {
  75.                                 ((uchar *) &ka)[0]=D[0];
  76.                                 ((uchar *) &ka)[1]=D[1];
  77.                         }
  78.                         if((k==1)&&(D[1]==((uchar *) &ka)[1])&&(D[0]==((uchar *) &ka)[0]))        //两次接收一致则为接收正确
  79.                         {
  80.                                 kk[0]=D[0];
  81.                                 kk[1]=D[1];
  82.                                 kk[2]=D[2];
  83.                                 flag=1;        //开显示               
  84.                         }
  85.                         k++;if(k>1)k=0;        //加记录次数               
  86.                 }  
  87.         }   
  88. }

  89. void Delay20ms()                //@12.000MHz
  90. {
  91.         unsigned char i, j;

  92.         i = 39;
  93.         j = 230;
  94.         do
  95.         {
  96.                 while (--j);
  97.         } while (--i);
  98. }

  99. void main()  
  100. {  
  101.         InitLCD();                        //初始化显示
  102.         ClearScreen();                //清屏
  103.         SetOnOff(1,0,15);   //开显示,正常显示,亮度7  
  104.         TMOD = 0x01;                //设置定时器模式
  105.         while(1)     
  106.         {
  107.                 flag=0;     
  108.                 if(wux==0)        //如果检测到低电平            
  109.                 jiema();        //开始解码
  110.                        
  111.                 if(flag==1)        //   
  112.                 {
  113.                         WRITE_STRING816(4,0, D[0]/16/10,0);
  114.                         WRITE_STRING816(4,8, D[0]/16%10,0);
  115.                         WRITE_STRING816(4,16,D[0]%16/10,0);
  116.                         WRITE_STRING816(4,24,D[0]%16%10,0);
  117.                                
  118.                         WRITE_STRING816(4,40,D[1]/16/10,0);
  119.                         WRITE_STRING816(4,48,D[1]/16%10,0);
  120.                         WRITE_STRING816(4,56,D[1]%16/10,0);
  121.                         WRITE_STRING816(4,64,D[1]%16%10,0);
  122.        
  123.                         WRITE_STRING816(4,80,D[2]/16/10,0);
  124.                         WRITE_STRING816(4,88,D[2]/16%10,0);
  125.                         WRITE_STRING816(4,96,D[2]%16/10,0);
  126.                         WRITE_STRING816(4,104,D[2]%16%10,0);

  127.                         WRITE_STRING816(6,0, kk[0]/16/10,0);
  128.                         WRITE_STRING816(6,8, kk[0]/16%10,0);
  129.                         WRITE_STRING816(6,16,kk[0]%16/10,0);
  130.                         WRITE_STRING816(6,24,kk[0]%16%10,0);
  131.        
  132.                         WRITE_STRING816(6,40, kk[1]/16/10,0);
  133.                         WRITE_STRING816(6,48, kk[1]/16%10,0);
  134.                         WRITE_STRING816(6,56, kk[1]%16/10,0);
  135.                         WRITE_STRING816(6,64, kk[1]%16%10,0);

  136.                         WRITE_STRING816(6,80,kk[2]/16/10,0);
  137.                         WRITE_STRING816(6,88,kk[2]/16%10,0);
  138.                         WRITE_STRING816(6,96,kk[2]%16/10,0);
  139.                         WRITE_STRING816(6,104,kk[2]%16%10,0);


  140.                

  141.                         Delay20ms();        //延时
  142.                         flag=0;                        //关显示
  143.                 }         
  144.         }  
  145. }
复制代码


回复

使用道具 举报

cetcnav 发表于 2016-1-29 13:22 | 显示全部楼层
这么好的帖子,必须顶起!

评分

参与人数 1黑币 +5 收起 理由
WANGCHONG + 5 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

yimei11111 发表于 2016-3-5 17:40 | 显示全部楼层
很好的程序,很清晰,
回复

使用道具 举报

yimei11111 发表于 2016-3-5 18:09 | 显示全部楼层
楼主您好,我想问下,接收模块在空闲状态就是没有接收数据时,数据口是高电平吗,jiema()里先出现的是while(wux);                //等待低电平
回复

使用道具 举报

 楼主| xueyunmicheng 发表于 2016-3-7 00:30 来自手机 | 显示全部楼层
yimei11111 发表于 2016-3-5 18:09
楼主您好,我想问下,接收模块在空闲状态就是没有接收数据时,数据口是高电平吗,jiema()里先出现的是while ...

模块会收到很多杂波!电平在不停变化 理想情况下 没有收到数据 时为高电平 收到数据为低电平
回复

使用道具 举报

yimei11111 发表于 2016-3-7 22:40 | 显示全部楼层
xueyunmicheng 发表于 2016-3-7 00:30
模块会收到很多杂波!电平在不停变化 理想情况下 没有收到数据 时为高电平 收到数据为低电平

谢谢楼主,我还想问下,3.3M震荡电阻的模块,我计算的频率32/3.3=9.697KH,周期T=3.3/32=103us,窄脉冲4T=413us,宽脉冲12T=1238us,同步码低电平124T=12788us,你的程序里宽窄脉冲及同步码时间有200us-360us,800us-1100us,10200us - 11000us,我想问下你是怎么算的,我那样的算法不对吧
回复

使用道具 举报

sdsdzs 发表于 2016-4-2 21:39 | 显示全部楼层
这么好的帖子,必须顶起!
回复

使用道具 举报

sdsdzs 发表于 2016-4-7 21:40 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

腾飞的龙 发表于 2016-4-25 12:23 | 显示全部楼层
楼主你好,你的12864和普通的一样吗?.H的文件好像不太一样?
回复

使用道具 举报

wujj1023 发表于 2016-4-29 14:47 | 显示全部楼层
请问楼主用的什么什么接收模块,超再生还是超外差或者什么?
回复

使用道具 举报

q4189513 发表于 2016-5-17 14:26 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

Rancho13502 发表于 2016-6-15 14:01 | 显示全部楼层
谢谢分享,看看能不能用的哈
回复

使用道具 举报

gxt467138 发表于 2016-6-30 11:07 | 显示全部楼层
老兄 硬件图有没?
回复

使用道具 举报

chjx0131 发表于 2016-8-5 20:20 | 显示全部楼层
我黑币不够了,55555能发我邮箱吗?1250175268@qq.com
回复

使用道具 举报

chjx0131 发表于 2016-8-5 20:22 | 显示全部楼层
那个解码显示的东东,是怎么弄出来的,可以指点一下吗?
回复

使用道具 举报

jjyyjj0131 发表于 2016-8-6 09:13 | 显示全部楼层
对新手来说,没有多少价值~
回复

使用道具 举报

唯我 发表于 2016-8-16 15:44 | 显示全部楼层
找了很久  希望这个有用
回复

使用道具 举报

uestchina 发表于 2016-8-22 09:38 | 显示全部楼层
先下载来看看
回复

使用道具 举报

lxlwoniu 发表于 2016-9-21 14:10 | 显示全部楼层
牛人
回复

使用道具 举报

1670819187 发表于 2017-2-16 11:42 | 显示全部楼层
老兄,你真棒,帮了我的大忙
回复

使用道具 举报

Rambo1996 发表于 2017-2-22 00:13 | 显示全部楼层
可以双向传输吗
回复

使用道具 举报

Alan_zcb 发表于 2017-3-6 14:13 | 显示全部楼层
多谢楼主的无私分享!
回复

使用道具 举报

xou822 发表于 2017-3-11 18:27 | 显示全部楼层
请问这个电源是什么样的要求

不可能用51的io口直接驱动吧

楼主的原理图里面没有明确的给出vfd供电的情况,麻烦讲一下呢
回复

使用道具 举报

sky2017 发表于 2017-3-31 22:32 | 显示全部楼层
我是新手正在学习使用433模块,
回复

使用道具 举报

cdm 发表于 2017-9-13 09:26 | 显示全部楼层
怎么用串口输出解码值
回复

使用道具 举报

jxdianqi 发表于 2017-9-15 23:11 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

qwchen 发表于 2017-12-22 16:45 | 显示全部楼层
感谢分享,正想做一个433遥控接收程序,没有头绪,可以参考这个。
回复

使用道具 举报

wananzi 发表于 2017-12-29 20:36 | 显示全部楼层
感谢分享,买了4套,发现解码不正确,参考一下楼主的
回复

使用道具 举报

cpfmly 发表于 2018-1-23 15:53 | 显示全部楼层
学习了,有模块,一直不会玩
回复

使用道具 举报

ztb096001 发表于 2018-2-5 21:06 | 显示全部楼层
这么好的帖子,必须顶起!
回复

使用道具 举报

chun_hua80 发表于 2018-2-13 12:26 | 显示全部楼层
正在研究 谢谢!
回复

使用道具 举报

wzswp 发表于 2018-2-20 16:22 | 显示全部楼层

51黑有你更精彩!!!,看楼主的程序是一种享受,调理清晰,注释详细.
回复

使用道具 举报

老胖熊 发表于 2018-2-20 20:10 | 显示全部楼层
很好的学习资料,谢谢楼主。
回复

使用道具 举报

邰夏留 发表于 2018-3-27 15:54 | 显示全部楼层
我有一个好习惯,下载了别人的东西就要顶一下。看帖顶帖
回复

使用道具 举报

cliang223 发表于 2018-3-27 22:42 | 显示全部楼层
学习下楼主的程序
回复

使用道具 举报

杀马特六年 发表于 2018-5-15 16:57 | 显示全部楼层
qq704661078 发表于 2016-1-27 17:15
51黑有你更精彩!!!,看楼主的程序是一种享受,调理清晰,注释详细.

老师您好,想请问一下    “ D[ i]=D[ i]<<1;  //数据左移一位 然后在接收”,为什么要左移以为呢?
回复

使用道具 举报

杀马特六年 发表于 2018-5-16 09:00 | 显示全部楼层
        老师您好,请问这里D[i]=D[i]<<1;        为什么要左移一位在接受呢
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛

Powered by 单片机教程网

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