基于STM32F103的红外遥控小车

本人小白一个,利用空闲时间,做了一些小东西,跟大家分享一下自己的代码。

如有不对的地方,还请各位前辈指正。

话不多说,先上干货。

#include "remote.h"
#include "stm32f10x.h"
#include "delay.h" 
#include "usart.h" //ºìÍâÒ£¿Ø³õʼ»¯
//³õʼ»¯IO¿ÚÅäÖÃÒÔ¼°¶¨Ê±Æ÷5ÊäÈ벶»ñ
void Remote_Init(void)       
    {   
      
 GPIO_InitTypeDef GPIO_InitStructure;  
        NVIC_InitTypeDef NVIC_InitStructure;  
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;  
        TIM_ICInitTypeDef  TIM_ICInitStructure;      
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //?? PORTB ??  
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE); //TIM5 
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;           //PA1 ??    
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;   //????   
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
        GPIO_Init(GPIOA, &GPIO_InitStructure); 
        GPIO_SetBits(GPIOA,GPIO_Pin_1); //??? GPIOA1          
        TIM_TimeBaseStructure.TIM_Period = 10000; //?????????? ?? 10ms ??  
        TIM_TimeBaseStructure.TIM_Prescaler =(72-1); //???? 1M ?????,1us ? 1.  
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //?????? 
        TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //?????????? TIMx 
 
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;  // IC2 ??? TI5 ?   
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //?????   
        TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;   
        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;  //??????,???   
        TIM_ICInitStructure.TIM_ICFilter = 0x03; //IC4F=0011 ??????? 8 ??????????   
        TIM_ICInit(TIM5, &TIM_ICInitStructure);//???????????? 
 
     
        NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;  //TIM5 ?? 
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  //????? 0 ? 
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //???? 3 ? 
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ ????? 
        NVIC_Init(&NVIC_InitStructure);  //????? NVIC ???  
        
            TIM_Cmd(TIM5,ENABLE );  //????? 5    
                TIM_ITConfig( TIM5,TIM_IT_Update|TIM_IT_CC2,ENABLE); //ÔÊÐí¸üÐÂÖжϣ¬,ÔÊÐíCC2IE²¶»ñÖжÏ
            
        }
    u8  RmtSta=0;     
                u16 Dval;  //ϽµÑØʱ¼ÆÊýÆ÷µÄÖµ
                u32 RmtRec=0; //ºìÍâÒ£¿Ø½ÓÊÕµ½µÄÊý¾Ý      
                u8  RmtCnt=0; //°´¼ü°´ÏµĴÎÊý  
                void TIM5_IRQHandler(void) 
                    {           
                        if(TIM_GetITStatus(TIM5,TIM_IT_Update)!=RESET)  
                            {  
                                if(RmtSta&0x80)//??????????  
                                {     RmtSta&=~0X10;  //????????????    
                                    if((RmtSta&0X0F)==0X00)RmtSta|=1<<6; //?????????????????  
                                    if((RmtSta&0X0F)<14)RmtSta++;  
                                    else  
                                        {    
                                        RmtSta&=~(1<<7);//??????    
                                        RmtSta&=0XF0; //?????   
                                        }            
                              }           
                          }   
                            if(TIM_GetITStatus(TIM5,TIM_IT_CC2)!=RESET) 
                                {      if(RDATA)//?????  
                                    { 
 
                        TIM_OC2PolarityConfig(TIM5,TIM_ICPolarity_Falling); //?????    
                                        TIM_SetCounter(TIM5,0);     //??????  
                                        RmtSta|=0X10;      
                                    }
                                        else //?????   
                                            {        
                                                Dval=TIM_GetCapture2(TIM5);//?? CCR1 ???? CC1IF ??? 
         TIM_OC2PolarityConfig(TIM5,TIM_ICPolarity_Rising); //ÉÏÉýÑز¶»ñ
                                                
                                                      if(RmtSta&0X10)     //?????????  
                                                                {     
                                                                    if(RmtSta&0X80)//???????    
                                                                        {         
                                                                            if(Dval>300&&Dval<800)   //560 ????,560us  
                                                                                {       RmtRec<<=1; //????.    
                                                                                    RmtRec|=0; //??? 0     
                                                                                }
                                                                            else if(Dval>1400&&Dval<1800) //1680 ????,1680us  
                                                                                {      
                                                                                    RmtRec<<=1; //????.     
                                                                                    RmtRec|=1; //??? 1   
                                                                                }
                                                                    else if(Dval>2200&&Dval<2600)  //??????????? 2500 ???? 2.5ms   
                                                                        {       RmtCnt++;   //?????? 1 ?    
                                                                                    RmtSta&=0XF0; //?????   
                                                                        }  
                                                                        
                                                                }
                                                                        else if(Dval>4200&&Dval<4700)  //4500 ???? 4.5ms  
                                                                {   
                                                                    RmtSta|=1<<7; //???????????    
                                                                    RmtCnt=0;  //?????????   
                                                                }         
  }   
        RmtSta&=~(1<<4); 
                    
        }       
    }  
    TIM_ClearFlag(TIM5,TIM_IT_Update|TIM_IT_CC2);  
    } 
        u8 Remote_Scan(void)
        {         
            u8 sta=0;        
            u8 t1,t2;    
            if(RmtSta&(1<<6))//???????????? 
                {  
                    
                    
                     t1=RmtRec>>24;   //?????   
                    t2=(RmtRec>>16)&0xff; //??????   
                    if((t1==(u8)~t2)&&t1==REMOTE_ID)//???????(ID)???   
                        {       
                            t1=RmtRec>>8;     
                            t2=RmtRec;     
                            if(t1==(u8)~t2)sta=t1;//????   
                            }    
                        if((sta==0)||((RmtSta&0X80)==0))//??????/????????? 
                            {    
                                RmtSta&=~(1<<6);//
                                RmtCnt=0;  //
                                } 
            }      
        return sta; 
            }


        remote.h

#ifndef __RED_H 
#define __RED_H 
#include "sys.h"   
#define RDATA PAin(1)//红外数据输入引脚
#define REMOTE_ID 0   //选用遥控器识别码为0.
extern u8 RmtCnt; 
void Remote_Init(void); //功能引脚初始化
u8 Remote_Scan(void);     //定义功能函数


#endif 

对于红外遥控,stm32手册里讲的很清楚了,就是利用stm32附带的遥控器输出信号,然后板子上的接收端接收信号。解码函数可以直接COPY手册里的函数,(这是完全配套的,引脚都不用改动),唯一需要更改的就是在main.c函数中的switch{}中不同case后所对应的执行操作。对于红外接收解码函数、以及反码等,以我的愚见,粗略读一下就行,最重要的是应用。我觉得,不能畏惧这些函数(比如Remote_Scan(); )自己写不出来,对于像我一样初学者,更需要的是理解这种逻辑,每一个句子是什么意思,所谓水到渠成可能就是这种意思。希望我的分享对大家有用。

我曾许下十年,只为最美的遇见。

我是西伯利亚蟑螂,我们下次再见。

猜你喜欢

转载自blog.csdn.net/qq_41821562/article/details/82116032
今日推荐