蜂鸣器按键控制

合集下载

蜂鸣器和弦音发声控制

蜂鸣器和弦音发声控制

蜂鸣器和弦音发声控制前言:现在一些带按键显示控制面板的家电(比较常见的是柜式空调)在按键操作的时候会有悦耳的和弦音发出,特别是开关机或操作上下键时会有不同变调的和弦音,相比普通的嘀嘀声给人更愉悦的操作体验。

1.控制方式说明此处以型号为SH2225T2PA的蜂鸣器(谐振频率2.6KHz)为例。

蜂鸣器模块有两个驱动引脚与MCU相连,一个是振荡信号输入引脚,由MCU提供相应频率的方波信号驱动蜂鸣器发声,一个是供电控制端,供电切断后蜂鸣器靠电解电容放电维持其发声,会有音量渐渐变小的效果。

原理图如下所示,MC9为供电控制端,MC8为振荡信号输入端。

MC9为高电平时,三极管Q4导通,然后Q2导通,蜂鸣器开始供电,同时电容CD2充电。

若MC8有一定频率的方波信号发出,则蜂鸣器可发出鸣叫。

若此时先关掉供电,即MC9置低电平,MC8依然发出方波信号,则蜂鸣器可依靠CD2放电发出声音,但随着电容电量减少,音量会逐渐减小,形成蜂鸣声渐隐的和弦音效果。

要实现变调的效果,则可通过短时间内切换发出几种不同频率的蜂鸣声来实现。

以下是3种比较典型的和弦音的实现细节:(符号说明:Tf:频率给定持续时间(ms)Tv:电压给定持续时间(ms)F:输出频率(KHz))单声和弦音:短暂鸣响后音量渐隐▪F=2.6,Tv=200,Tf=1000开机和弦音:三升调,按音调分3个阶段1.F=2.3,Tv=200,Tf=2002.F=2.6,Tv=200,Tf=2003.F=2.9,Tv=100,Tf=2100关机和弦音:三降调,按音调分3个阶段1.F=2.9,Tv=200,Tf=2002.F=2.6,Tv=200,Tf=2003.F=2.3,Tv=100,Tf=21002.编程实例MCU:STM8S903K3 开发环境:STVD 4.1.6+Cosmic 4.2.8/* buzzer.h文件*/[Copy to clipboard]View Code C1 2 3 4 5 6 #ifndef __BUZZER_H #define __BUZZER_H#include "common.h" #include "beep.h" typedef enum7 8 91011121314151617181920212223 {MONO =0,//单音POLY_ON =1,//开机和弦POLY_OFF =2//关机和弦}Tone_Type;//蜂鸣器声音类型typedef struct{FREQ_Type Freq;//频率u8 OSCTime;//振荡持续时间,最小单位为10ms u8 PWRTime;//供电持续时间,最小单位为10ms } TONE_Def;//音调结构体void BuzzerStart(Tone_Type ToneType); void BuzzerCtrl(void);#endif /* __BUZZER_H *//* buzzer.c文件*/[Copy to clipboard]View Code C1 2 3 4 5 6 7 8 910111213141516171819 #include "buzzer.h"const TONE_Def Tone1[]={{FREQ_2K6,100,20},{FREQ_NO,0,0}};//单音const TONE_Def Tone2[]={{FREQ_2K3,20,20},{FREQ_2K6,20,20},{FREQ_2K9,210,10},{FREQ_NO,0,0}};//开机和弦音const TONE_Def Tone3[]={{FREQ_2K9,20,20},{FREQ_2K6,20,20},{FREQ_2K3,210,10},{FREQ_NO,0,0}};//关机和弦音TONE_Def * pTone;static u8 BuzzerStatus =0;//蜂鸣器启动,需要发声时调用void BuzzerStart(Tone_Type ToneType){switch(ToneType){case MONO:pTone = Tone1;break;case POLY_ON:20212223242526272829303132333435363738 pTone = Tone2;break;case POLY_OFF:pTone = Tone3;break;default:pTone = Tone1;break;}BuzzerStatus =0;}//蜂鸣器控制,每10ms执行一次void BuzzerCtrl(void){static TONE_Def Tone;switch(BuzzerStatus){39404142434445464748495051525354555657case0:Tone =*pTone;if(Tone.Freq!= FREQ_NO)//非结束符{//先判断供电持续时间if(Tone.PWRTime!=0){Tone.PWRTime--;BeepPwrOn();}else{BuzzerStatus =2;break;}//再判断振荡持续时间if(Tone.OSCTime!=0){Tone.OSCTime--;58596061626364656667686970717273747576 BEEP_SetFreq(Tone.Freq);BEEP_On();}else{BeepPwrOff();BuzzerStatus =2;break;}//判断完成,开始递减计时BuzzerStatus =1;}else/* Tone.Freq == FREQ_NO *///是结束符{BuzzerStatus =2;}break;case1:if(Tone.PWRTime!=0)77787980818283848586878889909192939495{Tone.PWRTime--;}else{BeepPwrOff();}if(Tone.OSCTime!=0){Tone.OSCTime--;}else{BEEP_Off();pTone ++;//取下一个音调 BuzzerStatus =0;}break;default:9697break; }}以上代码中,BEEP_Off(),BEEP_On(),BeepPwrOff(),BEEP_SetFreq()都在头文件beep.h中声明,由底层代码实现。

