需求:按下遥控A键进入警报模式,按下遥控B键解除警报模式;在警报模式下,有震动则警报响。
软件:CubeMX,Keil5
硬件:STM32F103C8T6,震动传感器,蜂鸣器,433M无线接收模块,433M无线发射模块
1.配置STM32
打开CubeMX,点击ACCESS TO MCU SELECTOR
搜索STM32F103C8T6,后双击
设置时钟
按下图操作后回车
PB9(LED2):输出,配置:GPIO mode :high
PB8(LED1):输出,配置 :GPIO mode :high
PB6:输出,配置 :GPIO mode :high
PA4:中断,配置:GPIO mode:External lnterrupt Mode with Falling edge trigger detection
PA5,PA6:中断,配置:GPIO mode:External lnterrupt Mode with Rising edge trigger detection
打开中断
最后点击GENERATE CODE,选择 open project
2.实现代码
1.连接振动传感器,DO--PA4
2.连接蜂鸣器,I/O--PB6
注意:VCC--3.3V
3.连接433M无线接收模块
D0--PA5, D0对应433M无线发射模块A键
D1--PA6, D1对应433M无线发射模块B键
4.在main.c中重写中断函数
下方代码:测试震动传感器
测试说明:有震动则LED2亮
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
//重写中断函数,当检测到有中断申请时,调用此函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
//判断中断源是否来自PA4
if(GPIO_Pin == GPIO_PIN_4){
//若PA4为低电平,则点亮LED1
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_RESET){
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_RESET );
}
//若不为低电平,否则关闭LED1
else{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_SET );
}
}
}
/* USER CODE END 0 */
下方代码:测试433M无线接收模块,433M无线发射模块
测试说明:按下A键LED2亮1.5秒,按下B键LED1亮1秒
//重写中断函数,当检测到有中断申请时,调用此函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
switch(GPIO_Pin){
case GPIO_PIN_5:{
//若PA5被拉高,LED2亮一秒
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == GPIO_PIN_SET){
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_RESET );
for(int i=0;i<10000000;i++);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_SET );
}
break;
}
case GPIO_PIN_6:{
//若PA6被拉高,LED1亮一秒
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_SET){
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8,GPIO_PIN_RESET );
for(int i=0;i<10000000;i++);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8,GPIO_PIN_SET );
}
break;
}
}
/*
//判断中断源是否来自PA4
if(GPIO_Pin == GPIO_PIN_4){
//若PA4为低电平,则点亮LED2
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_RESET){
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_RESET );
}
//若不为低电平,否则关闭LED2
else{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_SET );
}
}
*/
}
最终代码:
//重写中断函数,当检测到有中断申请时,调用此函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
static int mark = J_OFF;
switch(GPIO_Pin){
case GPIO_PIN_4:{
//在警报模式下,如果检测到有震动,蜂鸣器一直响
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_RESET && mark == J_ON){
//拉低PB7
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6,GPIO_PIN_RESET );
}
break;
}
//如果检测到PA5被拉高(A键被按下),开启警报模式
case GPIO_PIN_5:{
//若PA5被拉高,LED2亮一秒,蜂鸣器响1.5秒
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == GPIO_PIN_SET){
mark = J_ON;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_RESET );
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6,GPIO_PIN_RESET );
HAL_Delay(1500);
//for(int i=0;i<10000000;i++);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_SET );
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6,GPIO_PIN_SET );
}
break;
}
//如果检测到PA6被拉高(B键被按下),解除警报模式
case GPIO_PIN_6:{
//若PA6被拉高,LED1亮一秒,蜂鸣器响1秒
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_SET){
mark = J_OFF;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8,GPIO_PIN_RESET );
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6,GPIO_PIN_RESET );
HAL_Delay(1000);
//for(int i=0;i<5000000;i++);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8,GPIO_PIN_SET );
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6,GPIO_PIN_SET );
}
break;
}
}
}
alert_project