目录
一、滴答定时器的使用与原理
1、定义
滴答定时器,又称系统定时器。它应用系统时钟拉计算时间,因此常用作为计时 工具来使用,也可以实现固定时间去做一件简单的事情。
2、原理
(1)向上计数![](https://i-blog.csdnimg.cn/blog_migrate/b417dc57a186fac8db3d9a630966dff6.png)
(2)向下计数
(3) 代码流程
a、配置滴答时钟唤醒频率
SysTick_Config(SystemCoreClock/100);//每0.01s调用中断
b、滴答时钟中断函数
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
#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
#include "stm32f4xx.h" // Device header
void delay_ms(uint32_t ms);
main.c
#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、接线![](https://i-blog.csdnimg.cn/blog_migrate/ec3b79604d3a05588da32e8b326b3286.png)
4、代码
main.c
#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
#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
#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传感器控制亮灯