单片机课程设计报告利用蜂鸣器播放音乐
单片机实验报告蜂鸣器
一、实验目的1. 熟悉51单片机的基本结构和工作原理。
2. 掌握51单片机的I/O口编程方法。
3. 学习蜂鸣器的驱动原理和应用。
4. 通过实验,提高动手实践能力和问题解决能力。
二、实验原理蜂鸣器是一种将电信号转换为声音信号的器件,常用于产生按键音、报警音等提示信号。
根据驱动方式,蜂鸣器可分为有源蜂鸣器和无源蜂鸣器。
1. 有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定。
2. 无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才能发声,调整提供振荡脉冲的频率,可发出不同频率的声音。
在本次实验中,我们使用的是无源蜂鸣器。
51单片机通过控制P1.5端口的电平,产生周期性的方波信号,驱动蜂鸣器发声。
三、实验器材1. 51单片机实验板2. 蜂鸣器3. 连接线4. 电路焊接工具5. 编程软件(如Keil)四、实验步骤1. 电路连接:- 将蜂鸣器的正极连接到51单片机的P1.5端口。
- 将蜂鸣器的负极接地。
2. 程序编写:- 使用Keil软件编写程序,实现以下功能:1. 初始化P1.5端口为输出模式。
2. 通过循环,不断改变P1.5端口的电平,产生方波信号。
3. 调整方波信号的频率,控制蜂鸣器的音调。
3. 程序下载:- 将程序下载到51单片机中。
4. 实验观察:- 启动程序后,观察蜂鸣器是否发声,以及音调是否与程序设置一致。
五、实验结果与分析1. 实验结果:- 成功驱动蜂鸣器发声,音调与程序设置一致。
2. 结果分析:- 通过实验,我们掌握了51单片机的I/O口编程方法,以及蜂鸣器的驱动原理。
- 在程序编写过程中,我们学习了方波信号的生成方法,以及如何调整方波信号的频率。
六、实验总结本次实验成功地实现了51单片机控制蜂鸣器发声的功能,达到了预期的实验目的。
通过本次实验,我们提高了以下能力:1. 对51单片机的基本结构和工作原理有了更深入的了解。
2. 掌握了51单片机的I/O口编程方法。
3. 学习了蜂鸣器的驱动原理和应用。
单片机《蜂鸣器》实验报告
单片机《蜂鸣器》实验报告实验报告:蜂鸣器实验工具和器材:Proteus仿真软件,Keil程序编写软件,蜂鸣器,AT89C51单片机。
实验原理:蜂鸣器分为压电式和电磁式两种类型。
本实验采用的是电磁式蜂鸣器。
蜂鸣器又分为有源和无源两种类型。
本实验采用的是有源蜂鸣器。
通过51单片机和C程序,将程序所设计的算法与蜂鸣器电路连接起来,采用循环函数配合多个延时来实现各个音节的有规律发声,合成一首完整的音乐。
本实验采用较为简单的一首儿歌《两只老虎》来体现。
硬件电路说明:本实验使用电磁式蜂鸣器,蜂鸣器连接单片机P2.0端口,另一端接地。
通过C程序产生的hex文件控制蜂鸣器发声,播放一首完整的歌曲。
音节的曲调和间隔时间都是构成歌曲的一个重要部分,需要调节频率和利用延时函数。
控制发声频率要产生音频脉冲,只要算出某一音频的周期/频率,然后将此周期除以2(即为半周期的时间)。
利用定时器计时这半个周期时间,就可在I/O脚上得到此频率的脉冲。
利用AT89C51的内部定时器使其工作在计数器模式下,改变计数值TH0及TL0从而产生不同频率。
此外,结束符和休止符可以分别用代码00H和XXX来表示,若查表结果为0x00,则表示曲子终了;若查表结果为0xff,则产生相应的停顿效果。
软件程序说明:主函数采用while和for循环,并且引用延时函数,对各部分程序进行调用。
与采用一般的延时函数相比,可以分别控制歌曲各个音节的持续发声。
在主函数中,使用多个for循环来控制每个音节的起始和结束,以实现蜂鸣器对一首完整歌曲的播放。
通过调用不同的延时函数,实现有节奏的音节发声,并将它们串联起来。
在调用Beep函数时,需要进行定义。
在主函数中,分别在每个音节开始前后的两个for循环中调用Beep函数。
通过Beep=~Beep和Beep=1指令的调用,实现各个音节的发声和停止,从而控制歌曲的有节奏播放。
为了实现各个音节的延时发声,我们使用了多个延时程序,例如500ms和700ms。
单片机蜂鸣器播放音乐
#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit speaker = P1^7;uint j;uchar m=1;uchar flag;uchar line;uchar code * data song;// 休止符低6 低7 中1 中2 中3 中4 中5 中 6 中7 高 1 低 3 低 5 低 4 高3uchar code yin[30]={0xFF,0xFF,0xFB,0x90,0xFC,0x0C,0xFC,0x44,0xFC,0xAC,0xFD,0x09,0xFD,0x34,0xF D,0x82,0xFD,0xC8,0xFE,0x06,0xFE,0x22,0xFA,0X15,0XFB,0x04,0xFA,0x67,0xFE,0x85};uchar code song1[97]={0x34,0x32,0x32,0x34,0x42,0x51, //<<干杯,朋友>>0x62,0x52,0x42,0x32,0x34,0x04,0x74,0x74,0x62,0x62,0x64,0x3c,0x04,0x64,0x62,0x52,0x42,0x32,0x34,0x33,0x31,0x32,0x72,0x76,0x72,0x83,0x81,0x82,0x82,0x82,0x74,0x72,0x7c,0x04,0x63,0x61,0x62,0x62,0x64,0x72,0x82,0x72,0x74,0x72,0x62,0x52,0x42,0x32,0x42,0x44,0x42,0x42,0x52,0x62,0x52,0x5c,0x04,0x64,0x62,0x62,0x64,0x72,0x82,0x72,0x74,0x72,0x62,0x52,0x42,0x32,0x42,0x46,0x53,0x41,0x42,0x32,0x3c,0x04,0x44,0x48,0x02,0x32,0x3f,0x44,0x48,0x02,0x32,0x3f,0x34,0x0c,0xFF};uchar code song2[46]={0x12,0x52,0x52,0x52,0x56,0x42, //<<兰花草>>0x32,0x42,0x32,0x22,0x18,0x82,0x82,0x82,0x82,0x86,0x72,0xB2,0x72,0x72,0x62,0x58,0x52,0x82,0x82,0x72,0x56,0x42,0x32,0x42,0x32,0x22,0x16,0xB2,0xB2,0x32,0x32,0x22,0x16,0x52,0x42,0x32,0x22,0xC2,0x88,0xFF};uchar code song3[131]={0x52,0x42, //<<两只蝴蝶>>0x58,0x02,0x42,0x52,0x42,0x38,0x04,0x12,0x32,0x44,0x42,0x52,0x42,0x32,0x12,0x12,0xC8,0x04,0x52,0x42,0x58,0x02,0x42,0x52,0x42,0x38,0x04,0x12,0x32,0x44,0x42,0x52,0x42,0x32,0x12,0x32,0x48,0x04,0x52,0x42,0x58,0x02,0x42,0x52,0x42,0x38,0x04,0x12,0x32,0x44,0x42,0x52,0x42,0x32,0x12,0x11,0x31,0xC8,0x04,0x52,0x72,0x78,0x02,0x72,0x82,0x72,0x58,0x04,0x42,0x42,0x44,0x42,0x52,0x42,0x32,0x12,0x12,0x32,0x32,0x3C,0x09,0x72,0x72,0x82,0xA2,0x92,0x92,0x82,0x52,0x42,0x42,0x42,0x58,0x02,0x52,0x52,0x72,0x84,0x84,0x02,0x12,0x52,0x42,0x48,0x04,0x52,0x72,0x72,0x52,0x74,0x02,0xA4,0x92,0x82,0x92,0x54,0x02,0x82,0x82,0x92,0x82,0x72,0x52,0x42,0x02,0xC4,0x12,0x3C,0xFF};uchar code song4[37]={0xC4,0x12,0x32,0x44,0x42,0x52, //<<祈祷>>0x52,0x44,0x32,0x32,0x12,0x14,0x12,0x12,0x32,0x42,0x54,0x44,0x4F,0xC4,0x12,0x32,0x44,0x42,0x72,0x58,0x42,0x32,0x34,0x14,0x12,0x32,0x34,0x32,0x12,0x1F,0xFF};uchar code song5[144]={0x52,0x62, //<<阳光总在风雨后>>0x74,0x74,0x74,0x34,0x42,0x34,0x52,0x56,0x42,0x34,0x34,0x14,0x32,0x12,0x12,0xC2,0xC4,0x04,0x52,0x62,0x74,0x74,0x74,0x34,0x42,0x34,0x52,0x56,0x42,0x34,0x32,0x12,0x12,0x34,0x42,0x4C,0x52,0x42,0x34,0x32,0x42,0x32,0x12,0x12,0xC2,0xC2,0x54,0x52,0x54,0x52,0x52,0x42,0x32,0x32,0x12,0x32,0x42,0x32,0x52,0x5C,0x52,0x42,0x34,0x32,0x42,0x32,0x12,0x12,0xC2,0xC2,0x54,0x52,0x54,0x02,0x52,0x52,0x42,0x32,0x12,0x32,0x84,0x72,0x7F,0x0F,0x74,0x72,0x52,0x54,0x74,0x82,0x52,0x52,0x72,0x78,0x34,0x32,0x32,0x42,0x54,0x72,0x7F,0x86,0x82,0x72,0x52,0x54,0x72,0x84,0x32,0x36,0x52,0x42,0x52,0x42,0x32,0x34,0x12,0x32,0x32,0x42,0x4C,0x86,0x82,0x72,0x52,0x54,0x72,0x84,0x52,0x56,0x52,0x42,0x52,0x72,0x82,0x52,0x34,0x12,0x12,0x32,0x3C,0xFF};uchar code song6[85]={0x04,0x24,0x14,0xC4, //<<心心相印>>0x54,0x54,0x48,0x04,0x54,0x44,0x34,0x22,0x14,0xB2,0xC8,0x04,0x12,0xC2,0x16,0x12,0x76,0x52,0x46,0x12,0x3F,0x04,0xB4,0xD4,0xC4,0x14,0x28,0xC4,0x14,0x12,0x32,0x16,0xC2,0x54,0x78,0x34,0x4C,0x42,0x52,0x86,0x72,0x76,0x52,0x74,0x28,0x42,0x52,0x46,0x12,0x26,0x12,0xCF,0x04,0x24,0x14,0xC4,0x56,0x52,0x48,0x04,0x54,0x44,0x34,0x22,0x14,0xB2,0xC8,0x04,0x34,0x14,0xC4,0x12,0x32,0x18,0x42,0x42,0x74,0x58,0x44,0x3F,0xFF};uchar code song7[138]={0xC2,0xC2,0x12, //<<最浪漫的事>>0x34,0x32,0x32,0x32,0x12,0x12,0x52,0x54,0x02,0xC2,0x12,0x32,0x32,0x32,0x32,0x34,0x52,0x72,0x7C,0x02,0x72,0x82,0x72,0x82,0x72,0x84,0x72,0x41,0x51,0x52,0x41,0x31,0x34,0x02,0x32,0x32,0x12,0x34,0x32,0x12,0x32,0x54,0x42,0x32,0x32,0x32,0x32,0x34,0x52,0x72,0x7C,0x72,0x72,0x82,0x72,0x82,0x72,0x84,0x82,0x72,0x42,0x52,0x42,0x34,0x12,0x12,0x32,0xC4,0x52,0x42,0x34,0x12,0x12,0x31,0x41,0x32,0x3C,0x0A,0x72,0x82,0xA2,0x84,0x82,0x72,0x82,0x72,0x52,0x72,0x78,0x02,0x72,0x82,0xA2,0x84,0x82,0x72,0x82,0x72,0x82,0x32,0x38,0x02,0x32,0x42,0x52,0x64,0x62,0x72,0x82,0x82,0x72,0x82,0x82,0xA2,0x82,0x82,0x82,0xA2,0x82,0x72,0x78,0x72,0x32,0x82,0x72,0x78,0x72,0x82,0xA3,0x51,0x42,0x51,0x41,0x3C,0xFF};uchar code song8[77]={0xC2,0xC2,0x34,0x42,0x42, //<<一生有你>>0x52,0x41,0x51,0x5C,0x04,0xC2,0xC2,0x34,0x42,0x42,0x52,0x31,0x41,0x4C,0x04,0xC2,0xC2,0x34,0x42,0x42,0x52,0x41,0x51,0x58,0x32,0x52,0x4C,0x42,0x32,0x34,0x32,0x42,0x48,0x04,0xC2,0xC2,0x34,0x42,0x42,0x72,0x41,0x51,0x5C,0x04,0xC2,0xC2,0x32,0x32,0x42,0x42,0x52,0x42,0x4C,0x04,0xC2,0xC2,0x34,0x42,0x42,0x52,0x41,0x51,0x58,0x32,0x52,0x4C,0x42,0x32,0x32,0x42,0x4C,0xFF};uchar code song9[]={0X54,0XC4,0X12,0X32,0X34, //<<宁夏>>0X52,0X52,0X52,0X52,0X42,0X32,0X34,0XC1,0XC2,0X52,0XC2,0X12,0X32,0X34,0X11,0X12,0X31,0X12,0XC2,0X78,0X72,0X52,0X52,0X42,0X32,0X42,0X52,0X11,0XC1,0XC4,0XC1,0XC1,0XC1,0XC1,0X12,0X32,0X32,0X12,0X42,0X42,0X44,0XC2,0X12,0X32,0X42,0X52,0X72,0X72,0X82,0X41,0X51,0X42,0X48,0X42,0X12,0X3C,0X72,0X62,0X3C,0X72,0X62,0X3C,0X72,0X62,0x21,0x31,0x41,0x51,0x61,0x71,0x81,0x91,0x61,0x71,0x81,0x91,0X3F,0X3F,0X54,0XC2,0XC2,0X42,0XC2,0XC4,0X34,0X32,0X42,0X52,0XC2,0XC4,0XD2,0XC2,0X12,0X22,0X38,0X12,0X22,0X32,0X42,0X48,0xFF};uchar code song10[]={0x32,0x31,0x41, //<<老鼠爱大米>>0x52,0x52,0x42,0x31,0x41,0x44,0x31,0x41,0x52,0x52,0x42,0x32,0x34,0x71,0x11,0x74,0x71,0x71,0x11,0x31,0x34,0x32,0x32,0x32,0x32,0x31,0x41,0x44,0x32,0x41,0x51,0x52,0x52,0x72,0x81,0x41,0x44,0x52,0x41,0x31,0x32,0x32,0x42,0x51,0x71,0x74,0x71,0x71,0x12,0x31,0x31,0x31,0x52,0x42,0x32,0x32,0x41,0x31,0x34,0x52,0x51,0x71,0x72,0x71,0x71,0x72,0x71,0x81,0x84,0x52,0x42,0x32,0x32,0x32,0x41,0x51,0x54,0x51,0x71,0x72,0x72,0x72,0x81,0xA1,0xA2,0x82,0x72,0x52,0x42,0x32,0x32,0x12,0x44,0x51,0x71,0x72,0x72,0x71,0x82,0x71,0x84,0x52,0x42,0x32,0x32,0x32,0x41,0x51,0x54,0x51,0x71,0x72,0x72,0x72,0x81,0xA1,0xA2,0x82,0x72,0x51,0x41,0x42,0x42,0x44,0x32,0x51,0x61,0x72,0x42,0x44,0x52,0x41,0x31,0x34,0x52,0x41,0x31,0x34,0x52,0x42,0x52,0x32,0x52,0x81,0x71,0x74,0x51,0x71,0x82,0x81,0x71,0x72,0x81,0x71,0x74,0x51,0x41,0x31,0x42,0x41,0x51,0x42,0x31,0x41,0x44,0x52,0x41,0x31,0x34,0x52,0x41,0x31,0x34,0x52,0x42,0x52,0x32,0x52,0x81,0x71,0x74,0x51,0x41,0x82,0x82,0xA2,0x71,0x81,0x72,0x71,0x51,0x41,0x31,0x44,0x41,0x31,0x41,0x51,0x44,0x52,0x52,0x42,0x31,0x34,0x52,0x41,0x31,0x42,0x31,0x34,0xFF};uchar code song11[]={0XC2,0XB2, //<<泰坦尼克号>>0X36,0X52,0X42,0X32,0X11,0XC1,0XB2,0XC6,0X12,0XC4,0X12,0XC2,0X76,0XA2,0X82,0X72,0X51,0X41,0X32,0X4C,0X42,0X32,0X74,0X82,0X74,0X82,0X72,0X52,0X41,0X38,0X32,0X42,0X16,0XC2,0X72,0X52,0X42,0X42,0X3C,0XC2,0XB2,0X36,0X52,0X42,0X32,0X11,0XC1,0XB2,0XC6,0X12,0XC4,0X12,0XC2,0X76,0XA2,0X82,0X72,0X51,0X41,0X32,0X4C,0X42,0X32,0X76,0X82,0X74,0X82,0X72,0X53,0X41,0X38,0X32,0X42,0X16,0XC2,0X72,0X52,0X41,0X51,0X12,0XCC,0XC2,0XB2,0X16,0XC2,0X72,0X52,0X42,0X42,0X3C,0X32,0X32,0X26,0X22,0X24,0X42,0X32,0x22,0x12,0x18,0x02,0x52,0X46,0X12,0X44,0X72,0X82,0X5C,0X52,0X52,0X46,0X42,0X74,0X42,0X32,0X36,0X42,0X58,0X82,0X72,0X62,0X52,0X46,0X32,0X3C,0X12,0XB2,0X36,0X52,0X42,0X32,0X11,0XC1,0XB2,0XC6,0X12,0XC4,0X12,0XC2,0X76,0XA2,0X82,0X72,0X51,0X41,0X32,0X48,0X02,0X42,0X52,0X62,0X76,0X82,0X74,0X82,0X72,0X56,0X41,0X38,0X32,0X22,0X16,0XC2,0X72,0X52,0X42,0X42,0X3C,0X04,0X04,0X04,0X04,0xFF};uchar code song12[]={0x34,0x32, //<<喜欢你>>0x34,0x34,0x24,0x34,0x32,0x32,0x24,0x38,0x44,0x58,0x48, 0x34,0x32,0x34,0x34,0x24,0x38,0x34,0x7F,0x34,0x32,0x34,0x32,0x24,0x38,0x34,0x24,0x38,0x44,0x58,0x48,0x34,0x32,0x34,0x34,0x24,0x38,0x34,0x7F,0x16,0x4C,0x74,0x78,0x64,0x54,0x48,0x54,0x64,0x58,0x44,0x34,0x24,0x38,0x24,0x14,0x12,0x21,0x11,0x78,0x68,0x3F,0x4C,0x74,0x78,0x64,0x52,0x42,0x48,0x54,0x64,0x58,0x44,0x34,0x24,0x38,0x24,0x24,0x38,0x44,0x58,0x48,0x3C,0xFF};//**********************************************************************//// 延时程序////**********************************************************************//void delay(uint d) //延时d微秒,最大延时65536微妙{while(d--);}/*延时1/4拍时间即187ms*/void delay187ms(void){uchar t;for(t=0;t<130;t++) delay(100);}void main(){uchar i;uchar k;delay(100);TMOD=0x01;IT0=1;EX0=1;TR0=1;ET0=1;EA=1;song=song1;while(1){switch(m){case 1 :song=song1;break;case 2 :song=song2;break;case 3 :song=song3;break;case 4 :song=song4;break;case 5 :song=song5;break;case 6 :song=song6;break;case 7 :song=song7;break;case 8 :song=song8;break;case 9 :song=song9;break;case 10 :song=song10;break;case 11 :song=song11;break;case 12 :song=song12;break;default :m=1;song=song1;break;}j=0;flag=1;while(*(song+j)!=0xFF&&flag){k=*(song+j)&0x0F; //取出节拍line=*(song+j)>>4; //取出音TH0=yin[2*line];TL0=yin[2*line+1];TR0=1;if ((yin[2*line]==0xFF)&&(yin[2*line+1]==0xFF)){TR0=0;}for(i=k;i>0;--i){delay187ms();}TR0=0;j++;}for(i=0;i<20;i++)delay187ms();m++;}}/* 每个音符的发声*/void timer1() interrupt 1{TH0=yin[2*line];TL0=yin[2*line+1];speaker = !speaker;}void int0() interrupt 0{flag=0;TR0=0;}。
单片机蜂鸣器唱歌程序(二)2024
单片机蜂鸣器唱歌程序(二)引言概述:本文档主要介绍了单片机蜂鸣器唱歌程序(二),包括使用单片机控制蜂鸣器发出不同音乐的方法和具体实现步骤。
本文将从五个大点进行阐述,每个大点包含5-9个小点,以便读者更好地理解和实践。
正文:一、引脚连接设置1. 确定单片机的输出引脚和蜂鸣器的输入引脚2. 将单片机的输出引脚与蜂鸣器的输入引脚连接3. 确保连接的稳定性和正确性4. 利用电路图进行布线二、编程环境配置1. 安装适合单片机的编程软件2. 创建新的项目3. 配置单片机的型号及选项4. 导入相关的库文件5. 编写代码框架三、发声原理及代码实现1. 理解蜂鸣器工作原理2. 使用单片机的PWM输出功能控制蜂鸣器的频率3. 利用PWM输出的方式实现不同音调的发声4. 编写音调转换函数5. 编写歌曲的音乐片段代码四、优化和调试1. 测试不同频率的声音2. 调整蜂鸣器的音量3. 避免噪音的干扰4. 检查代码的正确性和合理性5. 不断尝试,优化代码和音效五、实验结果及总结1. 运行程序,测试蜂鸣器的唱歌效果2. 记录实验结果和观察结果3. 分析实验过程中遇到的问题和解决方法4. 总结实验经验和注意事项5. 展望将来的改进和研究方向总结:本文详细介绍了单片机蜂鸣器唱歌程序(二)的实现方法和步骤。
通过连接设置、编程环境配置、发声原理及代码实现、优化和调试、实验结果及总结等五个大点的阐述,读者可以深入了解单片机控制蜂鸣器发声的原理和方法,并通过实验得到具体的唱歌效果。
同时,读者在实践过程中也要注意优化和调试,不断尝试和改进,以实现更好的音效效果。
希望本文对读者有所帮助,为单片机蜂鸣器唱歌程序的开发提供了指导和参考。
单片机课程设计报告(利用蜂鸣器播放音乐)
课程设计:嵌入式系统应用题目名称:利用蜂鸣器实现音乐播放功能姓名:学号:班级:完成时间:1设计的任务设计内容:动手焊接一个51单片机设计目标:利用单片机上的蜂鸣器实现音乐播放功能2 设计的过程2.1 基本结构1.STC89C52RC在本次的试验中采用了STC89C52RC单片机,STC89C52RC单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期,工作电压:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机),工作频率范围:0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz,用户应用程序空间为8K字节。
(STC89C52RC引脚图)STC89C52RC单片机的工作模式:(1)典型功耗<0.1μA,可由外部中断唤醒,中断返回后,继续执行原程序(2)空闲模式:典型功耗2mA(3)正常工作模式:典型功耗4Ma~7mA(4)唤醒,适用于水表、气表等电池供电系统及便携设备2.蜂鸣器及其工作原理:蜂鸣器按其结构分主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。
接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
本实验采用的是电磁式蜂鸣器。
蜂鸣器按其是否带有信号源又分为有源和无源两种类型。
有源蜂鸣器只需要在其供电端加上额定直流电压,其内部的震荡器就可以产生固定频率的信号,驱动蜂鸣器发出声音。
无源蜂鸣器可以理解成与喇叭一样,需要在其供电端上加上高低不断变化的电信号才可以驱动发出声音。
本实验采用的是有源蜂鸣器。
(蜂鸣器与单片机连接电路图)2.2 软件设计过程1.蜂鸣器发声原理本实验由于采用有源蜂鸣器,只需将引脚端口P3^4清零,蜂鸣器即可发声;P3^4置位,蜂鸣器停止发声。
蜂鸣器变声控制实验单片机实验报告
蜂鸣器变声控制实验单片机实验报告一、实验目的1、了解单片机控制蜂鸣器发声的原理。
2、学会使用单片机控制蜂鸣器的频率、占空比、时长等特性。
3、掌握编写蜂鸣器变声程序的方法。
二、实验器材1、单片机培训板。
2、蜂鸣器。
3、杜邦线若干。
三、实验原理1、蜂鸣器通常是由震动片、驱动电路和音箱构成的,同时需要满足一定的电源条件和频率特性才能发声。
四、实验内容1、将蜂鸣器与单片机连接好。
3、观察蜂鸣器的变声效果。
五、实验步骤1、将蜂鸣器与单片机连接好。
将蜂鸣器的正极连接单片机的P1.0口,将蜂鸣器的负极连接单片机的GND口。
2、编写蜂鸣器变声程序,具体过程如下:1)定义相关变量和函数:需要定义相关变量和函数,例如频率、占空比、时长等变量,以及控制蜂鸣器发声的函数。
2)初始化:需要对单片机进行初始化设置,包括端口初始化、定时器初始化等。
3)控制蜂鸣器发声:通过改变PWM的频率、占空比、时长等特性,来控制蜂鸣器的发声。
4)停止蜂鸣器发声:在需要停止蜂鸣器发声时,关闭PWM输出端口即可。
3、观察蜂鸣器的变声效果。
根据程序设定的频率、占空比和时长等特性,可以看到蜂鸣器在不同的情况下发出不同的声音。
六、实验结果1、在经过程序设计后,蜂鸣器成功发出变声效果,根据程序的要求可以发出不同的声音。
3、在实验中还可以通过添加其他的控制模块,例如按键、温度传感器等,来实现更复杂的控制操作。
1、本次实验主要掌握了单片机控制蜂鸣器发声的原理和方法,通过自己编写程序来控制蜂鸣器发声。
3、通过本次实验,学生们不仅掌握了相关的电路和编程知识,同时还锻炼了自己的实践能力和创新思维。
51单片机蜂鸣器播放单音节音乐
0xFD,0x23,0x7F, 0xFC,0xAC,0x7F, 0xFD,0x23,0xFF, 0xFC,0x44,0xFF,
// 1_ 3_ 2 .5
0xFC,0x44,0x7F, 0xFD,0x23,0x7F, 0xFC,0xAC,0xFF, 0xFA,0x68,0xFF,
{
for (i =0; i < 363; i++)
{;}
}
}
*名称:Init()
*功能:设置计数器0工作方式,16位计数,溢出中断方式
**********************************************************************************/
void Init()
{
TMOD = 0x01; //定时器0处于计时方式,16位
*名称:Count1(void) interrupt 1
*功能:设置计时器0溢出中断,每中断一次改变P2_3引脚电平
*********************************************************************************/
void Count1(void) interrupt 1
void main()
{
uchar time;
Init();
TH0 = high;
TL0 = low;
while (1)
{
if (music[ptr] != 0xFF && music[ptr] != 0x00)//判断是否是正常音符
{
TR0 = 0;
P2_3 = 1;
基于51单片机的音乐盒设计报告
摘要本作品利用单片机的IO口对蜂鸣器输送不同频率的信号,让单片机发出不同音调的声音。
以“新年好”曲调为基础以C51为语法编出51音乐盒的程序。
根据电路图焊接了蜂鸣器模块与TX-1C51开发板用杜邦线进行连接。
除了蜂鸣器外接模块外还使用了1602液晶显示模块作为外设连接。
本人对单片机演奏音乐比较有兴趣。
在此,本人将就这方面的知识做一些简介,但愿能对单片机演奏音乐比较有兴趣而又不知其解的朋友能有所启迪。
一般说来,单片机演奏音乐基本都是单音频率,它不包含相应幅度的谐波频率,也就是说不能象电子琴那样能奏出多种音色的声音。
因此单片机奏乐只需弄清楚两个概念即可,也就是“音调”和“节拍”。
音调表示一个音符唱多高的频率,节拍表示一个音符唱多长的时间。
一般说来,单片机演奏音乐基本都是单音频率,它不包含相应幅度的谐波频率,也就是说不能象电子琴那样能奏出多种音色的声音。
因此单片机奏乐只需弄清楚两个概念即可,也就是“音调”和“节拍”。
音调表示一个音符唱多高的频率,节拍表示一个音符唱多长的时间。
关键词: 51单片机音乐盒液晶屏幕显示模块蜂鸣器模块 C51目录1 设计任务目的与要求 (1)1.1任务设计目的 (1)1.2任务要求 (1)2 模块及其原理介绍 (2)2.1蜂鸣器模块 (2)2.21602液晶显示模块 (2)3 设计方案 (3)3.1软件设计 (3)3.2硬件设计 (3)4 实验结果与数据分析 (4)4.1测试步骤 (4)4.2实验现象 (4)5 结论与问题讨论 (4)5.1完成设计的要求程度 (4)5.2遇到的问题以及解决办法 (4)5.3存在的不足及改进思路 (4)参考文献 (5)附录 (5)附录一:C51程序 (5)1 设计任务目的与要求1.1任务设计目的本人对单片机演奏音乐比较有兴趣,所以选择51音乐盒的题目。
本设计通过两个模块的制作并与开发板一并使用。
通过本次设计不止熟悉焊接和熟悉各个电子元器件,而且还提高了对外设模块使用单片机编程的技能。
单片机课程设计报告蜂鸣器
单片机课程设计报告蜂鸣器河南师范大学新联学院单片机课程设计报告课程单片机原理及接口技术设计题目蜂鸣器演奏歌曲年级专业级计算机科学与技术学号 11学生姓名李指导教师莹6 月 15 日蜂鸣器演奏歌曲实验报告一、要求完成驱动蜂鸣器歌曲演奏的实验二、目的1、学习KEIL软件的使用方法;2、掌握BST-V51单片机学习板设计蜂鸣器音乐的发生;3、掌握设计中各模块的功能,能够填入并演奏曲子;4、学习乐谱的基本知识,掌握其演奏的原理。
三、分析1、基本原理简述声音是经过振动产生的。
单片机对某一引脚以一定的频率循环置1置0,该引脚便产生一定频率的方波,方波经过放大,作用于一定的物理实件(蜂鸣器),就产生了一定频率的声音。
若改变输出方波的频率,产生的声音随之改变。
经过控制输出方波的时间长短,声音的长短也可以得到控制,因此,根据乐谱,以类似的音及同样的节拍,单片机就能够产生电子音乐。
音乐的播放选择能够经过按键的输入得以实现。
为简便起见,以一定的频率方波产生的音在其每个周期内高低幅值得时间各占一半。
因此,输出引脚在每个方波周期内要动作两次:一次升高,一次降低。
即输出引脚的频率是原音频率的两倍。
2、单片机产生不同频率脉冲信号的原理(1)要产生音频脉冲,只要算出某一音频的脉冲(1/频率),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期的时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期的时间再对I/O反相,就能够在I/O脚上得到此频率的脉冲。
(2)利用8051的内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0以产生不同频率的方法如下:例如,频率为523Hz,其周期天/523 S=1912uS,因此只要令计数器计时956uS/1us=956,在每计数956次时就将I/O反接,就可得到中音DO(532Hz)。
计数脉冲值与频率的关系公式如下: N=Fi/2/Fr(N:计数值,Fi:内部计时一次为1uS,故其频率为1MHz,Fr:要产生的频率)(3)其计数值的求法如下:T=65536-N=65536-Fi/2/Fr计算举例:设K=65536,F=1000000=Fi=1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)的计数值。
单片机蜂鸣器实验报告
一、实验目的1. 了解单片机I/O的工作方式;2. 熟悉51单片机的汇编指令;3. 掌握蜂鸣器的工作原理及驱动方法;4. 学会通过单片机控制蜂鸣器发声,实现音乐播放功能。
二、实验原理1. 单片机:单片机是一种具有微处理器的集成电路,它将微处理器、存储器、输入/输出接口等集成在一个芯片上,具有体积小、功耗低、成本低等特点。
2. 蜂鸣器:蜂鸣器是一种将电信号转化为声音信号的装置,广泛应用于计算机、打印机、复印机、报警器、电子玩具等电子产品中。
蜂鸣器主要分为有源蜂鸣器和无源蜂鸣器两种类型。
有源蜂鸣器内置振荡源,可直接发声;无源蜂鸣器无内置振荡源,需要控制器提供振荡脉冲才能发声。
3. 51单片机与蜂鸣器连接:51单片机通过P1.0端口控制蜂鸣器,当P1.0端口输出高电平时,蜂鸣器发声;输出低电平时,蜂鸣器停止发声。
三、实验器材1. 51单片机实验板;2. 蜂鸣器;3. 连接线;4. 信号源;5. 示波器;6. 计算机及仿真软件(如Proteus)。
四、实验步骤1. 将蜂鸣器连接到51单片机实验板的P1.0端口;2. 编写程序,实现以下功能:(1)初始化51单片机系统;(2)通过P1.0端口控制蜂鸣器发声;(3)实现音乐播放功能;3. 将程序烧录到51单片机实验板;4. 使用示波器观察蜂鸣器发出的声音波形;5. 使用信号源模拟按键输入,验证蜂鸣器控制功能;6. 使用Proteus仿真软件验证程序功能。
五、实验结果与分析1. 通过实验,成功实现了51单片机控制蜂鸣器发声,验证了单片机I/O的工作方式和51单片机的汇编指令;2. 实现了音乐播放功能,验证了蜂鸣器的工作原理及驱动方法;3. 通过示波器观察,蜂鸣器发出的声音波形符合预期,验证了程序的正确性;4. 通过Proteus仿真软件,验证了程序在虚拟环境中的正确性。
六、实验总结1. 通过本次实验,掌握了单片机I/O的工作方式,熟悉了51单片机的汇编指令;2. 理解了蜂鸣器的工作原理及驱动方法,学会了通过单片机控制蜂鸣器发声;3. 提高了动手实践能力,培养了团队协作精神。
单片机课程设计蜂鸣器
单片机课程设计蜂鸣器一、课程目标知识目标:1. 理解单片机的基本原理,掌握蜂鸣器模块的电路连接和工作原理;2. 学会编写控制蜂鸣器响铃、停铃的程序代码,理解程序中的延时函数及其作用;3. 了解蜂鸣器在不同应用场景下的使用方法,如报警、音乐播放等。
技能目标:1. 能够独立完成蜂鸣器模块与单片机的连接,进行电路调试;2. 掌握使用编程软件编写、编译和烧录程序到单片机,实现蜂鸣器的控制;3. 培养学生的动手操作能力,提高问题解决能力。
情感态度价值观目标:1. 激发学生对单片机编程的兴趣,培养其主动探究精神;2. 培养学生的团队合作意识,学会在团队中沟通与协作;3. 引导学生关注单片机在现实生活中的应用,认识到科技改变生活的意义。
分析课程性质、学生特点和教学要求:本课程为单片机课程的实践环节,以动手操作为主,注重培养学生的实践能力和创新思维。
针对学生年级特点,课程内容以基础为主,逐步提高难度。
在教学过程中,教师需关注学生的学习进度,及时解答疑问,确保学生能够掌握课程内容。
1. 熟练掌握蜂鸣器模块的使用,实现基本的控制功能;2. 提高编程技能,为后续学习更复杂的单片机应用打下基础;3. 增强对单片机应用场景的认识,激发学习兴趣,培养良好的情感态度。
二、教学内容1. 理论知识:- 单片机基础原理介绍,重点掌握CPU、内存、I/O口等基本组成部分;- 蜂鸣器模块工作原理,理解其电路连接方式及控制方法;- 编程软件的使用,包括编写、编译、烧录程序的基本步骤。
2. 实践操作:- 蜂鸣器模块与单片机的连接,学会使用杜邦线进行电路搭建;- 编写程序控制蜂鸣器响铃与停铃,掌握延时函数的使用;- 设计简单的报警程序,实现蜂鸣器不同频率的响铃。
3. 教学大纲:- 第一课时:单片机基础原理学习,蜂鸣器模块介绍;- 第二课时:编程软件的使用,编写简单的控制程序;- 第三课时:实践操作,连接电路,烧录程序,调试蜂鸣器;- 第四课时:拓展应用,设计报警程序,提高编程技能。
单片机课程设计报告利用蜂鸣器播放音乐样本
课程设计: 电子设计题目名称: 音乐流水灯姓名: 戴锦超学号: 08123447班级: 信科12-3班完成时间: 10月23日1设计的任务设计内容: 动手焊接一个51单片机设计目标: 利用单片机上的蜂鸣器以及二极管实现音乐播放以及根据音乐的节奏而规律性闪亮的二极管。
而且经过程序调节音乐节奏的快慢。
2 设计的过程2.1 基本结构1.STC89C52RC在本次的试验中采用了STC89C52RC单片机, STC89C52RC 单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单片机, 指令代码完全兼容传统8051单片机, 12时钟/机器周期, 工作电压: 5.5V~3.3V( 5V单片机) /3.8V~2.0V( 3V单片机) , 工作频率范围: 0~40MHz, 相当于普通8051的0~80MHz, 实际工作频率可达48MHz, 用户应用程序空间为8K字节。
( STC89C52RC引脚图)STC89C52RC单片机的工作模式:(1)典型功耗<0.1μA,可由外部中断唤醒, 中断返回后, 继续执行原程序(2)空闲模式: 典型功耗2mA(3)正常工作模式: 典型功耗4Ma~7mA( 4) 唤醒, 适用于水表、气表等电池供电系统及便携设备2.蜂鸣器及其工作原理:蜂鸣器按其结构分主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。
接通电源后, 振荡器产生的音频信号电流经过电磁线圈, 使电磁线圈产生磁场, 振动膜片在电磁线圈和磁铁的相互作用下, 周期性地振动发声。
本实验采用的是电磁式蜂鸣器。
蜂鸣器按其是否带有信号源又分为有源和无源两种类型。
有源蜂鸣器只需要在其供电端加上额定直流电压, 其内部的震荡器就能够产生固定频率的信号, 驱动蜂鸣器发出声音。
无源蜂鸣器能够理解成与喇叭一样, 需要在其供电端上加上高低不断变化的电信号才能够驱动发出声音。
本实验采用的是有源蜂鸣器。
单片机蜂鸣器播放音乐代码生日快乐两只蝴蝶祝你平安
/生日快乐歌曲/ include<reg51.h>defineuintunsignedintdefineucharunsignedcharsbitbeep=P1^5;ucharcodeSONG_TONE={212;212;190;212;159;169;212;212;190;212;142;159;212;212;106;126;159;169;190;119;119;126;159;142;159;0};ucharcodeSONG_LONG={9;3;12;12;12;24;9;3;12;12;12;24;9;3;12;12;12;12;12;9;3;12;12;12;24;0};//延时voidDelayMSuintx{uchart;whilex--fort=0;t<120;t++;}voidPlayMusic{uinti=0;j;k;whileSONG_LONGi=0||SONG_TONEi=0{//播放各个音符;SONG_LONG为拍子长度forj=0;j<SONG_LONGi20;j++{//SONG_TONE延时表决定了每个音符的频率fork=0;k<SONG_TONEi/3;k++;}DelayMS10;i++;}}voidmain{beep=0;while1{PlayMusic;//播放生日快乐DelayMS500;//播放完后暂停一段时间}}两只蝴蝶:include<reg51.h>//这是单片机音乐代码生成器生成的代码defineucharunsignedcharsbitbeepIO=P1^5;//输出为P1.5可以修改成其它IO口ucharm;n;ucharcodeT492={{0;0};{0xF8;0x8B};{0xF8;0xF2};{0xF9;0x5B};{0xF9;0xB7};{0xFA;0x14};{0xFA;0x66};{0xFA;{0xFC;0x43};{0xFC;0x78};{0xFC;0xAB};{0xFC;0xDB};{0xFD;0x08};{0xFD;0x33};{0xFD; 0x5B};{0xFD;0x81};{0xFD;0xA5};{0xFD;0xC7};{0xFD;0xE7};{0xFE;0x05};{0xFE;0x21};{0xFE;0x3C};{0xFE;0x55};{0xFE;0x6D};{0xFE;0x84};{0xFE;0x99};{0xFE; 0xAD};{0xFE;0xC0};{0xFE;0x02};{0xFE;0xE3};{0xFE;0xF3};{0xFF;0x02};{0xFF;0x10};{0xFF;0x1D};{0xFF;0x2A};{0xFF;0x36};{0xFF;0x42};{0xFF;0x4C};{0xFF; 0x56};{0xFF;0x60};{0xFF;0x69};{0xFF;0x71};{0xFF;0x79};{0xFF;0x81}};ucharcodemusic2={{0;4};{23;4};{21;4};{23;16};{23;4};{21;4};{23;4};{21;4};{19;16};{16;4};{19;4};{21;8} ;{21;4};{23;4};{21;4};{19;4};{16;4};{19;4};{14;24};{23;4};{21;4};{23;16};{23;4};{21;4};{23;4};{21;4};{19;24};{16;4};{19;4};{21;8} ;{21;4};{23;4};{21;4};{19;4};{16;4};{19;4};{21;24};{23;4};{21;4};{23;16};{23;4};{21;4};{23;4};{21;4};{19;16};{16;4};{19;4};{21;8} ;{21;4};{23;4};{21;4};{19;4};{16;4};{19;4};{14;24};{23;4};{26;4};{26;16};{26;4};{28;4};{26;4};{23;24};{21;4};{23;4};{21;8};{21;4} ;{23;4};{21;4};{19;4};{16;4};{16;2};{19;2};{19;24};{0;20};{26;4};{26;4};{28;4};{31;4};{30;4};{30;4};{28;4};{23;4};{21;4};{21;4};{23;16}; {0;4};{23;4};{23;4};{26;4};{28;8};{28;12};{16;4};{23;4};{21;4};{21;24};{23;4};{26;4};{26;4};{23;4};{26;8};{0;4};{31;8};{30;4};{28;4};{30;4};{ 23;8};{0;4};{28;4};{28;4};{30;4};{28;4};{26;4};{23;4};{21;8};{23;4};{21;4};{23 ;4};{26;16};{0xFF;0xFF}};voiddelayucharpuchari;j;for;p>0;p--fori=181;i>0;i--forj=181;j>0;j--;}voidpause{uchari;j;fori=150;i>0;i--forj=150;j>0;j--;}voidT0_intinterrupt1 {beepIO=beepIO;TH0=Tm0;TL0=Tm1;}voidmain{uchari=0;TMOD=0x01;EA=1;ET0=1; while1{m=musici0;n=musici1;{TR0=0;delayn;i++;}elseifm==0xFF{TR0=0;delay30;i=0;}elseifm==musici+10{TR0=1;delayn;TR0=0;pause;i++;}else{TR0=1;delayn;i++;}}}祝你平安:include"reg52.h"unsignedcharCount;sbit_Speak=P1^5;unsignedcharcodeSONG={//祝你平安0x26;0x20;0x20;0x20;0x20;0x20;0x26;0x10;0x20;0x10;0x20;0x80;0x26;0x20;0x30;0x2 0;0x30;0x20;0x39;0x10;0x30;0x10;0x30;0x80;0x26;0x20;0x20;0x20;0x20;0x20;0x1c;0x2 0;0x20;0x80;0x2b;0x20;0x26;0x20;0x20;0x20;0x2b;0x10;0x26;0x10;0x2b;0x80;0x26;0x2 0;0x30;0x20;0x30;0x20;0x39;0x10;0x26;0x10;0x26;0x60;0x40;0x10;0x39;0x10;0x26;0x2 0;0x30;0x20;0x30;0x20;0x39;0x10;0x26;0x10;0x26;0x80;0x26;0x20;0x2b;0x10;0x2b;0x10x2b;0x20;0x30;0x10;0x39;0x10;0x26;0x10;0x2b;0x10;0x2b;0x20;0x2b;0x40;0x40;0x2 0;0x20;0x10;0x20;0x10;0x2b;0x10;0x26;0x30;0x30;0x80;0x18;0x20;0x18;0x20;0x26;0x2 0;0x20;0x20;0x20;0x40;0x26;0x20;0x2b;0x20;0x30;0x20;0x30;0x20;0x1c;0x20;0x20;0x2 0;0x20;0x80;0x1c;0x20;0x1c;0x20;0x1c;0x20;0x30;0x20;0x30;0x60;0x39;0x10;0x30;0x1 0;0x20;0x20;0x2b;0x10;0x26;0x10;0x2b;0x10;0x26;0x10;0x26;0x10;0x2b;0x10;0x2b;0x8 0;0x18;0x20;0x18;0x20;0x26;0x20;0x20;0x20;0x20;0x60;0x26;0x10;0x2b;0x20;0x30;0x2 0;0x30;0x20;0x1c;0x20;0x20;0x20;0x20;0x80;0x26;0x20;0x30;0x10;0x30;0x10;0x30;0x2 0;0x39;0x20;0x26;0x10;0x2b;0x10;0x2b;0x20;0x2b;0x40;0x40;0x10;0x40;0x10;0x20;0x1 0;0x20;0x10;0x2b;0x10;0x26;0x30;0x30;0x80;0x00};voidTime0_Init{TMOD=0x01;IE=0x82;TH0=0xD8;TL0=0xEF;//12MZ晶振;10msvoidTime0_Intinterrupt1{TH0=0xD8;TL0=0xEF;Count++;//长度加1}/-------------------------------------------------功能:1MS延时子程序-------------------------------------------------/ voidDelay_xMsunsignedintx{unsignedinti;j;fori=0;i<x;i++{forj=0;j<3;j++;}}voidPlay_Songunsignedchari{unsignedcharTemp1;Temp2;unsignedintAddr;Count=0;//中断计数器清0Addr=i217;Temp1=SONGAddr++;ifTemp1==0xFF//休止符{TR0=0;Delay_xMs100;}elseifTemp1==0x00//歌曲结束符{return;}else{Temp2=SONGAddr++;TR0=1;while1{_Speak=~_Speak;Delay_xMsTemp1;ifTemp2==Count{Count=0;break;}}}/-------------------------------------------------功能:主程序-------------------------------------------------/ voidmain{Time0_Init;//定时器0中断初始化while1{Play_Song0;//播放}}。
利用蜂鸣器和单片机演奏简单的音乐电路设计
利用蜂鸣器和单片机演奏简单的音乐电路设计利用蜂鸣器和单片机演奏简单的音乐实验原理图实验程序/* =========================================================== *//* ----------------------------------------------------------- *//* 曲谱存贮格式 uchar code 数组名{音高,音长,音高,音长....} *//* 音高由三位数字组成: *//* 个位是表示 1~7 这七个音符. *//* 十位是表示音符所在的音区,1-低音,2-中音,3-高音; *//* 百位表示这个音符是否要升半音 0(不写)-不升,1-升半音。
*//* 音长最多由三位数字组成: *//* 个位表示音符的时值,其对应关系是: *//* 数值(n) 0 1 2 3 4 5 6 *//* --------------------------------------------- *//* 几分音符 1 2 4 8 16 32 64 *//* 即:音符=2^n ,这样做的目的是为了节省曲谱的存贮空间。
*//* 十位表示音符的演奏效果(0-2),0-普通,1-连音,2-顿音。
*//* 百位是符点位,0(不写)-无符点,1-有符点。
*//* ----------------------------------------------------------- */ /* 调用演奏子程序的方法为: *//* play(乐曲数组名,调号,升降八度,演奏速度,开始指针,结束指针) */ /* 调号(0-11)是指乐曲升多少个半音演奏;升降八度(1-3)是指在演奏 */ /* 在哪个八度演奏: 1-降八度,2-不升不降,3-升八度.开始指针(0- ) */ /* 是从哪个音符开始演奏,结束指针是演奏到哪个音符为止. *//* ----------------------------------------------------------- */ //本程序用T0 来产生音调,用T1 产生音长#include <reg51.h>#define uchar unsigned char#define yx 4/5 /* 定义普通音符演奏的长度分率 */#define plen 2 /* 定义晶振的时钟周期(us) */#define uchar unsigned char#define uint unsigned intsbit speaker=P3^5;/* ------------------下面是曲谱 ------------------------------ */uchar code sound[100]={25,2,23,3,25,3,31,1,26,2,31,3,26,3,25,1,25,2,21,3,22,3,23,2,22,3,21,3,22, 0,25,2,23,3,25,3,31,102,27,3,26,2,31,2,25,1,25,2,22,3,23,3,24,102,17,3, 21,0};uchar tc0,tc1,sc0,sc1; /* 音长和音符两个计数器初值暂存 */void play(sound,dh,sj,speed,point1,point2)uchar code sound[]; /* 接受乐曲数组的地址 */uchar speed,sj,dh; /* 速度、八度、调号 */uint point1,point2; /* 乐曲开始、结束指针 */{uint code fftab[12]={262,277,294,311,330,349,369,392,415,440,466,494}; /* 频率表*/uchar code stab[7]={0,2,4,5,7,9,11}; /* 1~7 在频率表中的位置 */uchar code ltab[7]={1,2,4,8,16,32,64};uchar tl,ts,sl,sm,sh,slen,xg,ii,fd;uint point,hz,tc,sc,len,len0,len1,len2,len4,i,ftab[12]; speaker=1;for(i=0;i<12;i++) /* 根据调号及升降八度来计算音符频率 */ {ii=i+dh;if(ii>11){ii=ii-12;ftab[i]=fftab[ii]*2;}elseftab[i]=fftab[ii];if(sj==1) ftab[i]>>=2;if(sj==3) ftab[i]<<=2;}point=point1;ts=sound[point];tl=sound[point+1]; /* 读出第一个音符和它时时值 */tc=65535-10000/plen; /* 算出10ms 的初装值 */tc0=tc%256; /* 计算TL1 应装入的初值 */tc1=tc/256; /* 计算TH1 应装入的初值 */len0=12000/speed; /* 算出1 分音符的长度(几个10ms) */ len4=len0/4; /* 算出4 分音符的长度 */len4=len4-len4*yx; /* 普通音最长间隔标准 */TMOD=0x11;TH1=tc1; TL1=tc0;ET0=1; EA=1;TR0=0; TR1=1;while(point<=point2){sl=ts%10; /* 计算出音符 */sh=ts/100; /* 计算出是否升半 */sm=ts/10%10; /* 计算出高低音 */hz=ftab[stab[sl-1]+sh]; /* 查出对应音符的频率 */if(sl!=0){if (sm==1) hz>>=2; /* 若是低音 */if (sm==3) hz<<=2; /* 若是高音 */sc=(50000/hz)*10/plen; /* 计算脉冲个数 */sc=65536-sc; /* 计算计数器初值 */sc0=sc%256; /* 算出TL0 应装初值 */sc1=sc/256; /* 算出TH0 应装初值 */TH0=sc1; /* 装入初值 */TL0=sc0+12; /* 加12 是对中断延时的补偿 */}slen=ltab[tl%10]; /* 算出是几分音符 */xg=tl/10%10; /* 算出音符类型(0 普通1 连音2 顿音) */fd=tl/100;len=len0/slen; /* 算出连音音符演奏的长度(多少个10ms)*/ if (fd==1) len=len+len/2;if(xg!=1)if(xg==0) /* 算出普通音符的演奏长度 */if (slen<=4)len1=len-len4;elselen1=len*yx;elselen1=len/2; /* 算出顿音的演奏长度 */elselen1=len;if(sl==0) len1=0;len2=len-len1; /* 算出不发音的长度 */if (sl!=0)TR0=1;for(i=len1;i>0;i--) /* 发规定长度的音 */{while(TF1==0);TH1=tc1; TL1=tc0;TF1=0;}}if(len2!=0){TR0=0; speaker=1;for(i=len2;i>0;i--) /* 音符间的间隔 */{while(TF1==0);TH1=tc1; TL1=tc0;TF1=0;}}point+=2; /* 音符指针下移 */ts=sound[point]; tl=sound[point+1]; /* 读出下一个音符和它时时值 */}void yin() interrupt 1 /* 音符发生程序(中断服务程序)*/ {speaker=~speaker;TH0=sc1; TL0=sc0;}//==============================================main(){while(1){play(sound,0,2,60,0,57);play(sound,0,1,60,0,57);play(sound,0,3,60,0,57);play(sound,0,2,40,0,57);play(sound,5,2,60,0,57);play(sound,0,2,80,0,57);}}。
单片机-利用蜂鸣器演奏音乐
实验三-利用蜂鸣器演奏音乐一、实验目的1.了解BlueSkyC51单片机实验板中蜂鸣器的硬件电路2.学会利用蜂鸣器实现音乐的演奏3.掌握蜂鸣器实现音乐演奏的编程二、实验硬件设计及电路1. BlueSkyC51单片机实验板2.单片机最小系统3.蜂鸣器电路连接三极管主要是做驱动用的。
因为单片机的IO口驱动能力不够让蜂鸣器发出声音,所以我们通过三极管放大驱动电流,从而可以让蜂鸣器发出声音,你要是输出高电平,三极管导通,集电极电流通过蜂鸣器让蜂鸣器发出声音,当输出低电平时,三极管截止,没有电流流过蜂鸣器,所以就不会发出声音。
三、实验原理1.音调及节拍用一个口,输出方波,这个方波输入进蜂鸣器就会产生声音,通过控制方波的频率、时间,就能产生简单的音乐。
一般说来,单片机演奏音乐基本都是单音频率,因此单片机奏乐只需控制音调和节拍。
(1)音调的确定音调是由频率来确定的。
通过单片机的定时器定时中断,将单片机上对应蜂鸣器的I/O 口来回取反,从而让蜂鸣器发出不同频率的声音。
只需将定时器给以不同的定时值就可实现。
通过延时,即可发出所需要的频率。
(2)节拍的确定一拍的时长大约为400—500ms,每个音符的时长通过节拍来计算。
详细见程序代码。
2.软件设计相关(1)头文件#include<reg51.h>#define uint unsigned int#define uchar unsigned char#define ulong unsigned longsbit beep=P1^4; //蜂鸣器与P1.4口连接(2)歌曲曲谱uchar code diaodata[30]={ //音调代码0x10,0x0e,0x0c,0x10,0x0e,0x0c,0x10,0x0e,0x10,0x0c,0x10,0x15,0x13,0x10,0x13,0x15,0x15,0x13,0x15,0x13,0x10,0x0e,0x0c,0x0e,0x0e,0x10,0x0e,0x0c,0x0e,0x00};uchar code jiedata[30]={ //音长代码0x04,0x04,0x08,0x06,0x02,0x08,0x04,0x04,0x04,0x04,0x02,0x06,0x08,0x02,0x02,0x04,0x04,0x04,0x04,0x08,0x02,0x02,0x04,0x04,0x02,0x02,0x04,0x04,0x0c,0x00};(3)音阶表uchar code freq[36*2]={ //音阶码表0xf7,0xd8, //440hz , 1 //00xf8,0x50, //466hz , 1# //10xf8,0xbc, //494hz , 2 //20xf9,0x26, //524hz , 2# //30xf9,0x85, //554hz , 3 //40xf9,0xe5, //588hz , 4 //50xfa,0x3d, //622hz , 4# //60xfa,0x92, //660hz , 5 //70xfa,0xdd, //698hz , 5# //80xfb,0x29, //740hz , 6 //90xfb,0x70, //784hz , 6# //100xfb,0xb0, //830hz , 7 //110xfb,0xef, //880hz , 1 //120xfc,0x29, //932hz , 1# //130xfc,0x62, //988hz , 2 //140xfc,0x95, //1046hz, 2# //150xfc,0xc7, //1108hz, 3 //160xfc,0xf5, //1174hz, 4 //170xfd,0x20, //1244hz, 4# //180xfd,0x4c, //1318hz, 5 //190xfd,0x72, //1396hz, 5# //200xfd,0x97, //1480hz, 6 //210xfd,0xbb, //1568hz, 6# //220xfd,0xdc, //1662hz, 7 //230xfd,0xfb, //1769hz, `1 //240xfe,0x18, //1864hz, `1# //250xfe,0x34, //1976hz, `2 //260xfe,0x4e, //2092hz, `2# //270xfe,0x67, //2218hz, `3 //280xfe,0x7d, //2350hz, `4 //290xfe,0x94, //2488hz, `4# //300xfe,0xa8, //2639hz, `5 //310xfe,0xbc, //2794hz, `5# //320xfe,0xcf, //2960hz, `6 //330xfe,0xe0, //3136hz, `6# //340xfe,0xf1, //3322hz, `7 //35};(4) 音符发生程序(中断服务程序)void timer0() interrupt 1 //用于产生音符的T0中断服务程序{TH0=th0_f;TL0=tl0_f;beep=~beep; //取反beep引脚,发声}三、实验过程及问题1.Keil开发过程(1)新建“Project”,选择单片机为“AT89C52”(2)新建c文件“music.c”,并添加到工程中(3)设置生成“HEX”文件,编译(4)将生成的“HEX”文件烧录到单片机,检验(5)不断修改完善2.编译实验相关问题(1)实际发音颤音重解决方法为修改蜂鸣器的驱动频率.(2)实际节奏过快或者过慢调整延时四、C51程序代码(部分来源于网络)#include<reg51.h>#define uint unsigned int#define uchar unsigned char#define ulong unsigned longsbit beep=P1^4; //蜂鸣器与P1.4口连接uchar th0_f; //中断装载T0高8位uchar tl0_f; //T0低8位uchar code freq[36*2]={ //音阶码表0xf7,0xd8, //440hz , 1 //00xf8,0x50, //466hz , 1# //10xf8,0xbc, //494hz , 2 //20xf9,0x26, //524hz , 2# //30xf9,0x85, //554hz , 3 //40xf9,0xe5, //588hz , 4 //50xfa,0x3d, //622hz , 4# //60xfa,0x92, //660hz , 5 //70xfa,0xdd, //698hz , 5# //80xfb,0x29, //740hz , 6 //90xfb,0x70, //784hz , 6# //100xfb,0xb0, //830hz , 7 //110xfb,0xef, //880hz , 1 //120xfc,0x29, //932hz , 1# //130xfc,0x62, //988hz , 2 //140xfc,0x95, //1046hz, 2# //150xfc,0xc7, //1108hz, 3 //160xfc,0xf5, //1174hz, 4 //170xfd,0x20, //1244hz, 4# //180xfd,0x4c, //1318hz, 5 //190xfd,0x72, //1396hz, 5# //200xfd,0x97, //1480hz, 6 //210xfd,0xbb, //1568hz, 6# //220xfd,0xdc, //1662hz, 7 //230xfd,0xfb, //1769hz, `1 //240xfe,0x18, //1864hz, `1# //250xfe,0x34, //1976hz, `2 //260xfe,0x4e, //2092hz, `2# //270xfe,0x67, //2218hz, `3 //280xfe,0x7d, //2350hz, `4 //290xfe,0x94, //2488hz, `4# //300xfe,0xa8, //2639hz, `5 //310xfe,0xbc, //2794hz, `5# //320xfe,0xcf, //2960hz, `6 //330xfe,0xe0, //3136hz, `6# //340xfe,0xf1, //3322hz, `7 //35};uchar code diaodata[30]={ //音调代码0x10,0x0e,0x0c,0x10,0x0e,0x0c,0x10,0x0e,0x10,0x0c,0x10,0x15,0x13,0x10,0x13,0x15,0x15,0x13,0x15,0x13,0x10,0x0e,0x0c,0x0e,0x0e,0x10,0x0e,0x0c,0x0e,0x00};uchar code jiedata[30]={ //音长代码0x04,0x04,0x08,0x06,0x02,0x08,0x04,0x04,0x04,0x04,0x02,0x06,0x08,0x02,0x02,0x04,0x04,0x04,0x04,0x08,0x02,0x02,0x04,0x04,0x02,0x02,0x04,0x04,0x0c,0x00};void timer0() interrupt 1 //用于产生音符的T0中断服务程序{TH0=th0_f;TL0=tl0_f;beep=~beep; //取反beep引脚,发声}void main(void){uchar i,j,k=0;uint n;TMOD=0X01; //T0方式1TR0=0; //关闭T0(不发声)ET0=1; //允许T0中断EA=1; //允许总中断while(1){TR0=1; //开T0for(i=0;diaodata[i]!=0;i++){th0_f=freq[diaodata[i]*2];tl0_f=freq[diaodata[i]*2+1];for(j=0;j<20000;n++); //(jiedata*20000)TR0=0;for(n=0;n<256;n++); //音符之间的短暂延时TR0=1;}TR0=0;}}(注:可编辑下载,若有不当之处,请指正,谢谢!)。
基于单片机的蜂鸣器放音乐课程设计
基于单片机的蜂鸣器放音乐课程设计单片机课程设计—蜂鸣器放音乐设计学号:**************班级:**************姓名:**指导教师:***日期:2012.6课程设计任务书级: ********** 班姓名: **设计周数: 1 学分: 1指导教师: ***设计题目:设计目的及要求:目的:,.熟悉印制电路板设计的步骤和方法,能够按照自己的思想设计出所需的电路功能,并能明白其原理和应用。
,.熟悉常用电子器件的类别、型号、规格、性能及其使用范围,能查阅有关的电子器件图书。
,.能够正确识别和选用常用的电子器件,并且能够熟练使用普通万用表和数字万用表。
,.能够熟练的使用单片机编程软件,实现硬件及软件的紧密结合,并能熟练地调试程序,明白程序的目的和编写步骤。
要求:掌握设计电路和写单片机程序及调试.设计内容和方法:用STC89C52单片机和电平转换芯片MAX232组成一个简单的控制电路,用以控制蜂鸣器发出各种不同的声音,并利用虚拟仪器控制。
方法:通过电脑的串口写入一段程序到单片机中,实现单片机的控制作用。
利用按键控制蜂鸣器的发声,经MAX232与电脑相连,用虚拟仪器实现对单片机的控制。
目录第一章绪论............................................................. 1 第二章总体设计.......................................................... 2 第三章硬件部分. (3)第四章软件部分..........................................................4 第五章总结.............................................................. 5 参考文献. (6)附录...................................................................7第一章绪论单片机的发展概况单片机以其高可靠性、高性价比、低电压、低功耗等一系列优点,近几年得到迅猛发展和大范围推广,广泛应用于工业控制系统,数据采集系统、智能化仪器仪表,及通讯设备、日常消费类产品、玩具等。
基于单片机的蜂鸣器唱歌设计(附图)
蜂鸣器是一种一体化结构的电子讯响器�主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型�他广泛应用于计算机、打印机、复印机、报警器、电话机等电子产品中作发声器件。
单片机上面使用的蜂鸣器一般都是无源电磁式的蜂鸣器�如下图所示�。
它由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。
接通电源后�振荡器产生的音频信号电流通过电磁线圈�使电磁线圈产生磁场�振动膜片在电磁线圈和磁铁的相互作用下�周期性地振动发声。
蜂鸣器发声原理是电流通过电磁线圈�使电磁线圈产生磁场来驱动振动膜发声的�因此需要一定的电流才能驱动它�单片机IO引脚输出的电流较小�单片机输出的TTL电平基本上驱动不了蜂鸣器�因此需要增加一个电流放大的电路。
单片机与蜂鸣器连接如图二所示。
图中�蜂鸣器的正极接到VCC��5V�电源上面�蜂鸣器的负极接到三极管的发射极E�三极管的基级B经过限流电阻R1后由单片机的P3.7引脚控制�当P3.7输出高电平时�三极管T1截止�没有电流流过线圈�蜂鸣器不发声�当P3.7输出低电平时�三极管导通�这样蜂鸣器的电流形成回路�发出声音。
因此�我们可以通过程序控制P3.7脚的电平来使蜂鸣器发出声音和关闭。
程序中改变单片机P3.7引脚输出波形的频率�就可以调整控制蜂鸣器音调�产生各种不同音色、音调的声音。
另外�改变P3.7输出电平的高低电平占空比�则可以控制蜂鸣器的声音大小�这些我们都可以通过编程实验来验证。
下面就是一个能够发出音乐的单片机程序�示例中所播放的音乐是《两只老虎》。
SPK EQU P3.7 ;位定义ORG 0000H ;伪指令�指定程序从0000H开始存放LJMP START ;程序跳转至START处执行ORG 0030H ;伪指令�指定程序从0030H开始存放START: MOV SP,#60H ;堆栈初始化MOV R3,#00H ;给R3赋值NEXT:MOV A,R3MOV DPTR,#TABLE ;查歌曲表MOVC A,@A+DPTRJZ START ;为00则循环播放此歌MOV R7,A ;R7/R2保存连续相邻的表数据INC R3MOV A,R3MOVC A,@A+DPTRMOV R2,AACALL SONGINC R3SJMP NEXT;==============================;=========歌曲播放子程序==========;==============================SONG:MOV A,R2 ;取出节拍RL AJNZ KEEP ;A不等于零则跳MOV A,#01H ;A等于零则赋值为1KEEP:MOV R2,A ;REPEAT:ACALL EIGHTH ;调用1/8拍延时程序DJNZ R2,REPEAT ;RET;===============================;=======产生1/8拍延时子程序=======;===============================EIGHTH:MOV A,R7 ;查表取出延时参数,保存到R4MOV DPTR,#DELAY_TMOVC A,@A+DPTRMOV R4,AMOV A,R7 ;查表取出1/8拍周期数,保存到R5 MOV DPTR,#S_PARAMOVC A,@A+DPTRMOV R5,ANEXTCYC:ACALL SOUNDDJNZ R5,NEXTCYCRET;==============================;===========发声子程序===========;==============================SOUND:SETB SPKACALL SDELAYCLR SPKACALL SDELAYRET;==============================;===========延时子程序===========;==============================SDELAY:MOV A,R4 ;延时值在R4内MOV R0,AXL2:MOV R1,#03HDL1:NOPDJNZ R1,DL1DJNZ R0,XL2RET;==============================;===========1/8拍周期表==========;==============================S_PARA:DS 1DHDB 15H,16H,00DB 19H,00H,1CH,00H,1FH,21H,00H,25HDB 00H,29H,2CH,00H,31H,34H,37H,00HDB 3EH,41H,00H,49H,00H,52H,57H,00HDB 62H;==============================;===========延时参数表===========;==============================DELAY_T:DS 1DHDB 7EH,77H,00HDB 6AH,00H,5EH,00H,54H,4FH,00H,46HDB 00H,3FH,3BH,00H,35H,32H,2FH,00HDB 2AH,27H,00H,23H,00H,1FH,1DH,0C0HDB 1AH;==============================;============歌曲表=============;==============================TABLE:DW 2504H,2704H,2904H,2504HDW 2504H,2704H,2904H,2504HDW 2904H,2A04H,2C08HDW 2904H,2A04H,2C08HDW 2C02H,2E02H,2C02H,2A02H,2904H,2504HDW 2C02H,2E02H,2C02H,2A02H,2904H,2504HDW 2904H,2004H,2508HDW 2904H,2004H,2508HDW 0000HEND童鞋们可能发现了�数据表TABLE里面的数据才是歌曲数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计:嵌入式系统应用题目名称:利用蜂鸣器实现音乐播放功能姓名:学号:班级:完成时间:1设计的任务设计内容:动手焊接一个51单片机设计目标:利用单片机上的蜂鸣器实现音乐播放功能2 设计的过程2.1 基本结构1.STC89C52RC在本次的试验中采用了STC89C52RC单片机,STC89C52RC单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期,工作电压:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机),工作频率范围:0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz,用户应用程序空间为8K 字节。
(STC89C52RC引脚图)STC89C52RC单片机的工作模式:(1)典型功耗<0.1μA,可由外部中断唤醒,中断返回后,继续执行原程序(2)空闲模式:典型功耗2mA(3)正常工作模式:典型功耗4Ma~7mA(4)唤醒,适用于水表、气表等电池供电系统及便携设备2.蜂鸣器及其工作原理:蜂鸣器按其结构分主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。
接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
本实验采用的是电磁式蜂鸣器。
蜂鸣器按其是否带有信号源又分为有源和无源两种类型。
有源蜂鸣器只需要在其供电端加上额定直流电压,其内部的震荡器就可以产生固定频率的信号,驱动蜂鸣器发出声音。
无源蜂鸣器可以理解成与喇叭一样,需要在其供电端上加上高低不断变化的电信号才可以驱动发出声音。
本实验采用的是有源蜂鸣器。
(蜂鸣器与单片机连接电路图)2.2 软件设计过程1.蜂鸣器发声原理本实验由于采用有源蜂鸣器,只需将引脚端口P3^4清零,蜂鸣器即可发声;P3^4置位,蜂鸣器停止发声。
采用置1置0的方法只能使蜂鸣器发声或停止发声,想要使蜂鸣器发出声音,必须对蜂鸣器发出声音的音频和节拍进行控制。
(音乐基础音调:不同音高的乐音是用C、D、E、F、G、A、B来表示,这7个字母就是音乐的音名,它们一般依次唱成DO、RE、MI、FA、SO、LA、SI,即唱成简谱的1、2、3、4、5、6、7,相当于汉字“多来米发梭拉西”的读音,这是唱曲时乐音的发音,所以叫“音调”,即Tone。
把C、D、E、F、G、A、B这一组音的距离分成12个等份,每一个等份叫一个“半音”。
两个音之间的距离有两个“半音”,就叫“全音”。
在钢琴等键盘乐器上,C–D、D–E、F–G、G–A、A–B两音之间隔着一个黑键,他们之间的距离就是全音;E–F、B–C两音之间没有黑键相隔,它们之间的距离就是半音。
通常唱成1、2、3、4、5、6、7的音叫自然音,那些在它们的左上角加上﹟号或者b号的叫变化音。
﹟叫升记号,表示把音在原来的基础上升高半音,b叫降记音,表示在原来的基础上降低半音。
例如高音DO的频率(1046Hz)刚好是中音DO的频率(523Hz)的一倍,中音DO的频率(523Hz)刚好是低音DO频率(266 Hz)的一倍;同样的,高音RE的频率(1175Hz)刚好是中音RE的频率(587Hz)的一倍,中音RE的频率(587Hz)刚好是低音RE频率(294 Hz)的一倍。
节拍:节拍是让音乐具有旋律(固定的律动),而且可以调节各个音的快满度。
“节拍”,即Beat,简单说就是打拍子,就像我们听音乐不自主的随之拍手或跺脚。
若1拍实0.5s,则1/4 拍为0.125s。
至于1拍多少s,并没有严格规定,就像人的心跳一样,大部分人的心跳是每分钟72下,有些人快一点,有些人慢一点,只要听的悦耳就好。
音持续时间的长短即时值,一般用拍数表示。
休止符表示暂停发音。
)1)控制发声频率要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。
利用定时器计时这半个周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O 反相,就可在I/O脚上得到此频率的脉冲。
利用STC89C52RC的内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0从而产生不同频率。
此外结束符和休止符可以分别用代码00H和FFH来表示,若查表结果为0x00,则表示曲子终了;若查表结果为0xff,则产生相应的停顿效果。
以标准音高A为例,A的频率是440Hz,周期T=1/440=2272us。
在占空比为50%的情况下,导通时间=断开时间=半周期t=2272us/2=1136us,利用P3^4端口的位操作,经过不断地反相变换即可得到标准音高A的音频脉冲。
端口导通时间与断开时的时间利用定时器实现。
具体的方法是将单片机定时器的中断触发时间设为半周期t,这样每隔半周期端口反相,输出连续的对应音高的频率。
设晶振的频率为f0,中断触发时间(半周期)为t,定时器工作在模式1时计数器的初值为THL,高8位为THL,低8位为TL。
时钟周期即为1/f0,定时器每一次累加用去一个机器周期,一个机器周期包含12个时钟周期,即定时器每次加一所用时间是12/f0。
定时器在模式1下计时采用16位数,最大计数为2^16-1(65535),再次加一(65536)溢出触发中断。
根据以上分析可得如下关系:音频对应定时器初值的高8位TH=THL/(2^8)=(65536-t*f/12)/256;音频对应定时器初值的低8位TL=THL%(2^8)=(65536-t*f/12)%256; 附:八度12音阶定时器初值表(只含自然音)低音音名频率Hz 晶振12MHz晶振11.0592MHz中音音名频率Hz 晶振12MHz晶振11.0592MHz高音音名频率Hz 晶振12MHz晶振11.0592MHzDo 262 0xF885 0xF91B Do 523 0xFC43 0xFC8EDo 1046 0xFE21 0xFE47Re 294 0xF95A 0xF9DF Re 587 0xFCAD0xFCEDRe 1175 0xFE56 0xFE76Mi 330 0xFA10xFA8Mi 659 0xFD00xFD4Mi 1318 0xFE85 0xFEAFa 349 0xFA68 0xFAD8Fa 698 0xFD340xFD6AFa 1397 0xFE9A0xFEC7So 392 0xFB04 0xFB68 So 784 0xFD82 0xFDB3So 1568 0xFEC10xFED9La 440 0xFB90 0xFBE9 La 880 0xFDC80xFDF3 La 1760 0xFEE4 0xFEF9Si 494 0xFC0C 0xFC5BSi 988 0xFE06 0xFE2DSi 1976 0xFF03 0xFF162)控制发声节拍每个音符的节拍可通过延时一定的时间来实现,在具体实现时需要有一个基本的带参延时程序,用于主函数根据不同的音符调用不同的时延。
若以十六分之一音符的时长为基本延时时间,则十六分音符只需调用一次延时程序,八分音符则需调用两次延时程序,以此类推。
3)简谱及其编码*简谱知识1音符音符用数字1至7表示。
这7个数字就等于大调的自然音阶。
如果是C大调,加上音名,就会是这样:○2八度如果是高一个八度,就会在数字上方加上一点。
如果是低一个八度,就会数字下方加上一点。
在中间的那一个八度就什么也不用加。
如果要再高一个八度,就在上方垂直加上两点(如:);要再低一个八度,就在下方垂直加上两点(如:),如此类推。
见下表所示:大调... ...小调... ...○3音长通常只有数字的是四分音符。
数字下加一条横线,就可令四分音符的长度减半,即成为八分音符;两条横线可令八分音符的长度减半,即成为十六分音符,余此类推;简单来説,下加横綫数目与五綫谱的符尾数目相对应。
数字后方的横线延长音符,每加一条横线延长一个四分音符的长度。
正如五綫谱的附点一样,数字后方加一点会将音符长度增加一半。
○4休止符休止符用“0”来表示。
比四分休止符长,就只需在每一个四分休止符再多加一个“0”,不需在后方加上横线。
若整个小节均是休止状态的话,就在每个四分音符加一个“0”,就像是3拍4就写成“| 0 0 0 |”,而4拍4就写成“| 0 0 0 0 |”。
○5无音高音符就像敲击乐的乐器那样是没有音高的,这时,简谱就需要用“X”或“x”表达。
例如啦啦队拍手时,简谱上就需如此表达:○6小节线正如五綫谱一样,小节与小节之间以纵綫(称小节线)分隔,乐曲终止以一粗一细的直綫表示(但是一般不分粗细);重复乐段以纵綫后两点表示开始,纵綫前两点表示终止。
○7拍号拍号的表达方式为:“2/4”、“3/4”、“4/4”、“6/8”等等。
拍号一般都是置于调号的后方。
○8变调与调号表示调号有两种方法:可以直接写“C调”,“C小调”或“Key: C”,“Key: Cm”。
亦可写清楚主音代表哪一个音,例如1=C,就是C大调(大调以1为主音)。
6=C就是C小调(小调以6为主音)。
2=D 就是D多利安调(多利安调以2为主音)。
五线谱有升降号,简谱同样有升降号。
在简谱中,若需表达升降号,就把符号加在数字1至7的前方,让该音升高或降低。
若要把升降号加在调号跟和弦CDEFGAB七个字母,就须加在它们的后方。
在五綫谱中,C小调要把B-E-A三个音降低半音。
所以表达它的和声小调时,就会把一个还原号放在B♭前面。
简谱就一定得写♯5,因为5不能下降。
○9延音线、圆滑线与其他音乐符号简谱延音线(Tie)跟圆滑綫(slur)都是跟五线谱相同,一定得置在数字上方。
表达跳音(staccato)时需要特别小心,因为很容易会跟低八度的那一点混淆,因此在表达跳音时把那一点写得粗点及低点。
*简谱编码将简谱中的每个音符进行编码,每个音符用一个unsigned char字符类型表示,简谱可用一个unsigned char字符数组表示。
字符的前四位表示音频,可以表示0-f共十六个音符。
本实验中采用了中音区和高音区。
中音do-si分别编码为1~7,高音do-si分别编码为8~E,停顿编为0。
字符的后四位表示节拍,节拍以十六分音符为单位(在本程序中为165ms),一拍即四分音符等于4个十六分音符,编为4,其它的播放时间以此类推。
以0xff作为曲谱的结束标志。
程序从数组中取出一个数,然后分离出高4位得到音调,将值赋给定时器0,得到音调;接着分离出该数的低4位,得到节拍。
本实验中播放音乐使用简谱如下:将其编码成:uchar code zbjbxf[]={0x64,0xA3,0xC1,0xA2,0x62,0x84,0x61,0x81,0x61,0xA4,0xA1,0x91,0xA1,0x8 1,0x64,0xA3,0xC1,0xD2,0xD2,0xD2,0xA2,0xC4,0xA1,0xC1,0xA1,0xC1,0xD2 ,0xD2,0xD2,0xA2,0xC4,0xC2,0x62,0xC2,0x62,0xA2,0xA2,0x84,0x94,0x94,0x 92,0x81,0x91,0xA2,0xC2,0xD4,0xE4,0xA4,0xE4,0xA2,0xE2,0xA2,0xE2,0xA2, 0xA2,0x84,0x94,0x94,0x92,0x81,0x91,0xA2,0xC2,0xD8};2.3 程序流图及说明(主程序流程图)程序代码:#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit fm=P3^4;//蜂鸣器控制端口uchar timeh,timel;//用于存放定时器的高8位和低8位uchar code zbjbxf[]={//定义猪八戒背媳妇的简谱数组0x64,0xA3,0xC1,0xA2,0x62,0x84,0x61,0x81,0x61,0xA4,0xA1, 0x91,0xA1,0x81,0x64,0xA3,0xC1,0xD2,0xD2,0xD2,0xA2,0xC4, 0xA1,0xC1,0xA1,0xC1,0xD2,0xD2,0xD2,0xA2,0xC4,0xC2,0x62, 0xC2,0x62,0xA2,0xA2,0x84,0x94,0x94,0x92,0x81,0x91,0xA2,0xC2,0xD4,0xE4,0xA4,0xE4,0xA2,0xE2,0xA2,0xE2,0xA2, 0xA2,0x84,0x94,0x94,0x92,0x81,0x91,0xA2,0xC2,0xD8};//适合12M的晶振定时器初值表,高低8位分开uchar code chuzhi[]={0xff,0xff,//占位0xFC,0x8E,//中央C调1-70xFC,0xED,0xFD,0x43,0xFD,0x6A,0xFD,0xB3,0xFD,0xF3,0xFE,0x2D,0xFE,0x47,//高八度1-70xFE,0x76,0xFE,0xA1,0xFE,0xC7,0xFE,0xD9,0xFE,0xF9,0xFF,0x16};void timer0() interrupt 1 //定时器0中断服务程序{TH0=timeh; //将timeh赋给计时器的高8位TL0=timel; //将timel赋给计时器的低8位fm=~fm; //定时器每次到时将蜂鸣器反相}void delay(uint z) //延时165MS,即十六分音符{ uint y;for(z;z>0;z--)for(y=19000;y>0;y--);//大致时间}void delay1(uint z) //延时1MS{ uint y;for(z;z>0;z--)for(y=112;y>0;y--);//大致时间}void main(){uint temp; //存放简谱数组中的每一个音符的临时变量uchar i=0;uchar jp; //jp用于取出temp中的高8位和低8位TMOD=0x01;//设置定时器T0工作于方式1IE=0x82; //允许T0中断while(1){temp=zbjbxf[i];if(temp==0xff)break;jp=temp/16; //取数的高4位,音频数值if(jp!=0){timeh=chuzhi[jp*2];//构造定时器初值高8位timel=chuzhi[jp*2+1]; //构造定时器初值低8位TR0=1; //开定时器}else{TR0=0; //关定时器fm=1; //关蜂鸣器}delay(temp%16); //取数的低4位,节拍(音符总时延)TR0=0; //唱完一个音停5MSfm=1;delay1(5);//TR0=1;i++;}TR0=0; //关定时器fm=1; //关蜂鸣器}3 运行结果或者测试结果测试结果:利用蜂鸣器实现了播放音乐的功能,达到了预期的目标,测试成功。