基于单片机的八音盒电路原理图和完整程序源代码_第1页
基于单片机的八音盒电路原理图和完整程序源代码_第2页
基于单片机的八音盒电路原理图和完整程序源代码_第3页
基于单片机的八音盒电路原理图和完整程序源代码_第4页
基于单片机的八音盒电路原理图和完整程序源代码_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、51单片机课程设计报告(八音盒) 2010-12-13 22:28:24| 分类: 电子、课程设计类 | 标签:51单片机 八音盒 程序 |字号大中小 订阅 摘 要本文设计了一种基于51单片机(AT89C52)的八音盒,利用蜂鸣器和K20K27制作了一个八音盒,内置八首乐曲,当按下不同的按键时,奏出不同的乐曲。并且把其他按键当作琴键,可以用它弹奏乐曲。本设计充分利用51单片机定时器的功能,根据do、re、mi等音调的频率,利用其产生不同的音调,从而演奏乐曲。在设计需考虑到歌曲曲谱的解析,令单片机能够解读其含义并工作,并根据演奏出乐曲的效果不断调整程序,进行优化。关键词:51单片机、八音盒、定时

2、器AbstractThis article introduces a design based on 51 SCM (AT89C52), using the buzzer and buttons as K20 - K27 made a her bed-room, with built-in eight songs。 When pressing different button, it goes out different pieces of music. And taking the other buttons as keys, we can use it to play music. Thi

3、s design make full use of 51 single-chip microcomputer timer function, according to do, re, mi tones of frequency, we use it to produce different tone, thus playing music. In the design song analysis should be considered, so the songs can be understood by SCM and make it work, and according to play

4、music effect constantly adjust procedure, making optimization.Keywords:51 SCM、her bed-room、timer目 录摘要 I第一章51单片机简介 1第二章系统设计 12.1主要电路图及说明 12.2软件方框图及说明 3第三章实验结果及讨论 17第四章总结 17参考文献 17附录 18第一章 51单片机简介单片机现在是越来越普及了,学习单片机的热潮也一阵阵赶来,许多人因为工作需要或者个人兴趣需要学习单片机。可以说,掌握了单片机开发,就多了一个饭碗。51 单片机已经有30 多年的历史了,在中国,高校的单片机课程大多数

5、都是51,而51 经过这么多年的发展,也增长了许多的系列,功能上有了许多改进,也扩展出了不少分支。而国内书店的单片机专架上,也大多数都是51 系列。可以预见,51 单片机在市场上只会越来越多,功能只会越来越丰富,在可以预见的数十年内是不可能会消失的。在数字电路中,电压信号只有两种情况,高电平和低电平,用数字来记录就是1 和0。单片机内部的CPU,寄存器,总线等等结构都是通过1 和0 两种信号来运作的,数据也是以1 或者0 来保存的。单片机的输入输出管脚,也就是IO 口,也是只输出或识别1 和0 两种信号,也就是高电平和低电平。当单片机输出一个或一组电平信号到IO 口后,外部的设备就可以读到这些

6、信号,并进行相应操作,这就是单片机对外部的控制。当外部一个或一组电平信号送到单片机的IO 口时,单片机也可以读到这些信号,并进行分析操作,这就是单片机对外部设备信号的读取。当然实际的操作中,这些信号可能十分复杂,必须严格地按照规定的时间顺序(时序)输入输出。每种设备也都规定了自己的时序,只要都严格遵守,就可以控制任何设备,做出只要你想象得出的任何事情。如何让单片机去控制和分析外部设备呢?答案是程序,我们可以编写相关的程序,并且把他们烧写到单片机内部的程序空间,单片机在上电时,就会一步一步按照您写的程序去执行指令,做您想做的事情。在51 标准芯片中,有32 个输入输出IO,分为4 组,每组8 个

7、,分别为P0 口,P1 口,P2 口,P3 口。P1 口的8 条脚就用P1.0 至P1.7 表示,其余类似。51 就是用这32 个口来完成所有外部操作的。第二章系统设计2.1主要电路图及说明 本设计使用的是单片机实验箱来实现八音盒功能,实验箱包含单片机接口的各个电路。本章中只介绍本设计所使用的主要电路部分。如图2.1.1所示为单片机的最小系统部分,只有这部分电路正常,整个系统才能正常工作。图2.1.1 单片机最小系统如图2.1.2所示为键盘接口电路图,此电路包含行列式键盘和独立式按键输入电路。P20-23为行,P24-27为列,构成4×4行列式键盘。按键编号规律为S2+行号+列号。例

