编写蜂鸣器/风扇/马达代码

pwm.h代码如下:

#ifndef __PWM_H__
#define __PWM_H__

#include "stm32mp1xx_tim.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"

//蜂鸣器初始化
void beep_init();

//风扇初始化
void fan_init();

//马达初始化
void monitor_init();


#endif

pwm.c代码如下:

#include "pwm.h"

//蜂鸣器初始化
void beep_init()
{
    /***********rcc初始化*********/
    RCC->MP_AHB4ENSETR |= (0x1<<1);
    RCC->MP_APB1ENSETR |= (0x1<<2);

    /**********gpio初始化*********/
    GPIOB->MODER &= (~(0x3<<12));
    GPIOB->MODER |= (0x1<<13);

    GPIOB->AFRL &= (~(0xf<<24));
    GPIOB->AFRL |= (0x1<<25);

    /**********TIM初始化*********/
    //分频器
    TIM4->PSC = 208;
    TIM4->ARR = 1000;
    TIM4->CCR1 = 300;

    TIM4->CCMR1 &= (~(0x1<<16));
    TIM4->CCMR1 &= (~(0x3<<4));         //设置输出模式为PWM模式
    TIM4->CCMR1 |= (0x3<<5); 
    TIM4->CCMR1 |= (0x1<<3);         //设置输出比较寄存器使能
    TIM4->CCMR1 &= (0x3<<0);         //设置通道为输出模式

    TIM4->CCER &= (~(0x1<<3));         //配置通道1为输出极性模式
    TIM4->CCER &= (~(0x1<<1));          //配置通道1起始电平状态
    TIM4->CCER |= (0x1<<0);         //配置通道1输出使能
        
    TIM4->CR1 |= (0x1<<7);   //自动重载预加载使能
    TIM4->CR1 &= (~(0x3<<5)); //边沿对齐模式
    TIM4->CR1 |= (0x1<<4);         //采用递减方式进行计数
    TIM4->CR1 |= (0x1<<0);         //计数器使能


}

//风扇初始化
void fan_init()
{
    /*********rcc初始化*************/
    RCC->MP_AHB4ENSETR |= (0x1<<4);
    RCC->MP_APB2ENSETR |= (0x1<<0);

    /**********gpio初始化*********/
    GPIOE->MODER &= (~(0x3<<18));
    GPIOE->MODER |= (0x1<<19);

    GPIOE->AFRH &= (~(0xf<<4));
    GPIOE->AFRH |= (0x1<<4);
    
    /**********TIM初始化*********/
    //分频器
    TIM1->PSC = 208;
    TIM1->ARR = 1000;
    TIM1->CCR1 = 300;

    TIM1->CCMR1 &= (~(0x1<<16));
    TIM1->CCMR1 &= (~(0x3<<4));         //设置输出模式为PWM模式
    TIM1->CCMR1 |= (0x3<<5); 
    TIM1->CCMR1 |= (0x1<<3);         //设置输出比较寄存器使能
    TIM1->CCMR1 &= (0x3<<0);         //设置通道为输出模式

    TIM1->CCER &= (~(0x1<<3));         //配置通道1为输出极性模式
    TIM1->CCER &= (~(0x1<<1));          //配置通道1起始电平状态
    TIM1->CCER |= (0x1<<0);         //配置通道1输出使能
        
    TIM1->CR1 |= (0x1<<7);   //自动重载预加载使能
    TIM1->CR1 &= (~(0x3<<5)); //边沿对齐模式
    TIM1->CR1 |= (0x1<<4);         //采用递减方式进行计数
    TIM1->CR1 |= (0x1<<0);         //计数器使能
    
    TIM1->BDTR |= (0x1<<15);

}

