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
|