MCU |
您所在的位置:网站首页 › 播放小行星的声音是什么 › MCU |
目录
一、蜂鸣器介绍二、驱动电路2.1 三极管驱动2.2 集成电路驱动
三、蜂鸣器播放音乐3.1 键盘与音符对照3.2 音符与频率对照3.3 简谱
四、代码演示4.1 按键蜂鸣器播放提示音4.2 小星星
注意:一定要看
一、蜂鸣器介绍
蜂鸣器是一种将电信号转换为声音信号的器件,常用来产生设备的按键音、报警音等提示信号 蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器 有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定 无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音
main.c #include #include "Delay.h" #include "key.h" #include "Nixie.h" #include "Buzzer.h" unsigned char KeyNum; void main() { Nixie(1,0); while(1) { KeyNum=Key(); if(KeyNum) { Buzzer_Time(100); Nixie(1,KeyNum); } } }Nixie.c #include #include "Delay.h" //包含Delay头文件 //数码管段码表 unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //数码管显示子函数 void Nixie(unsigned char Location,Number) { switch(Location) //位码输出 { case 1:P2_4=1;P2_3=1;P2_2=1;break; case 2:P2_4=1;P2_3=1;P2_2=0;break; case 3:P2_4=1;P2_3=0;P2_2=1;break; case 4:P2_4=1;P2_3=0;P2_2=0;break; case 5:P2_4=0;P2_3=1;P2_2=1;break; case 6:P2_4=0;P2_3=1;P2_2=0;break; case 7:P2_4=0;P2_3=0;P2_2=1;break; case 8:P2_4=0;P2_3=0;P2_2=0;break; } P0=NixieTable[Number]; //段码输出 // Delay(1); //显示一段时间 // P0=0x00; //段码清0,消影 }Buzzer.c #include #include #include "Delay.h" //蜂鸣器端口 sbit Buzzer=P2^5; /** * @brief 蜂鸣器私有延时函数,延时500us * @param 无 * @retval 无 */ void Buzzer_Delay500us() //@12.000MHz { unsigned char i; _nop_(); i = 247; while (--i); } /** * @brief 蜂鸣器发声 * @param ms 发声时长 * @retval 无 */ void Buzzer_Time(unsigned int ms) { unsigned int i; for(i=0;i unsigned char KeyNumber=0; if(P3_1==0) { Delay(20);while(P2_1==0);Delay(20);KeyNumber=1; } if(P3_0==0) { Delay(20);while(P2_0==0);Delay(20);KeyNumber=2; } if(P3_2==0) { Delay(20);while(P2_2==0);Delay(20);KeyNumber=3; } if(P3_3==0) { Delay(20);while(P2_3==0);Delay(20);KeyNumber=4; } return KeyNumber; }key.h #ifndef __KEY_H__ #define __KEY_H__ unsigned char Key(); #endifDelay.c void Delay(unsigned int i) { while(i--); }Delay.h #ifndef __DELAY_H__ #define __DELAY_H__ void Delay(unsigned int i); #endif 4.2 小星星 #include #include "Delay.h" #include "Timer0.h" //蜂鸣器端口定义 sbit Buzzer=P2^5; //播放速度,值为四分音符的时长(ms) #define SPEED 50 //索引与频率对照表 unsigned int FreqTable[]={ 0, 63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528, 64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030, 65058,65085,65110,65134,65157,65178,65198,65217,65235,65252,65268,65283, }; //乐谱 unsigned char Music[]={ 13,4, 14,4, 20,4, 20,4, 22,4, 22,4, 20,4+4, 0,4, 18,4, 18,4, 17,4, 17,4, 15,4, 15,4, 13,4+4, 0xFF, }; unsigned char FreqSelect,MusicSelect; void main() { Timer0_Init(); while(1) { if(Music[MusicSelect]!=0xFF) //如果不是停止标志位 { FreqSelect=Music[MusicSelect]; //选择音符对应的频率 MusicSelect++; Delay(SPEED/4*Music[MusicSelect]); //选择音符对应的时值 MusicSelect++; TR0=0; Delay(5); //音符间短暂停顿 TR0=1; } else //如果是停止标志位 { TR0=0; while(1); } } } void Timer0_Routine() interrupt 1 { if(FreqTable[FreqSelect]) //如果不是休止符 { /*取对应频率值的重装载值到定时器*/ TL0 = FreqTable[FreqSelect]%256; //设置定时初值 TH0 = FreqTable[FreqSelect]/256; //设置定时初值 Buzzer=!Buzzer; //翻转蜂鸣器IO口 } } 注意:一定要看千万不要直接复制代码,因为是模块化编写,模块的代码没有往上复制,大家一定要自己动手跟着教学视屏自己写!!!!! |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |