第十节 蜂鸣器

2024-01-16 13:18
文章标签 第十节 蜂鸣器

本文主要是介绍第十节 蜂鸣器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第十节  蜂鸣器

    蜂鸣器是一种常用的报警设备,常用的蜂鸣器有无源和有源两种类型,无源蜂鸣器需要用一定频率的方波驱动,从而发出不同频率的声音。而有源蜂鸣器只需要通电就会发出固定频率的声音,MT254xboard开发板上的蜂鸣器用的是无源蜂鸣器,因此我们需要用一定频率的方波来驱动。


硬件驱动方面,我们这里使用了PNP三极管来驱动蜂鸣器,BUZZ引脚为芯片的P2.0。对照IO复用表可知,此IO可以作为定时器4的匹配通道1输出。所以我们需要把定时器配置为PWM匹配输出模式:

<span style="font-size:18px;">PERCFG |= (0x01<<4);   // 选择定时器4匹配功能中的第2种IO口P2DIR |= 0x01;          // p2.0  输出P2SEL |= 0x01;          // p2.0  复用功能T4CTL &= ~0x10;             // Stop timer 3 (if it was running)T4CTL |= 0x04;              // Clear timer 3T4CTL &= ~0x08;             // Disable Timer 3 overflow interruptsT4CTL |= 0x03;              // Timer 3 mode = 3 - Up/DownT4CCTL0 &= ~0x40;           // Disable channel 0 interruptsT4CCTL0 |= 0x04;            // Ch0 mode = compareT4CCTL0 |= 0x10;            // Ch0 output compare mode = toggle on compare</span>

这里仅仅是配置为匹配输出,具体输出什么样的波形还需要我们再通过计算得出。

<span style="font-size:18px;">void Buzzer_Start(uint16 frequency)
{P2SEL |= 0x01;          // p2.0  复用功能uint8 prescaler = 0;// Get current Timer tick divisor settinguint8 tickSpdDiv = (CLKCONSTA & 0x38)>>3;// Check if frequency too lowif (frequency < (244 >> tickSpdDiv)){   // 244 Hz = 32MHz / 256 (8bit counter) / 4 (up/down counter and toggle on compare) / 128 (max timer prescaler)Buzzer_Stop();                       // A lower tick speed will lower this number accordingly.}// Calculate nr of ticks required to achieve target frequencyuint32 ticks = (8000000/frequency) >> tickSpdDiv;      // 8000000 = 32M / 4;// Fit this into an 8bit counter using the timer prescalerwhile ((ticks & 0xFFFFFF00) != 0){ticks >>= 1;prescaler += 32;}// Update registersT4CTL &= ~0xE0;T4CTL |= prescaler;T4CC0 = (uint8)ticks;// Start timerT4CTL |= 0x10;
}</span>

这个函数是通过传入参数的形式,使P2.0口发出指定频率的方波。

<span style="font-size:18px;">void Buzzer_Stop(void)
{T4CTL &= ~0x10;             // Stop timer 3P2SEL &= ~0x01;P2_0 = 1;
}</span>

这个函数是使蜂鸣器停止,主要有三个动作,停止定时器,将P2.0配置为IO功能并且输出高电平,因为我们使用的是PNP三极管。
    我们在按键的程序上加上蜂鸣器的控制,当按下按键时,蜂鸣器响。松开后停止响。

<span style="font-size:18px;">int main(void)
{char LCDBuf[21]={0};            // 显存int KeyCnt = 0;SysStartXOSC();LCD12864_Init();LCD12864_DisStr(1, "    Buzzer Test");Buzzer_Init();P0SEL &= ~0X01; // 设置为IO功能P0DIR &= ~0X01; // 设置为输入功能P0IEN |= 0X01;  // P0.0 设置为中断方式PICTL |= 0X01;  // 下降沿触发IEN1 |= 0X20;   // 允许P0口中断P0IFG = 0x00;   // 清除中断标志位EA = 1;         // 开总中断sprintf(LCDBuf, "   Key Count : %d", KeyCnt++);    // 按键计数LCD12864_DisStr(3, LCDBuf);while(1){if(KEY_DOWN == NewKeyValue)  // 按键按下{SoftWaitUs(25000);       // 延时防抖if((P0&0X01) == 0X00)   // 再次确认按键是否按下{sprintf(LCDBuf, "   Key Count : %d", KeyCnt++);    // 按键计数LCD12864_DisStr(3, "    Buzzer Start");Buzzer_Start(2000);}else{NewKeyValue = KEY_UP;   // 按键松开Buzzer_Stop();LCD12864_DisStr(3, "    Buzzer Stop");}}}return 0;
}</span>

本文章转载自
http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/t/69222.aspx
请勿用于商业

