#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_adc.h"
#include "stm32f10x_tim.h"
#define TIMEOUT_VALUE 60000 // 无人超时时间,单位为毫秒
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
uint16_t ADC_ConvertedValue = 0;
uint16_t last_time = 0;
void GPIO_Configuration(void);
void USART_Configuration(void);
void ADC_Configuration(void);
void TIM_Configuration(void);
void delay_us(uint32_t n);
void send_bluetooth_msg(void);
int main(void) { // 初始化GPIO、USART、ADC和TIM模块
GPIO_Configuration();
USART_Configuration();
ADC_Configuration();
TIM_Configuration(); // 使能USART模块和ADC模块
USART_Cmd(USART1, ENABLE);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while (1) { if (ADC_ConvertedValue > 100) {
// 有人坐在座位上
last_time = 0;
// 记录最后一次检测到有人时的时间
} else {
// 没有人坐在座位上
if (last_time == 0) { last_time = TIM_GetCounter(TIM3);
// 如果上一次检测到有人,则重新记录最后一次检测到有人时 }
else { uint16_t current_time = TIM_GetCounter(TIM3);
if (current_time - last_time > TIMEOUT_VALUE) {
// 超时,通过蓝牙发送信息
send_bluetooth_msg();
// 发送蓝牙信息
break; } } ADC_ConvertedValue = 0; // 清除ADC转换值,以便下次采样
} } } // 配置GPIO模块
void GPIO_Configuration(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //
USART1_TX GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //
USART1_RX GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //
ADC1_IN1 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure); } // 配置USART模块
void USART_Configuration(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); } // 配置ADC模块
void ADC_Configuration(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5); ADC_Cmd(ADC1, ENABLE);
// 配置ADC中断优先级和使能ADC中断
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE); } // 配置TIM模块
void TIM_Configuration(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_DeInit(TIM3); TIM_TimeBaseStructure.TIM_Period = 0xffff; TIM_TimeBaseStructure.TIM_Prescaler = 71; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_Cmd(TIM3, ENABLE); } // 延时函数,延时时间为n微秒
void delay_us(uint32_t n) { volatile uint32_t i = 0; for (i = 0; i < n * 8; i++); } // 发送蓝牙信息
void send_bluetooth_msg(void) { USART_SendData(USART1, 'T'); while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); USART_SendData(USART1, 'i'); while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); USART_SendData(USART1, 'm'); while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); USART_SendData(USART1, 'e'); while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); USART_SendData(USART1, 'o'); while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); } // ADC中断服务函数,获取ADC转换值
void ADC1_2_IRQHandler(void) { if (ADC_GetITStatus(ADC1, ADC_IT_EOC) != RESET) { ADC_ConvertedValue = ADC_GetConversionValue(ADC1); ADC_ClearITPendingBit(ADC1, ADC_IT_EOC); } }