一个可以蜂鸣器提示的小函数

118 阅读1分钟
/*******************************************************************************
 * @fn      BUZ_PRO_FUN 
 *
 * @brief   蜂鸣器提示处理函数
 *
 * @param   beep_num 响次数; beep_per 响周期
 *
 * @return  no
 *******************************************************************************/
void BUZ_PRO_FUN(uint8_t beep_num, uint8_t beep_per)
{
	static uint8_t Beep_Num, Beep_Per, Beep_CLK, Beep_Flag;//响的次数,周期,时钟,响的标志

	if(beep_per != 0xff)//放在定时器下面时,形参就是0xff,只为了用定时器当时钟
		Beep_Flag = 1; //收到有效形参,蜂鸣器开始工作
	
	if(Beep_Flag == 1)
	{
		if(Beep_Num == 0)  //上一次已经响完,并且不重复给Beep_Num、Beep_Per赋值
                {
			Beep_Num = beep_num * 2; // *2 是因为响一声需要翻转,电平变化两次
	                Beep_Per = beep_per; //存储有效周期
		}
		
		if(Beep_CLK++ > Beep_Per)//周期,周期示时钟而定
		{
                        Beep_CLK = 0;
			if(Beep_Num--)//次数
				HAL_GPIO_TogglePin(BUZZER_GPIO_Port, BUZZER_Pin);
		}
		
		if(Beep_Num == 0)//本次提示已经完成并结束,关闭蜂鸣器,下次不再进入
		{
			HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET);//关闭蜂鸣器提示
			Beep_Flag = 0;
		}
	}
}

这个函数放到定时器下面起到时钟作用

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance == TIM6)
  {
    BUZ_PRO_FUN(0xff,0xff);//蜂鸣器提示时钟
  }
}

使用时:

BUZ_PRO_FUN(2,3);//蜂鸣器提示2次 假如定时器是100ms,则蜂鸣器每隔300ms翻转一次

 

创作打卡挑战赛

赢取流量/现金/CSDN周边激励大奖