按键计数蜂鸣器实验报告(3篇)

按键计数蜂鸣器实验报告(3篇)

第1篇一、实验目的1. 了解按键电路的工作原理。

2. 掌握蜂鸣器的工作原理及其控制方法。

3. 学习使用C语言进行嵌入式编程。

4. 培养动手实践能力和团队合作精神。

二、实验原理1. 按键电路:按键电路由按键、上拉电阻和下拉电阻组成。

当按键未被按下时,上拉电阻将输入端拉高;当按键被按下时,下拉电阻将输入端拉低。

2. 蜂鸣器电路:蜂鸣器是一种发声元件,其工作原理是利用电磁铁的磁力使振动膜片振动,从而产生声音。

蜂鸣器的控制主要通过改变输入信号的频率来实现。

3. 计数原理:通过按键输入信号,实现计数器的计数功能。

当按键被按下时,计数器加一;当按键被连续按下时,计数器的计数值随之增加。

三、实验器材1. 单片机开发板(如STC89C52)2. 按键3. 蜂鸣器4. 电阻5. 接线6. 电脑7. 调试软件(如Keil uVision)四、实验步骤1. 设计电路图:根据实验要求,设计按键、蜂鸣器和单片机的连接电路图。

2. 编写程序:使用C语言编写程序,实现按键计数和蜂鸣器控制功能。

3. 编译程序:将编写好的程序编译成机器码。

4. 烧录程序:将编译好的机器码烧录到单片机中。

5. 调试程序:通过调试软件对程序进行调试,确保程序正常运行。

6. 测试实验:将单片机连接到实验电路中,进行按键计数和蜂鸣器控制测试。

五、实验代码```cinclude <reg52.h>define uchar unsigned chardefine uint unsigned intsbit key = P3^2; // 按键连接到P3.2端口sbit buzzer = P1^0; // 蜂鸣器连接到P1.0端口uchar count = 0; // 计数器void delay(uint t) {uint i, j;for (i = 0; i < t; i++)for (j = 0; j < 127; j++);}void buzzer_on() {buzzer = 0; // 使蜂鸣器发声}void buzzer_off() {buzzer = 1; // 使蜂鸣器停止发声}void main() {while (1) {if (key == 0) { // 检测按键是否被按下delay(10); // 消抖if (key == 0) {count++; // 计数器加一buzzer_on(); // 使蜂鸣器发声delay(500); // 发声时间buzzer_off(); // 停止发声}}}}```六、实验结果与分析1. 当按键未被按下时,蜂鸣器不发声。

51单片机通过按键控制蜂鸣器发生详解

51单片机通过按键控制蜂鸣器发生详解

单片机开发报告院系:电子工程学院专业:自动化班级:自动化1401学号:8姓名:越指导老师:星光2018年01 月04 日一.系统任务按键控制蜂鸣器发声二.电路原理图三.程序设计容“叮咚”电子门铃实验程序:常见的家用电子门铃在有客人来访时候,如果按压门铃按钮时,室会发出“叮咚”声音,本实验程序模拟电子门铃的发音,当我们按压实验板上的K1按钮时候,蜂鸣器发出“叮咚”音乐声,是一个比较实用的程序。

使用无源蜂鸣器输出7个基本音阶声音是由物体振动所产生的。

只是由于物体的材料以及振幅、频率不同,而产生不同的声音。

声音的响度是由振幅决定的,而音调则是由频率决定的,那么我们只需要控制物体振动的频率,就可以发出固定的声调。