//马达初始化
void monitor_init()
{
/*********rcc初始化*************/
    RCC->MP_AHB4ENSETR |= (0x1<<5);
    RCC->MP_APB2ENSETR |= (0x1<<3);

    /**********gpio初始化*********/
    GPIOF->MODER &= (~(0x3<<12));
    GPIOF->MODER |= (0x1<<13);

    GPIOF->AFRL &= (~(0xf<<24));
    GPIOF->AFRL |= (0x1<<24);
    
    /**********TIM初始化*********/
    //分频器
    TIM16->PSC = 208;
    TIM16->ARR = 1000;
    TIM16->CCR1 = 300;

    TIM16->CCMR1 &= (~(0x1<<16));
    TIM16->CCMR1 &= (~(0x3<<4));         //设置输出模式为PWM模式
    TIM16->CCMR1 |= (0x3<<5); 
    TIM16->CCMR1 |= (0x1<<3);         //设置输出比较寄存器使能
    TIM16->CCMR1 &= (0x3<<0);         //设置通道为输出模式

    TIM16->CCER &= (~(0x1<<3));         //配置通道1为输出极性模式
    TIM16->CCER &= (~(0x1<<1));          //配置通道1起始电平状态
    TIM16->CCER |= (0x1<<0);         //配置通道1输出使能
        
    TIM16->CR1 |= (0x1<<7);   //自动重载预加载使能
    TIM16->CR1 &= (~(0x3<<5)); //边沿对齐模式
    TIM16->CR1 |= (0x1<<4);         //采用递减方式进行计数
    TIM16->CR1 |= (0x1<<0);         //计数器使能
    
    TIM16->BDTR |= (0x1<<15);
}

main.c代码如下:

#include "pwm.h"

extern void printf(const char *fmt, ...);

void delay_ms(int ms)
{
    int i,j;
    for(i = 0; i < ms;i++)
        for (j = 0; j < 1800; j++);
}


