找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14792|回复: 20
收起左侧

基于stm32的红外遥控器学习与发射程序源码

  [复制链接]
ID:58581 发表于 2018-7-12 15:21 | 显示全部楼层 |阅读模式
通过载波学习红外,并可还原发送出去

单片机源程序如下:
  1. #include "stdio.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "led.h"
  5. #include "myuart.h"
  6. #include "ir.h"
  7. #include "irsend.h"
  8. #include "learn.h"
  9. #include "key.h"
  10. #include "pwm.h"
  11. #include "remoteflash.h"

  12. #include "lcd.h"


  13. /* 接口
  14. 发送指示灯 LED_SEND -- PC.0
  15. 学习指示灯 LED_COPY -- PC.1
  16. 按键                         K1 -- PA.3
  17.                                  K2 -- PA.4
  18.                                  K3 -- PA.5
  19.                                  K4 -- PA.6
  20.                                  K5 -- PA.7
  21. 学习按键        KEY -- PA.2
  22. 接收使能                 DQ -- PC.3
  23. 红外接收引脚        OUT -- PA.1
  24. 载波38K         38K -- PA.0
  25. 发送控制             Txd -- PC.2
  26. */

  27. u8 Flag_RemoteSet = 0;
  28. u8 Flag_LearnState = 0;
  29. extern u16 PulseTab[];
  30. int main(void)               
  31. {       
  32.         u16 i;
  33.         u8 temp = 0;       
  34.         /* 延时函数初始化 */
  35.         DelayInit();
  36.         NVIC_Configuration();        //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  37.         /* MYUART 初始化 */
  38.         MY_UartInit(9600);
  39.         /* KEY 初始化 */
  40.         KEY_Init();
  41.         LearnKEY_Init();
  42.         /* PWM 初始化 */
  43.         TIM2_PWM_Init(1895,0);        //72000/(1895+1) = 37.99K
  44.         /* LED 初始化 */                      
  45.         LED_Init();
  46.         /* IR 初始化 */
  47.         IR_Init();                // 红外接收函数
  48.         SendPort_Init();
  49.         /* TFT1.8初始化 */
  50.         LCD_PortInit();
  51.         LCD_Init();
  52. /***************************** 以下添加代码区 *****************************/
  53.         /* 设置窗口 */
  54.         LCD_SetRamAddr(0,127, 0,29);
  55.         for(i=0; i<3839; i++)        LCD_Wirte_Data16(CYAN);
  56.         ChineseChar(32,10,0,BLACK,CYAN,1);        // 遥
  57.            ChineseChar(48,10,0,BLACK,CYAN,2);        // 控
  58.            ChineseChar(64,10,0,BLACK,CYAN,3);        // 器
  59.            ChineseChar(80,10,0,BLACK,CYAN,4);        // 码

  60.         LCD_SetRamAddr(0,127,30,89);
  61.         for(i=0; i<11520; i++)        LCD_Wirte_Data16(YELLOW);
  62.         ChineseChar(0,40,0,BLACK,YELLOW,5);        // 红
  63.         ChineseChar(15,40,0,BLACK,YELLOW,6);// 外
  64.         ChineseChar(30,40,0,BLACK,YELLOW,7);// 协
  65.         ChineseChar(45,40,0,BLACK,YELLOW,8);// 议
  66.         LCD_ShowChar(55,40,BLACK,YELLOW,':');

  67.         LCD_SetRamAddr(0,127,90,159);
  68.         for(i=0; i<11520; i++)        LCD_Wirte_Data16(PUEPLE);
  69.         ChineseChar( 0,100,0,BLACK,PUEPLE,1);        // 红
  70.         ChineseChar(15,100,0,BLACK,PUEPLE,2);        // 外
  71.         ChineseChar(30,100,0,BLACK,PUEPLE,9);        // 状
  72.         ChineseChar(45,100,0,BLACK,PUEPLE,10);        // 态
  73.         LCD_ShowChar(55,100,BLACK,PUEPLE,':');
  74. /***************************** 以上添加代码区 *****************************/
  75.         LEARN_ON = 0;        // 关闭红外接收
  76.         LED1 = 1;  // 收到脉冲指示
  77.         LED_SEND = 1;  // 发送状态指示
  78.         LED2 = 0;
  79.         LED2 = 1;
  80.         LED3 = 1;               
  81.         LED4 = 1;
  82.         LED5 = 1;
  83. //        TFTDisplay();        // 测试
  84.           while(1)
  85.         {       
  86. /* 页面定义 */
  87. //#define KEY1_ADDR 0x0807E000        VOL+
  88. //#define KEY2_ADDR 0x0807E800        VOL-
  89. //#define KEY3_ADDR 0x0807F000        CH+
  90. //#define KEY4_ADDR 0x0807F800        CH-
  91. //#define KEY5_ADDR 0x0807D800        POWER

  92. //#define VOL_UP        1
  93. //#define VOL_DOWN        2
  94. //#define CH_UP                3
  95. //#define CH_DOWN        4
  96. //#define PWR_ON        5       
  97.                 LED2 = 0;
  98.                 temp = KEY_Scan(0);        // 按键扫描,非连按模式
  99.                 /* 红外协议检测 */
  100.                 if(PulseTab[1]>3500 && PulseTab[1]<5500) {
  101.                         LCD_ShowString(50,65,BLACK,YELLOW,"NEC   ");
  102.                 }else{
  103.                         LCD_ShowString(50,65,BLACK,YELLOW,"Other");
  104.                 }
  105.                 /* 遥控器状态检测 */
  106.                 if((Flag_RemoteSet==0) && (temp!=0)) {
  107.                         LCD_ShowString(18,120,BLACK,PUEPLE,"Sending....");
  108.                 }
  109.                 if((Flag_RemoteSet==0) && (temp==0)) {
  110.                         LCD_ShowString(18,120,BLACK,PUEPLE,"Idle State ");
  111.                 }
  112. //                TFTDisplay();        // 测试
  113. //=======================学习状态=======================//
  114.                 if(Flag_RemoteSet == 1){
  115. //                        ChineseChar(20,110,2,BLACK,PUEPLE,1);// 学
  116. //                        ChineseChar(45,110,2,BLACK,PUEPLE,2);// 习
  117. //                        ChineseChar(70,1`        10,2,BLACK,PUEPLE,3);// 中
  118. //                        LCD_ShowString(95,115,BLACK,YELLOW,"...");
  119.                         //LCD_ShowString(18,115,BLACK,PUEPLE,"Learning...");
  120.                         switch(temp){
  121.                                 case VOL_UP  :temp = 0;                 // 按键按下标志清零
  122.                                                           LED3 = ~LED3;         // 调试用
  123.                                                           FLASH_WriteData(KEY1_ADDR,PulseTab,200);        // 红外脉冲宽度值保存到相应按键下
  124.                                                           break;
  125.                                 case VOL_DOWN:temp = 0;                 // 按键按下标志清零
  126.                                                           LED3 = ~LED3;
  127.                                                           FLASH_WriteData(KEY2_ADDR,PulseTab,200);        // 红外脉冲宽度值保存到相应按键下
  128.                                                           break;
  129.                                 case CH_UP   :temp = 0;                 // 按键按下标志清零
  130.                                                           LED3 = ~LED3;
  131.                                                           FLASH_WriteData(KEY3_ADDR,PulseTab,200);        // 红外脉冲宽度值保存到相应按键下
  132.                                                           break;
  133.                                 case CH_DOWN :temp = 0;                 // 按键按下标志清零
  134.                                                           LED3 = ~LED3;
  135.                                                           FLASH_WriteData(KEY4_ADDR,PulseTab,200);        // 红外脉冲宽度值保存到相应按键下
  136.                                                           break;
  137.                                 case PWR_ON  :temp = 0;                 // 按键按下标志清零
  138.                                                           LED3 = ~LED3;
  139.                                                           FLASH_WriteData(KEY5_ADDR,PulseTab,200);        // 红外脉冲宽度值保存到相应按键下
  140.                                                           break;
  141.                         }
  142.                 }
  143. //=======================发送状态=======================//
  144.                 if(Flag_RemoteSet == 0){
  145.                         //LCD_ShowString(18,115,BLACK,PUEPLE,"SendingStat");
  146.                         switch(temp){
  147.                                 case VOL_UP  :temp = 0;                 // 按键按下标志清零
  148.                                                           SendLight(1);  // 发送指示灯亮                                                                 
  149.                                                           //LED3 = ~LED3;         // 调试用
  150.                                                           IR_SendData(KEY1_ADDR);  // 红外发送
  151.                                                           delay_ms(150);
  152.                                                           SendLight(0);  // 发送完熄灭
  153.                                                           break;
  154.                                 case VOL_DOWN:temp = 0;                 // 按键按下标志清零
  155.                                                           SendLight(1); //发送指示灯亮
  156.                                                           //LED3 = ~LED3;       
  157.                                                           IR_SendData(KEY2_ADDR);
  158.                                                           delay_ms(150);
  159.                                                           SendLight(0);
  160.                                                           break;
  161.                                 case CH_UP   :temp = 0;                 // 按键按下标志清零
  162.                                                           SendLight(1); //发送指示灯亮
  163.                                                           //LED3 = ~LED3;
  164.                                                           IR_SendData(KEY3_ADDR);
  165.                                                           delay_ms(150);
  166.                                                           SendLight(0);
  167.                                                           break;
  168.                                 case CH_DOWN :temp = 0;                 // 按键按下标志清零
  169.                                                           SendLight(1); //发送指示灯亮
  170.                                                           //LED3 = ~LED3;
  171.                                                           IR_SendData(KEY4_ADDR);
  172.                                                           delay_ms(150);
  173.                                                           SendLight(0);
  174.                                                           break;
  175.                                 case PWR_ON  :temp = 0;                 // 按键按下标志清零
  176.                                                           SendLight(1); //发送指示灯亮
  177.                                                           //LED3 = ~LED3;                               
  178.                                                           IR_SendData(KEY5_ADDR);
  179.                                                           delay_ms(150);
  180.                                                           SendLight(0);
  181.                                                           break;
  182.                         }
  183.                 }       
  184.         }                                                                                                                   
  185. }

