标题:
基于stm32的红外解码源程序 大家看不懂可以问我
[打印本页]
作者:
zhu56139902
时间:
2018-1-31 15:48
标题:
基于stm32的红外解码源程序 大家看不懂可以问我
qq1175630462只需要去读取发射部分的对应的码值什么都能解
单片机源程序如下:
#include "ir.h"
#include "LED.h"
#include "usart.h"
#include "control.h"
char IR_charge_states_after[3]={0};
char IR_charge_states[3]={0};
IR_OBJ IR_DATA[7]={0};
//正在接受红外接收的状态
u8 ready_ok=0;
void IR_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//外部中断
static void IR_EXTI_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource4);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1);
EXTI_InitStructure.EXTI_Line=EXTI_Line0|EXTI_Line1|EXTI_Line4;
EXTI_InitStructure.EXTI_LineCmd= ENABLE;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger= EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel= EXTI4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //设置中断优先级
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//顶
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //设置中断优先级
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
//只用到定时器的计数功能故不开启定时器更新中断、不必配置中断优先级。
static void IR_TIM_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructure.TIM_Period=59999;
TIM_TimeBaseStructure.TIM_Prescaler=719;
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// TIM_SetAutoreload(TIM2, 60000);//手动设置ARR
TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE );
TIM_Cmd(TIM2, ENABLE);
}
void IR_Init(void)
{
IR_GPIO_Init();
IR_EXTI_Init();
IR_TIM_Init();
}
//红外解码
static void IR_RECEIVE(IR_OBJ *IR_DATA_INTENAL,char number)
{
int T_val=0;
T_val=(TIM2->CNT>IR_DATA_INTENAL->ITC)?(TIM2->CNT-IR_DATA_INTENAL->ITC):(60000-IR_DATA_INTENAL->ITC+TIM2->CNT);
IR_DATA_INTENAL->ITC=TIM2->CNT;
if(T_val>1300&&T_val<1400&&ready_ok==0)//引导码
{
ready_ok=1;
IR_DATA_INTENAL->Flag_Data=0;
IR_DATA_INTENAL->Flag_ROK=0;//receive ok
IR_DATA_INTENAL->AdressCode=0;
IR_DATA_INTENAL->AdressCode1=0;
IR_DATA_INTENAL->Ir_OrderCode=0;
IR_DATA_INTENAL->Ir_OrderCode1=0;
IR_DATA_INTENAL->RepeatSen=0;
}
else if(T_val>100&&T_val<140)//低电平
{
if(IR_DATA_INTENAL->Flag_Data<8)
{
IR_DATA_INTENAL->AdressCode&=(u8)~(1<<IR_DATA_INTENAL->Flag_Data);
IR_DATA_INTENAL->Flag_Data++;
}
else if(IR_DATA_INTENAL->Flag_Data>=8&IR_DATA_INTENAL->Flag_Data<16)
{
IR_DATA_INTENAL->AdressCode1&=(u8)~(1<<IR_DATA_INTENAL->Flag_Data);
IR_DATA_INTENAL->Flag_Data++;
}
else if(IR_DATA_INTENAL->Flag_Data>=16&IR_DATA_INTENAL->Flag_Data<24)
{
IR_DATA_INTENAL->Ir_OrderCode&=(u8)~(1<<IR_DATA_INTENAL->Flag_Data);
IR_DATA_INTENAL->Flag_Data++;
}
else if(IR_DATA_INTENAL->Flag_Data>=24&IR_DATA_INTENAL->Flag_Data<32)
{
IR_DATA_INTENAL->Ir_OrderCode1&=(u8)~(1<<IR_DATA_INTENAL->Flag_Data);
IR_DATA_INTENAL->Flag_Data++;
if(IR_DATA_INTENAL->Flag_Data==32)
{
IR_DATA[6].Flag_ROK=1;
IR_DATA[6].Flag_Data=IR_DATA_INTENAL->Flag_Data;
IR_DATA[6].AdressCode=IR_DATA_INTENAL->AdressCode;
IR_DATA[6].AdressCode1=IR_DATA_INTENAL->AdressCode1;
IR_DATA[6].Ir_OrderCode=IR_DATA_INTENAL->Ir_OrderCode;
IR_DATA[6].Ir_OrderCode1=IR_DATA_INTENAL->Ir_OrderCode1;
IR_DATA[6].RepeatSen=IR_DATA_INTENAL->RepeatSen;
IR_DATA_INTENAL->Flag_Data=0;
IR_DATA_INTENAL->AdressCode = 0;
IR_DATA_INTENAL->AdressCode1 = 0;
IR_DATA_INTENAL->Ir_OrderCode = 0;
IR_DATA_INTENAL->Ir_OrderCode1 = 0;
IR_DATA_INTENAL->RepeatSen = 0;
}
}
}
else if(T_val>200&&T_val<240)//高电平
{
if(IR_DATA_INTENAL->Flag_Data<8)
{
IR_DATA_INTENAL->AdressCode|=(u8)(1<<IR_DATA_INTENAL->Flag_Data);
IR_DATA_INTENAL->Flag_Data++;
}
else if(IR_DATA_INTENAL->Flag_Data>=8&IR_DATA_INTENAL->Flag_Data<16)
{
IR_DATA_INTENAL->AdressCode1|=(u8)(1<<IR_DATA_INTENAL->Flag_Data);
IR_DATA_INTENAL->Flag_Data++;
}
else if(IR_DATA_INTENAL->Flag_Data>=16&IR_DATA_INTENAL->Flag_Data<24)
{
IR_DATA_INTENAL->Ir_OrderCode|=(u8)(1<<IR_DATA_INTENAL->Flag_Data);
IR_DATA_INTENAL->Flag_Data++;
}
else if(IR_DATA_INTENAL->Flag_Data>=24&IR_DATA_INTENAL->Flag_Data<32)
{
IR_DATA_INTENAL->Ir_OrderCode1|=(u8)(1<<IR_DATA_INTENAL->Flag_Data);
IR_DATA_INTENAL->Flag_Data++;
if(IR_DATA_INTENAL->Flag_Data==32)
{
IR_DATA[6].Flag_ROK=1;
IR_DATA[6].Flag_Data=IR_DATA_INTENAL->Flag_Data;
IR_DATA[6].AdressCode=IR_DATA_INTENAL->AdressCode;
IR_DATA[6].AdressCode1=IR_DATA_INTENAL->AdressCode1;
IR_DATA[6].Ir_OrderCode=IR_DATA_INTENAL->Ir_OrderCode;
IR_DATA[6].Ir_OrderCode1=IR_DATA_INTENAL->Ir_OrderCode1;
IR_DATA[6].RepeatSen=IR_DATA_INTENAL->RepeatSen;
IR_DATA_INTENAL->Flag_Data=0;
IR_DATA_INTENAL->AdressCode = 0;
IR_DATA_INTENAL->AdressCode1 = 0;
IR_DATA_INTENAL->Ir_OrderCode = 0;
IR_DATA_INTENAL->Ir_OrderCode1 = 0;
IR_DATA_INTENAL->RepeatSen = 0;
}
}
}
else if(T_val>1000 && T_val<1200) //11.25ms
{
IR_DATA_INTENAL->RepeatSen++;
if(32==IR_DATA_INTENAL->Flag_Data)
{
IR_DATA[6].Flag_ROK =1;
IR_DATA[6].Flag_Data = IR_DATA_INTENAL->Flag_Data;
IR_DATA[6].AdressCode = IR_DATA_INTENAL->AdressCode;
IR_DATA[6].AdressCode1 = IR_DATA_INTENAL->AdressCode1;
IR_DATA[6].Ir_OrderCode= IR_DATA_INTENAL->Ir_OrderCode;
IR_DATA[6].Ir_OrderCode1 = IR_DATA_INTENAL->Ir_OrderCode1;
IR_DATA[6].RepeatSen = IR_DATA_INTENAL->RepeatSen;
IR_DATA_INTENAL->Flag_Data = 0;
IR_DATA_INTENAL->AdressCode = 0;
IR_DATA_INTENAL->AdressCode1 = 0;
IR_DATA_INTENAL->Ir_OrderCode = 0;
IR_DATA_INTENAL->Ir_OrderCode1 = 0;
IR_DATA_INTENAL->RepeatSen = 0;
}
}
if((7==IR_DATA_INTENAL->Flag_Data)&&((IR_DATA_INTENAL->AdressCode==0x18)||(IR_DATA_INTENAL->AdressCode==0x05)||(IR_DATA_INTENAL->AdressCode==0x20)))
{
//IR_DATA_INTENAL->Flag_RECEIVE_OK = 1;
IR_charge_states_after[number]|=Charge_data_calc(&IR_DATA[number]);
IR_charge_states[number]|=IR_charge_states_after[number];
}
}
//红外充电座数据处理
char Charge_data_calc(IR_OBJ *IR_DATA_INTENAL)
{
char temp=0;
switch(IR_DATA_INTENAL->AdressCode)
{
case 0x18: //充电座防碰撞保护区域
{
temp=IR_Home_close;
break;
}
case 0x05: //充电座右方发光区域
{
temp=IR_Home_Right;
break;
}
case 0x20: //充电座左方发光区域
{
temp=IR_Home_Left;
break;
}
default: break;
}
IR_DATA_INTENAL->AdressCode=0; //置零
IR_DATA_INTENAL->Flag_ROK=0;
return temp;
}
//顶
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0))
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
红外解码部分.rar
(315.39 KB, 下载次数: 94)
2018-2-1 00:38 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
jhsusan2008
时间:
2018-11-20 13:03
好东西 看一看
作者:
hkabcc
时间:
2019-9-22 15:48
将近2000的查看,回复却只有一个,都是拿来主义
作者:
维超
时间:
2019-10-10 18:40
记号一下,不错
作者:
lyseg
时间:
2020-4-6 12:17
谢谢分享!!!
作者:
hominidclint
时间:
2020-4-9 20:57
挺有参考意义的资料,感谢分享,
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1