目录
一、介绍
MC-38常闭式门磁开关是作为IO开关输入数字信号的,原理是合在一起信号是导通的 , 配合有线主机使用 不能单独使用。适用于非铁质(如木制或铝合金制)门或窗表面安装,做防盗报警使用。
以下是门磁模块的参数:
|------|---------------|
| 型号 | MC-38 |
| 开关耐压 | 100VDC |
| 负载电流 | 150mA |
| 外观尺寸 | 27*14*10 mm |
| 动作距离 | 18mm ± 6mm |
| 寿命 | 100万次 |
| 开关输入 | 常闭式 |
哔哩哔哩视频:
门磁模块详解(防盗感应开关 STM32)
(资料分享见文末)
二、程序设计
1.使用STM32F103C8T6读取门磁模块采集的数据,通过串口发送至电脑
2.将读取得到信息数据同时在OLED上显示
|----------|------|
| 门磁IO | PB15 |
| OLED_SCL | PB11 |
| OLED_SDA | PB10 |
| 串口 | 串口1 |
main.c文件
cpp
#include "stm32f10x.h"
#include "led.h"
#include "usart.h"
#include "delay.h"
#include "oled.h"
#include "gate_guard.h"
#include "adcx.h"
/*****************辰哥单片机设计******************
STM32
* 项目 : 门磁模块实验
* 版本 : V1.0
* 日期 : 2024.9.6
* MCU : STM32F103C8T6
* 接口 : 参看gate_guard.h
* BILIBILI : 辰哥单片机设计
* CSDN : 辰哥单片机设计
* 作者 : 辰哥
**********************BEGIN***********************/
u16 value;
int main(void)
{
SystemInit();//配置系统时钟为72M
delay_init(72);
LED_Init();
LED_On();
GATE_GUARD_Init();
USART1_Config();
OLED_Init();
delay_ms(1000);
OLED_Clear();
//显示"门磁状态:"
OLED_ShowChinese(0,0,0,16,1);
OLED_ShowChinese(16,0,1,16,1);
OLED_ShowChinese(32,0,2,16,1);
OLED_ShowChinese(48,0,3,16,1);
OLED_ShowChar(64,0,':',16,1);
while (1)
{
value = GATE_GUARD_GetData();
if(value == 1)
{
OLED_ShowChinese(60,30,4,16,1); //开
printf("开\r\n");
LED_Toggle();
delay_ms(100);
}
else
{
OLED_ShowChinese(60,30,5,16,1); //关
printf("关\r\n");
delay_ms(100);
}
}
}
gate_guard.h文件
cpp
#ifndef __GATE_GUARD_H
#define __GATE_GUARD_H
#include "stm32f10x.h"
#include "adcx.h"
#include "delay.h"
#include "math.h"
/*****************辰哥单片机设计******************
STM32
* 文件 : 门磁模块h文件
* 版本 : V1.0
* 日期 : 2024.9.6
* MCU : STM32F103C8T6
* 接口 : 见代码
* BILIBILI : 辰哥单片机设计
* CSDN : 辰哥单片机设计
* 作者 : 辰哥
**********************BEGIN***********************/
/***************根据自己需求更改****************/
// 门磁模块 GPIO宏定义
#define GATE_GUARD_GPIO_CLK RCC_APB2Periph_GPIOB
#define GATE_GUARD_GPIO_PORT GPIOB
#define GATE_GUARD_GPIO_PIN GPIO_Pin_15
/*********************END**********************/
#define GATE_GUARD GPIO_ReadInputDataBit(GATE_GUARD_GPIO_PORT,GATE_GUARD_GPIO_PIN) //读取按键1
void GATE_GUARD_Init(void);
uint16_t GATE_GUARD_GetData(void);
#endif /* __ADC_H */
gate_guard.c文件
cpp
#include "gate_guard.h"
/*****************辰哥单片机设计******************
STM32
* 文件 : 1×4矩阵键盘c文件
* 版本 : V1.0
* 日期 : 2024.8.31
* MCU : STM32F103C8T6
* 接口 : 见代码
* BILIBILI : 辰哥单片机设计
* CSDN : 辰哥单片机设计
* 作者 : 辰哥
**********************BEGIN***********************/
void GATE_GUARD_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd (GATE_GUARD_GPIO_CLK, ENABLE ); // 打开连接 单片机引脚端口时钟
GPIO_InitStructure.GPIO_Pin = GATE_GUARD_GPIO_PIN; // 配置连接 单片机引脚模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 设置为上拉输入
GPIO_Init(GATE_GUARD_GPIO_PORT, &GPIO_InitStructure); // 初始化
}
uint16_t GATE_GUARD_GetData()
{
if(GATE_GUARD==1)
{
delay_ms(10);//去抖动
if(GATE_GUARD==1)
return 1;
}
return 0;// 无按键按下
}