复制代码

所有资料51hei提供下载:
IR_remote.zip (382.88 KB, 下载次数: 576)
回复

使用道具 举报

ID:350170 发表于 2018-7-30 15:54 | 显示全部楼层
楼主你好,很有用的学习资料,这里想问个问题,这个红外发射的硬件电路,你是通过三极管b基级(即PC2口)负责控制,c集电极是38K载波信号,是这样的吗?
回复

使用道具 举报

ID:350170 发表于 2018-7-30 15:58 | 显示全部楼层
楼主你好,资料非常有用,想问个问题,红外发射模块的硬件电路,是b基级(PC2口)负责控制,然后c集电极是38K载波信号吗?
回复

使用道具 举报

ID:239219 发表于 2018-11-14 11:18 | 显示全部楼层
楼主你好,很有用的学习资料,这里想问个问题,这个红外发射的硬件电路,你是通过三极管b基级(即PC2口)负责控制,c集电极是38K载波信号,是这样的吗?
回复

使用道具 举报

ID:305847 发表于 2019-2-28 10:31 | 显示全部楼层
感谢楼主的分享,我下载来参考,如果可行,真的感激
回复

使用道具 举报

ID:220853 发表于 2019-3-25 16:42 | 显示全部楼层

感谢楼主的分享,我下载来参考,如果可行,真的感激
回复

