小白跟做江科大32单片机之对射式红外传感器计次

2024-06-01 23:28

本文主要是介绍小白跟做江科大32单片机之对射式红外传感器计次,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原理部分

1中断示意图,中断会打断主函数的执行,终端执行完成之后再返回主函数继续执行

2.STM32中断

这些灰色的是内核中断

这些白色的是普通中断

3.NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级

4.抢占优先级是表示可以直接插队让CPU执行,相当于急诊

   响应优先级就是看谁的优先级高,等待CPU执行完当前任务之后就立马执行优先级最高的,相当于平时较重的疾病

5.EXTI框图,最终有两个选择,第1个表示事件响应:触发别的外设操作。第2个表示中断:引脚电平触发中断

6.主要看此结构,打通一条GPIO到NVIC的中断通路就可以使用中断

7.旋转编码器电路图


实验过程

1.按照江科大老师给的电路链接图进行连接

2.在hardware中新建sensor.c和sensor.h文件夹

3.sensor.h代码如下

#ifndef _SENSOR__H
#define _SENSOR__H

void SENSOR_Init(void);
uint16_t turn(void);


#endif
 

4.sensor.c代码如下

#include "stm32f10x.h" 

uint16_t CountSensor_Count;

void SENSOR_Init(void)
{
    //使用各个外设前必须开启时钟,否则对外设的操作无效
    //中断只需开始B口和AFIO即可,EXTI和NVIC无需开启时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);    //开启GPIOB的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);    //开启AFIO的时钟
    
    
    /*GPIO初始化*/
    GPIO_InitTypeDef GPIO_InitStructure;                    //定义结构体变量
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;        //GPIO模式,赋值为上拉输出模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;    //GPIO引脚,赋值为第1,2号引脚
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //GPIO速度,赋值为50MHz
    
    GPIO_Init(GPIOB, &GPIO_InitStructure);                    //将赋值后的构体变量传递给GPIO_Init函数
                                                            //函数内部会自动根据结构体的参数配置相应寄存器
                                                            //实现GPIOB的初始化
    /*AFIO选择中断引脚*/
    //将外部中断的14号线映射到GPIOB,即选择PB14为外部中断引脚
    //AFIO这个函数在GPIO那个里面
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);
    
    
    
    /*EXTI初始化*/
    //这个在library中找一下
    EXTI_InitTypeDef EXTI_InitStruct;
    EXTI_InitStruct.EXTI_Line=EXTI_Line14;              //选择哪个口
    EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;      //中断
    EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;   //这个需要搜索一下EXTI_Trigger,现在是上升沿触发
    EXTI_InitStruct.EXTI_LineCmd=ENABLE;                //中断打开
    EXTI_Init(&EXTI_InitStruct);
    
    //NVIC在初始化之前需要指定中断优先级分组
    /*NVIC中断分组*/
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    /*NVIC初始化*/
    NVIC_InitTypeDef NVIC_InitStruct;
    NVIC_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn;       //选择配置NVIC的EXTI15_10线,因为那个14号线过来的在10-15以内
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;  //这个是自己给的,值越低优先级越高
    NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
    NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; 
    NVIC_Init(&NVIC_InitStruct);
}

uint16_t turn(void)
{
    return CountSensor_Count;
}

//中断函数不需要声明,但一定是这个函数名
void EXTI15_10_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line14)==SET)      //判断是否是外部中断14号线触发的中断
    {
        if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) == 0)
        {
            CountSensor_Count ++;                    //计数值自增一次
        }
        EXTI_ClearITPendingBit(EXTI_Line14);        //清除外部中断14号线的中断标志位
                                                    //中断标志位必须清除
                                                    //否则中断将连续不断地触发,导致主程序卡死
    }
}

最后中断函数的设置参考这个,红色的一般用于主函数中,蓝色的一般用于sensor中

5.main.c代码如下:

#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "sensor.h"

int main()
{
  OLED_Init();
    SENSOR_Init();
    OLED_ShowString(1, 2, "RED_LED:");
    while (1)
    {
        OLED_ShowNum(2, 2, turn(), 5);
    }
}
6.实验结果

注意

ctrl+alt+空格可以出现代码提示

这篇关于小白跟做江科大32单片机之对射式红外传感器计次的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1022392

相关文章

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

基于stm32的河流检测系统-单片机毕业设计

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品

『功能项目』更换URP场景【32】

上一章已经将项目从普通管线升级到了URP管线 现在我们打开上一篇31项目优化 - 默认管线转URP的项目, 进入战斗场景 将Land的子级全部隐藏 将新的URP场景预制体拖拽至Land子级 对场景预制体完全解压缩 将Terrain拖拽至Land的直接子级 将Terrain设置为Land 与 静态Static 清除烘培 重新烘培 修改脚本:LoadRe

VB和51单片机串口通信讲解(只针对VB部分)

标记:该篇文章全部搬自如下网址:http://www.crystalradio.cn/thread-321839-1-1.html,谢谢啦            里面关于中文接收的部分,大家可以好好学习下,题主也在研究中................... Commport;设置或返回串口号。 SettingS:以字符串的形式设置或返回串口通信参数。 Portopen:设置或返回串口

作为刚从事Java开发的小白,需要掌握哪些技能

作为一个刚踏入Java开发世界的小白,面对各种技术和工具,你可能会觉得有点不知所措。但是别担心,我会给你一个简单清晰的路线图,让你可以有条不紊地掌握基本技能,逐步成长为一名Java开发者。 1. 扎实的Java基础 Java的基础是你迈向高级开发的重要基石,建议从以下几个方面着手: 语法和基础概念:比如变量、条件语句、循环、方法、数组、面向对象编程(OOP)等等。这些基础如同建房子的地基,越

MCU5.51单片机的最小系统

1.最小系统的组成部分 晶振电路(时钟),复位电路,电源电路(控制电压,保持稳定),下载电路(外加的,用于烧录程序) 烧录: 通过下载电路,把程序下载到单片机中用于运行 2.晶振电路 电路图: 是晶振 是电容 为了防止晶振起振时产生影响,因此加电容 3.复位电路 电路图: 按按钮RSTK1(保持一段时间的高电平)即可实现STC芯片的复位 4.电源电路 电路图:

单片机XTAL引脚引出的晶振分析

51单片机的18,19脚XTAL1,XTAL2用来提供外部振荡源给片内的时钟电路。 XTAL1和XTAL2引脚,该单片机可以使用外部时钟也可以使用内部时钟。 当使用内部时钟时,此二引线端用于外接石英晶体和微调电容; 当使用外部时钟时,用于接外部时钟信号,NMOS接XTAL2,CMOS接XTAL1。 原理: XTAL1和XTAL2分别是一个反相器的输入和输出。NMOS的反相器是

leetcode#32. Longest Valid Parentheses

题目 Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring. For "(()", the longest valid parentheses substring is "()", wh

关于武汉高芯coin417G2红外机芯的二次开发

文章目录 前言一、外观和机芯参数二、SDK的使用1、打开相机2、回调函数中获取全局温度和图像3、关闭相机 前言 最近工作中接触了一款基于武汉高芯科技有限公司开发的红外模组,即coin417g2(测温型)+9.1mm镜头.使用此模组,开发了一套红外热成像检测桌面应用程序.下面简单记录下该模组的使用. 一、外观和机芯参数 如下是该机芯的外观和机芯参数: 二、SDK