找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 34643|回复: 81
收起左侧

学习型万能红外遥控器设计与制作 含单片机源程序与PCB及原理图

  [复制链接]
ID:228524 发表于 2018-5-21 16:57 | 显示全部楼层 |阅读模式
基于51单片机的万能红外遥控器的设计资料分享给51hei的朋友们
这个单片机选择的是STC15F2K60S2型高速单片机,这个遥控器主要分为两种模式
(1)遥控模式
        在这个模式下这个遥控器可以遥控其他的红外设备,和正常的遥控器一样。
(2)学习模式
        这个模式是获取其他遥控器的用户码以及键码,然后把获取的用户码和键码储存到单片机的EEPROM中,所以这个遥控器具有掉电不丢失的功能。
最后一点就是介绍一下遥控器的小灯的功能。小灯起的是指示的功能,在刚开机的时候,如果是遥控模式小灯闪两下,学习模式小灯闪三下。在遥控模式下按键按一下,小灯闪一下。在学习模式下,红外接收头接收到一帧数据小灯闪两下,连续接收两帧数据小灯闪四下。按键按一下小灯闪一下。

制作出来的实物图如下:
1526893249466.jpg

Altium Designer画的学习型红外遥控器原理图和PCB图如下:(51hei附件中可下载工程文件)
TIM图片20180521165334.png 0.png 0.jpg