8、如S226表示P22行和P26列跨接处的按键。K20-27构成独立式按键,分别接在P20-27上,当按键按下时,对应的口线输入0,同时相应的LED点亮。但在本设计中未使用。图2.1.2 键盘接口电路如图2.1.3电路为蜂鸣器电路。蜂鸣器采用9012三极管驱动,其基极接到RD端,当RD端为低电平时,三极管导通,蜂鸣器响。否则关断。图2.1.3 蜂鸣器电路图2.2 软件方框图及说明 实验程序及解析:#include <reg52.h> /包括一个52标准内核的头文件#define uchar unsigned char /定义一下方便使用#define uint unsigned in

9、t#define ulong unsigned long#define SPEAK RD/*sbit SPEAK = P20;*/uchar th0_f; /在中断中装载的T0的值高8位uchar tl0_f; /在中断中装载的T0的值低8位uchar key;/*-函数声明-*/ uchar keyscan(void);/键盘扫描void delay(uint i); /延时程序/*-*/T0的值,及输出频率对照表uchar code freq36*2=0xA9,0xEF,/00220HZ ,1 /00x93,0xF0,/00233HZ ,1#0x73,0xF1,/00247HZ ,20x4

10、9,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,0xF7,/00440HZ 1 /120x4D,0xF8,/00466HZ 1# /130xBD,0xF8,/00494HZ 2 /140x24,0xF9,/00523HZ 2# /150x87,0xF9,/0

11、0554HZ 3 /160xE4,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 10x2A,0xFC,/00932HZ 1#0x62,0xFC,/00988HZ 20x95,0xFC,/01046HZ 2#0xC7,0xFC,/01109HZ 30xF6,0xFC,/0117

