搜索
bottom↓
123
返回列表 发新帖
楼主: BXAK

发一个红外线解码程序+仿真文件(可定义任意I/O作接收脚,支持长/短按,自适应主频6MHz~40

  [复制链接]

出0入0汤圆

发表于 2013-6-17 23:27:27 | 显示全部楼层
本帖最后由 HeP028 于 2013-6-17 23:32 编辑

经过改造成功:  STC90C58RD+11.0592
  1. #define IRSENDPORT P0

  2. #define TIMER9000US            (65536-8294)                   //9mS
  3. #define TIMER4500US          (65536-4147)                   //4.5mS
  4. #define TIMER1650US          (65536-1520)                   //1.65mS
  5. #define TIMER0560US          (65536-516)                   //0.56mS
  6. #define TIMER40000US           (65536-36863)               //40mS
  7. #define TIMER56000US           (65536-51609)               //56mS

  8. void IrUserTimerConfiguration(void)
  9. {
  10.         TMOD |= 0x01;
  11.         IRSENDPORT = 0XFF;
  12. }



  13. void IRWriteOneBit(BIT send_Mode,unsigned int TimerInitValue,unsigned char ChangNumer)
  14. {
  15.         unsigned char NumBer = 1 << ChangNumer;
  16.         unsigned char onlyOneChangorAllChang = 20;
  17.        
  18.         if (ChangNumer < 8 && ChangNumer >= 0)        onlyOneChangorAllChang = 0;                //单独通道发送
  19.         else if (255 == ChangNumer)                            onlyOneChangorAllChang = 1;                //所有通道都发送
  20.         TH0 = TimerInitValue >> 8;                                                                       
  21.         TL0 = TimerInitValue;
  22.         TF0 = 0;
  23.         TR0 = 1;
  24.         if (send_Mode == 0)        while(!TF0);
  25.         else while(1)
  26.         {
  27.                 if (0 == onlyOneChangorAllChang)            IRSENDPORT |= NumBer;                //置位相应的通道
  28.                 else if (1 == onlyOneChangorAllChang)        IRSENDPORT = 0xff;
  29.                
  30.                 if (TF0) break; if (TF0) break;
  31.                
  32.                 if (0 == onlyOneChangorAllChang)                IRSENDPORT &= ~NumBer;                //CLR相应通道
  33.                 else if (1 == onlyOneChangorAllChang)        IRSENDPORT = 0x00;
  34.                
  35.                 if (TF0) break; if (TF0) break; if (TF0) break;
  36.                 if (TF0) break; if (TF0) break; if (TF0) break;
  37.                 if (TF0) break; if (TF0) break; if (TF0) break; if (TF0) break;               
  38.         }
  39.         TR0 = 0;
  40.     if (0 == onlyOneChangorAllChang)            IRSENDPORT |=  NumBer;
  41.         else if (1 == onlyOneChangorAllChang)        IRSENDPORT = 0xff;
  42. }


  43. void IRWriteOneChar(unsigned char ircode,unsigned char ChangNumber)
  44. {
  45.         unsigned char I = 0x00;
  46.         for (I = 0;I < 8;I++)
  47.         {
  48.                 IRWriteOneBit(1,TIMER0560US,ChangNumber);
  49.                 if (ircode & 0x01)       
  50.                         {
  51.                                 IRWriteOneBit(0,TIMER1650US,ChangNumber);
  52.                         }
  53.                 else
  54.                         {
  55.                                 IRWriteOneBit(0,TIMER0560US,ChangNumber);
  56.                         }
  57.                 ircode >>= 1;
  58.         }       
  59. }

  60. void IrPortWriteIrcode(unsigned char *Ircode,unsigned char ChangNumber)
  61. {
  62.         IRWriteOneBit(1,TIMER9000US,ChangNumber);
  63.         IRWriteOneBit(0,TIMER4500US,ChangNumber);

  64.     IRWriteOneChar(*Ircode    ,ChangNumber);       
  65.         IRWriteOneChar(*(Ircode+1),ChangNumber);
  66.         IRWriteOneChar(*(Ircode+2),ChangNumber);
  67.         IRWriteOneChar(*(Ircode+3),ChangNumber);

  68.         IRWriteOneBit(1,TIMER0560US,ChangNumber);
  69.         IRWriteOneBit(0,TIMER40000US,ChangNumber);
  70. }
复制代码
解码用的也是论坛的很好用,误码率还算比较低的哈,解100次可能错一次:
  1. SBIT IRrecPort = PORTD^3;


  2. void IRUsereceiveTimerConfiuration(void)
  3. {
  4.         T2MOD = 0X00;
  5.         T2CON = 0X00;
  6.         RCAP2L= (unsigned int)(0XFFFF-(250/((12/FOSC)+0.00005))+1);
  7.         RCAP2H= (unsigned int)(0XFFFF-(250/((12/FOSC)+0.00005))+1)>>8;
  8.         TL2   = RCAP2L;
  9.         TH2   = RCAP2H;
  10.         TR2 = 1;
  11.         ET2 = 1;
  12.         EA  = 1;
  13. }



  14. BIT IRprotLaststatus = 0;                                   // 端口状态位
  15. unsigned char codeCount = 0;                        // 数据码位计数
  16. unsigned char irTime;                               // 码时间,用于以125us时间计时
  17. unsigned char InfarereceiveArray[4];                  // 接收数据缓存


  18. void IRreceive_Hander(void) interrupt 5
  19. {
  20.         TR0 = 0;
  21.         if (TF2)
  22.         {
  23.                 TF2 = 0;
  24.                 irTime++;
  25.                 if (irTime == 120)                                        //存活时间240*125=30MS
  26.                         {
  27.                                 irTime--;
  28.                                 codeCount = 0x3f;
  29.                         }
  30.                 if (IRrecPort)        IRprotLaststatus = 1;
  31.                 else if (IRprotLaststatus)
  32.                         {
  33.                                 IRprotLaststatus = 0;
  34.                                 if (irTime < 12)
  35.                                 {
  36.                                         codeCount++;
  37.                                         codeCount &= 0x1f;                //限制其codeCount不大于某某数
  38.                                         InfarereceiveArray[codeCount >> 3] <<= 1;
  39.                                         if (irTime > 7)
  40.                                                 {
  41.                                                         InfarereceiveArray[codeCount >> 3]++;
  42.                                                 }
  43.                                 }
  44.                                 irTime = 0;
  45.                         }
  46.         }
  47.         TR0 = 1;
  48. }
复制代码
不过哪位大神看下,如果自发自收1个单片机好像完成不了哇!

出0入0汤圆

发表于 2013-7-16 15:53:07 | 显示全部楼层
红外发射  接收

出0入0汤圆

发表于 2013-7-16 15:55:05 | 显示全部楼层
红外接收  发射

出0入0汤圆

发表于 2013-7-31 23:20:43 | 显示全部楼层
楼主 请教下在解码头文件中定义了一个
#define  CA_S       8                             //长按时间设置,单位:108mS(即 108mS整数倍,10倍以上为宜)
请问这个 CA_S为什么是108的整数倍呢 在哪里进行了定义 我这个地方不是太明白 恳请楼主指点下 谢谢

出0入0汤圆

 楼主| 发表于 2013-8-1 01:03:12 | 显示全部楼层
yyinfo263 发表于 2013-7-31 23:20
楼主 请教下在解码头文件中定义了一个
#define  CA_S       8                             //长按时间设置,单位:108mS(即 108 ...


示波器
或者
自制的简易逻辑分析仪
或者
直接用电脑录音原理,如:利用一个二极管,就可以检测315M/433M遥控器发射数据的波形,解码PT2262
记录一个完整的NEC发射波形(按住遥控某一键不放)看看它的 重复码就清楚了

如果嫌麻烦直接看网上的测试:http://www.tinyos.net.cn/?article-39.html

出0入0汤圆

发表于 2013-8-1 07:23:06 | 显示全部楼层
谢谢楼主的耐心解答 有点理解了长按有一个重复码的 我是初学单片机不久。
还有一点不明 就是 CA_S 定义为8这个数了 这个数8为什么是108mS的整数倍 是不是有一个换算关系在这里面。

出0入0汤圆

 楼主| 发表于 2013-8-1 13:49:31 | 显示全部楼层
yyinfo263 发表于 2013-8-1 07:23
谢谢楼主的耐心解答 有点理解了长按有一个重复码的 我是初学单片机不久。
还有一点不明 就是 CA_S 定义为8 ...

那个没规定,看个人需要取值

出0入0汤圆

发表于 2013-8-1 20:41:38 | 显示全部楼层
了解了 再次谢谢楼主

出0入0汤圆

发表于 2013-8-2 14:19:14 | 显示全部楼层
m a  r   k!

出0入0汤圆

发表于 2013-8-2 23:38:40 | 显示全部楼层
BXAK 发表于 2012-2-29 01:39
回复【58楼】b60885262
-----------------------------------------------------------------------

楼主,你用的是STC11L04E吗,我也有2片,想拿一片实现从串口收到遥控码值后通过11L04E接红外头发送出去,另一片实现接红外头接收遥控码值解码从串口输出码值,能指点一下吗。当然一片能实现收发最好了。

出0入0汤圆

 楼主| 发表于 2013-8-4 18:51:12 | 显示全部楼层
n321 发表于 2013-8-2 23:38
楼主,你用的是STC11L04E吗,我也有2片,想拿一片实现从串口收到遥控码值后通过11L04E接红外头发送出去, ...

一片就可以了

出200入0汤圆

发表于 2013-8-4 19:51:42 | 显示全部楼层
好东东,收藏

出0入0汤圆

发表于 2013-8-4 22:45:34 | 显示全部楼层
非常不错哦,谢谢

出0入0汤圆

发表于 2013-8-12 00:28:40 | 显示全部楼层
mark              

出0入0汤圆

发表于 2013-10-14 20:54:17 | 显示全部楼层
好东西,顶

出0入0汤圆

发表于 2013-10-15 18:55:43 | 显示全部楼层
老帖了  感谢 楼主  

出0入0汤圆

发表于 2014-5-26 22:06:31 | 显示全部楼层
最近才开始用STC 1T的单片机,原先一直用的PIC,Mark一下,做块板子试试!

出0入8汤圆

发表于 2014-5-27 09:01:55 | 显示全部楼层
好东西,记下了~

出0入0汤圆

发表于 2014-5-28 16:17:18 | 显示全部楼层
多謝分享,讚一個

出0入0汤圆

发表于 2014-6-1 18:50:04 | 显示全部楼层
楼主很厉害,帖子很好。不过我都无心机学了

出0入0汤圆

发表于 2014-6-9 12:01:35 | 显示全部楼层

多任务的思想,不错

出0入0汤圆

发表于 2014-6-9 13:42:44 | 显示全部楼层
mark,谢谢分享!

出0入0汤圆

发表于 2014-6-9 16:20:59 | 显示全部楼层
mark                  

出0入0汤圆

发表于 2014-7-4 08:47:40 | 显示全部楼层
mark,谢谢分享!

出0入0汤圆

发表于 2014-8-7 11:43:47 | 显示全部楼层
mark,最近要做这方面,谢谢楼主的无私

出0入0汤圆

发表于 2014-8-28 14:09:17 | 显示全部楼层
收藏了,谢谢楼主

出0入0汤圆

发表于 2014-9-5 15:25:20 | 显示全部楼层
mark               

出0入0汤圆

发表于 2015-1-26 16:23:13 | 显示全部楼层
很好红外编解码资料,谢谢分享!

出0入0汤圆

发表于 2015-1-26 17:10:28 | 显示全部楼层
够详细,GOOD

出0入0汤圆

发表于 2015-1-26 19:09:57 | 显示全部楼层
Mark一下,好东西

出0入0汤圆

发表于 2015-1-26 22:00:47 | 显示全部楼层
楼主不错

出0入0汤圆

发表于 2015-1-26 22:33:56 | 显示全部楼层
楼主你太给了,服务也很给力,及时还给人分析,无私啊

出0入0汤圆

发表于 2015-1-26 23:29:49 | 显示全部楼层
很不错的分享!

出0入0汤圆

发表于 2015-5-8 20:14:58 | 显示全部楼层
楼主你好! 我把红外解码程序在STC  12T单片机上运行可以,但在STC 1T单片机上就不能正常解码了。请问需要做何更改呢?  

出0入0汤圆

发表于 2015-5-8 20:20:27 | 显示全部楼层
夏朗 发表于 2015-5-8 20:14
楼主你好! 我把红外解码程序在STC  12T单片机上运行可以,但在STC 1T单片机上就不能正常解码了。请问需要 ...

都是是挖坟的主啊.....
主要是延时函数的不同,用小精灵什么,重新生成一直试试就好用了

出0入0汤圆

发表于 2015-10-9 23:51:38 | 显示全部楼层
找了好久,这个发须得顶

出0入0汤圆

发表于 2015-10-10 08:51:50 | 显示全部楼层
红外解码mark

出0入0汤圆

发表于 2015-10-10 16:51:27 | 显示全部楼层
回去马上试试,谢谢楼主啊,一直想涉足红外遥控解码这块

出0入0汤圆

发表于 2015-12-14 01:06:21 | 显示全部楼层
mark 好东西 谢谢楼主分享

出0入0汤圆

发表于 2015-12-14 12:03:56 | 显示全部楼层
老贴, 不过质量不错,  刚好有部份代码正须要的..

出0入0汤圆

发表于 2016-6-13 12:35:40 | 显示全部楼层
谢谢楼主啊

出0入0汤圆

发表于 2016-6-13 13:31:13 | 显示全部楼层
好贴 收藏。

出0入0汤圆

发表于 2016-8-26 14:30:42 | 显示全部楼层
好东西学习的好资料

出0入0汤圆

发表于 2017-5-16 20:45:01 | 显示全部楼层
mark,赞一个!!!

出0入0汤圆

发表于 2017-11-1 17:11:30 | 显示全部楼层
好资料,找了很久,谢谢楼主的分享

出0入0汤圆

发表于 2017-11-1 21:38:14 | 显示全部楼层
楼主真是大好人,好东西学习了,谢谢你的分享!!

出0入0汤圆

发表于 2018-2-19 11:23:46 | 显示全部楼层
好东西学习了

出0入0汤圆

发表于 2018-9-29 22:40:02 | 显示全部楼层
很不错,

出0入0汤圆

发表于 2018-10-1 00:42:47 | 显示全部楼层
不错,学习了。

出0入0汤圆

发表于 2020-7-9 20:15:52 | 显示全部楼层
学习收藏,谢谢楼主

出100入101汤圆

发表于 2020-7-9 21:33:39 来自手机 | 显示全部楼层
不错,收藏
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 22:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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