GPIO的使用--滴答定时器--pir人体红外传感器

目录

一、滴答定时器的使用与原理

1、定义

2、原理

(1)向上计数​编辑

(2)向下计数

[(3) 代码流程](#(3) 代码流程)

a、配置滴答时钟唤醒频率

b、滴答时钟中断函数

(4)结果

3、优化-->寄存器协助模式

代码

二、pir传感器的使用

1、介绍

2、接法

3、接线​编辑

4、代码

main.c

pir.c

pir.h

5、运行结果


一、滴答定时器的使用与原理

1、定义

滴答定时器,又称系统定时器。它应用系统时钟拉计算时间,因此常用作为计时 工具来使用,也可以实现固定时间去做一件简单的事情。

2、原理

(1)向上计数

(2)向下计数

(3) 代码流程

a、配置滴答时钟唤醒频率
cpp 复制代码
SysTick_Config(SystemCoreClock/100);//每0.01s调用中断
b、滴答时钟中断函数
cpp 复制代码
void SysTick_Handler(void)//滴答中断调用
{
		static uint32_t i=0;
		i++;
		if(i==100)//1s
		{
			
		 PFout(9)=0;
		 PFout(10)=1;
		 PFout(12)=1;		
		}
		if(i==200)
		{
		 PFout(9)=1;
		 PFout(10)=0;
		 PFout(12)=1;	
		}
		if(i==300)
		{
		 i=0;
		 PFout(9)=1;
		 PFout(10)=1;
		 PFout(12)=0;	
		}
		
	}

(4)结果

main函数中写有一个空while循环,循环不结束,SysTick_Config会一直调用中断函数,使得三个灯一直交替闪烁。

3、优化-->寄存器协助模式

原理如图

代码

delay.c

cpp 复制代码
#include "stm32f4xx.h"  

void delay_ms(uint32_t ms)
{
	while(ms--)
		{
	SysTick->CTRL=0;//使其工作
	SysTick->LOAD=(SystemCoreClock/1000);//一毫秒
	SysTick->VAL=0;//清空
	SysTick->CTRL=5;//让内部时钟开始干活
	while((SysTick->CTRL & 0x00010000)==0);
	SysTick->CTRL=0;
		}
}
 

delay.h

cpp 复制代码
#include "stm32f4xx.h"                  // Device header

void delay_ms(uint32_t ms);

main.c

cpp 复制代码
#include "stm32f4xx.h"                  // Device header
#include "led.h"
#include "key.h"
#include "BitBand.h"
#include "delay.h"
#include <stdio.h>

int main()
{
	Led_Init();	
    while(1)
    {
        PFout(9)=0;
		 PFout(10)=1;
		 PFout(12)=1;	
		delay_ms(1000);
		
		PFout(9)=1;
		 PFout(10)=0;
		 PFout(12)=1;	
		delay_ms(1000);
		
		 PFout(9)=1;
		 PFout(10)=1;
		 PFout(12)=0;	
		delay_ms(1000);
    }
}

二、pir传感器的使用

1、介绍

热释电红外线传感器是利用红外线来进行数据处理的一种传感器。主要是由一种高热电系数的材料,如锆钛酸铅系陶瓷、钽酸锂、硫酸三甘钛等制成尺寸为2*1mm的探测元件。

人体都有恒定的体温,一般在37度,所以会发出特定波长10UM左右的红外线,被动式红外探头就是靠探测人体发射的10UM左右的红外线而进行工作的。人体发射的10UM左右的红外线通过菲泥尔滤光片增强后聚集到红外感应源上。红外感应源通常采用热释电元件,这种元件在接收到人体红外辐射温度发生变化时就会失去电荷平衡,向外释放电荷,后续电路经检测处理后就能产生报警信号。

2、接法

3、接线

4、代码

main.c

cpp 复制代码
#include "stm32f4xx.h"                  // Device header
#include "led.h"
#include "key.h"
#include "BitBand.h"
#include "pir.h"

int main()
{
	Led_Init();
	Pir_Init();
	uint32_t key=0;
	//传感器测试
	while(1)
	{
		key=PFin(14);
		if(key==1)//有人
		{
			PFout(12)=0;
		}
		else//否则周边没有人
		{
			PFout(12)=1;
		}
	}
}

pir.c

cpp 复制代码
#include "stm32f4xx.h"                  // Device header


void Pir_Init()
{
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
	
	GPIO_InitTypeDef gpio_init;
	
	gpio_init.GPIO_Mode=GPIO_Mode_IN;
//	gpio_init.GPIO_OType=GPIO_OType_OD;
	gpio_init.GPIO_Pin=GPIO_Pin_14;
	gpio_init.GPIO_PuPd=GPIO_PuPd_DOWN;//默认为低电平
	gpio_init.GPIO_Speed=GPIO_High_Speed;
	
	GPIO_Init(GPIOF,&gpio_init);
}

pir.h

cpp 复制代码
#include "stm32f4xx.h"                  // Device header


void Pir_Init()
{
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
	
	GPIO_InitTypeDef gpio_init;
	
	gpio_init.GPIO_Mode=GPIO_Mode_IN;
//	gpio_init.GPIO_OType=GPIO_OType_OD;
	gpio_init.GPIO_Pin=GPIO_Pin_14;
	gpio_init.GPIO_PuPd=GPIO_PuPd_DOWN;//默认为低电平
	gpio_init.GPIO_Speed=GPIO_High_Speed;
	
	GPIO_Init(GPIOF,&gpio_init);
}

5、运行结果

pir传感器控制亮灯

相关推荐
落羽的落羽10 分钟前
【AI】快速理解AI应用的相关名词概念
linux·c++·人工智能·python·计算机网络·算法
刚入门的大一新生12 分钟前
Linux-进程控制
linux·运维·服务器·c++
刃神太酷啦32 分钟前
Redis 进阶核心:持久化 (RDB/AOF)、事务与主从复制全解析----《Hello Redis!》(5)
linux·c语言·数据库·c++·redis·缓存·bootstrap
ShallWeL1 小时前
Orin 上多模型常驻与显存预算
人工智能·嵌入式硬件·nvidia·orin
亮工硬件2 小时前
1-11 STM32内部FLASH(数据掉电保存)
笔记·stm32·单片机·嵌入式硬件·学习
集和诚JHCTECH2 小时前
案例分享 | BRAV-7721助力印刷电路板(PCB)智能缺陷复判系统
人工智能·嵌入式硬件·边缘计算
恒锐丰科技林技术员3 小时前
EG27524 双通道栅极驱动芯片:高速功率变换系统的驱动利器
经验分享·嵌入式硬件·硬件工程
喜欢吃燃面4 小时前
深入 C++ STL:从 unordered_set与unordered_map到底层哈希表的原理与实现
数据结构·c++·散列表
FlightYe4 小时前
音视频修炼之基础理论(五):AAC格式与解析
android·linux·c++·音视频·aac
恒锐丰科技林技术员4 小时前
EG2003:200V 半桥 MOS/IGBT 栅极驱动芯片解析
经验分享·嵌入式硬件·硬件工程