int main()
{
      //beep_init();
    fan_init();
    monitor_init();
    while(1)
    {

    }

    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是使用 Arduino 编写蜂鸣器演奏《大鱼》的代码: ```c++ int buzzerPin = 10; // 蜂鸣器连接的引脚 int notes[] = { // 音符数组 NOTE_E5, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_G5, NOTE_F5, NOTE_E5, NOTE_D5, NOTE_C5, NOTE_C5, NOTE_D5, NOTE_E5, NOTE_E5, NOTE_D5, NOTE_D5 }; int durations[] = { // 音符时长数组 8, 8, 4, 4, 4, 8, 8, 4, 4, 8, 8, 4, 4, 8, 8 }; void setup() { pinMode(buzzerPin, OUTPUT); // 设置蜂鸣器引脚为输出模式 } void loop() { for (int i = 0; i < sizeof(notes) / sizeof(notes[0]); i++) { int duration = 1000 / durations[i]; tone(buzzerPin, notes[i], duration); delay(duration * 1.3); // 延时一定时间,使音符之间有间隔 noTone(buzzerPin); // 停止发声 } } ``` 注意,这是一个简单的示例代码,没有考虑节奏和速度的变化,如果需要更加精细的演奏,可以通过修改音符数组和时长数组来实现。 ### 回答2: 使用Arduino编写蜂鸣器演奏《大鱼》的代码可以使用Arduino的Tone函数来实现。先确定每个音符的频率,然后在循环中使用Tone函数来生成各个音符的声音。 首先在代码中定义每个音符的频率,例如C4对应的频率为262Hz: int c4 = 262; 接下来使用Tone函数来播放每个音符,例如演奏《大鱼》的前奏部分的代码如下: void setup() { // 配置蜂鸣器引脚 pinMode(9, OUTPUT); } void loop() { // 播放《大鱼》的前奏部分 tone(9, c4); // 播放C4 delay(500); // 延迟0.5秒 tone(9, c4); // 播放C4 delay(500); // 延迟0.5秒 tone(9, c4); // 播放C4 delay(1000); // 延迟1秒 tone(9, c4); // 播放C4 delay(500); // 延迟0.5秒 tone(9, c4); // 播放C4 delay(500); // 延迟0.5秒 tone(9, c4); // 播放C4 delay(1000); // 延迟1秒 tone(9, c4); // 播放C4 delay(500); // 延迟0.5秒 tone(9, c4); // 播放C4 delay(500); // 延迟0.5秒 tone(9, c4); // 播放C4 delay(1000); // 延迟1秒 noTone(9); // 停止播放 } 这段代码会循环播放《大鱼》的前奏部分。通过调整每个音符的频率和延迟时间,可以实现更多的音乐效果。同时,也可以在代码中新增其他部分的音符频率和延迟时间来完整演奏整首《大鱼》的曲子。 ### 回答3: 使用Arduino编写蜂鸣器演奏《大鱼》的代码如下: 1. 首先,我们需要将蜂鸣器连接到Arduino板的数字引脚上。假设我们将蜂鸣器连接到数字引脚 8 。 2. 在Arduino的setup()函数中,设置引脚 8 为输出模式,用于控制蜂鸣器。 3. 在Arduino的loop()函数中,通过一系列的高低电平控制蜂鸣器的声音。 下面是一个简单的代码示例,用于演奏《大鱼》: ```c //定义蜂鸣器引脚 int buzzerPin = 8; //定义乐谱数组 int melody[] = { NOTE_E5, NOTE_E5, NOTE_E5, NOTE_C5, NOTE_E5, NOTE_G5, NOTE_G4, NOTE_C5, NOTE_G4, NOTE_E4, NOTE_A4, NOTE_B4, NOTE_AS4, NOTE_A4, NOTE_G4, NOTE_E5, NOTE_G5, NOTE_A5, NOTE_F5, NOTE_G5, NOTE_E5, NOTE_C5, NOTE_D5, NOTE_B4, NOTE_C5, NOTE_G4, NOTE_E4, NOTE_A4, NOTE_B4, NOTE_AS4, NOTE_A4, NOTE_G4, NOTE_E5, NOTE_G5, NOTE_A5, NOTE_F5, NOTE_G5, NOTE_E5, NOTE_C5, NOTE_D5, NOTE_B4, 0, NOTE_C5, 0, NOTE_G4, NOTE_E4, NOTE_A4, NOTE_B4, NOTE_AS4, NOTE_A4, NOTE_G4, NOTE_G5, NOTE_DS5, NOTE_B4, NOTE_DS5, NOTE_E5, NOTE_A4, NOTE_A4, NOTE_A4, 0, NOTE_A4, NOTE_AS4, NOTE_B4, NOTE_B4, NOTE_AS4, NOTE_A4, NOTE_G4, NOTE_E5, NOTE_G5, NOTE_A5, NOTE_F5, NOTE_G5, NOTE_E5, NOTE_C5, NOTE_D5, NOTE_B4, 0, 0 }; //定义节拍数组 int beats[] = { 8, 8, 4, 8, 4, 2, 1, 8, 4, 8, 4, 4, 4, 8, 4, 8, 2, 8, 4, 8, 4, 2, 1, 8, 4, 8, 4, 4, 4, 8, 4, 8, 2, 8, 4, 8, 4, 2, 2, 8, 4, 2, 1, 8, 8, 8, 8, 4, 8, 4, 4, 4, 8, 4, 8, 2, 8, 8, 8, 4, 4, 8, 4, 8, 2, 1, 8, 8, 1 }; void setup() { //设置蜂鸣器引脚为输出模式 pinMode(buzzerPin, OUTPUT); } void loop() { //循环演奏乐谱中的每个音符 for (int i = 0; i < sizeof(melody) / sizeof(int); i++) { //通过tone()函数播放音符 tone(buzzerPin, melody[i]); //延时根据对应的拍子 delay(300 / beats[i]); //停止播放音符 noTone(buzzerPin); } //在演奏完毕后,重置循环变量 i = 0; } ``` 以上代码使用了两个数组,一个是乐谱数组`melody[]`,存储了《大鱼》的每个音符,另一个是节拍数组`beats[]`,存储了每个音符的持续时长。通过循环演奏这两个数组中对应位置的音符和拍子,实现了演奏《大鱼》的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值