使用道具 举报

ID:516765 发表于 2019-5-1 07:47 | 显示全部楼层
下载试试看,谢谢分享
回复

使用道具 举报

ID:525814 发表于 2019-5-2 07:45 | 显示全部楼层
资料不错值得学习
回复

使用道具 举报

ID:575801 发表于 2019-7-17 11:48 | 显示全部楼层
就想要个积分下载,以后可能用得上,先储存
回复

使用道具 举报

ID:587282 发表于 2019-7-20 11:12 | 显示全部楼层
很好像下载过来看看
回复

使用道具 举报

ID:312300 发表于 2019-8-2 09:38 | 显示全部楼层
下载学习学习,感谢楼主分享!!!
回复

使用道具 举报

ID:17647 发表于 2019-8-2 18:52 | 显示全部楼层
没有看到硬件原理图
回复

使用道具 举报

ID:112865 发表于 2019-11-18 15:59 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

ID:645302 发表于 2019-11-19 20:35 | 显示全部楼层
非常感谢
回复

使用道具 举报

ID:342398 发表于 2019-11-24 20:41 | 显示全部楼层
非常感谢楼主的分享
回复

使用道具 举报

ID:520928 发表于 2020-3-21 23:05 | 显示全部楼层
感谢楼主的分享,我下载来参考,如果可行,真的感激
回复

使用道具 举报

ID:705415 发表于 2020-3-24 21:40 | 显示全部楼层
感谢楼主的分享,我下载来参考,如果可行,真的感激
回复

使用道具 举报

ID:708835 发表于 2020-3-25 15:23 | 显示全部楼层
非常感谢楼主分享,下载来做参考,感谢。
回复

使用道具 举报

ID:128463 发表于 2020-3-27 09:55 | 显示全部楼层
非常感谢楼主的分享
回复

使用道具 举报

ID:699932 发表于 2021-1-29 08:41 | 显示全部楼层
没有看到硬件原理图
回复

使用道具 举报

ID:956336 发表于 2021-7-25 16:33 | 显示全部楼层
@择一城终老
好像红外频率是38K吧, 三极管选型需要支持38K.
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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