单片机实验(十一)无源蜂鸣器

80S52:无源蜂鸣器模块

功能:嗡嗡叫发声
这个无源蜂鸣器的操作非常水所以我也水过去好了
先上电路连接图(Proteus仿真):
在这里插入图片描述
从图中可见我们能操作的也就P3.3一个端口,只要不停地输出0,1,0,1就能让蜂鸣器振动发声,那么如何发出美妙的声音呢,只要在0和1的变换之间插入不同长度的延时就能做到音阶的变化,本人不懂乐理,更搞不清楚具体要延时几微秒,但可以问度娘手动滑稽

然后看到了大佬们惊为天人的作品:
基于T0定时/计数器的最炫民族风。。。

#include<reg52.h>
sbit BUZZER = P3^3;

#define uchar unsigned char
#define uint  unsigned int
#define REST         36                       
#define A                  0                  
#define AB          1                  
#define B                  2                 
#define BC          3                  
#define C                  4                  
#define D                  5                  
#define DE                 6                  
#define E                 7                      
#define EF          8                  
#define F                  9                  
#define FG          10         
#define G                 11          
#define L                  12         
#define LM          13          
#define M                  14          
#define MN          15          
#define N                  16                 
#define O                  17          
#define OP          18          
#define P                  19          
#define PQ          20          
#define Q                  21          
#define QR          22          
#define R                  23         
#define S                  24          
#define SU          25          
#define U                  26         
#define UV          27          
#define V                  28         
#define W                  29         
#define WX          30          
#define X                  31         
#define XY          32          
#define Y                  33         
#define YZ          34          
#define Z                  35          
uchar code m_note[][2] = {
{248,136},{248,243},{249,88},{249,184},{250,18},{250,103},{250,184},{251,3},{251,75},
{251,143},{251,206},{252,11},{252,67},{252,121},{252,172},{252,219},{253,9},{253,51},
{253,91},{253,129},{253,165},{253,199},{253,231},{254,5},{254,33},{254,60},{254,85},
{254,109},{254,132},{254,153},{254,173},{254,192},{254,210},{254,227},{254,243},{255,2},
{0,0},
};
uchar code display[][2] = {
{N,8},{F,4},{F,4},{L,8},{N,8},{M,4},{M,2},{N,2},{M,4},{L,4},
{M,4},{L,4},{F,8},{N,8},{F,4},{F,4},{L,8},{N,8},
{P,4},{M,2},{N,2},{M,4},{L,4},{M,4},{L,4},{G,4},{E,4},
{N,8},{F,4},{F,4},{L,8},{N,8},{M,4},{M,2},{N,2},{M,4},{L,4},
{M,4},{L,4},{F,4},{E,4},{N,8},{F,4},{F,4},{L,8},{N,8},
{P,4},{N,4},{0xff,24},
{F,8},{F,4},{E,4},{F,8},{F,4},{L,4},{L,8},{M,4},{L,4},{F,8},
{0xff,8},{L,8},{L,4},{E,4},{L,4},{M,4},{N,4},{P,4},{P,4},{N,4},
{M,8},{N,8},{0xff,8},{Q,4},{Q,4},{Q,4},{P,4},{N,4},{N,8},{L,4},
{F,4},{F,4},{F,4},{N,4},{M,8},{0xff,8},{N,4},{N,4},{P,4},{N,4},
{M,4},{N,4},{M,4},{L,4},{F,8},{E,8},{F,8},{0xff,8},
{F,8},{F,4},{E,4},{F,8},{F,4},{L,4},{L,8},{M,4},{L,4},{F,8},
{0xff,8},{L,8},{L,4},{E,4},{L,4},{M,4},{N,4},{P,4},{P,4},{N,4},
{M,8},{N,8},{0xff,8},{Q,4},{Q,4},{Q,4},{P,4},{N,4},{N,8},{L,4},
{F,4},{F,4},{F,4},{N,4},{M,8},{0xff,8},{N,4},{N,4},{P,4},{N,4},
{M,4},{N,4},{M,4},{L,4},{F,8},{E,8},{F,8},{0xff,8},
{N,4},{N,4},{P,4},{N,4},{N,4},{P,4},{P,4},{Q,4},{S,4},{Q,4},
{P,8},{Q,8},{0xff,8}, 
{F,8},{F,4},{E,4},{F,8},{L,8},{M,4},{N,2},{M,2},{L,4},{M,4},
{N,8},{0xff,8},{F,4},{Q,4},{Q,4},{P,4},{M,4},{N,2},{M,2},
{L,4},{M,4},{N,8},{0xff,8},{0xff,16},{L,4},{F,4},{F,4},{L,4},
{M,8},{E,4},{E,4},{N,4},{P,4},{N,4},{M,4},{L,8},{0xff,8},
{F,4},{L,4},{M,4},{N,4},{M,4},{L,4},{E,4},{C,4},{F,8},{0xff,8},{0xff,16},
{F,8},{F,4},{E,4},{F,8},{L,8},{M,4},{N,2},{M,2},{L,4},{M,4},
{N,8},{0xff,8},{F,4},{Q,4},{Q,4},{P,4},{M,4},{N,2},{M,2},
{L,4},{M,4},{N,8},{0xff,8},{0xff,16},{L,4},{F,4},{F,4},{L,4},
{M,8},{E,4},{E,4},{N,4},{P,4},{N,4},{M,4},{L,12},{L,4},
{F,4},{L,4},{M,4},{N,4},{P,4},{N,4},{N,4},{P,4},{Q,8},{0xff,8},{0xff,8},

{Q,6}, {Q,2},{Q,4},{Q,4},{Q,6},{P,2},{N,4},{M,4},{M,6},{M,2},{N,6},{P,2},{N,6},{M,2},
{L,6},{F,2},{F,8},{F,4},{E,4},{F,8},{F,4},{L,4}, {M,4},{N,2},{M,2},        {L,4},{M,4},{N,8},{0xff,8},
{Q,4},{P,4},{N,4},{M,4},{P,4},{N,4},{M,4},{L,4},{L,8},{0xff,8},{F,2}, {A,2},{B,2},{C,2},{B,2},
{A,2}, {F,2},{A,2},
{N,4},{N,4},{P,4},{N,4},{N,4},{P,4},{P,4},{Q,4},{S,4},{Q,4},
{P,8},{Q,8},{0xff,8},
{F,8},{F,4},{E,4},{F,8},{L,8},{M,4},{N,2},{M,2},{L,4},{M,4},
{N,8},{0xff,8},{F,4},{Q,4},{Q,4},{P,4},{M,4},{N,2},{M,2},
{L,4},{M,4},{N,8},{0xff,8},{0xff,16},{L,4},{F,4},{F,4},{L,4},
{M,8},{E,4},{E,4},{N,4},{P,4},{N,4},{M,4},{L,8},{0xff,8},
{F,4},{L,4},{M,4},{N,4},{M,4},{L,4},{E,4},{C,4},{F,8},{0xff,8},{0xff,16},
{F,8},{F,4},{E,4},{F,8},{L,8},{M,4},{N,2},{M,2},{L,4},{M,4},
{N,8},{0xff,8},{F,4},{Q,4},{Q,4},{P,4},{M,4},{N,2},{M,2},
{L,4},{M,4},{N,8},{0xff,8},{0xff,16},{L,4},{F,4},{F,4},{L,4},
{M,8},{E,4},{E,4},{N,4},{P,4},{N,4},{M,4},{L,12},{L,4},
{F,4},{L,4},{M,4},{N,4},{P,4},{N,4},{N,4},{P,4},{Q,8},{0xff,8},{0xff,8},
{0,0xff},
};
uchar time_h,time_l;
void Delay(uchar x);

