基于stm32f103c8t6的干簧管检测磁铁停车加计数代码
时间: 2023-07-29 13:11:28 浏览: 122
以下是基于STM32F103C8T6的干簧管检测磁铁停车加计数代码的示例:
```
#include "stm32f10x.h"
void delay_ms(uint32_t ms); // 延时函数声明
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
uint32_t i, count = 0;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // PA0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能GPIOB时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // PB12
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最大速度50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 使能GPIOC时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; // PC13
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最大速度50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure);
while (1)
{
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET) // 判断干簧管状态
{
GPIO_SetBits(GPIOB, GPIO_Pin_12); // PB12输出高电平,停车
delay_ms(5000); // 停车5秒
GPIO_ResetBits(GPIOB, GPIO_Pin_12); // PB12输出低电平,继续运行
count++; // 计数器加1
GPIO_WriteBit(GPIOC, GPIO_Pin_13, (count & 0x01)); // 计数器最低位控制LED灯
}
else
{
GPIO_ResetBits(GPIOB, GPIO_Pin_12); // PB12输出低电平,继续运行
}
}
}
void delay_ms(uint32_t ms)
{
volatile uint32_t nCount;
RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq(&RCC_Clocks);
nCount = (RCC_Clocks.HCLK_Frequency / 10000) * ms;
for (; nCount != 0; nCount--);
}
```
这个示例代码在基于之前的停车检测代码上增加了一个计数器,每次停车后计数器加1,并且最低位控制了一个LED灯的亮灭。需要注意的是,计数器的实现方式可以根据实际需求进行修改,比如可以使用定时器来实现更为精确的计时。
阅读全文