单片机学习型遥控器的源程序如下:
  1. /*
  2. 单片机型号STC15F2K60S2,晶振24MHZ
  3. */
  4. #include "config.h"
  5. #include "main.h"
  6. #include "keyboard.h"
  7. #include "PWM_Init.h"
  8. #include "EEPROM.h"
  9. #include "Infrared_Init.h"
  10. #include<intrins.h>

  11. uint8 IR_Send_Code[16][4];
  12. uint8 xdata IR_Send_Code2[16][4];
  13. uint8 Send_Flag[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  14. uint16 timebyte;
  15. uint8 T0RH = 0;    //T0重载值的高字节
  16. uint8 T0RL = 0;    //T0重载值的低字节
  17. uint8 LED_Control = 0;

  18. bit irflag = 0;           //"红外接收标志,收到一帧正确数据后置1"

  19. unsigned char ircode[4];  //"红外代码接收缓冲区"

  20. bit MODE = 1;
  21. volatile unsigned char CodeBuff=30;
  22. void main()
  23. {
  24.         P1=0XFF;
  25.         LED = 1;
  26.         ConfigTimer2();    //定时器0 1KHZ
  27.         EEPROM_Init();                //把所有的EEPROM中的数据读到缓存区中
  28.         EA=1;                            //总中断打开

  29.         if(Mode_CHO)                //判断要使用什么模式
  30.         {
  31.                 MODE = 1;       //遥控模式
  32.                 PWM_Init();            //产生38K载波
  33.                 LED_Control = 2;    //小灯闪烁2次         代表控制模式
  34.         }
  35.         else
  36.         {
  37.                 MODE = 0;                //学习模式
  38.                 InitInfrared();            //红外线接收初始化
  39.                 LED_Control = 3; //小灯闪烁2次          代表学习模式
  40.         }
  41.         while (1)
  42.         {
  43.                 KeyDriver();            //按键驱动
  44.                 if(irflag&&(CodeBuff<16))         //irflag接收完成标志,
  45.                 {
  46.                         irflag=0;

  47.                         if(timebyte>=500)
  48.                         {
  49.                                 IR_Send_Code[CodeBuff][0]=ircode[0];        //功能码
  50.                                 IR_Send_Code[CodeBuff][1]=ircode[1];         //功能码反码
  51.                                 IR_Send_Code[CodeBuff][2]=ircode[2];         //键码
  52.                                 IR_Send_Code[CodeBuff][3]=ircode[3];         //键码反码
  53.                                 Send_Flag[CodeBuff]=0;
  54.                                 EEPROM_Write();                                                 //接收第一个字节
  55.                         }
  56.                         if(timebyte<500)                                                        //在短时间内收到第二个字节则接收
  57.                         {
  58.                                 IR_Send_Code2[CodeBuff][0]=ircode[0];        //功能码
  59.                                 IR_Send_Code2[CodeBuff][1]=ircode[1];         //功能码反码
  60.                                 IR_Send_Code2[CodeBuff][2]=ircode[2];         //键码
  61.                                 IR_Send_Code2[CodeBuff][3]=ircode[3];         //键码反码
  62.                                 Send_Flag[CodeBuff]=1;
  63.                                 EEPROM_Write();
  64.                                 LED_Control=5;                                                 //接收第二个字节
  65.                         }
  66.                         timebyte=0;//从接收到第一帧数据开始计时
  67.                         LED_Control += 2; //小灯闪烁2次          接收完成一次小灯闪烁两次
  68.                 }
  69.         }
  70. }
  71. /* 配置并启动T0,ms-T0定时时间 */
  72. void ConfigTimer2()
  73. {
  74. //    AUXR &= ~0x04;                  //定时器2为12T模式
  75. //    T2L = 0X60;                     //初始化计时值
  76. //    T2H = 0Xf0;
  77. //    AUXR |= 0x10;                   //定时器2开始计时   
  78. //    IE2 |= 0x04;
  79.         AUXR &= 0xFB;                //?????12T??
  80.         T2L = 0x30;                //??????
  81.         T2H = 0xF8;                //??????
  82.         AUXR |= 0x10;                //???2????
  83.          IE2 |= 0x04;
  84. }


  85. void InterruptTimer2() interrupt 12
  86. {
  87.    static unsigned int i=0,j=0;
  88.         i++;
  89.         timebyte++;//计算字节之间的时间
  90.         if(LED_Control)
  91.         {
  92.                 if(!(i%50))
  93.                 {
  94.                         LED=!LED;
  95.                         i=0;
  96.                         j++;
  97.                 }
  98.                 if(j==(2*LED_Control))
  99.                 {
  100.                         LED_Control=0;
  101.                         LED=1;
  102.                         j=0;
  103.                 }
  104.         }
  105.         if(timebyte>600)
  106.                 timebyte=600;
  107.     KeyScan();   //执行按键扫描
  108. }
  109. //中断服务程序
  110. void Interrupt38KPWM() interrupt 3           //中断入口
  111. {
  112.         IR = !IR;  
  113. //  IE2 &= ~0x04;                   //若需要手动清除中断标志,可先关闭中断,此时系统会自动清除内部的中断标志
  114. //  IE2 |= 0x04;                    //然后再开中断即可
  115. }
  116. /* "INT1中断服务函数,执行红外接收及解码 "*/
  117. void EXINT1_ISR() interrupt 2
  118. {
  119.     unsigned char i, j;
  120.     unsigned char byt;
  121.     unsigned int time;
  122. //        LED_Control=1;
  123.     //"接收并判定引导码的9ms低电平"
  124.     time = GetLowTime();
  125.     if ((time<8500*2) || (time>9500*2))  //"时间判定范围为8.5~9.5ms,"                //((time<7833) || (time>8755))
  126.     {                                //"超过此范围则说明为误码,直接退出 "
  127.         IE1 = 0;   //"退出前清零INT1中断标志"
  128.         return;
  129.     }
  130.     //"接收并判定引导码的4.5ms高电平"
  131.     time = GetHighTime();
  132.     if ((time<4000*2) || (time>5000*2))  //"时间判定范围为4.0~5.0ms,"                //((time<3686) || (time>4608))
  133.     {                                //"超过此范围则说明为误码,直接退出"
  134.         IE1 = 0;
  135.         return;
  136.     }
  137.     //"接收并判定后续的4字节数据"
  138.     for (i=0; i<4; i++)  //"循环接收4个字节"
  139.     {
  140.         for (j=0; j<8; j++)  //"循环接收判定每字节的8个bit"
  141.         {
  142.             //"接收判定每bit的560us低电平 "
  143.             time = GetLowTime();
  144.             if ((time<340*2) || (time>780*2)) //"时间判定范围为340~780us,        "                 //((time<313) || (time>718))
  145.             {                             //"超过此范围则说明为误码,直接退出"
  146.                 IE1 = 0;
  147.                 return;
  148.             }
  149.             //"接收每bit高电平时间,判定该bit的值"
  150.             time = GetHighTime();
  151.             if ((time>340*2) && (time<780*2)) //"时间判定范围为340~780us,"                //((time>313) && (time<718))
  152.             {                             //"在此范围内说明该bit值为0"
  153.                 byt >>= 1;   //"因低位在先,所以数据右移,高位为0"
  154.             }
  155.             else if ((time>1460*2) && (time<1900*2)) //"时间判定范围为1460~1900us,"        //((time>1345) && (time<1751))
  156.             {                                    //"在此范围内说明该bit值为1"
  157.                 byt >>= 1;   //"因低位在先,所以数据右移, "
  158.                 byt |= 0x80; //"高位置1"
  159.             }
  160.             else  //"不在上述范围内则说明为误码,直接退出"
  161.             {
  162.                 IE1 = 0;
  163.                 return;
  164.             }
  165.         }
  166.         ircode[i] = byt;  //"接收完一个字节后保存到缓冲区"
  167.     }
  168.     irflag = 1;  //"接收完毕后设置标志"
  169.     IE1 = 0;     //"退出前清零INT1中断标志"
  170. ……………………

  171. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png

所有资料51hei提供下载:
红外遥控.rar (752.31 KB, 下载次数: 958)

评分

参与人数 4黑币 +89 收起 理由
INVIO + 30 共享资料的黑币奖励!
jjjjhh + 4 赞一个!
pen_2B + 5 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:227422 发表于 2018-6-27 21:59 | 显示全部楼层
不错,我想下载
回复

使用道具 举报

ID:282747 发表于 2018-7-2 13:11 | 显示全部楼层
我也想下载看看
回复

使用道具 举报

ID:325642 发表于 2018-7-4 19:26 | 显示全部楼层
这个不错哦
回复

使用道具 举报

ID:290576 发表于 2018-8-22 13:45 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:390052 发表于 2018-8-25 22:16 来自手机 | 显示全部楼层
好东西,谢谢分享
回复

使用道具 举报

ID:199210 发表于 2018-9-6 10:59 | 显示全部楼层
有做成成品的吗,谢谢分享。
回复

使用道具 举报

ID:398219 发表于 2018-9-15 10:14 | 显示全部楼层
非常好,下载下来学习一下
回复

使用道具 举报

ID:380389 发表于 2018-9-16 12:04 | 显示全部楼层
赞  很实用   感谢分享
回复

使用道具 举报

ID:401532 发表于 2018-9-23 11:55 | 显示全部楼层
不错,我想下载
回复

使用道具 举报

ID:399179 发表于 2018-9-23 19:58 来自手机 | 显示全部楼层
感谢楼主分享!
回复

使用道具 举报

ID:227832 发表于 2018-10-1 17:05 | 显示全部楼层

感谢楼主分享!
回复

使用道具 举报

ID:227832 发表于 2018-10-9 22:40 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:154310 发表于 2018-12-31 22:33 | 显示全部楼层
太厉害了
回复

使用道具 举报

ID:438499 发表于 2019-1-1 07:00 | 显示全部楼层
非常好,学习学习!
回复

使用道具 举报

ID:475903 发表于 2019-2-12 14:12 | 显示全部楼层
好贴
回复

使用道具 举报

ID:483019 发表于 2019-3-5 10:02 | 显示全部楼层
终于找到了,谢谢楼主
回复

使用道具 举报

ID:471632 发表于 2019-3-6 10:45 | 显示全部楼层
这个用c51不行吗?
回复

使用道具 举报

ID:487502 发表于 2019-3-10 10:50 | 显示全部楼层
非常感谢,学习中。
回复

使用道具 举报

ID:487159 发表于 2019-3-11 00:41 来自手机 | 显示全部楼层
好帖,值得学习
回复

使用道具 举报

ID:487294 发表于 2019-3-11 17:57 | 显示全部楼层
楼主在吗,有问题想向你请教呀
回复

使用道具 举报

ID:487294 发表于 2019-3-11 17:59 | 显示全部楼层
楼主在吗,想请教一些问题
回复

使用道具 举报

ID:487926 发表于 2019-4-19 19:19 | 显示全部楼层

这个原理图为什么没有最小系统
回复

使用道具 举报

ID:56665 发表于 2019-4-23 19:16 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

ID:519862 发表于 2019-4-23 19:39 | 显示全部楼层
有搞成功的嘛
回复

使用道具 举报

ID:146746 发表于 2019-4-24 19:49 | 显示全部楼层
感谢楼主
回复

使用道具 举报

ID:522698 发表于 2019-4-27 06:38 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:484435 发表于 2019-4-27 10:59 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

ID:296138 发表于 2019-4-27 11:57 来自手机 | 显示全部楼层
厉害了
回复

使用道具 举报

ID:305245 发表于 2019-4-27 14:18 | 显示全部楼层
正需要,想做一个学习型遥控器
回复

使用道具 举报

ID:19690 发表于 2019-4-28 00:16 来自手机 | 显示全部楼层
非常感谢楼主学习了
回复

使用道具 举报

ID:535270 发表于 2019-5-11 13:06 | 显示全部楼层
感谢作者
回复

使用道具 举报

ID:266802 发表于 2019-5-26 20:39 | 显示全部楼层
楼主,这个学子之后断电会保留学习之后的信号吗
回复

使用道具 举报

ID:128463 发表于 2019-6-1 16:03 | 显示全部楼层

好东西,谢谢分享!!
回复

使用道具 举报

ID:189311 发表于 2019-6-9 22:14 | 显示全部楼层
想下载,黑币不够怎么办
回复

使用道具 举报

ID:574438 发表于 2019-6-29 11:03 | 显示全部楼层
不错,,好东西
回复

使用道具 举报

ID:561138 发表于 2019-7-1 15:46 来自手机 | 显示全部楼层
学习下,赞
回复

使用道具 举报

ID:579784 发表于 2019-7-8 10:47 | 显示全部楼层
分享能送我黑币吗
回复

使用道具 举报

ID:312300 发表于 2019-7-25 08:21 | 显示全部楼层
感谢楼主无私分享!!!
回复

使用道具 举报

ID:445367 发表于 2019-8-6 20:16 | 显示全部楼层
资料很棒,正是需要的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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