五.汇编程序ORG 0000HAJMP STARTORG 000BHINC 20H ;中断服务,中断计数器加1MOV TH0,#0D8HMOV TL0,#0F0H 12M晶振,形成10毫秒中断RETIORG 001BHLJMP INTT1 ;跳转到T1中断服务程序START: MOV DPTR,#00H ;初始化程序MOV A,#00HOBUF1 EQU 30HOBUF2 EQU 31HOBUF3 EQU 32HOBUF4 EQU 33HFLAGB BIT 00HSTOPB BIT 01HMOV SP,#50HMOV TH0,#0D8HMOV TL0,#0F0HMOV TMOD,#21HMOV TH1,#09HMOV TL1,#09HMOV IE,#8AHAJMP LOOPLOOP: JNB P3.2,MUSIC0JNB P3.1,MAINAJMP LOOPMAIN:JB P3.1,MAIN ;检测p3.1按钮LCALL YS10M ;延时去抖动JB P3.1,MAINSETB TR1 ;按钮有效MOV OBUF1,#00HMOV OBUF2,#00HMOV OBUF3,#00HMOV OBUF4,#00HCLR FLAGBCLR STOPBJNB STOPB,$AJMP START ;发出“叮咚”完毕,返回重新检测按钮YS10M: ;10ms延时子程序MOV R6,#20D1:MOV R7,#100DJNZ R7,$DJNZ R6,D1RETTING: AJMP STARTINTT1: ;定时器T1中断服务程序INC OBUF3 ;中断服务程序中发出一声“叮咚”响声MOV A,OBUF3CJNE A,#100,NEXTMOV OBUF3,#00HINC OBUF4MOV A,OBUF4CJNE A,#20,NEXTMOV OBUF4,#00HJB FLAGB,PGSTPCPL FLAGBAJMP NEXT PGSTP:SETB STOPBCLR TR1LJMP INT0RET NEXT:JB FLAGB,SOU2INC OBUF2MOV A,OBUF2CJNE A,#04H,INT0RETMOV OBUF2,#00HCPL P1.5LJMP INT0RETSOU2:INC OBUF1MOV A,OBUF1CJNE A,#05H,INT0RETMOV OBUF1,#00HCPL P1.5INT0RET:RETIMUSIC0: JB p3.2,MUSIC0LCALL YS10MJB p3.2,MUSIC0NOPMOV DPTR,#DAT 表头地址送DPTRMOV 20H,#00H ;中断计数器清0MOV B,#00H ;表序号清0 MAIN2: JNB P3.3,TINGCLR AMOVC A,A+DPTR ;查表取代码JZ END0 ;是00H,则结束CJNE A,#0FFH,MUSIC5LJMP MUSIC3MUSIC5:NOPMOV R6,AINC DPTRMOV A,BMOVC A,A+DPTR ;取节拍代码送R7MOV R7,ASETB TR0 ;启动计数MUSIC2:NOPCPL P1.5MOV A,R6MOV R3,ALCALL DELMOV A,R7CJNE A,20H,MUSIC2 ;中断计数器(20H)=R7否?;不等,则继续循环MOV 20H,#00H ;等于,则取下一代码INC DPTRINC BLJMP MAIN2MUSIC3: ;休止100毫秒NOPCLR TR0MOV R2,#0DHMUSIC4:NOPMOV R3,#0FFHLCALL DELDJNZ R2,MUSIC4INC DPTRLJMP MAIN2NOPMOV R2,#0FFH ;歌曲结束,延时MUSIC6:MOV R3,#00HLCALL DELDJNZ R2,MUSIC6CLR TR0LJMP LOOPDEL:NOPDEL3:MOV R4,#03HDEL4:NOPDJNZ R4,DEL4NOPDJNZ R3,DEL3RETDENG1: MOV R3,#64HDJNZ R3,$AJMP MAINDB30h,30h,26h,26h,20h,20h,1ch,1ch,1ah,1ah,18h,18h,00h END六、程序下载及调试步骤:1.点击translate 按钮预编译2.点击build 按钮编译3.点击rebuild 按钮编译所有目标4.打开普中烧录软件5.点击程序下载. . .. .. .四.程序流程图。

gpio按键控制蜂鸣器响实验心得

gpio按键控制蜂鸣器响实验心得

gpio按键控制蜂鸣器响实验心得
最近,我进行了一个有关GPIO按键控制蜂鸣器响的实验,并取得了一些有趣的结果。

在此分享我的实验心得。

在实验前,我先准备了一个树莓派和一个蜂鸣器,接下来通过GPIO 引脚将它们连接起来。

然后,我使用Python编程语言编写了一个简单的代码来控制蜂鸣器的工作。

该代码使用了GPIO库来读取按键的输入状态,并根据按键的状态来控制蜂鸣器的响声。

在实验过程中,我发现了一些有趣的现象。

首先,当按下按键时,蜂鸣器会发出一声短促的响声。

这是因为按键按下时,GPIO引脚会发送一个高电平信号,导致蜂鸣器工作。

当释放按键时,蜂鸣器停止响声。

这是因为GPIO引脚发送了一个低电平信号,使蜂鸣器停止工作。

此外,我还尝试了不同的按键操作,例如长按、快速连续按等。

我发现,当我长按按键时,蜂鸣器会持续不断地发出响声。

这是因为GPIO 引脚一直发送高电平信号,使蜂鸣器保持工作状态。

而当我快速连续按下按键时,蜂鸣器会发出一系列短促的响声。

这是因为GPIO引脚在每次按下按键时都会发送高电平信号,然后在按键释放后发送低电平信号,使蜂鸣器停止工作。

通过这个实验,我不仅学习到了如何使用GPIO引脚来控制蜂鸣器的
工作,还深入了解了按键的工作原理。

我还发现,通过合理的编程方式,可以实现按键的不同操作,从而控制蜂鸣器发出不同的声音。

这对于一些交互式的项目来说,非常有用。

总的来说,这个实验让我对GPIO按键控制蜂鸣器有了更深入的了解。

我将继续探索GPIO的其他应用,并尝试更复杂的实验,以提升我的编程和电子技能。

单片机学习(四)蜂鸣器和独立按键的使用

单片机学习(四)蜂鸣器和独立按键的使用

单⽚机学习(四)蜂鸣器和独⽴按键的使⽤⽬录蜂鸣器两种蜂鸣器的介绍有源蜂鸣器⼀般是输⼊⼀个电流或电压即可直接驱动⼯作,⽽⽆源蜂鸣器则需要输⼊脉冲信号才可以进⾏⼯作。

