基于stm32不使用pwm实现利用1/0口产生一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演奏乐曲(最少三首乐曲):(2)采用数码管显示歌曲序号;(3)可通过功能键选择乐曲,暂停,播放。完整参考代码
时间: 2024-03-14 20:49:59 浏览: 28
由于这是一个比较复杂的项目,代码量较大,我在这里只提供大致的代码框架和思路,具体的代码实现需要根据具体的硬件和软件环境进行优化和修改。
首先,在main函数中定义一个数组来存储不同音调的频率:
```
uint16_t freq[] = {262, 294, 330, 349, 392, 440, 494, 523};
```
然后,定义一个变量来记录当前选择的乐曲序号:
```
uint8_t song_num = 0;
```
然后,在main函数中初始化硬件,并启用中断:
```
int main(void)
{
// 初始化硬件
InitHardware();
// 启用中断
HAL_NVIC_EnableIRQ(TIM2_IRQn);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
// 进入主循环
while (1)
{
// 等待中断触发
}
}
```
接下来,实现定时器中断函数,用于产生方波音调:
```
void TIM2_IRQHandler(void)
{
// 清除中断标志位
__HAL_TIM_CLEAR_IT(&htim2, TIM_IT_UPDATE);
// 计算当前音调的计数值
uint16_t count = (uint16_t)(SystemCoreClock / (freq[song_num] * 2));
// 设置计数值和重载值
TIM2->ARR = count;
TIM2->CCR1 = count / 2;
}
```
然后,实现外部中断函数,用于切换乐曲和暂停/播放:
```
void EXTI0_IRQHandler(void)
{
// 清除中断标志位
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
// 判断按键状态
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
{
// 暂停/播放
if (HAL_TIM_Base_GetState(&htim2) == HAL_TIM_STATE_BUSY)
{
HAL_TIM_Base_Stop_IT(&htim2);
}
else
{
HAL_TIM_Base_Start_IT(&htim2);
}
}
else
{
// 切换乐曲
song_num++;
if (song_num >= 3)
{
song_num = 0;
}
// 显示乐曲序号
DisplayNumber(song_num);
}
}
```
最后,实现数码管驱动函数,用于显示乐曲序号:
```
void DisplayNumber(uint8_t num)
{
// 数码管显示字符数组
uint8_t display_char[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
// 数码管扫描计数器
static uint8_t scan_count = 0;
// 数码管扫描数组
static uint8_t scan_pin[] = {GPIO_PIN_12, GPIO_PIN_13, GPIO_PIN_14, GPIO_PIN_15};
// 设置数码管输出
uint8_t digit = display_char[num % 10];
HAL_GPIO_WritePin(GPIOD, scan_pin[scan_count], GPIO_PIN_SET);
HAL_GPIO_WritePort(GPIOE, digit << 8, GPIO_PIN_RESET);
// 等待一段时间
HAL_Delay(1);
// 清除数码管输出
HAL_GPIO_WritePin(GPIOD, scan_pin[scan_count], GPIO_PIN_RESET);
HAL_GPIO_WritePort(GPIOE, 0x0000, GPIO_PIN_RESET);
// 更新扫描计数器
scan_count++;
if (scan_count >= 4)
{
scan_count = 0;
}
}
```
完整的代码实现可以参考以下链接:
https://github.com/zhongshuaihui/STM32-Music-Player
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pptx](https://img-home.csdnimg.cn/images/20210720083543.png)