1、单片机原理及应用课程设计基于按键控制蜂鸣器播放多段音乐的设计基于按键控制蜂鸣器播放多段音乐的设计引言这学期我们学习了单片机原理及接口技术这一门实用而又生动的课程,初次接触到它就被它丰富的内容所吸引。单片机自 20 世纪 70 年代问世以来,已得到了十分广泛的应用。随着单片机 的集成度越来越高以及单片机系统的广泛应用,对软件编程的要求也越来越高,要求编程人员在短时间内编写出执行效率高、运行可靠的程序代码。单片机具有一些突出的有点:体积小、重量轻、耗电少、电源单一、功能强、价格低、运行速度较快、抗干扰能力强、可行性高,所以在如今的绝大数的领域中都能够看到单片机的身影。本次设计是基于 AT89C51
2、 芯片的电路为基础,外加上三极管的放大、放音设备蜂鸣器,以此来实现音乐硬件控制器的硬件电路,通过软件程序来控制单片机内部的定时器使其播放出优美的音乐。此次设计共写进了三首歌曲程序,分别是仙剑 、 月亮代表我的心和小星星 。关键字:单片机 蜂鸣器 AT89C51 芯片 音乐Based on the button control play more paragraphs music of the buzzer designInstructionThis term we have learnt the digital image processing which is a practical and
3、 vivid course, First contact to it, I was attractive by its rich content.Since the 1970 s, the single chip microcomputer appeared has been a wide range of applications. With the integration of single chip more and more high and the wide application of single-chip microcomputer system, the software p
4、rogramming requirement also more and more high, requesting programming staff in a short time, writing executive high efficiency and reliable operation program code. SCM has some prominent a bit: small volume, light weight, less consumption, and the power of a single, the function is strong, price lo
5、w, the process is fast and strong anti-interference ability, feasibility is high, so in most of the number now in your field you can see the figure of single chip microcomputer.This design is based on AT89C51 chips based circuit, and the transistor amplifier and let the sound equipment, so as to rea
6、lize music hardware hardware circuit, through the software program to control of the single chip microcomputer timer internal plays beautiful music. The design of three songs were written into the program, it is respectively xianjian, the moon represents my heart, little star. Keywords: Single-chip
7、microcomputer ,buzzer,AT89C51 chip,music目 录第一章 绪论 .11.1课程设计目的 11.2课程设计任务 11.3课程设计的意义 1第二章 设计原理 .22.1 设计原理 22.1.1 基本原理简述 22.1.2 关于音乐的原理知识概况 2第三章 ATMEL 89C51 简介 .53.1 ATMEL 89C51简介 53.1.1 AT89C51单片机 53.1.2 单片机 CPU结构 53.1.3 AT89C51用户系统 63.1.4 引脚介绍 73.1.5 蜂鸣器原理 7第四章 软件编程设计 84.1 编程思路 84.2 编程方案的设计 94.2.1
8、软件功能选择 94.2.2 综合调试 94.2.3 程序清单 9心得体会 .16致谢 .17参考文献 .17第一章 绪论1.1课程设计目的应用单片机,基于按键控制蜂鸣器播放多段音乐,利用它的原理组成一个简单的音乐盒。1.2课程设计任务1)以单片机为核心部件组成一个简单音乐播放器;2)利用单片机的定时器产生乐谱的各种频率方波,信号经过放大后由蜂鸣器发出声音;3)自行定义按键盘,当有键按下时,能相应的播放出歌曲。有一个停止键能控制音乐的播放;1.3课程设计的意义利用开发板及组成的器件,在软件及硬件上进一步了解单片机的原理,深入了解了单片机 C51 语言的实际应用,能更深地理解课堂上所学的内容,巩固
9、C 语言程序编写,亲身体会作为一名设计人员所需要具备的各种能力,学会理论知识联系实际,提高我们发现问题,分析问题,解决问题和实践动手的能力。第二章 设计原理2.1 设计原理2.1.1 基本原理简述声音是通过振动产生的。单片机对某一引脚以一定的频率循环置 1 置 0,该引脚便产生一定频率的方波,方波通过放大,作用于一定的物理实件(蜂鸣器) ,就产生了一定频率的声音。若改变输出方波的频率,产生的声音随之改变。通过控制输出方波的时间长短,声音的长短也可以得到控制,因此,根据乐谱,以类似的音节及同样的节拍,单片机就可以产生电子音乐。音乐的播放选择可以通过按键的输入得以实现。为简便起见,以一定的频率方波
10、产生的音在其每个周期内高低幅值得时间各占一半因此,输出引脚在每个方波周期内要动作两次:一次升高,一次降低。即输出引脚的频率是原音频率的两倍。方波的产生由定时器控制。定时器 T0 工作在定时方式 1,改变 TH0 及TL0,产生不同的音频频率。必须考虑到中断响应时间的影响,尤其在高音部分,若忽略中断响应时间,会使音频频率比标准值低几十 Hz,相当于 1/4 音程,很容易听出来,对低音部分影响不大。一般中断响应时间为 36 个机器周期,经过反复试验取 5 个机器周期作为校正最为恰当,表 1 中所给的定时初值就是考虑中断响应后的定时常数。另外,为避免 T1 中断可能引起杂音,应将定时器T0 中断设为
11、高优先级。这样编写出来的程序播放的音与标准音叉进行差频校音,非常准确和谐。音乐播放器的基本硬件电路有六部分组成:单片机、时钟与复位电路、选择按键输入电路、音频发生器、音频放大器和扬声器。2.1.2 关于音乐的原理知识在音乐中使用的各个固定频率的音叫音级 1。常用符号C、D、E、F、G、A、B、c、d、e、a 1、b 1、c 2、d 2表示,它们对应于钢琴上的白键。两音之间音高的距离叫音程。在上述音级中,E 与 F、B 与 C 之间音高的距离仅为其它相邻音级之间距离的一半,称它们之间的音程为半音音程,而称其它相邻各音之间的距离为全音音程。在这些全音音程之间又加入新的半音音级,用符号C、D、F、G
12、、A、c、d、f、表示,对应于钢琴上的黑键。音持续时间的长短即时值,一般用拍数表示。休止符表示暂停发音。下面分别是各音符及对应频率(表 2.1)与节拍表(表 2.2)表 2.1 各音符及对应频率音符 低 DO 低#DO 低 RE 低#RE 低 MI 低 EA简谱码 DO_L DO#_L RE_L RE#_L MI_L FA_L频率 262HZ 277HZ 294HZ 311HZ 330HZ 349HZ音符 低#FA 低 SO 低#SO 低 LA 低#LA 低 SI简谱码 FA#_L SO_L SO#_L LA_L LA#_L SI_L频率 370HZ 393HZ 415HZ 440HZ 466
13、HZ 494HZ音符 中 DO 中#DO 中 RE 中#RE 中 MI 中 EA简谱码 DO DO# RE RE# MI FA频率 523HZ 554HZ 587HZ 622HZ 659HZ 698HZ音符 中#FA 中 SO 中#SO 中 LA 中#LA 中 SI简谱码 FA# SO SO# LA LA# SI频率 740HZ 785HZ 831HZ 880HZ 932HZ 988HZ音符 高 DO 高#DO 高 RE 高#RE 高 MI 高 EA简谱码 DO_H DO#_H RE_H RE#_H MI_H FA_H频率 1047HZ 1109HZ 1174HZ 1245HZ 1318HZ
14、1397HZ音符 高#FA 高 SO 高#SO 高 LA 高#LA 高 SI简谱码 FA#_H SO_H SO#_H LA_H LA#_H SI_H频率 1480HZ 1568HZ 1661HZ 1760HZ 1865HZ 1976HZ每个音符分为简谱码和节拍码。简谱码为 D0-L 到 SI-H,节拍码为 1 到16。对应的节拍表如表 2.2 所示。对应的拍子: 2/2。 。 。 。 。 。 。 。 。 。 。以二分音符为一拍,每小节有两拍(二分音符代表一拍)2/4。 。 。 。 。 。 。 。 。 。 。以四分音符为一拍,每小节有两拍(四分音符代表一拍)3/4。 。 。 。 。 。 。 。
15、。 。 。以四分音符为一拍,每小节有三拍(四分音符代表一拍)4/4。 。 。 。 。 。 。 。 。 。 。以四分音符为一拍,每小节有四拍(四分音符代表一拍)表 2.2 节拍表拍数 字符 拍数 字符1/8 00H 2 08H1/4 01H 5/2 09H1/2 02H 3 0AH3/4 03H 7/2 0BH1 04H 4 0CH5/4 05H 5 0DH3/2 06H 6 0EH7/4 07H 8 0FH第三章 ATMEL 89C51 概况3.1 ATMEL 89C51简介3.1.1 AT89C51单片机AT89C51 是美国 ATMEL 公司推出的系列单片机,将多种功能的 8 位 CPU
16、与FPEROM(快闪可编程/擦除只读存储器)结合在一个芯片上,是一种低功耗、高性能的 CMOS 控制器,为很多嵌入式控制应用提供了非常灵活而又价格适宜的方案,其性能价格比远高于同类芯片。它与 MCS-51 指令系统兼容,片内 FPEROM允许对程序存储器在线重复编程,也可用常规的 EPROM 编程器编程,可循环写入/擦除 1000 次。89C51 内含 4KB 的 FPEROM,一般的 EEPROM 的字节擦除时间和写入时间基本上均为 10ms,对于任一个实时控制系统来说,这样长的时间是不可能在线修改程序的。3.1.2 单片机 CPU结构(如图 3.1) 图 3.1 单片机 CPU 结构3.1
17、.3 AT89C51用户系统 CPU 为 Atmel 公司生产的 89C51/89C52/89C55 等。出厂所配晶振频率为11.0592MH,每个机器周期为 1.085us,用户更换晶振以提高速度; 存贮器为 64K,前 4K/8K20K 在 CPU 内部,其它程序在 EPR0M27512 中; 数据存贮器为 32K(62256),地址为 8000FFFFH; /O 扩展 8155,片内 RAM 地址200O-20FFH ; 8155 命令口地址为2100H ; A 口地址21O1H B 口地址:2102H C 口地址:2103H ; T 低八位2104H T 高八位2105H ; 多路模拟
18、开关的使用 IN0P1=0F8H IN4:P1=0FCH IN1P1=0F9H IN5:P1=OFDH IN2P1=0FAH IN5:P1=0FEH IN3P1=0FBH IN7:P1=0FFH 不掉电数据存贮器为500EH-507FH ; 控制板160x1O9(mm) 供电+5V300mA +12V100mA -12V100mA ; AT89C51 是一种低功耗、高性能的片内含有 4KB 快闪可编程/擦除只读存储器(FPEROM-Flash Programmable and Eraseable Read Only Memory)的8 位 CMOS 微控制器,使用高密度、非易失存储技术制造,并
19、且与 80C51 引脚和指令系统完全兼容; 主要性能: 与 MCS-51 微控制器产品系列兼容;片内有 4KB 可在线重复编程的快闪擦写存储器 。3.1.4 引脚分布如图(3.2)图 3.2 89C51 引脚图3.1.5 蜂鸣器原理如图(3.3)图 3.3 蜂鸣器原理图第四章 软件编程设计4.1 编程思路想要产生音频信号,只要算出某一音频的周期(频率的倒数) ,将此周期除以 2 即为半周期的时间,利用定时器计时此半周期时间,计时到后取反输出,重复此过程即得到此频率的声音信号。此信号从 P3.0 脚输出。定时器 T0 工作在定时方式 1,改变 TH0 及 TL0,产生不同的音频频率。必须考虑到中
20、断响应时间的影响,尤其在高音部分,若忽略中断响应时间,会使音频频率比标准值低几十 Hz,相当于 1/4 音程,很容易听出来,对低音部分影响不大。一般中断响应时间为 36 个机器周期,经过反复试验取 5 个机器周期作为校正最为恰当,表 2.1 中所给的定时初值就是考虑中断响应后的定时常数。另外,为避免 T1 中断可能引起杂音,应将定时器 T0 中断设为高优先级。这样编写出来的程序播放的音与标准音叉进行差频校音,非常准确和谐。本设计中单片机晶振频率为 11.0592MHz。每个音符使用两个字节。低位字节(偶地址)代表音级,00H 表示不发音(休止符) ,01H30H 依次表示的音级为c、c、d、d
21、、e、f、a3、a3、b3 ,详见表 2.1。高位字节(奇地址)代表音符的时值(拍数) ,00H0FH 依次表示拍数为 1/8 拍(0.10s)8 拍(6.40s) ,见表 2.2。乐曲的结束标志是两个字节:0FFH,0FFH。设计延时程序 125ms,来控制节拍,并在延时中判断是否有停止键按下,以便随时停止音乐。改变延时程序的延迟时间,即可实现歌曲的快慢演奏。主程序的任务是按顺序读取数据表中的字节,根据情况调用音级子程序和演唱子程序,启动定时器 T0;通过延时控制节拍,并循环回音级子程序,等待演唱完毕。要编写的乐谱按要求以音符字节数据表的形式存放在程序中,改变乐曲就是通过改变该数据表的内容来
22、实现的。主程序的任务是按顺序读取数据表中的字节,根据情况调用音级子程序和音长子程序,启动定时器 T0;根据定时器 T1 应中断的次数,启动定时器 T1。数据表读完后,根据所设置的循环演奏次数决定是否结束程序。音级子程序的任务是取出字节中的音级部分,分析 TH0 和 TL0 中应送入何值,送给33H,34H。演唱子程序的任务是取出对应频率值,并乘以 2,启动 T0,实现发音。之后执行延时程序,体现节拍,依此循环,直到音乐结束。当乐曲较长时(超过 254 个字节) ,数据表指针溢出,应及时修改基址寄存器 DPTR 内容,即数据表的表头指针。4.2 编程方案的设计4.2.1 软件功能选择对于 4 个
23、按键的功能设计,一个停止键 P2.5,其余三个键(P1.0,P1.2,P1.3)分别对应三首歌曲。演奏过程中,按停止键可使乐曲停止,继续按其他键继续选择其他歌曲演奏。选歌的按键使用 8279 键盘扫描以获得键值。停止键使用的单片机的外部中断 1 实现其功能的。4.2.2 综合调试在开发板上进行调试,先是进行单个模块调试,在开发板上进行播放歌曲的调试,使其能单曲循环播放,当有开关键按下时,就停止播放歌曲,再按下时,又重新播放歌曲。最终实现当有控制键按下时,能够演奏对应的歌曲,再按播放下一首,当停止键按下时,停止播放歌曲。4.2.3程序清单#define uchar unsigned char /
24、定义一下方便使用#define uint unsigned int#define ulong unsigned long#include /包括一个 52 标准内核的头文件char code dx5163 _at_ 0x003b;/这是为了仿真设置的sbit BEEP=P37; /喇叭输出脚sbit P10=P10; sbit K1= P10; /播放仙剑sbit K2= P12;/播放月亮sbit K3= P13;/播放小星星sbit K4= P25;/停止播放uchar th0_f; /在中断中装载的 T0 的值高 8 位uchar tl0_f; /在中断中装载的 T0 的值低 8 位/T
25、0 的值,及输出频率对照表uchar code freq36*2=0xA9,0xEF,/00220HZ ,1 /00x93,0xF0,/00233HZ ,1#0x73,0xF1,/00247HZ ,20x49,0xF2,/00262HZ ,2#0x07,0xF3,/00277HZ ,30xC8,0xF3,/00294HZ ,40x73,0xF4,/00311HZ ,4#0x1E,0xF5,/00330HZ ,50xB6,0xF5,/00349HZ ,5#0x4C,0xF6,/00370HZ ,60xD7,0xF6,/00392HZ ,6#0x5A,0xF7,/00415HZ ,70xD8,0x
26、F7,/00440HZ 1 /120x4D,0xF8,/00466HZ 1# /130xBD,0xF8,/00494HZ 2 /140x24,0xF9,/00523HZ 2# /150x87,0xF9,/00554HZ0xE4,0xF9,/00587HZ 4 /170x3D,0xFA,/00622HZ 4# /180x90,0xFA,/00659HZ 5 /190xDE,0xFA,/00698HZ 5# /200x29,0xFB,/00740HZ 6 /210x6F,0xFB,/00784HZ 6# /220xB1,0xFB,/00831HZ 7 /230xEF,0xFB,/00880HZ 1
27、0x2A,0xFC,/00932HZ 1#0x62,0xFC,/00988HZ 20x95,0xFC,/01046HZ 2#0xC7,0xFC,/01109HZ 30xF6,0xFC,/01175HZ 40x22,0xFD,/01244HZ 4#0x4B,0xFD,/01318HZ 50x73,0xFD,/01397HZ 5#0x98,0xFD,/01480HZ 60xBB,0xFD,/01568HZ 6#0xDC,0xFD,/01661HZ 7 /35;/定时中断 0,用于产生唱歌频率timer0() interrupt 1TL0=tl0_f;TH0=th0_f; /调入预定时值BEEP=B
28、EEP; /取反音乐输出 IO/*/音乐符号串解释函数/入口:要解释的音乐符号串,输出的音调串,输出的时长串changedata(uchar *song,uchar *diao,uchar *jie)uchar i,i1,j;char gaodi; /高低+/-12 音阶uchar banyin;/有没有半个升音阶uchar yinchang;/音长uchar code jie78=0,12,14,16,17,19,21,23; /C 调的 7 个值*diao=*song;for(i=0,i1=0;)gaodi=0; /高低=0banyin=0;/半音=0yinchang=4;/音长 1 拍i
29、f(*(song+i)=|) | (*(song+i)= ) i+;/拍子间隔和一个空格过滤switch(*(song+i)case ,: gaodi=-12;i+;/低音break;case : gaodi=12;i+; /高音break;if(*(song+i)=0) /遇到 0 结束*(diao+i1)=0; /加入结束标志 0*(jie+i1)=0;return;j=*(song+i)-0x30; i+; /取出基准音j=jie7j+gaodi; /加上高低音yinc: switch(*(song+i)case #: /有半音 j 加一个音阶i+;j+;goto yinc;case -
30、: /有一个音节加长yinchang+=4;i+;goto yinc;case _: /有一个音节缩短yinchang/=2;i+;goto yinc;case .: /有一个加半拍yinchang=yinchang+yinchang/2;i+;goto yinc;*(diao+i1)=j; /记录音符*(jie+i1)=yinchang; /记录音长i1+;/*/奏乐函数/入口:要演奏的音乐符号串void play(uchar *songdata)uchar i,c,j=0;uint n;uchar xdata diaodata112; /音调缓冲uchar xdata jiedata112
31、; /音长缓冲changedata(songdata,diaodata,jiedata); /解释音乐符号串TR0=1;for(i=0;diaodatai!=0;i+) /逐个符号演奏tl0_f=freqdiaodatai*2; /取出对应的定时值送给 T0th0_f=freqdiaodatai*2+1;for(c=0;cjiedatai;c+) /按照音长延时for(n=0;n32000;n+);if(!K1)|(!K2)|(!K3)|(!K4)/发现按键,立即退出播放TR0=0;return;TR0=0;for(n=0;n500;n+); /音符间延时TR0=1;TR0=0;/仙剑ucha
32、r code xianjian=“|3_3_3_2_3-|2_3_2_2_,6,6_,7_|12_1_,7,6_,5_|,6-|“3_3_3_2_3.6_|5_6_5_5_22_3_|45_4_32_1_|3.-3_|“67_6_55_3_|5-3_5_|26_5_32_3_|3-|“26_6_6-|16_6_66_7_|17_6_76_7_|3.-3_|“67_6_55_3_|5-3_5_|67_6_76_7_|3-|“26_6_6-|16_6_66_7_|17_6_7.5_|6-|“;/月亮代表我的心uchar code song3=“5-5_3_2_1_|3-|6-6_4_2_1_“,7
33、-,5_|1.3_5.1_|,7.3_5 5_|“6.7_1.6_|6_5_5-3_2_|1.1_13_2_|“1.1_12_3_|2.1_,62_3_|2- ,5_|“1.3_5.1_|,7.3_55_|6.7_1.6_|“6_5_5-3_2_|1.1_13_2_|1.1_12_3_“2.,6_,71_2_|1-“;/小星星uchar code mamahao=“1155|665-|4433|221-|“5544|332-|5544|332-|“1155|665-|4433|221-|“;/三个按键选择三首不同的音乐播放,一个键停止播放void main(void) / 主程序TMOD =
34、0x01; /使用定时器 0 的 16 位工作模式TR0 = 0;ET0 = 1; /定时器 0 中断EA = 1; /打开总中断while(1)if(!K1)while(!K1);play(xianjian); /播放音乐if(!K2)while(!K2);play(song3); /播放音乐if(!K3)while(!K3);play(mamahao); /播放音乐心得体会此次课程设计培养了学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域, 在生活
35、中可以说得是无处不在。因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。回顾起此次单片机课程设计,我仍感慨颇多,的确,从选题到定稿,从理论到实践,在接近四星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同
36、时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说不懂一些元器件的使用方法,对单片机汇编语言掌握得不好通过这次课程设计之后,一定把以前所学过的知识重新温故。通过这次单片机课程设计,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。创新可以是在原有的基础上进行改进,使之功能不断完善,成为真己的东西。我们花费了大量的时间和精力,更重要的是,我们在学会创新的基础上,同时还懂得合作精神的重要性,学会了与他人合作。学习单片机这门课程要掌握单片机指令系统中汇编语言各种基本语句的意义
37、及汇编语言程序设计的基本知识和方法,以及单片机与其他设备相连接的输入输出中断等接口技术。使学生从硬件软件的结合上理论联系实际,提高动手能力,从而全面掌握单片机的应用。致谢本文的撰写是在老师、同学和朋友的支持下完成的,在此向他们表示衷心的感谢,首先感谢我们的 XX 老师,X 老师作为我们专业课的任教老师具有广博的专业知识,超前的学术思维,指引着我们在学术研究中前进的方向,正是在X 老师的悉心授课下,我们从对单片机这门课的一无所知到受益匪浅。X 老师在工作中治学严谨、踏实认真;在生活中态度和蔼、平易近人,在平时的交谈中总可以从他的话语中得到思维上的启迪,他不仅是我们的良师更是我们的益友。在此真诚的感谢他!另外还要感谢我们的同学和朋友们,他们给了我许多的建议和帮助,帮助我们查漏补缺,真得很感激他们。最后感谢在我们背后默默支持我们的家人,在他们的关爱和鼓励下,我们体会到了前所未有的动力,让我们能够克服重重的困难完成任务。参考文献1孙毅刚,彭宇,赵光权, 单片机原理及接口技术 ,人民邮电出版社,2011.082 马忠梅,籍顺心,张凯,马岩, 单片机的 C 语言应用程序设计 ,北京航空航天大学出版社,2003 年3李朝青, 单片机原理及接口技术 ,北京航空航天大学出版社.1998 年4 赵建领, 51 系列单片机开发宝典 ,电子工业出版社.2007 年