【stm32-3】对射式红外传感器计次旋转编码器计数

devtools/2024/9/23 7:32:34/

1.对射式红外传感器计次 

void EXTI_DeInit(void);        //把EXTI配置都清除,恢复到上电默认状态
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct//指向EXTI_InitTypeDef结构体的指针,其中包含了EXTI外设的基本信息);        //初始化
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);        //
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);        //软件触发外部中断
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);
void EXTI_ClearFlag(uint32_t EXTI_Line);
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);        //获取中断标志位是否被置1
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);        //清除中断标志位

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);        //配置优先级分组:抢占优先级和响应优先级
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct//指向NVIC_InitTypeDef结构体的指针,该设备中含有NVIC外设的信息);        //根据NVIC_InitStruct中指定的参数初始化NVIC外设

(1)main.c

#include "Device/Include/stm32f10x.h"   // Device header
#include "Delay.h"
#include "OLED.h"
#include "countsensor.h"
int main(void)
{OLED_Init();countsensor_Init();OLED_ShowString(1,1,"Count:");while(1){OLED_ShowNum(1,7,countsensor_Get(),5);}
}

(2)countsensor.c

#include "Device/Include/stm32f10x.h"   // Device header
uint16_t countsensor_count;
void countsensor_Init()
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_InitTypeDef GPIO_Initstructure;GPIO_Initstructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_Initstructure.GPIO_Pin=GPIO_Pin_14;GPIO_Initstructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_Initstructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);//AFIO:选择要用做外部中断线源的GPIO端口:指定要配置的外部中断线EXTI_InitTypeDef EXTI_Initstructure;EXTI_Initstructure.EXTI_Line=EXTI_Line14;EXTI_Initstructure.EXTI_LineCmd=ENABLE;EXTI_Initstructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_Initstructure.EXTI_Trigger=EXTI_Trigger_Falling;	//下降沿触发EXTI_Init(&EXTI_Initstructure);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_Initstructure;NVIC_Initstructure.NVIC_IRQChannel=EXTI15_10_IRQn;NVIC_Initstructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_Initstructure.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_Initstructure);}
uint16_t countsensor_Get(void)
{return countsensor_count;
}
void EXTI15_10_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line14)==SET)	//用于判断在该中断函数上的中断是否发生,若发生,标志位置1.{countsensor_count++;EXTI_ClearITPendingBit(EXTI_Line14);	//清除中断标志位,防止单片机检测到中断标志,重复进入中断}
}

 (3)countsensor.h

#ifndef __COUNT_SENSOR_H
#define __COUNT_SENSOR_Hvoid countsensor_Init(void);
uint16_t countsensor_Get(void);
//中断函数不需要调用,自动执行
#endif

 2.旋转编码器计数

(1)main.c

#include "Device/Include/stm32f10x.h"   // Device header
#include "Delay.h"
#include "OLED.h"
#include "encoder.h"
int16_t Num;
int main(void)
{OLED_Init();encode_Init();OLED_ShowString(1,1,"Num:");while(1){Num+=encoder_Get();OLED_ShowSignedNum(1,5,Num,5);}
}

(2)encoder.c

