基于stm32f103c8t6的干簧管检测磁铁停车加计数的代码
时间: 2023-08-01 11:07:56 浏览: 160
以下是一个基于STM32F103C8T6的干簧管检测磁铁停车加计数的代码示例:
```
#include "stm32f10x.h"
#define MAGNET_PIN GPIO_Pin_0
#define MAGNET_PORT GPIOA
#define LED_PIN GPIO_Pin_1
#define LED_PORT GPIOA
int count = 0;
void GPIO_Config()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟
GPIO_InitStructure.GPIO_Pin = MAGNET_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(MAGNET_PORT, &GPIO_InitStructure); // 初始化干簧管引脚
GPIO_InitStructure.GPIO_Pin = LED_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_PORT, &GPIO_InitStructure); // 初始化LED引脚
}
void delay_us(u32 nus)
{
u32 ticks;
u32 told, tnow, tcnt = 0;
u32 reload = SysTick->LOAD;
ticks = nus * (SystemCoreClock / 1000000);
told = SysTick->VAL;
while (1)
{
tnow = SysTick->VAL;
if (tnow != told)
{
if (tnow < told)
{
tcnt += told - tnow;
}
else
{
tcnt += reload - tnow + told;
}
told = tnow;
if (tcnt >= ticks)
break;
}
}
}
void SysTick_Init()
{
if (SysTick_Config(SystemCoreClock / 1000000))
{
while (1)
;
}
}
void SysTick_Handler()
{
delay_us(1);
}
int main()
{
GPIO_Config();
SysTick_Init();
while (1)
{
if (GPIO_ReadInputDataBit(MAGNET_PORT, MAGNET_PIN) == SET) // 如果检测到磁铁靠近
{
GPIO_SetBits(LED_PORT, LED_PIN); // 打开LED
delay_us(100000); // 等待一段时间
if (GPIO_ReadInputDataBit(MAGNET_PORT, MAGNET_PIN) == SET) // 确认磁铁仍在附近
{
count++; // 计数器加一
printf("Count: %d\n", count); // 通过串口输出计数
}
GPIO_ResetBits(LED_PORT, LED_PIN); // 关闭LED
}
}
}
```
这个代码中,我们首先定义了干簧管连接的引脚和LED连接的引脚,以及计数器变量。在`GPIO_Config()`函数中,我们初始化了干簧管引脚和LED引脚。在`delay_us()`函数中,我们使用SysTick定时器来实现微秒级别的延时。在`SysTick_Init()`函数中,我们初始化了SysTick定时器。在`main()`函数中,我们不断读取干簧管引脚状态,如果检测到磁铁靠近,则打开LED并等待一段时间,确认磁铁仍在附近后计数器加一并通过串口输出计数,最后关闭LED。这样就可以实现基于STM32F103C8T6的干簧管检测磁铁停车加计数的功能了。
阅读全文