基于STM32F103的红外遥控小车

2023-05-16

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

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

话不多说,先上干货。

#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(); )自己写不出来,对于像我一样初学者,更需要的是理解这种逻辑,每一个句子是什么意思,所谓水到渠成可能就是这种意思。希望我的分享对大家有用。

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

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

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于STM32F103的红外遥控小车 的相关文章

随机推荐

  • 使用evo测试aruco_detect精度

    使用evo测试aruco detect精度 一 实验目的二 实验设备三 实验步骤四 实验结果五 实验结论六 结论分析 一 实验目的 测试aruco detect的精确度 xff1b 分析影响aruco slam精准度的主要因素 二 实验设备
  • 3. LaTeX图片的排版、引用与格式

    3 LaTeX图片的排版 引用与格式 1 LaTeX 图片排版方式 在 LaTex 排版的论文写作中 xff0c LaTex 的所有宏包文件都要写在 documentclass 命令之后和 begin document 之前 在本文中 xf
  • 一个七年Java女程序员的年终总结,写给过去一年的自己

    简单先说一下 xff0c 坐标杭州 xff0c 14届本科毕业 xff0c 算上年前在阿里巴巴B2B事业部的面试 xff0c 一共有面试了有6家公司 xff08 因为不想请假 xff0c 因此只是每个晚上去其他公司面试 xff0c 所以面试
  • 嵌入式Linux下tca9548的使用以及测传感器实例。

    tca9548为IIC拓展板 xff0c 主要应用在多个同种传感器的测量环境中 保证在传感器出厂地址相同的情况下也能通过传感器进行测量 下面开始说一下整个的使用步骤 首先必须保证开发板内核有IIC驱动程序 xff1b 如果开发板内核中没有驱
  • ssh远程连接报错

    1 ssh远程连接报错 ssh远程连接报错 root 64 101 34 177 174 Permission denied publickey gssapi keyex gssapi with mic ssh远程连接报错 Permissi
  • 作为一名Web前端开发人员和设计师,2018告诉你如何正确的学习前端

    第一步 掌握HTML CSS 这是你最初必须 掌握的是网站的构建元素没得选 随着你前端的学习进程 熟练掌握HTML CSS简单易学这里还是要推荐下小编的web前端学习群 606加721加798 xff0c 不管你是小白还是大牛 xff0c
  • OpenCV error: ‘CV_BGR2GRAY’ was not declared in this scope错误

    本人在学习OpenCV时按照书上的代码敲 xff1a cvtColor srcImage grayImage COLOR BGR2GRAY 这里遇到报错 xff1a error CV BGR2GRAY was not declared in
  • px4源码编译之 建立自己的程序模块

    前言 xff1a 在网上找了一大圈 xff0c 如何在px4源码examples中添加自己的程序 xff0c 包括官网那个都没有用 xff0c 后来发现需要在对应的编译位置对cmake文件进行修改 xff0c 具体如下 xff1a 1 在你
  • 关于在Gazebo中给无人机添加相机(摄像头)之后,无人机无法起飞

    其实主要内容还是参考别人的博客 xff0c 修改或新增相应模型文件和launch文件 xff0c 通过mavros启动之后 xff0c 不管是用commander takeoff还是递地面站都无法使无人机起飞 xff0c 同时地面站报告没有
  • 【ubuntu系统下装win10双系统】

    ubuntu系统下装win10双系统个人经验分享 xff08 1 xff09 前期准备 xff1a 建议准备两个空u盘 xff08 更方便 xff09 xff0c 或者一个空u盘也是可以的 xff0c 提前格式化好即可 然后准备下载必要的文
  • PyQT在ui界面新建Label控件

    PyQT通过自定义外部函数 xff0c 在ui界面新建Label控件 写在前面的废话 xff1a 如果你想要在ui界面创建一个Label xff08 或者其他控件 xff09 xff0c 最快捷的当属在QTdesigner里找到你需要的控件
  • ubuntu克隆ue4源码

    ubuntu克隆ue4源码 1 进入ue官网 xff0c 登陆自己账号 xff0c 进入个人账户界面 xff0c 点击连接 xff0c 账户 xff0c 关联github Epic Games 2 之后按照操作进行 xff0c 关联自己的g
  • Windows环境跑通清华开源通用时间序列分析模型TimesNet

    1 需要按照给定配置准备python3 8环境与相关依赖包 xff0c 全程在windows环境下进行 2 github thuml Time Series Library A Library for Advanced Deep Time
  • 嵌入式工程师职业生涯该怎样规划

    嵌入式工程师分布在各行各业 xff0c 包括消费电子 工业电子 汽车电子和军用电子等 从功能上面看 xff0c 嵌入式本身包括了51 mcu soc soc 43 baseband等很多形式 从开发的结构上看 xff0c 有些同学专注于底层
  • 使用ros实现c++与python通信

    创建工作空间 选择在桌面创建 cd mkdir p my workspace src 编译工作空间 cd my workspace catkin make source一下新生成的setup bash文件 xff1a source deve
  • C++输出系统时间

    编译软件 xff1a dev5 4 0 程序功能 xff1a 输出系统时间 xff0c 输出格式 2018 08 10 15 14 40 方法 xff1a 使用time t获取系统时间 xff0c 再使用strftime 函数对日期和时间进
  • 该博客已搬家至 博客园

    由于CSDN不支持metaweblog xff0c 该博客今日起停止更新 所有内容移至博客园 我的博客园博客地址 xff1a 戳我 https www cnblogs com wittxie CSDN写文章真的难受 xff0c 具体原因你们
  • Kernel Based Progressive Distillation for Adder Neural Networks:基于核的渐进式蒸馏的加法神经网络

    2020 NeurIPS AdderNet基于核的渐进式的蒸馏加法神经网络 一 简介二 问题解决2 1问题提出2 2初步解决方案2 3具体分析2 4问题解决 用核方法来解决这个问题2 5渐进式学习 三 实验结果分析3 1基于MNIST数据集
  • 人脸识别 灰度化

    人脸识别 灰度化 欢迎使用Markdown编辑器 你好 xff01 这是你第一次使用 Markdown编辑器 所展示的欢迎页 如果你想学习如何使用Markdown编辑器 可以仔细阅读这篇文章 xff0c 了解一下Markdown的基本语法知
  • 基于STM32F103的红外遥控小车

    本人小白一个 xff0c 利用空闲时间 xff0c 做了一些小东西 xff0c 跟大家分享一下自己的代码 如有不对的地方 xff0c 还请各位前辈指正 话不多说 xff0c 先上干货 include 34 remote h 34 inclu