在51单⽚机开发板上的即为⽆源蜂鸣器。

蜂鸣器相关电路图可以看出,信号是通过P15传递到ULN2003D芯⽚后进⽽传递到芯⽚的OUT5(即BEEP端⼝)再传递到蜂鸣器中的,其中ULN2003D芯⽚起着电流放⼤的作⽤。

控制代码⾸先我们先获得控制蜂鸣器的引脚,从电路图可以看出是P15,所以:sbit BEEP= P1^5;因为这是⽆源蜂鸣器,所以我们需要给它提供脉冲信号输⼊才能使它⼯作。

⽽当BEEP为0时有电流,BEEP为1时⽆电流,所以我们需要循环改变BEEP的值,主函数代码如下所⽰:int main() {while (1){BEEP = ~BEEP;deley(10);}}如果我们希望改变蜂鸣器的⾳调,只需要改变脉冲信号的频率即可,也就是while循环中deley()的参数。

我们也可以不断改变deley()中填⼊的参数来使蜂鸣器发出奇怪的声⾳ :int main() {u16 time = 10;u8 cnts = 50;u8 i;for(time=10;time<200;time++) {for(i=0;i<cnts;i++) {BEEP = ~BEEP;deley(time);}}}独⽴按键独⽴按键电路图可以看到,这4个独⽴按键都是⼀端和单⽚机的引脚(P3[0..3])相连,⽽另⼀端直接接地的。

这些按键的效果是,当按键没有按下时,它们对应的端⼝的输出是⾼电平,⽽当按键按下之后,这些端⼝的输出则变为低电平了。

因此我们可以使⽤轮询的⽅式查看这些端⼝的电平情况来检测按钮是否被按下,如果按下,则我们可以进⾏计数等控制其他元件的操作。

按键控制⼀个LED的点亮和熄灭我们希望当点击按键时,第⼀个LED点亮,⽽在此单击时则熄灭。

按照之前的思路,我们很容易就能写出对应的控制代码:sbit OneLED = P2^0; // 使⽤OneLED来控制对应的引脚的输出sbit k1 = P3^1;void keypros() {if (k1 == 0) {deley(1000); // 消抖if (k1 == 0) {OneLED = ~OneLED;}while (!k1);}}int main() {while (1) {keypros();}}重要的是keypros()函数中的内容,当我们点击第⼀个按钮时,k1的值会变为0,因此我们进⾏轮询的时候就会进⼊到keypros()函数的第⼀个if中。

arm开发板的关于控制灯亮,蜂鸣器以及按键的简单编程

arm开发板的关于控制灯亮,蜂鸣器以及按键的简单编程

我的开发板是s3c2440。

程序简介:开发板有4个灯,6个按键,通过程序实现通过按下按键来使灯亮或灯灭,而且按键让蜂鸣器发声。

编程流程:要是灯亮,必须要知道控制灯的寄存器,当然也要知道按键和蜂鸣器的控制器。

这就要查询开发板的原理图和开发板手册了。

灯为led你通过搜索原理图,会找到对应的灯的电路的连接,如下图:然后你会发现与led连接的是nled,然后搜索nled,得到下图:看此图,你会发现控制4个灯的分别是GPB5,GPB6,GPB7,GPB8,这样你就可以在开发板的手册上查询GPB的内存地址了。

如下图:上面图片的解释:GPBCON是灯的控制器,GPBDAT是灯的状态。

灯亮是“输出”,因此GPBCON 相应的位为01.长话短说吧:也就是说要控制灯1亮,首先设置GPBCON的10-11位为01,然后设置状态GPBDAT第5位为0(灯是低电平有效).这样灯就亮了。

可能理论不好理解。

下面先附上源代码:#include "y1.h" //我的头文件,自己实现吧,名字可以改变#define GPBCON (*(volatile unsigned *)0x56000010) //灯的控制寄存器的内存地址#define GPBDAT (*(volatile unsigned *)0x56000014) //灯的状态寄存器的内存地址(低电平有效)#define GPGCON (*(volatile unsigned *)0x56000060) //蜂鸣器的控制寄存器内存地址#define GPGDAT (*(volatile unsigned *)0x56000064) //蜂鸣器的状态寄存器内存地址(高电平有效)void led_on(int i){ //使灯亮的函数if(i>4) i = i%4;GPBDAT = GPBDAT & ~(1<<(i+5));}void led_off(int i){ //使灯灭的函数if(i>4) i = i%4;GPBDAT = GPBDAT | (1<<(i+5));}void init(){ //主函数要调用的方法,寄存器的初始化int i1,i2,i3,i4,i5;GPBCON = 0X15401;GPGCON = 0;GPGDAT = 0xffff;led_off(0);led_off(1);led_off(2);led_off(3);while(1){i1 = GPGDAT & 1;if(i1 == 1){led_off(0);}else{led_on(0);}i2 = GPGDAT >> 3 & 1; if(i2 == 1){led_off(1);}else{led_on(1);}i3 = GPGDAT >> 5 & 1 ; if(i3 == 1){led_off(2);}else{led_on(2);}i4 = GPGDAT >> 6 & 1 ; if(i4 == 1){led_off(3);}else{led_on(3);}i5 = GPGDAT >> 7 & 1 ; if(i5 == 1){ GPBDAT = 0x1e0;}else{GPBDAT = 1;}}}void delay(){ //延迟函数int i,j;for(i=0;i<200;i++)for(j=0;j<65536;j++);}。

