单片机音乐发生器.doc

上传人:w****2 文档编号:6598602 上传时间:2020-02-29 格式:DOC 页数:26 大小:683.50KB
返回 下载 相关 举报
单片机音乐发生器.doc_第1页
第1页 / 共26页
单片机音乐发生器.doc_第2页
第2页 / 共26页
单片机音乐发生器.doc_第3页
第3页 / 共26页
点击查看更多>>
资源描述
第 届电子设计大赛论文单片机音乐发生器组长: 组员: 目 录1、系统方案- 2 -1.1、方案比较与选择- 2 -1.1.1、单片机选择与论证- 2 -1.1.2、功放选择与论证- 2 -1.1.3、显示器件选择与论证- 2 -1.1.4、键盘形式选择与论证- 3 -1.1.5、材料选择与论证- 3 -2、理论分析与计算- 3 -2.1、声音播放的原理- 3 -2.1.1、普通声音产生原理. - 3 -2.1.2、音乐产生原理.- 4 -2.2、音符节拍处理- 5 -3、电路与程序设计- 6 -3.1、电路的设计- 6 -3.1.1、总体框图设计- 6 -3.1.2、时钟电路设计- 6 -3.1.3、复位电路设计- 7 -3.1.4、按键电路设计- 7 -3.1.5、显示电路设计- 8 -3.1.6、扬声器电路设计- 9 -3.2、程序设计.- 10 -3.2.1、系统整体流程图- 10 -3.2.2、键盘子程序流程图- 10 -3.2.3、液晶显示子程序流程图- 11 -4、测试方案与测试结果- 12 -4.1、测试方案- 12 -4.2、测试结果- 12 -4.3、测试分析- 13 -附录- 13 -附录1:电路原理图- 13 -附录2:部分源程序- 14 -1、系统方案1.1、方案比较与选择1.1.1、单片机选择与论证方案一:8051单片机。8051内部包含一个8位CPU,128BRAM,4KBROM,21个特殊功能寄存器,4个8位并行I/O口,一个全双工串行口,2个16位定时器、计数器,5个中断源。方案二:SST单片机。SST单片机省去了开发用的编程器和仿真器。省去了外部EEPROM、电压监控芯片、上电复位电路和5个UART的扩展芯片。它自带在线下载和在线仿真功能,带有5路PCA模块(主成分分析),PCA功能比普通单片机有更强的计时性。利用PCA的脉冲宽度调制(PWM)模式可产生一个8位PWM。方案三:AT89C52单片机。AT89C52是美国ATMEL公司生产的低电压,高性能CMOS位单片机,片内含4k字节的可反复擦写1000次的只读程序存储器(PEROM)和128字节的随机存取数据存储器(RAM),片内置通用8位中央处理器(CPU)和Flash存储单元。基于对功能齐全性的考虑,我们采用方案三。1.1.2、功放选择与论证方案一:LM386。LM386是一种音频集成功放,具有自身功耗低、更新内链增益可调整、电源电压范围大和总谐波失真小等优点的功率放大器。方案二:NPN型三极管。集电极电流受基极电流的控制,并且基极电流很小的变化,会引起集电极电流很大的变化,且变化满足一定的比例关系。出于对市场供应情况和价格方面的考虑,我们采用方案一。1.1.3、显示器件选择与论证方案一:数码管。数码管显示能在低电压、小电流条件下驱动发光,能与CMOS、ITL电路兼容。发光响应时间极短(30秒。发挥部分(1):能播放指定曲目。发挥部分(2):具有键盘,可现场编曲并播放。发挥部分(3):具有液晶显示功能,可显示简谱。发挥部分(4):可将简谱转换成显示五线谱。4.2、测试结果4.2.1、仿真测试通过Keil和Proteus仿真,在播放Do,Re,Mi,Fa,So,La,Xi,Do等待两秒后,可以听到自选歌曲和指定曲目,LCD显示歌曲信息。按下控制键后,进入编曲模式,7个独立键盘分别代表七个音符,可现场编曲。同时,数码管显示每个按键代表的数字。如图13所示,为数码管仿真结果。 图134.2.2、成品测试 通过对成品进行调试实验,所得到的结果与仿真结果相同。4.3、测试分析由测试结果可以看出,成品满足基本要求和发挥部分的部分要求。附录附录1:电路原理图附录2:部分源程序#include#include #defineuchar unsigned char#define uint unsigned int #define LCDPORT P0#define E P31#define RW P33#define DI P34#define CS1 P36#define CS2 P35#define BUSYSTATUS P07#define LCDSTARTROW 0xc0#define LCDPAGE 0xB8#define LCDLINE 0x40void Run(void);/主程序void KeyScan(void);/ 按键void PlayKey(void); /按键程序void delay_1ms(uchar i);/延时1msvoid PlayMusic1(void); / 播放12345671void PlayMusic(void); /播放同一首歌void PlayMusic2(void); /播放规定曲目1void DisPlay(void);/ 数码管/void lcd_init(void); /lcd初始化void init_com(void);void sound_delay(uchar n);void timer0(void);uchar code hz1;/*一系列变量*/sbit Beep=P27;/sbit busy=P01;ucharTh0,Tl0;ucharflag=0;/模式,0表示音乐,1表示按键ucharkey=0;/按键代号uchara;uchargaodi=0;/uchar data count=0;/uint counter=0;/12345671的频率uchar code SONG_TONE=115,102,91,86,77,68,61,0;/12345671的节拍uchar code SONG_LONG=17,18,20,21,23,25,28,0; /*比赛规定曲目*/魂斗罗 赤色要塞uchar code SONG_TONE2=34,38,45,51,45,51,57,61, 57,61,68,77,68,102,91,77, 68,68,45,51,45,43,38, 68,68,45,51,45,43,57, 68,68,45,51,45,43,38, 68,68,45,51,45,43,57,0;/魂斗罗的节拍uchar code SONG_LONG2=13,12,10,9,10,9,8,28, 8,7,6,6,6,5,5,6, 35,13,10,9,19,11,85, 35,13,10,9,19,11,68, 35,13,10,9,19,11,85, 35,13,10,9,19,11,68,0; /*同一首歌的源代码*/uchar codeMusic=0Xef,0Xef, 0X88,0X14,0X24,0X36,0X42,0X34,0X14,0X28,0X14,0X94,0X1f,0X88,0X14,0X24,0X34,0X32,0X42,0X54,0X14,0X46,0X32,0X54,0X22,0X32,0X32,0X22,0X2C,0X38,0X54,0X74,0X76,0X62,0X68,0X54,0X52,0X62,0X74,0X62,0X52,0X3f,0X46,0X42,0X54,0X64,0X54,0X42,0X32,0X28,0X0a4,0Xa2,0X92,0X84,0X94,0X1f,0Xb8,0X68,0X46,0X52,0X68,0X74,0X72,0X72,0X74,0X62,0X52,0X3f,0Xb8,0X68,0X46,0X52,0X68,0X64,0X62,0X62,0X64,0X42,0X32,0X2f,0X58,0X14,0X24,0X36,0X42,0X34,0X12,0X12,0X26,0X22,0X24,0X22,0X12,0X94,0X9c,0Xa8,0Xa6,0X92,0X84,0X64,0X54,0X22,0X22,0X46,0X42,0X44,0X32,0X22,0X5f,0Xef,0Xef,0xFF,/按键音符ucharcodeKeyCode =0XFF,0XFF,0xF8,0x8B,0xF9,0x5B,0xFA,0x14,0xFA,0x66,0xFB,0x03,0xFB,0x8F,0xFC,0x0B,/低音0xFC,0x43,0xFC,0xAB,0xFD,0x08,0xFD,0x33,0xFD,0x81,0xFD,0xC7,0xFE,0x05,/中音0xFE,0x21,0xFE,0x55,0xFE,0x84,0xFE,0X99,0XFE,0xC0,0xFE,0xE3,0xFF,0x02,/高音;/功能程序void Run(void)if(flag=0)PlayMusic1(); /12345671PlayMusic(); /同一首歌PlayMusic2();/魂斗罗elsePlayKey();void KeyScan(void)/按按键1-7,数码管的显示if(P1=0X7f)/如果P1.7=0delay_1ms(5);if(P1=0X7f)gaodi+;if(gaodi2)gaodi=0;a=gaodi;else if(P1=0XFE)delay_1ms(12);if(P1=0XFE)key=1;a=key;else if(P1=0XFD)delay_1ms(12);if(P1=0XFD)key=2;a=key;else if(P1=0XFB)delay_1ms(12);if(P1=0XFB)key=3;a=key;else if(P1=0XF7)delay_1ms(12);if(P1=0XF7)key=4;a=key;else if(P1=0XEF)delay_1ms(12);if(P1=0XEF)key=5;a=key; else if(P1=0XDF)delay_1ms(12);if(P1=0XDF)key=6;a=key;else if(P1=0XBF)delay_1ms(12);if(P1=0XBF)key=7;a=key;elsereturn;void PlayKey(void)if(key=0)return;elseTh0=KeyCodegaodi*14+key*2;Tl0=KeyCodegaodi*14+key*2+1;TR0=1;delay_1ms(187);TR0=0;key=0;time0() interrupt 1 /定时器0中断TH0=Th0;TL0=Tl0;Beep=Beep;void interrupt0() interrupt 0 /外部终端0flag=flag;if(flag=0)a=8;P2=0;/延时1msvoid delay_1ms(uchar i)uchar j,k;for(j=0;ji;j+)for(k=0;k148;k+); /*播放音乐主程序*/12345671void PlayMusic1(void) uint i=0; uint j,k; while(SONG_LONGi!=0|SONG_TONEi!=0) /播放各个音符,SONG_LONG 为拍子长度 for(j=0;jSONG_LONGi*30;j+) Beep=Beep; /SONG_TONE 延时表决定了每个音符的频率 for(k=0;k4);jiepai=(Musici&0X0F);if(yinfu=0)continue;Th0=MusicCode(yinfu-1)*2;Tl0=MusicCode(yinfu-1)*2+1;TR0=1;for(j=jiepai;j0;-j)delay_1ms(150);/调歌曲快慢:187(越大越慢) TR0=0;if(flag!=0)break;void PlayMusic2(void) uint i=0; uint j,k; while(SONG_LONG2i!=0|SONG_TONE2i!=0) /播放各个音符,SONG_LONG 为拍子长度 for(j=0;jSONG_LONG2i*30;j+) Beep=Beep; /SONG_TONE 延时表决定了每个音符的频率 for(k=0;k0 ;n-)for ( i=500; i0 ; i-);bit bCheckBusy () LCDPORT=0xff; RW = 1; DI=0; E=1; E=0; return BUSYSTATUS ;void vWriteData (unsigned char ucData) while(bCheckBusy() ; LCDPORT=0xff; RW=0; DI=1; LCDPORT=ucData; E=1; E=0;void vWriteCMD(unsigned char ucCMD) while ( bCheckBusy() ); LCDPORT=0xff; RW=0; DI=0; LCDPORT=ucCMD; E=1; E=0; void vLCDInitialize()CS1=1;CS2=1;vWriteCMD (0x38) ;vWriteCMD (0x0f) ;vWriteCMD (0x01) ;vWriteCMD (0x06) ;vWriteCMD (LCDSTARTROW); Void vShowCustomRow ( unsigned char ucPage ,unsigned char ucLine ,unsigned char ucWidth ,unsigned char *ucaRow) unsigned char ucCount ; if(ucLine64) CS1=1; CS2=0; vWriteCMD(LCDPAGE+ucPage) ; vWriteCMD(LCDLINE+ucLine) ; if (ucLine + ucWidth)64) for (ucCount =0 ; ucCountucWidth ;ucCount +) vWriteData (*(ucaRow+ucCount) ; for(ucCount=0;ucCount64-ucline;ucCount+) vWriteData(*(ucaRow+ucCount) ;CS1=0;CS2=1;vWriteCMD(LCDPAGE+ucPage);vWriteCMD(LCDLINE);for (ucCount=64-ucLine;ucCountucWidth;ucCount+) vWriteData(*(ucaRow+ucCount) ; else CS1=0;CS2=1; vWriteCMD(LCDPAGE+ucPage);vWriteCMD(LCDLINE);for(uccount=0;uccountucwidth;uccount+)vwritedata(*(ucarow+uccount); void vShowOneChin(unsigned char ucPage,unsigned char ucLine,unsigned char *ucaChinMap)vShowCustomRo(ucPage,ucLine,16,ucaChinMap);vShowCustomRow(ucPage+1,ucLine,16,ucaChinMap+16); /*主程序模块*/void main(void)/主程序P1=0XFF;/P1口全置位为1P2=0;/P2口全置位为0TMOD=0X01;/设置T0为工作方式1IT0=1;/置外部中断为边沿(下降沿)触发方式TR0=0;/与门被封锁,控制开关被关闭EX0=1;/开放外部中断0允许位ET0=1;/T0中断允许位EA=1;/开放中断总允许位/lcd_init();while(1)/lcd_str_wr(0,0,8,hz1);Run();/运行KeyScan();/按键扫描DisPlay();/显示长通杯感想这是我们第一次参加长通杯,在之前听到了很多同学对于长通杯不同的评价,直到这次自己亲身体会,才品尝到个中滋味。从选题到初试,再到预赛,无论是程序的调试,电路的焊接还是报告的撰写,都是自己亲自动手。团队的合作,思想火花的碰撞,遇到难题绞尽脑汁锲而不舍最终成功,这一切的一切都让我体会到了长通杯魅力的所在。在这次设计中,我们由于经验不足走了很多弯路,出了很多问题,曾一度想要放弃,但我庆幸自己没有放弃,而是一直坚持,查阅了很多资料,找到错误,一次又一次的修改。这么多天的忙碌过后,当成品摆在自己面前时,之前所有的辛苦又算得了什么。面对自己汗水与智慧的结晶,我真正学会了在遇到困难时要坚持,做事情要细心,思考问题要全面。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 临时分类 > 人文社科


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!