目錄
一、滴答定時器的使用與原理
1、定義
2、原理
(1)向上計數?編輯
(2)向下計數
?(3)?代碼流程
a、配置滴答時鐘喚醒頻率
b、滴答時鐘中斷函數
(4)結果
3、優化-->寄存器協助模式
代碼
二、pir傳感器的使用
1、介紹
2、接法
?3、接線?編輯
?4、代碼
main.c
?pir.c
pir.h
5、運行結果
一、滴答定時器的使用與原理
1、定義
? ? ? 滴答定時器,又稱系統定時器。它應用系統時鐘拉計算時間,因此常用作為計時 工具來使用,也可以實現固定時間去做一件簡單的事情。
2、原理
(1)向上計數
(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 headervoid 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、接線
?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 headervoid 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 headervoid 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傳感器控制亮燈
?