请教学习型遥控器,波形拷贝式,发射和接收的问题。

2020-01-21 21:36发布

本帖最后由 yihui184 于 2012-10-12 09:35 编辑

做遥控器做了三个月来了,
还没有做到让自己满意的地步!特地来这里请教高人,
帮助帮助我,鳖的急了,真是有点恨自己了,
怎么就做不出来,在网上找资料感觉没有什么收获,这么久了,
现在我就想快点把这个学习型遥控器做出来,
尽快,我再也等不了,再拖,我自己都原谅不了我自己,
很郁闷,真的.现在确实是碰到了瓶颈了!

我做的第一个遥控器程序是专门解NEC的,参考了本论坛楼主BXAK的程序.





第二个做的是看到51hei论坛上的一个学习型遥控器,我把它该造成了存入eeprom中去,但是感觉这个路波型的学习型遥控器,感觉时间不是很准确,不是用定时器录波的,感觉不可靠,但是试了试所有的身边的电视都可以实现
接收码,再发射码都能控制电视。代码如下:有遇到点问题,里面都有注释:

学习型遥控器.rar (40.29 KB, 下载次数: 88) 2012-10-11 23:10 上传 点击文件名下载附件

第三个是我现在做的,根据百度文库上面的一个文章写的,文章如下:

学习型遥控器设计.pdf (121.82 KB, 下载次数: 125) 2012-10-11 23:12 上传 点击文件名下载附件


我写的程序如下:

  1. /*
  2.    时间:2012.10.10
  3.    功能:学习型遥控器
  4. */

  5. #include <reg52.h>

  6. #define uchar unsigned char   
  7. #define uint  unsigned int
  8. #define ulong unsigned long

  9. sbit  study_key=P1^0;                      //学习按键
  10. sbit  studylamp=P2^1;                             //学习状态指示灯
  11. sbit  send_key=P1^1;                      //发射键
  12. sbit  remotein=P2^0;                      //遥控信号输入口
  13. sbit  remoteout= P3^4;                  // 遥控信号输出口
  14. sbit  txkey=P1^1;                         //待定
  15. bit   flag=0;

  16. uchar dat[80];                            //用于记录高低电平的记时值!80个.一的电平要2个字节.


  17. void Delay1ms(uint t)
  18. {
  19.                 uint x,y;
  20.         for(x=0;x<t;x++)
  21.            for(y=0;y<120;y++);
  22. }

  23. void delete_dat()
  24. {
  25.                uchar t;
  26.         for(t=0;t<80;t++)
  27.         {
  28.             dat[t]=0;
  29.         }
  30. }

  31. void init_io()
  32. {
  33.                TMOD=0x21;
  34.         TH1=0xF3;                              
  35.         TL1=0xF3;
  36.         remotein=1;
  37.         remoteout=1;
  38.         studylamp=0;       
  39.         EA=1;
  40. }


  41. void main()
  42. {
  43.    uchar i=0;
  44.    init_io();
  45.    delete_dat();
  46.    while(1)
  47.    {

  48.            if(!study_key)                                                                            //学习键按下,开始接收红外码.用于记录整个码的高低电平.
  49.            {
  50.                           Delay1ms(10);
  51.                   if(!study_key)
  52.                   {
  53.                                  while(!study_key);
  54.                                     while( remotein );                   //当红外接收端为 1 时一直等待,为 0 跳入循环.开始接收程序.
  55.                                       while(1)
  56.                                 {                       
  57.                                   TH0=0;                                
  58.                                   TL0=0;
  59.                                   TR0=1;
  60.                                   while(!remotein);                         //当为 1 时 跳出循环.
  61.                                   TR0=0;
  62.                                   dat[i++]=TH0;                           //保存 0  的记时时间.
  63.                                   dat[i++]=TL0;
  64.                                   TH0=0;                                    //重新赋初值.
  65.                                   TL0=0;                 
  66.                                   TR0=1;
  67.                                   while(remotein)                      //当接收的时候,1 的值是否有溢出,有的话,跳出当前循环,给一个标志位,用于跳出大循环,不再接收.
  68.                                   if(TF0)
  69.                                   {
  70.                                             TF0=0;
  71.                                             TR0=0;
  72.                                               flag=1;
  73.                                               dat[i++]=0;
  74.                                             studylamp=1;
  75.                                             break;
  76.                                  }
  77.                                  if(flag)
  78.                                       break;
  79.                                  TR0=0;
  80.                                  dat[i++]=TH0;
  81.                                          dat[i++]=TL0;                  
  82.                         }
  83.                   }
  84.            }
  85.        
  86.            if(!send_key)                                                  //发射键按下,用于发射接收到的码的高低电平.
  87.            {
  88.                           Delay1ms(10);
  89.                   if(!send_key)
  90.                   {
  91.                           while(!send_key);
  92.                           if(flag)
  93.                           {          
  94.                                           i=0;                                                                                               
  95.                                           ET1=1;                                                                                   //把发送载波的中断开启.
  96.                                           while(1)
  97.                                   {                         
  98.                                                TH0=256-dat[i++];                                                       //先发 1 ,给定时器赋初值,取反,                                          
  99.                                                TL0=256-dat[i++];
  100.                                                TR0=1;
  101.                                                TR1=1;                                                                     //启动载波
  102.                                           while(!TF0);                                                               //溢出后,发下一组.
  103.                                                TF0=0;
  104.                                                TR0=0;
  105.                                                TR1=0;
  106.                                         remoteout=0;                                                        //发送 低 电平
  107.                                         TH0=256-dat[i++];                                                 //发 0  
  108.                                         TL0=256-dat[i++];
  109.                                          if( dat[i] == 0 )                                                     //当发的数据中没有植,为0时,停止发送.
  110.                                          {
  111.                                                       delete_dat();
  112.                                               flag=0;
  113.                                                       studylamp=0;
  114.                                                ET1=0;
  115.                                                break;
  116.                                         }
  117.                                         TR0=1;
  118.                                         while(!TF0);
  119.                                         TF0=0;       
  120.                                         TR0=0;                                                                                 
  121.                                 }
  122.                           }
  123.                   }
  124.            }

  125.    }
  126.         
  127. }

  128. //40KHz发生器      
  129. void time_intt1(void) interrupt 3
  130. {
  131.      remoteout=~remoteout;
  132. }