这篇关于第十节 蜂鸣器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/612720

相关文章

Circuit Design 三极管驱动蜂鸣器电路 及 蜂鸣器两端电压正确但是不响的解决方案

利用三极管进行电流放大的蜂鸣器驱动电路图: (百度图片找的) 我用有源蜂鸣器实现的这个电路,但是蜂鸣器不响。 details: 1. VCC =5V 蜂鸣器两端的直接电压约为4.5V, 但是蜂鸣器不响。 2. 将蜂鸣器直接接在4.5V的电源两端,蜂鸣器响。(说明蜂鸣器是好的) 3. 测了三极管各个管脚的电压, 和理论上的是一致的。 情况很奇怪,换了好几个三极管结果都是一样的,

s3c2440---PWM使用之蜂鸣器驱动移植

一、蜂鸣器驱动介绍 1.1.什么是蜂鸣器               蜂鸣器是一种简单的声响发生器,常用于电子产品中作为警示或提醒作用。其基本原理是通过交替改变直流电的电压方向来产生声音,一般使用交替电流产生声音会比较稳定。 1.2.蜂鸣器的类别 1.有源蜂鸣器 1)结构原理 有源蜂鸣器内部自带振荡源,只需接通电源即可发声。内部电路会自动产生一定频率的振荡信号,从而驱动蜂鸣器发声。

51单片机——蜂鸣器

1、蜂鸣器简介 蜂鸣器是一种将电信号转换为声音信号的器件,常用来产生设备的按键音、报警音等提示信号。 蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器 。 有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定 无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音 2、驱动电路 三极管驱动 NPN高电平导通

蜂鸣器奏乐

一、粗略了解简谱 拍号:如图,“2”表示一个小节有2拍,“4”表示4分音符为一拍 终止线表示歌曲结束 注意:以下音符都按以四分音符为一拍计算拍数 四分音符: 唱一拍 二分音符: 某一个音右边有一个小横线,这个音唱两拍 全音符 某一个音右边有4个小横线,这个音唱四拍 八分音符 下面有一个横线的,这个音唱半拍 十六分音符 某个音下面有两个横线,这个音唱

51单片机.之蜂鸣器振动播放歌曲

蜂鸣器发声是通过喇叭振动发声的,通电产生磁场,磁铁吸收,而振动。不断释放,吸收。 1、蜂鸣器发声,播放不同频率的声音逐渐变尖 #include<reg52.h>sbit BUZZ = P1^6;unsigned char T0RH=0;unsigned char T0RL=0;void OpenBuzz(unsigned int frequ);void StopBuzz();void

使用HAL库实现按键控制LED和蜂鸣器

下载STM32CubeMX实现项目的初始配置(寄存器操作),下载keil对程序进行编译烧写 在STM32CubeMX中将PB0/PB1设置为输入引脚作为按键,PA6/PA4设置为输出引脚作为led和Beep,将按键引脚设置为上拉输入: 创建项目完成后在kei中写代码: 最后可以在自己的开发板上试试啦!

01:【江科大stm32】:LED闪烁/LED流水灯/蜂鸣器

1、LED闪烁程序 /*LED灯闪烁,LED正极连接电源,负极连接PA0引脚,所以输出0点亮,输出1熄灭*/#include "stm32f10x.h" #include "Delay.h"int main(void){//1. 使能挂载在APB2总线上面的片上外设时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,E

6410裸板程序,led、蜂鸣器、按键…

//***************************************************************** //作者:昊天 // //功能:在ok6410板子上跑裸板程序,用四个按键控制四个led灯的两灭及蜂鸣器的叫声, //       当按键1按下时(此时为低电平)点亮led1同时蜂鸣器响,当松手时,led1灭及蜂鸣器不响     //

stm32学习笔记---GPIO输出(代码部分)LED闪烁/流水灯/蜂鸣器

目录 面包板的使用方法 第一个演示代码:LED闪烁 最后一次快速新建工程演示 点击新建工程 选择芯片 在工程文件夹中创建Start、Library、User Start文件夹的必备文件复制操作 Library文件夹的必备文件复制操作 User文件夹的必备文件复制操作 在keil中创建Start、Library、User分组并添加文件 添加Start、Library、User文

smart210 linux3.0.8内核蜂鸣器pwm驱动分析

刚刚移植这个pwm驱动到linux3.7.4,发现了一些问题,所以把这个3.0.8的pwm驱动看看,友善带的pwm驱动为mini210-pwm.c,这个只是这个驱动的一部分,直接搬到3.7.4内核下不能用,让我们来好好看看这个驱动的实现吧 static int __init mini210_pwm_dev_init(void) {int ret;ret = gpio_request(BUZZ