void main()
{
        uchar j;
        uint i;
        TMOD = 0x01;
        ET0 = 1;
        EA = 1;
        TR0 = 1;
        i = 0;
        j = 0;
        while(1)
        {
                while(display[i][1] != 0xff)
                {
                        if(display[i][0] == 0xff)
                        {
                                TR0 = 0;
                                Delay(display[i][1]);
                            BUZZER = 1;        
                        }
                        else
                        {
                                time_h = m_note[display[i][0]][0];
                                time_l = m_note[display[i][0]][1];
                                TH0 = time_h;
                                TL0 = time_l;
                                ET0 = 1;
                                TR0 = 1;
                                Delay(display[i][1]);
                                TR0 = 0;
                                ET0 = 0;
                            BUZZER = 1;        
                        }                        
                        i++;
                }
                i = 0;
        }
}

void Timer0() interrupt 1
{
        TR0 = 0;
        TH0 = time_h;
        TL0 = time_l;
        BUZZER = ~BUZZER;
        TR0 = 1;
}

void Delay(uchar x)
{
        uint i,j;
        for(i = 0;i < x;i++)
                for(j = 0;j < 12000;j++);
}

我自己跑了一下,效果大概如下:
在这里插入图片描述
妙啊!

### 无蜂鸣器的工作原理 无蜂鸣器需要输入特定频率的电信号才能发声,其工作原理基于电磁驱动或压电效应。当向无蜂鸣器施加直流电压时不会发出声音,只有通过提供周期性的方波或其他形式的交流信号,才能够使蜂鸣器振动并产生声音[^2]。 ### Proteus中的无蜂鸣器仿真设置 在Proteus中使用无蜂鸣器进行仿真的基本流程如下: #### 创建STM32CubeMX工程 利用STM32CubeMX工具配置GPIO端口作为PWM输出模式。具体来说,选择一个通用定时器(如TIM2或TIM3),并将对应的通道分配给某个GPIO引脚用于生成脉宽调制(PWM)信号[^1]。 #### 设计Proteus电路图 打开Proteus软件绘制电路图,在元件库找到Buzzer组件放置到画布上;注意区分有与无型号。对于无型,通常标注为“Passive Buzzer”。接着把MCU开发板上的指定IO口连接至该器件正极端子(+),另一负极接地(-)。 #### 编写控制代码 以下是实现简单音阶播放功能的一段示范代码片段: ```c #include "stm32f1xx_hal.h" #define BUZZER_PIN GPIO_PIN_0 #define BUZZER_GPIO_PORT GPIOA void buzz_init(void){ __HAL_RCC_TIM2_CLK_ENABLE(); TIM_HandleTypeDef htim; htim.Instance = TIM2; htim.Init.Prescaler = 84-1; // Assuming system clock is 84MHz, set prescale to get ~1KHz base frequency. htim.Init.CounterMode = TIM_COUNTERMODE_UP; htim.Init.Period = 999;// Set period value according to your desired note duration and resolution. HAL_TIM_PWM_Init(&htim); TIM_OC_InitTypeDef sConfigOC; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 500 ;// Initial duty cycle setting halfway through the range (adjustable). sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH ; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE ; HAL_TIM_PWM_ConfigChannel (&htim,&sConfigOC,TIM_CHANNEL_1); } void play_note(uint16_t freq,uint16_t ms_duration){ uint32_t tim_period=SystemCoreClock/freq -1; __HAL_TIM_SET_AUTORELOAD(TIM2,tim_period); delay_ms(ms_duration); } ``` 上述代码初始化了一个定时器来生成不同频率的声音信号,并定义了一个函数`play_note()`用来按照给定的时间长度播放指定频率的音符。 ### 总结 为了成功模拟无蜂鸣器的行为,必须确保微控制器能够发送适当变化的电子讯息序列到达目标设备接口处。这可以通过调节占空比或者切换高低逻辑状态达成目的。同时也要记得校准好硬件参数匹配实际应用场景需求。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值