#include "Device/Include/stm32f10x.h"   // Device header
int16_t encodercount;
void encode_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_InitTypeDef GPIO_Initstructure;GPIO_Initstructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_Initstructure.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1;GPIO_Initstructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_Initstructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);	//函数不能|,|后是两个数操作之后的值GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);//AFIO:选择要用做外部中断线源的GPIO端口:指定要配置的外部中断线EXTI_InitTypeDef EXTI_Initstructure;EXTI_Initstructure.EXTI_Line=EXTI_Line0|EXTI_Line1;EXTI_Initstructure.EXTI_LineCmd=ENABLE;EXTI_Initstructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_Initstructure.EXTI_Trigger=EXTI_Trigger_Falling;	//下降沿触发EXTI_Init(&EXTI_Initstructure);//指向EXTI_InitTypeDef结构体的指针,其中包含了EXTI外设的基本信息   初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_Initstructure;NVIC_Initstructure.NVIC_IRQChannel=EXTI0_IRQn;NVIC_Initstructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_Initstructure.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_Initstructure);//指向NVIC_InitTypeDef结构体的指针,该设备中含有NVIC外设的信息//根据NVIC_InitStruct中指定的参数初始化NVIC外设NVIC_Initstructure.NVIC_IRQChannel=EXTI1_IRQn;NVIC_Initstructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority=2;NVIC_Initstructure.NVIC_IRQChannelSubPriority=2;NVIC_Init(&NVIC_Initstructure);}
int16_t encoder_Get(void)
{int16_t temp;temp=encodercount;encodercount=0;return temp;
}
void EXTI0_IRQHandler(void)		//????????????
{if(EXTI_GetITStatus(EXTI_Line0)==SET)	//用于判断在该中断函数上的中断是否发生,若发生,标志位置1.{if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0){encodercount--;}EXTI_ClearITPendingBit(EXTI_Line0);	//清除中断标志位}
}
void EXTI1_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line1)==SET)	//中断标志位置1(SET),程序会跳到中断函数{if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0){encodercount++;}EXTI_ClearITPendingBit(EXTI_Line1);	//清除中断标志位}
}

(3)encoder.h

#ifndef __ENCODER_H
#define __ENCODER_Hvoid encode_Init(void);
int16_t encoder_Get(void);#endif


http://www.ppmy.cn/devtools/35270.html

相关文章

毕业设计:《基于 Prometheus 和 ELK 的基础平台监控系统设计与实现》

前言 《基于 Prometheus 和 ELK 的基础平台监控系统设计与实现》,这是我在本科阶段的毕业设计,通过引入 Prometheus 和 ELK 架构实现企业对指标与日志的全方位监控。并且基于云原生,使用容器化持续集成部署的开发方式,通过 Sprin…

基于springboot+vue+Mysql的在线动漫信息平台

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

数组操作push、pop、shift、unshift操作

这四个都是用来操作数组的,用于插入和删除元素 成对来说 push、pop都是从数组尾部操作(你看p开头的,就记住屁股就行了),分别是插入和弹出 let array [1,2,3,4,5,6] array.push(7) // 7 array // [1,2,3,4,5,6,7]push操作,数组从尾部插入,返回插入后数组的个数,改变了原数组…

数据库的乐观锁和悲观锁是什么?怎么实现的?

数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技…

conda换源和pip换源

最近在anaconda虚拟环境里时,pip下载实在过慢,忍不住怀疑换源到底成功了没,最后发现conda和pip的换源不是一个东西 conda的换源网上教程很多了,我在这里就不提了,随便找个赞数高的教程参考即可。但是,cond…

PHP源码_众筹商城

众筹商城源码 众筹商品平台 商城加共识元富之路 网上商城众筹 前端是编译后的,后端PHP,带商城 运行截图 源码贡献 https://githubs.xyz/boot?app39 部分数据库表 CREATE TABLE ti_shopro_store (id int(11) NOT NULL AUTO_INCREMENT COMMENT ID,nam…

保研面试408复习 3——操作系统

文章目录 1、操作系统一、进程有哪几种状态,状态之间的转换、二、调度策略a.处理机调度分为三级:b.调度算法 标记文字记忆,加粗文字注意,普通文字理解。 为什么越写越少? 问就是在打瓦。(bushi) 1、操作系统 一、进程…

【CLion】clion无法加载或找不到cmakekists文件

一、问题表象 最近工作中,在git pull远程仓库最新版本程序后,平时打开CLion自动加载的工程CMakeLists文件突然失效(显示找不到可编译的文件),无法debug程序。 二、原因分析 基于平时的编码经验和之前git pull也出现…