一個可以蜂鳴器提示的小函數

/*******************************************************************************
 * @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翻轉一次

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章