找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5134|回复: 5
打印 上一主题 下一主题
收起左侧

基于stm32的红外解码源程序 大家看不懂可以问我

[复制链接]
跳转到指定楼层
楼主
ID:281185 发表于 2018-1-31 15:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
qq1175630462只需要去读取发射部分的对应的码值什么都能解

单片机源程序如下:
  1. #include "ir.h"
  2. #include "LED.h"
  3. #include "usart.h"
  4. #include "control.h"
  5. char IR_charge_states_after[3]={0};
  6. char IR_charge_states[3]={0};
  7. IR_OBJ  IR_DATA[7]={0};
  8. //正在接受红外接收的状态
  9. u8 ready_ok=0;
  10. void        IR_GPIO_Init(void)
  11. {       
  12.         GPIO_InitTypeDef   GPIO_InitStructure;
  13.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  14.                 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
  15.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
  16.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  17.                
  18.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
  19.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
  20.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  21.        
  22.                 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
  23.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
  24.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  25. }

  26. //外部中断

  27. static void IR_EXTI_Init(void)
  28. {
  29.         EXTI_InitTypeDef   EXTI_InitStructure;
  30.         NVIC_InitTypeDef   NVIC_InitStructure;       
  31.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);       
  32.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource4);
  33.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
  34.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1);
  35.        
  36.         EXTI_InitStructure.EXTI_Line=EXTI_Line0|EXTI_Line1|EXTI_Line4;
  37.         EXTI_InitStructure.EXTI_LineCmd= ENABLE;
  38.         EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
  39.         EXTI_InitStructure.EXTI_Trigger= EXTI_Trigger_Falling;
  40.         EXTI_Init(&EXTI_InitStructure);
  41.        
  42.         NVIC_InitStructure.NVIC_IRQChannel=        EXTI4_IRQn;
  43.         NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  44.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
  45.         NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
  46.         NVIC_Init(&NVIC_InitStructure);
  47.        
  48.         NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;                                  //设置中断优先级
  49.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  50.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  51.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  52.         NVIC_Init(&NVIC_InitStructure);
  53.        
  54. //顶
  55.         NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;                                  //设置中断优先级
  56.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  57.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  58.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  59.         NVIC_Init(&NVIC_InitStructure);
  60. }

  61. //只用到定时器的计数功能故不开启定时器更新中断、不必配置中断优先级。
  62. static void IR_TIM_Init(void)
  63. {
  64.        
  65.         TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;

  66.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  67.        
  68.         TIM_TimeBaseStructure.TIM_Period=59999;
  69.         TIM_TimeBaseStructure.TIM_Prescaler=719;
  70.         TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  71.         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
  72.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  73. //        TIM_SetAutoreload(TIM2, 60000);//手动设置ARR
  74.         TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE );
  75.         TIM_Cmd(TIM2, ENABLE);
  76.        
  77. }

  78. void IR_Init(void)
  79. {       
  80.          IR_GPIO_Init();
  81.          IR_EXTI_Init();
  82.          IR_TIM_Init();
  83. }
  84. //红外解码
  85. static void IR_RECEIVE(IR_OBJ *IR_DATA_INTENAL,char number)
  86. {
  87.         int T_val=0;
  88.         T_val=(TIM2->CNT>IR_DATA_INTENAL->ITC)?(TIM2->CNT-IR_DATA_INTENAL->ITC):(60000-IR_DATA_INTENAL->ITC+TIM2->CNT);
  89.         IR_DATA_INTENAL->ITC=TIM2->CNT;
  90.        
  91.         if(T_val>1300&&T_val<1400&&ready_ok==0)//引导码
  92.         {
  93.                 ready_ok=1;
  94.                 IR_DATA_INTENAL->Flag_Data=0;
  95.                 IR_DATA_INTENAL->Flag_ROK=0;//receive ok
  96.                 IR_DATA_INTENAL->AdressCode=0;
  97.                 IR_DATA_INTENAL->AdressCode1=0;
  98.                 IR_DATA_INTENAL->Ir_OrderCode=0;
  99.                 IR_DATA_INTENAL->Ir_OrderCode1=0;
  100.                 IR_DATA_INTENAL->RepeatSen=0;
  101.                
  102.         }
  103.                

  104.         else if(T_val>100&&T_val<140)//低电平
  105.         {
  106.        
  107.                 if(IR_DATA_INTENAL->Flag_Data<8)
  108.                 {
  109.                        
  110.                         IR_DATA_INTENAL->AdressCode&=(u8)~(1<<IR_DATA_INTENAL->Flag_Data);
  111.                         IR_DATA_INTENAL->Flag_Data++;
  112.                 }
  113.                 else if(IR_DATA_INTENAL->Flag_Data>=8&IR_DATA_INTENAL->Flag_Data<16)
  114.                 {
  115.                        
  116.                         IR_DATA_INTENAL->AdressCode1&=(u8)~(1<<IR_DATA_INTENAL->Flag_Data);
  117.                         IR_DATA_INTENAL->Flag_Data++;
  118.                 }
  119.                 else if(IR_DATA_INTENAL->Flag_Data>=16&IR_DATA_INTENAL->Flag_Data<24)
  120.                 {
  121.                         IR_DATA_INTENAL->Ir_OrderCode&=(u8)~(1<<IR_DATA_INTENAL->Flag_Data);
  122.                         IR_DATA_INTENAL->Flag_Data++;
  123.                 }
  124.                 else if(IR_DATA_INTENAL->Flag_Data>=24&IR_DATA_INTENAL->Flag_Data<32)
  125.                 {
  126.                         IR_DATA_INTENAL->Ir_OrderCode1&=(u8)~(1<<IR_DATA_INTENAL->Flag_Data);
  127.                         IR_DATA_INTENAL->Flag_Data++;
  128.                        
  129.                
  130.                         if(IR_DATA_INTENAL->Flag_Data==32)
  131.                         {
  132.                                 IR_DATA[6].Flag_ROK=1;
  133.                                 IR_DATA[6].Flag_Data=IR_DATA_INTENAL->Flag_Data;
  134.                                 IR_DATA[6].AdressCode=IR_DATA_INTENAL->AdressCode;
  135.                                 IR_DATA[6].AdressCode1=IR_DATA_INTENAL->AdressCode1;
  136.                                 IR_DATA[6].Ir_OrderCode=IR_DATA_INTENAL->Ir_OrderCode;
  137.                                 IR_DATA[6].Ir_OrderCode1=IR_DATA_INTENAL->Ir_OrderCode1;
  138.                                 IR_DATA[6].RepeatSen=IR_DATA_INTENAL->RepeatSen;
  139.                                 IR_DATA_INTENAL->Flag_Data=0;
  140.                                 IR_DATA_INTENAL->AdressCode = 0;
  141.                                 IR_DATA_INTENAL->AdressCode1 = 0;
  142.                                 IR_DATA_INTENAL->Ir_OrderCode = 0;
  143.                                 IR_DATA_INTENAL->Ir_OrderCode1 = 0;
  144.                                 IR_DATA_INTENAL->RepeatSen = 0;
  145.                         }
  146.                 }
  147.         }
  148.        
  149.         else if(T_val>200&&T_val<240)//高电平
  150.         {
  151.                 if(IR_DATA_INTENAL->Flag_Data<8)
  152.                 {
  153.                        
  154.                         IR_DATA_INTENAL->AdressCode|=(u8)(1<<IR_DATA_INTENAL->Flag_Data);
  155.                         IR_DATA_INTENAL->Flag_Data++;
  156.                 }
  157.                 else if(IR_DATA_INTENAL->Flag_Data>=8&IR_DATA_INTENAL->Flag_Data<16)
  158.                 {
  159.                         IR_DATA_INTENAL->AdressCode1|=(u8)(1<<IR_DATA_INTENAL->Flag_Data);
  160.                         IR_DATA_INTENAL->Flag_Data++;
  161.                 }
  162.                 else if(IR_DATA_INTENAL->Flag_Data>=16&IR_DATA_INTENAL->Flag_Data<24)
  163.                 {
  164.                         IR_DATA_INTENAL->Ir_OrderCode|=(u8)(1<<IR_DATA_INTENAL->Flag_Data);
  165.                         IR_DATA_INTENAL->Flag_Data++;
  166.                 }
  167.                 else if(IR_DATA_INTENAL->Flag_Data>=24&IR_DATA_INTENAL->Flag_Data<32)
  168.                 {
  169.                         IR_DATA_INTENAL->Ir_OrderCode1|=(u8)(1<<IR_DATA_INTENAL->Flag_Data);
  170.                         IR_DATA_INTENAL->Flag_Data++;
  171.                
  172.                         if(IR_DATA_INTENAL->Flag_Data==32)
  173.                         {               
  174.                                 IR_DATA[6].Flag_ROK=1;
  175.                                 IR_DATA[6].Flag_Data=IR_DATA_INTENAL->Flag_Data;
  176.                                 IR_DATA[6].AdressCode=IR_DATA_INTENAL->AdressCode;
  177.                                 IR_DATA[6].AdressCode1=IR_DATA_INTENAL->AdressCode1;
  178.                                 IR_DATA[6].Ir_OrderCode=IR_DATA_INTENAL->Ir_OrderCode;
  179.                                 IR_DATA[6].Ir_OrderCode1=IR_DATA_INTENAL->Ir_OrderCode1;
  180.                                 IR_DATA[6].RepeatSen=IR_DATA_INTENAL->RepeatSen;
  181.                                 IR_DATA_INTENAL->Flag_Data=0;
  182.                                 IR_DATA_INTENAL->AdressCode = 0;
  183.                                 IR_DATA_INTENAL->AdressCode1 = 0;
  184.                                 IR_DATA_INTENAL->Ir_OrderCode = 0;
  185.                                 IR_DATA_INTENAL->Ir_OrderCode1 = 0;
  186.                                 IR_DATA_INTENAL->RepeatSen = 0;                       
  187.                         }
  188.                 }       
  189.                        
  190.         }
  191.         else if(T_val>1000 && T_val<1200)        //11.25ms
  192.         {
  193.           IR_DATA_INTENAL->RepeatSen++;
  194.           if(32==IR_DATA_INTENAL->Flag_Data)
  195.           {

  196.                         IR_DATA[6].Flag_ROK        =1;
  197.                         IR_DATA[6].Flag_Data        =        IR_DATA_INTENAL->Flag_Data;
  198.                         IR_DATA[6].AdressCode        =        IR_DATA_INTENAL->AdressCode;
  199.                         IR_DATA[6].AdressCode1        =        IR_DATA_INTENAL->AdressCode1;
  200.                         IR_DATA[6].Ir_OrderCode=        IR_DATA_INTENAL->Ir_OrderCode;
  201.                         IR_DATA[6].Ir_OrderCode1        =        IR_DATA_INTENAL->Ir_OrderCode1;
  202.                         IR_DATA[6].RepeatSen        =        IR_DATA_INTENAL->RepeatSen;
  203.                         IR_DATA_INTENAL->Flag_Data = 0;
  204.                         IR_DATA_INTENAL->AdressCode = 0;
  205.                         IR_DATA_INTENAL->AdressCode1 = 0;
  206.                         IR_DATA_INTENAL->Ir_OrderCode = 0;
  207.                         IR_DATA_INTENAL->Ir_OrderCode1 = 0;
  208.                         IR_DATA_INTENAL->RepeatSen = 0;
  209.           }
  210.         }
  211.         if((7==IR_DATA_INTENAL->Flag_Data)&&((IR_DATA_INTENAL->AdressCode==0x18)||(IR_DATA_INTENAL->AdressCode==0x05)||(IR_DATA_INTENAL->AdressCode==0x20)))
  212.         {
  213.                 //IR_DATA_INTENAL->Flag_RECEIVE_OK = 1;
  214.                 IR_charge_states_after[number]|=Charge_data_calc(&IR_DATA[number]);
  215.                 IR_charge_states[number]|=IR_charge_states_after[number];
  216.         }
  217. }
  218. //红外充电座数据处理
  219. char Charge_data_calc(IR_OBJ *IR_DATA_INTENAL)
  220. {       
  221.          char temp=0;
  222.          switch(IR_DATA_INTENAL->AdressCode)
  223.         {
  224.                         case 0x18:        //充电座防碰撞保护区域
  225.                         {
  226.                                 temp=IR_Home_close;
  227.                                 break;
  228.                         }
  229.                         case 0x05:        //充电座右方发光区域
  230.                         {
  231.                                 temp=IR_Home_Right;

  232.                                 break;
  233.                         }
  234.                         case 0x20:        //充电座左方发光区域
  235.                         {
  236.                                 temp=IR_Home_Left;
  237.                                 break;
  238.                         }
  239.                         default: break;
  240.         }
  241.         IR_DATA_INTENAL->AdressCode=0; //置零
  242.         IR_DATA_INTENAL->Flag_ROK=0;
  243.         return temp;
  244. }




  245. //顶
  246. void EXTI0_IRQHandler(void)
  247. {
  248.         if(EXTI_GetITStatus(EXTI_Line0))
  249. ……………………

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

所有资料51hei提供下载:
红外解码部分.rar (315.39 KB, 下载次数: 93)


评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:44139 发表于 2018-11-20 13:03 | 只看该作者
好东西 看一看
回复

使用道具 举报

板凳
ID:268784 发表于 2019-9-22 15:48 | 只看该作者
将近2000的查看,回复却只有一个,都是拿来主义
回复

使用道具 举报

地板
ID:46999 发表于 2019-10-10 18:40 | 只看该作者
记号一下,不错
回复

使用道具 举报

5#
ID:128463 发表于 2020-4-6 12:17 | 只看该作者
谢谢分享!!!
回复

使用道具 举报

6#
ID:102688 发表于 2020-4-9 20:57 | 只看该作者
挺有参考意义的资料,感谢分享,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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