复制代码请问一下:

我上面的这个程序,我根据PDF那份文档,写的程序:

看了这么多程序,我觉得要做学习型遥控器,我现在是要做记录波形的这种,我觉得只要把高低电平保存起来就可以了嘛,
我上面的这个程序,根据上面那份PDF文档写的,我感觉逻辑上没有错,可是就是控制不了,硬件上面没有问题,希望有经验的
大侠能教教我。

帮我看下我上面写的那个接收码和发射码,哪里是不是有问题呢?还是思路有问题呢?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
61条回答
liujinhan
1楼-- · 2020-01-26 13:53
yihui184 发表于 2012-10-12 14:10
恩,改程序,光解NEC的我是做出来了,我想问下发送RC6码的波形,不是38KHZ的载波么? ...

3.2.2 数据的逻辑定义
(1)RC6逻辑电平的定义(对于接受波形)。见图RC6-3。
  逻辑‘ 0’ :先高后低,下降沿。
  逻辑‘ 1’ :先低后高,上升沿。
(2)RC6每一位的时间
  RC6用36K 载波, 半位时间(1T)占用16个载波周期。
  半位时间(HALF BIT TIME‡1T):16*27778=444.444µs(1T)
  一位时间(FULL BIT TIME‡2T):2*444.444=888.889µs(2T)
(3)RC6消息时间(MESSAGE TIME)和帧(FRAME TIME)
  一个消息经历的消息时间为:52*0.444444=23.111MS(52T)。
  一个帧经历的帧时间为:58*0.444444=25.778MS(58T)。
(4)RC6重复时间(REPEATING TIMING)
  240*0.444444=106.667ms。



还有一点需要特别注意,遥控接收头的问题,并不是所有的接收头都可以接收所有的遥控信号。有些接收出来的时序和实际差别很大,导致无法正常解码。
BXAK
2楼-- · 2020-01-26 15:07
yihui184 发表于 2012-10-12 14:49
BXAK,还是不行,我再研究下,用单片机做的逻辑分析仪看下,我去找个网上有网友做的逻辑分析仪弄到我开发 ...

又一个错误的地方,16位定时器赋值错误
TH0=256-dat[i++];                                                       //先发 1 ,给定时器赋初值,取反,                                          
TL0=256-dat[i++];

BXAK
3楼-- · 2020-01-26 19:52
BXAK 发表于 2012-10-12 18:02
又一个错误的地方,16位定时器赋值错误
TH0=256-dat;                                                  ...

程序已传到新帖,链接:基于STC89C52的简易学习型红外遥控器
yihui184
4楼-- · 2020-01-27 00:38
BXAK 发表于 2012-10-12 22:25
程序已传到新帖,链接:基于STC89C52的简易学习型红外遥控器

BXAK,你就弄出来啦,就验证啦,真厉害!
yihui184
5楼-- · 2020-01-27 02:42
 精彩回答 2  元偷偷看……
BXAK
6楼-- · 2020-01-27 04:12
yihui184 发表于 2012-10-12 23:07
BXAK,又让你花时间了,谢谢你,我现在就去看你的程序。好强大啊,真的好厉害呀!你总是那么的热心,我都 ...

还好,主要模块都是以前模块化编程留下来的,现在只需组合小改就行

一周热门 更多>