小白跟做江科大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单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

墨刀原型工具-小白入门篇

墨刀原型工具-小白入门篇 简介 随着互联网的发展和用户体验的重要性越来越受到重视,原型设计逐渐成为了产品设计中的重要环节。墨刀作为一款原型设计工具,以其简洁、易用的特点,受到了很多设计师的喜爱。本文将介绍墨刀原型工具的基本使用方法,以帮助小白快速上手。 第一章:认识墨刀原型工具 1.1 什么是墨刀原型工具 墨刀是一款基于Web的原型设计工具,可以帮助设计师快速创建交互原型,并且可以与团队

Java面试八股之怎么通过Java程序判断JVM是32位还是64位

怎么通过Java程序判断JVM是32位还是64位 可以通过Java程序内部检查系统属性来判断当前运行的JVM是32位还是64位。以下是一个简单的方法: public class JvmBitCheck {public static void main(String[] args) {String arch = System.getProperty("os.arch");String dataM

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

雨量传感器的分类和选型建议

物理原理分类 机械降雨量计(雨量桶):最早使用的降雨量传感器,通过漏斗收集雨水并记录。主要用于长期降雨统计,故障率较低。电容式降雨量传感器:基于两个电极之间的电容变化来计算降雨量。当降雨时,水滴堵住电极空间,改变电容值,从而计算降雨量。超声波式降雨量传感器:利用超声波的反射来计算降雨量。适用于大降雨量的场合。激光雷达式降雨量传感器:利用激光技术测量雨滴的速度、大小和形状等参数,并计算降雨量。主

IPython小白教程:提升你的Python交互式编程技巧,通俗易懂!

IPython是一个增强的Python交互式shell,它提供了丰富的功能和便捷的交互方式,使得Python开发和数据分析工作更加高效。本文将详细介绍IPython的基本概念、使用方法、主要作用以及注意事项。 一、IPython简介 1. IPython的起源 IPython由Fernando Pérez于2001年创建,旨在提供一个更高效的Python交互式编程环境。 2. IPyt

STM32单片机PWR电源控制详解

文章目录 1. PWR概述 2. 电源结构框图 3. 上电复位和掉电复位 4. 可编程电压监测器 5. 低功耗模式 6. 模式选择 6.1 睡眠模式 6.2 停止模式 6.3 待机模式 7. 代码示例 1. PWR概述 PWR(Power Control)电源控制,负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能。 可编程电压监测器

博通5720 windows server 2003 32位网卡驱动和系统

driver for DELL R320 Broadcom 5720 Windows 2003 32bit 本人安装windows server 2003 网卡驱动成功!! 提供方便网盘下载地址博通5720网卡驱动 : http://pan.baidu.com/s/1GQWpw  windows server 2003 ghost 系统: http://pan

【单片机毕业设计选题24024】-房间自动除湿控制系统

系统功能: 系统分为手动和自动模式,上电默认为自动模式。自动模式下如果获取到湿度 值大于设定的湿度值则自动打开风扇,手动模式下手动开关风扇。 系统上电后显示“欢迎使用除湿控制系统请稍后”,两秒钟后进入主页面显示。 第一行显示系统模式,手动或自动模式 第二行显示获取到的温湿度 第三行显示设置的湿度阈值 第四行显示风扇状态和系统报警状态,风扇状态有开关状态,系统状态和OK和 NG状态。

基于51单片机抽奖系统

基于51单片机抽奖系统 (仿真+程序) 功能介绍 具体功能: 1.利用5片74HC495对单片机的IO进行串并转换,进而控制5个1位数码管; 2.采用一个独立按键用于抽奖系统的启停控制; 3.8位拨码开关是用于设定随机数发生器的“种子值”(初始值); ​演示视频: 基于51单片机抽奖系统  添加图片注释,不超过 140 字(可选) 程序 #inclu