利用外部中断方式实现蜂鸣器控制(2个按键控制)单片机使用STM32F103系列
时间: 2024-01-27 21:06:34 浏览: 24
实现蜂鸣器控制的外部中断程序如下:
```c
#include "stm32f10x.h"
void Delay(__IO uint32_t nCount);
void EXTI0_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line0) != RESET)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_SET);
Delay(10000);
GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_RESET);
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
void EXTI1_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line1) != RESET)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_SET);
Delay(5000);
GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_RESET);
EXTI_ClearITPendingBit(EXTI_Line1);
}
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);
EXTI_InitStructure.EXTI_Line = EXTI_Line1;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
while (1)
{
}
}
void Delay(__IO uint32_t nCount)
{
while (nCount--)
{
}
}
```
在这个例子中,我们使用PA8控制蜂鸣器,PA0和PA1分别连接两个外部按键。当按下PA0时,蜂鸣器会响一次,当按下PA1时,蜂鸣器会响两次。
代码中的外部中断处理程序分别为`EXTI0_IRQHandler`和`EXTI1_IRQHandler`,分别对应PA0和PA1的外部中断。在处理程序中,我们通过GPIO_WriteBit函数控制PA8输出高电平,让蜂鸣器响起来。然后使用Delay函数延时一段时间后,再将PA8输出低电平,让蜂鸣器停止响。最后使用EXTI_ClearITPendingBit函数清除中断标志位,以便下一次中断的触发。