AD按键扫描与蜂鸣器

AD按键扫描与蜂鸣器
ADIE=1; //A/D转换中断允许
PEIE=1; //外围中断允许
GIE=1;
TMR1ON=1; //开定时中断
INTCON=0xC0;
TMR1IF=0;
TMR1IE=1;
PIE1=0X00;
PIE2=0X00;
ADIF=0; //A/D转换中断允许
//补充说明,以上的内容为寄存器配置,每种不同的单片机会有点差异,
//大家不用过度关注以上寄存器的配置,只要知道有这么一回事即可
beep_dr=0; //关蜂鸣器,上电初始化IO
while(1)
{
CLRWDT(); //喂看门狗,大家不用过度关注此行
ad_samping(); //AD采样
key_service(); //按键服务
}
}
void key_scan() //按键扫描函数
{
if(key_value>cnt_key_nc) //空闲,没有按下
//补充说明:吴坚鸿程序风格是这样的,凡是做类型的变量的分类
//后缀都用_sec表示。
Unsigned char key_sec=0; //哪个按键被触发
//补充说明:吴坚鸿程序风格是这样的,凡是只有两种状态(0或者1)的变量,
//后缀都用_flag表示。
Unsigned char AD_Flag=0; //用来指示单片机内部硬件AD处理完成的标志
(a)用4个电阻竖着串联起来,最上端接5V,最下端接地。从上往下,最上端接5V的算第一个节点,最下端接地算最后一个节点,共5个节点。用一个带AD的IO口连接到第2个节点上,此节点上连接第一个按键,按键的另一端接地。以此方式,第二个按键连接到第3个节点,第三个按键连接到第4个节点。这4个电阻的目的主要是用来分压,靠不同的电压来识别不同的按键。

单片机按键控制蜂鸣器发声程序

单片机按键控制蜂鸣器发声程序
void Time0_Init()//定时器T0方式1,定时10ms
{
TMOD = 0x01;
IE= 0x82;
TH0 = 0xDC;
TL0 = 0x00;
}
void Time0_Int() interrupt 1
{
TH0 = 0xDC;
TL0 = 0x00;
Count++;
}
void delay (uint8 k)//按键防抖延时
{
return;
}
else
{
Temp2 = SONG[Addr++];
TR0 = 1;
while(1)
{
Speak = ~Speak;
Delay_xMs(Temp1);
if(Temp2 == Count)
{CΒιβλιοθήκη unt = 0;break;
}
}
}
}
}
void keyscan (void)//按键切换声音函数
单片机按键控制蜂鸣器发声程序单片机蜂鸣器音乐程序单片机蜂鸣器程序单片机蜂鸣器报警程序蜂鸣器发声程序单片机按键程序单片机独立按键程序单片机按键扫描程序单片机按键消抖程序单片机按键中断程序
#include<reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
{
uint8 Temp1,Temp2;
uint8 Addr;
Count = 0;//中断计数器清0
Addr = i *3;
while(1)
{
Temp1 = SONG[Addr++];

单片机原理及应用A实验-流水灯、蜂鸣器、独立按键

单片机原理及应用A实验-流水灯、蜂鸣器、独立按键

流水灯、蜂鸣器、独立按键一、实验目的1、学习实验系统的基本操作,了解在实验系统中进行程序设计、仿真和调试的操作方法和步骤;2、了解单片机的基本输入、输出功能;3、熟悉Proteus的基本仿真功能;二、实验原理1、LED流水灯的原理即为单个控制LED的亮灭、亮灭,让单个LED灯先亮然后很快灭掉,并在很短的时间里使下一个LED重复这一过程。

这样让一排LED灯依次亮灭后即形成流水灯的效果。

2、在本次实验中把蜂鸣器用扬声器替代,通过控制扬声器工作时间来控制扬声器的发音频率。

3、按键是机械装置,在其闭合的时候会产生震荡,这会让软件产生误判。

为了消除这种影响,就需要对按键进行软件消抖。

消抖原理为两次判断,只要相隔一段时间的两次判断皆为按键已按下,那么这次的判断结果就是可信的,所以用到延时函数。

三、实验步骤;1、硬件仿真。

先分析实验所需的硬件条件,然后在Proteus上连接好硬件电路,注意连接好必要的电阻等。

2、软件编写。

在Keil或其它的单片机编程软件上用C语言编写出构思好的软件。

3、将程序编译为HEX文件,然后烧录到仿真单片机中,进行仿真。

四、实验结果及分析1、LED流水灯的硬件仿真电路图:实验中加入了循环处理,所以该流水灯可以顺着亮一遍再逆着亮一遍,如此反复。

并且改变流水灯亮灭的时间间隔还可以得到各种不同的效果。

2、蜂鸣器驱动的硬件仿真电路图:这里用扬声器代替蜂鸣器。

以单片机产生的一方波脉冲作为扬声器的电信号输入,用不同频率的方波信号产生不同音调的声音。

3、;4、独立按键延时去抖的硬件仿真电路图:用一个按键控制LED灯的亮灭,在软件中对按键进行消抖。

五、体会这一次的单片机实验让我感到自己对Proteus的运用还欠缺许多,基本可以说是一窍不通。

所以,这次实验以后还要花大量的时间在Proteus的学习上,希望可以从中学习到很多的东西。

还有在编程方面,很多的编程思想都还不成熟,想到的方法都有很多欠缺的地方,和书上所给的例子差距还很大。

单片机使用4个独立按键控制蜂鸣器代码

单片机使用4个独立按键控制蜂鸣器代码

单片机使用4个独立按键控制蜂鸣器代码下面是使用单片机控制蜂鸣器,使用4个独立按键的示例代码:```c#include <reg52.h> // 8052 单片机头文件sbit beep=P1^5; // 将蜂鸣器引脚定义为 P1.5sbit key1=P3^1; // 定义四个按键引脚为 P3.1 到 P3.4sbit key2=P3^2;sbit key3=P3^3;sbit key4=P3^4;void delay(unsigned int t) // 延时函数{unsigned int i,j;for(i=0;i<t;i++)for(j=0;j<125;j++);}void main(){beep = 0; // 蜂鸣器关闭while(1){if(key1 == 0) // 首先检测按键1是否按下{beep = ~beep; // 取反控制蜂鸣器开/关delay(500); // 延时以避免误触}else if(key2 == 0) // 随后检测按键2是否按下{beep = 0; // 关闭蜂鸣器delay(500);}else if(key3 == 0) // 然后检测按键3是否按下{beep = 1; // 打开蜂鸣器delay(500);}else if(key4 == 0) // 最后检测按键4是否按下{beep = 0; // 关闭蜂鸣器delay(500);}}}```在上述代码中,我们首先定义了蜂鸣器引脚 `beep`,以及四个按键引脚 `key1` 到 `key4`。

然后,我们通过 `delay` 函数来延时防止误碰。

在无限循环中,我们检测四个按键的状态,如果有按键被按下,我们会对蜂鸣器进行相应的操作。

按键1控制开/关蜂鸣器,按键2关闭蜂鸣器,按键3打开蜂鸣器,按键4同样关闭蜂鸣器。

《单片机技术及应用》教学课件 项目2 任务一 按键轮询控制蜂鸣器发声全文

《单片机技术及应用》教学课件 项目2 任务一 按键轮询控制蜂鸣器发声全文

分类
本任务中所采用蜂鸣器为有源蜂鸣器其驱动电路如右图所示。
1
2
3
4
5
蜂鸣器原理 按键的工作原理
按键电路原理图 程序流程图 主要代码分析
按键的工作原理
1
2
按键的分类
独立式按键 电路介绍
3
4
按键消抖 按键的击键类型
触点式开关按键,如机械式开关、导电橡胶式开关等; 无触点式开关按键,如电气式按键,磁感应按键等。
02 任务描述与要求 04 知识储备 06 任务检查与评价 08 任务拓展
根据所学相关知识, 请制订完成本次任务的实施计划。
2.1按键轮询控制蜂鸣器发声
01 职业能力目标 03 任务分析与计划 05 任务实施 07 任务小结
02 任务描述与要求 04 知识储备 06 任务检查与评价 08 任务拓展
能根据功能需求,熟练掌握按键轮询的编程思路, 实现按键控制蜂鸣器发声功能。
2.1 按键轮询控制蜂鸣器发声
01 职业能力目标 03 任务分析与计划 05 任务实施 07 任务小结
02 任务描述与要求 04 知识储备 06 任务检查与评价 08 任务拓展
• 任务描述: XX公司研发一款新产品——电子门铃,要求能
项目二 电子门铃
单元阐述:
现今随着科学技术的发展,人们的生活 正朝着智能化的方向发展,电子门铃便是其 中之一。
本项目中,使用压电模块模拟电子门铃 开关,使用蜂鸣器模拟门铃的喇叭,大家也 来试试,当我们按下压电开关时,蜂鸣器是 否发声呢?
2.1 按键轮询控制蜂鸣器发声
知识目标:
1. 掌握按键控制的方法(轮询方式) 2. 掌握蜂鸣器使用方法
项目二 电子门铃
引导案例:

使用按键自动控制LED闪烁及蜂鸣器鸣叫—LED闪烁与蜂鸣器鸣叫程序编写

使用按键自动控制LED闪烁及蜂鸣器鸣叫—LED闪烁与蜂鸣器鸣叫程序编写
2、完成本次任务要用到所复习的哪些知识点?
本次任务与前面所使用的按键控制LED灯亮灭有什么区别?
2 工作任务
(1)第一次按下按钮,LED灯持续闪亮,蜂鸣器鸣叫 (2)第二次按下按钮,LED灯熄灭,蜂鸣器停止鸣叫; (3)以后根据按键次数一直重复步骤1和2的现象。
3 知识准备: 蜂鸣器
1、作用:蜂鸣器是一种一体化结构的电子讯响器,广泛 应用于计算机、打印机、复印机、报警器、电话机等电 子产品中作发声器件
int main()
{int num=0;
//按键次数记录(初值赋0)
while ( 1 )
{if( k==0)
{delay(1000);
//延时重新判断按键是否按下,
延时消除抖动
if( k==0)
{num++;
if(num==1) flasher ();
buzzer();
if(num==2)num=0;
#define uint unsigned int
#define uchar unsigned char
sbit k=P1^1;
//定义P1.1引脚名为独立按键k
sbit led=P1^0;
//定义P1.0引脚名led
sbit buzzer=P2^0;
//定义P2.0引脚名为buzzer
/*延时函数*/
5
编写程序
(1)任务分析
① 程序流程图
说明:因为按一次为奇 数次点亮和鸣叫,按第 二次为偶数次熄灭和停 止鸣叫,以后一直循环, 所以可以通过判断按键 次数是奇数还是偶数来 控制LED灯和蜂鸣器
② 端口分配
单片机端口
驱动模块端口
P1.0
LED1

FPGA蜂鸣器发声控制设计

FPGA蜂鸣器发声控制设计

实验一蜂鸣器实验【实验目的】1、理解蜂鸣器的工作原理。

2、学习FPGA控制蜂鸣器的设计方法。

【实验设备】1、带有quartusII软件的PC机一台。

2、FPGA实验箱以及电源线下载线。

【实验要求】1、理解蜂鸣器原理。

2、实现按键控制蜂鸣器音调改变。

【实验原理】1、蜂鸣器原理:蜂鸣器的原理是非常简单的,我们所要了解的就是它能在不同频率脉冲下产生不同的音调,我们听到的音调一般在350HZ左右,而我们开发板的时钟频率是50MHZ,所以事先我们先进行分频,本实验中我们根据50000000/350,来大致确定分频系数,我进行了120000分频,同学们在可听到的声音范围内可自由设置分频系数;设置通过按键来调节声音的频率,来改变音调,本实验中每次调节最少使分频系数增加10000,这样使音调变化比较明显。

图错误!文档中没有指定样式的文字。

.1蜂鸣器连接图。

图错误!文档中没有指定样式的文字。

.1 蜂鸣器连接图如图所示,蜂鸣器的正极接到VCC(+5V)电源上面,蜂鸣器的负极接到三极管的发射极E,三极管的基级B经过限流电阻后由FPGA的引脚控制,当IO口输出高电平时,三极管截止,没有电流流过线圈,蜂鸣器不发声;当输出低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。

程序中改变FPGA的IO输出波形的频率,就可以调整控制蜂鸣器音调。

另外,改变IO输出电平的高低电平占空比,则可以控制蜂鸣器的声音大小,本实验我们仅改变音调,不改变声音大小。

2、源码:module beep(clk,key,beep);input clk;input key;output beep;reg beep;reg[20:0] count;reg[20:0] n = 120000;always@(posedge clk)beginif(n==21'b111111111111111111111)n<=120000;elsecase(key)1'b0:beginn=n+10000;1'b1:n=n;default:n=n;endcaseendalways @ (posedge clk)beginif ( count < n/2-1)begincount <= count + 1'b1;endelsebegincount <= 21'b0;beep <= ~beep;endendendmodule【实验步骤】1、打开quartusII开发环境,打开ex17_beep的工程;2、编译工程;3、连接好电源线,下载线接JTAG接口,做好准备工作。

蜂鸣器和弦音发声控制

蜂鸣器和弦音发声控制

蜂鸣器和弦音发声控制前言:现在一些带按键显示控制面板的家电(比较常见的是柜式空调)在按键操作的时候会有悦耳的和弦音发出,特别是开关机或操作上下键时会有不同变调的和弦音,相比普通的嘀嘀声给人更愉悦的操作体验。

1.控制方式说明此处以型号为SH2225T2PA的蜂鸣器(谐振频率2.6KHz)为例。

蜂鸣器模块有两个驱动引脚与MCU相连,一个是振荡信号输入引脚,由MCU提供相应频率的方波信号驱动蜂鸣器发声,一个是供电控制端,供电切断后蜂鸣器靠电解电容放电维持其发声,会有音量渐渐变小的效果。

原理图如下所示,MC9为供电控制端,MC8为振荡信号输入端。

MC9为高电平时,三极管Q4导通,然后Q2导通,蜂鸣器开始供电,同时电容CD2充电。

若MC8有一定频率的方波信号发出,则蜂鸣器可发出鸣叫。

若此时先关掉供电,即MC9置低电平,MC8依然发出方波信号,则蜂鸣器可依靠CD2放电发出声音,但随着电容电量减少,音量会逐渐减小,形成蜂鸣声渐隐的和弦音效果。

要实现变调的效果,则可通过短时间内切换发出几种不同频率的蜂鸣声来实现。

以下是3种比较典型的和弦音的实现细节:(符号说明:Tf:频率给定持续时间(m)Tv:电压给定持续时间(m)F:输出频率(KHz))单声和弦音:短暂鸣响后音量渐隐F=2.6,Tv=200,Tf=1000开机和弦音:三升调,按音调分3个阶段1.F=2.3,Tv=200,Tf=2002.F=2.6,Tv=200,Tf=2003.F=2.9,Tv=100,Tf=2100关机和弦音:三降调,按音调分3个阶段 1.F=2.9,Tv=200,Tf=2002.F=2.6,Tv=200,Tf=2003.F=2.3,Tv=100,Tf=21002.编程实例[Copytoclipboard]ViewCodeC#ifndef__BUZZER_H2#define__BUZZER_H34#include\5#include\6typedefenum7{8MONO=0,//单音9POLY_ON=1,//开机和弦POLY_OFF=2//关机和弦1011}Tone_Type;//蜂鸣器声音类型1213typedeftruct14{15FREQ_TypeFreq;//频率16u8OSCTime;//振荡持续时间,最小单位为10m17u8PWRTime;//供电持续时间,最小单位为10m18}TONE_Def;//音调结构体1920voidBuzzerStart(Tone_TypeToneType);21voidBuzzerCtrl(void);2223#endif/某__BUZZER_H某//某buzzer.c文件某/[Copytoclipboard]ViewCodeC#include\23contTONE_DefTone1[]={{FREQ_2K6,100,20},{FREQ_NO,0,0}};//单音4contTONE_DefTone2[]={{FREQ_2K3,20,20},{FREQ_2K6,20,20},{FREQ _2K9,210,10},{FREQ_NO,0,0}};//开机和弦音56contTONE_DefTone3[]={{FREQ_2K9,20,20},{FREQ_2K6,20,20},{FREQ _2K3,210,10},{FREQ_NO,0,0}};//关机和弦音7TONE_Def某pTone;9taticu8BuzzerStatu=0;1011//蜂鸣器启动,需要发声时调用voidBuzzerStart(Tone_TypeToneType) 1213{14witch(ToneType)15{16caeMONO:17pTone=Tone1;18break;caePOLY_ON:20pTone=Tone2;21break;22caePOLY_OFF:23pTone=Tone3;24break;25default:26pTone=Tone1;27break;28}29BuzzerStatu=0;30}3132//蜂鸣器控制,每10m执行一次33voidBuzzerCtrl(void) 34{35taticTONE_DefTone;3637witch(BuzzerStatu)38{39cae0:40Tone=某pTone;41if(Tone.Freq!=FREQ_NO)//非结束符42{ 43//先判断供电持续时间44if(Tone.PWRTime!=0)45{46Tone.PWRTime--;47BeepPwrOn();48}49ele50{51BuzzerStatu=2;52break;53}54//再判断振荡持续时间55if(Tone.OSCTime!=0)56{57Tone.OSCTime--;58BEEP_SetFreq(Tone.Freq);59BEEP_On();60}61ele62{63BeepPwrOff();64BuzzerStatu=2;65break;66}67//判断完成,开始递减计时68BuzzerStatu=1;69}70ele/某Tone.Freq==FREQ_NO某///是结束符71{ 72BuzzerStatu=2;73}74break;75cae1:76if(Tone.PWRTime!=0)77{78Tone.PWRTime--;79}80ele81{82BeepPwrOff();83}84if(Tone.OSCTime!=0)85{86Tone.OSCTime--;87}88ele89{90BEEP_Off();91pTone++;//取下一个音调92BuzzerStatu=0;93}94break;95default:96break;97}}以上代码中,BEEP_Off(),BEEP_On(),BeepPwrOff(),BEEP_SetFreq()都在头文件beep.h中声明,由底层代码实现。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
uint num;
/*1ms廷时*/
void delay_ms(uint z)
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<110;j++);
}
/*定时器初始化*/
void init_timer0()
{
TMOD=0x01; ห้องสมุดไป่ตู้
{
delay_ms(10); //延时消抖
if(key2==0) //再次判断按键是否真的被按下
{
while(key2==0); //等待释放按键
EA=0; //关闭总中断
BELL=0; //关闭蜂鸣器
}
}
}
}
void timer0() interrupt 1
{
num=0;
BELL=~BELL;
}
}
{
delay_ms(10); //延时消抖
if(key1==0) //再次判断按键是否真的被按下
{
while(key1==0); //等待释放按键
EA=1;
BELL=1; //开启总中断
}
}
if(key2==0)
TH0=(65535-20000)/256;
TL0=(65535-20000)%256;
EA=0;
ET0=1;
TR0=1;
}
void main()
{
rd=0;
BELL=0;
init_timer0();
while(1)
{
if(key1==0)
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit BELL=P1^4;//定义蜂鸣器
sbit key1=P3^0;//定义按键
sbit key2=P3^1;//定义按键
sbit rd=P3^4;
{
TH0=(65535-20000)/256;
TL0=(65535-20000)%256; //中断计时2ms(500Hz),之所以用中断是因为定时比较准确 想改延时就把里面的2000改掉,这个数除以1000得的数就是多少毫秒
num++;
if(num==1) //让蜂鸣器工以 500Hz频率工作
相关文档
最新文档