12、5HZ 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; /调入预定时值SPEAK =SPEAK; /取反音乐输出IO/*/音乐符号串解释函数/入口:要解释的音乐符号串,输出的音调串,输出的时长串changedata(uchar *song,uchar *diao,uchar *

13、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拍if(*(song+i)='|') | (*(song+i)=' ') i+; /拍子间隔和一个空格过滤switch(*(song+i)case ',': g

14、aodi=-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 '-': /有一个音节加长yinchang+=4;i+;goto yinc;case '_

15、': /有一个音节缩短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 diaodata48; /音调缓冲uchar jiedata48; /音长缓冲changedata(songdata,diaodata,jied

16、ata); /解释音乐符号串TR0=1;for(i=0;diaodatai!=0;i+) /逐个符号演奏tl0_f=freqdiaodatai*2; /取出对应的定时值送给T0th0_f=freqdiaodatai*2+1;for(c=0;c<jiedatai;c+) /按照音长延时key = keyscan();for(n=0;n<29500;n+); / 29500if(key != 0xff)/(!K1)|(!K2)|(!K3)|(!K4)/发现按键,立即退出播放TR0=0;return; TR0=0;for(n=0;n<460;n+); /音符间延时TR0=1;TR0

17、=0;/茉莉花uchar code molihua="33_5_6_1_1_6_|55_6_5-|33_5_6_1_1_6_|55_6_5-|""5553_5_|665-|32_3_53_2_|11_2_1|"/"3_2_1_3_2.3_|56_1_5-|23_5_2_3_1_,6_|,5-,61|"/"2.3_1_2-1_,6_|,5-" ;/世上只有妈妈好 uchar code mamahao= "6.5_35|16_5_6-|35_6_53_2_|1_,6_5_3_2-|" "2

18、.3_55_6_|321-|5.3_2_1_,6_1_|,5-" ;/小毛驴uchar code xiaomaolv="1_1_1_3_|5_5_5_5_|6_6_6_1|5-|""4_4_4_6_|3_3_3_3_|2_2_2_2_|5-"/我是一只菠萝uchar code boluo="1-|2_4_3_2_55|5_6_3_4_22|2_4_3_2_1_1_7_6_|5_4_2_3_11|""2_4_3_2_55|5_6_3_4_22|2_4_3_2_1_5_2_3_|1-|"/小星星uchar c

19、ode xiaoxingxing="1155|665-|4433|221-|""5544|332-|5544|332-|""1155|665-|4433|221-|"/春天在哪里uchar code chuntian="3_3_3_1_|,5,5_|3_3_3_1_|3-|5_5_3_1_|,5_,5_,5|,6_,7_1_3_|2-|""3_3_3_1_|,5,5_|3_3_3_1_|3-|5_6_5_6_|5_4_3_1_|,5_3_|2_1_"/两只老虎uchar code laohu=&

20、quot;1231|1231|345-|345-|""5_6_5_4_31|5_6_5_4_31|""151-|151-"/就是爱你uchar code jiushiaini="3_2_3_4_5,7_1_|11_7_7 5_6_|66_5_5_3_2_1_3_|4_,6_,7_1_32|""3_2_3_4_5,7_1_|11_7_7_3_|3-6_|5_4_.4_5_5-|4_,6_ ,7_1_32._1_|"/黑白配uchar code heibai="32345-|1,7123-|3,5,

21、611-|"/找朋友uchar code zhaopeng="5_6_5_6_|5_6_5|5_1_7_6_|5_6_5"/数鸭子uchar code shuya="313_3_1|3_3_5_6_5-|6_6_5_5_4_4_4|2_3_2_1_2"/欢乐颂uchar code huanle="3345|5432|1123|322-|3345|5432|1123|211-|"/一分钱uchar code lifen="51|6_1_5|3_5_2_3_|5|3_5_6_1_|5_6_5_3_|5_13_2&quo

22、t;/乐谱方式输入的音乐播放void main(void) / 主程序uchar code jie88=12,14,16,17,19,21,23,24;/12345671八个音符在频率表中的位置TMOD = 0x01; /使用定时器0的16位工作模式TR0 = 0;ET0 = 1;EA = 1;while(1)key = keyscan(); switch(key) case 0x7e: while(key = 0x7e)key = keyscan();play(molihua);SPEAK=1;break;/0 按下相应的键显示相对应的码值 case 0x7d: while(key = 0x

23、7d)key = keyscan();play(shuya);SPEAK=1;break;/1 case 0x7b:while(key = 0x7b) key = keyscan();play(mamahao);SPEAK=1;break;/2 case 0x77:while(key = 0x77) key = keyscan();play(xiaomaolv);SPEAK=1;break;/3 case 0xbe:while(key = 0xbe) key = keyscan();play(boluo);SPEAK=1;break;/4 case 0xbd:while(key = 0xbd)

24、 key = keyscan();play(huanle);SPEAK=1;break;/5 case 0xbb:while(key = 0xbb) key = keyscan();play(heibai);SPEAK=1;break;/6 case 0xb7:while(key = 0xb7) key = keyscan();play(zhaopeng);SPEAK=1;break;/7 case 0xde:while(!(key 0xde)tl0_f=freqjie80*2; /置一个音符的值th0_f=freqjie80*2+1;TR0 = 1;key = keyscan();/for(

25、n=0;n<10000;n+); /延时SPEAK=1; break;/8 case 0xdd:while(!(key 0xdd)tl0_f=freqjie81*2; /置一个音符的值th0_f=freqjie81*2+1;TR0 = 1;key = keyscan();/for(n=0;n<10000;n+); /延时SPEAK=1;break;/9 case 0xdb:while(!(key 0xdb)tl0_f=freqjie82*2; /置一个音符的值th0_f=freqjie82*2+1;TR0 = 1;key = keyscan();/for(n=0;n<1000

26、0;n+); /延时SPEAK=1;break;/a case 0xd7:while(!(key 0xd7)tl0_f=freqjie83*2; /置一个音符的值th0_f=freqjie83*2+1;TR0 = 1;key = keyscan();/for(n=0;n<10000;n+); /延时SPEAK=1;break;/b case 0xee:while(!(key 0xee)tl0_f=freqjie84*2; /置一个音符的值th0_f=freqjie84*2+1;TR0 = 1;key = keyscan();/for(n=0;n<10000;n+); /延时SPEA

27、K=1;break;/c case 0xed:while(!(key 0xed)tl0_f=freqjie85*2; /置一个音符的值th0_f=freqjie85*2+1;TR0 = 1;key = keyscan();/for(n=0;n<10000;n+); /延时SPEAK=1;break;/d case 0xeb:while(!(key 0xeb)tl0_f=freqjie86*2; /置一个音符的值th0_f=freqjie86*2+1;TR0 = 1;key = keyscan();/for(n=0;n<10000;n+); /延时SPEAK=1;break;/e c

28、ase 0xe7:while(!(key 0xe7)tl0_f=freqjie87*2; /置一个音符的值th0_f=freqjie87*2+1;TR0 = 1;key = keyscan();/for(n=0;n<10000;n+); /延时SPEAK=1;break;/f default: break; TR0 = 0;/*-键盘扫描程序-*/uchar keyscan(void) /键盘扫描函数,使用行列反转扫描法 uchar cord_l,cord_h;/行列值中间变量 P2=0x0f; /行线输出全为0 cord_l=P2&0x0f; /读入列线值 if(cord_l!=0x0f) /先检测有无按键按下 delay(100); /消抖 if(cord_l!=0x0f) cord_l=P2&0x0f; /读入列线值 P2=cord_l|0xf0; /输出当前列线值 cord_h=P2&0xf0; /读入行线值 return(cord_h+cord_l);/键盘最后组合码值 return(0xff); /返回该值/*-延时程序-*/void delay(uint i) /延时函数while(i-);第三章 实验结果及讨论本程序能清晰地演奏乐谱,并能用按键演奏歌曲。第四

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论