单片机实现电子琴并可播放歌曲
- 格式:doc
- 大小:38.50 KB
- 文档页数:8
#include<reg51.h>#include<absacc.h>#include<stdio.h>#include<math.h>#define uchar unsigned char#define uint unsigned intuchar STH0; //定时器计数初值uchar STL0;bit FY=0; //放乐曲时FY=1,电子琴弹奏时FY=0uchar Song_Index=0,Tone_Index=0; //放音乐的参数uchar k,key;sbit SPK=P3^7;sbit LED1=P1^0;sbit LED2=P1^1;uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6f,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79 ,0x71};uchar code Song[][50]={{1,2,3,5,7,8,4,3,4,3,4,5,4,6,3,4,5},{5,5,3,5,4,2,4,5,7,4,2,10,10,10,2,1,2,1,2,10,10},{5,5,10,9,8,5,5,5,5,10,9,8,6,6,6,11,12,9,6,8-1},{13,14,13,12,12,10,12,13,14,15,14,14},{6,6,11,10,9,12,12,12,12,13,12,11,9,8,10,10,10,-1},{9,13,13,13,13,8,13,13,13,13,14,15,14,13,13,14,12,13},};uchar code Len[][50]={{1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,2,2,2,1,2,2,1,2,2},{1,1,1,1,1,1,2,1,1,1,2,2,1,1,1,1,-1},{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1},{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1},{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1},{1,1,2,0,1,1,2,0,1,1,1,1,1,1,1,1,1,1,1},{1,1,1,1,1,1,1,1,2,0,1,2,1,2,1,2,1,2,1,2},{2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1},}; //音符与计数值对应表uint code tab[]={0,63628,63835,64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178,65217,65252,65283};void delay1(uint ms) //播放歌曲时实现节拍的延时函数{uchar t;while(ms--) for(t=0;t<120;t++);}//键消抖延时函数void delay(void){uchar i;for(i=300;i>0;i--);}//键扫描函数uchar getkey(void){uchar scancode,tmpcode;if((P0&0xf0)==0xf0)return(0);scancode=0xfe;while((scancode&0x10)!=0){P0=scancode; //输入行扫描码if((P0&0xf0)!=0xf0) //本行有键按下{tmpcode=(P0&0xf0)|0x0f;return((~scancode)+~(tmpcode));}else scancode=(scancode<<1)|0x01;}}//外部中断0void EX0_INT() interrupt 0{FY=0;LED1=1;LED2=0;}//外部中断1,这里是播放按键void EX1_INT() interrupt 2{FY=1;LED1=0;LED2=1;}//定时器0中断服务子程序void time0_int(void) interrupt 1 using 0{TH0=STH0;TL0=STL0;SPK=!SPK;P2=DSY_CODE[k];void main(void){LED1=1;LED2=0;P2=0x3f;IE=0x87;TMOD=0x01;IT0=1;IT1=1;while(1){P0=0xf0;if((P0&0xf0)!=0xf0){delay();if((P0=0xf0)!=0xf0){key=getkey();switch(key){case 0x11:k=0;break;case 0x21:k=1;break;case 0x41:k=2;break;case 0x81:k=3;break;case 0x12:k=4;break;case 0x22:k=5;break;case 0x42:k=6;break;case 0x82:k=7;break;case 0x14:k=8;break;case 0x24:k=9;break;case 0x44:k=10;break;case 0x84:k=11;break;case 0x18:k=12;break;case 0x28:k=13;break;case 0x48:k=14;break;case 0x88:k=15;break;default:break;}if(FY==0){STH0=tab[k]/256;STL0=tab[k]%256;TR0=1;while((P0&0xf0)!=0xf0);TR0=0;}else{while(FY==1){if(Song[k][Tone_Index]==-1)Tone_Index=0;STH0=(tab[Song[k][Tone_Index]])/256;STL0=(tab[Song[k][Tone_Index]])%256;P2=DSY_CODE[Song[k][Tone_Index]];TR0=1;delay1(300*Len[k][Tone_Index]);Tone_Index++;TR0=0;}}}}}}关于“世上只有妈妈好”的单片机音乐演奏程序2009-11-22 21:45单片机演奏一个音符,是通过引脚,周期性的输出一个特定频率的方波。
课题名称、主要内容和基本要求:进度安排:指导教师签名:评阅教师签名:毕业设计(论文)成绩:答辩委员会主任签名:摘要电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。
它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。
本文的主要内容是用AT89S51单片机为核心控制元件,设计一个电子琴。
以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有10个按键和扬声器。
本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。
众所周知,由于一首音乐是由许多不同的音阶组合而成的,而每个音阶则对应着不同的频率,因此我们可以利用不同的频率来进行音阶的组合,即可产生美妙的音乐了。
对于单片机来说,产生不同的频率非常方便,只要算出某一音频的周期,然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期时间,每当计时到后,就将输出脉冲的I/O反相,然后重复计时,此半周期再对I/O反相,即可在I/O脚上得到此频率的脉冲。
因此我们可以利用单片机的定时器,使其工作在计数器模式MODE1下,改变计数值TH0及TL0来产生不同频率的信号。
从而产生不同的音符[1]。
关键词:音阶,频率,单片机AbstractElectronic organ is a modern electronic music technology and the product is a ne w type of keyboard instruments. It played an important role in modern music. SCM ha s powerful control functions and flexible programming characteristics. It has converge d with modern people's lives, become an irreplaceable part. The main content is AT89 S51 control of the core components, design of a electronic organ. SCM as a host to th e core, with the keyboard, speaker and other core modules. In the main control modul e has 16 keys and a speaker. The system is steady, its simple hardware circuits, softwa re functions, reliability of control system and high cost performance is its advantages. It also has certain practical and reference value.Well-known, the music is made up by many different scales, and each scale corresponds to different frequency, so we can use different frequency to make combination of scales, and then produce wonderful music.As for single-chip microcomputer, it is very convenient to produce different frequency, we just calculate an audio cycle, then this cycle divided by 2, namely half cycle time, using timer to time the half cycle time.Whenever timing, it will output pulse I/O reverse phase, and repeat the timing, the half cycle again to the I/O reversed-phase, then can get this frequency pulse from the I/O feet. So we can use microcontroller timer to make it work in the counter mode and generate different frequency signal. Thus produce different notes. Keywords: scales,frequency, single-chip microcomputer目录第一章绪论 (1)1.1电子琴的特点及研究意义 (1)1.2系统介绍 (1)第二章方案论证 (2)2.1单片机选择 (2)2.2键盘选择 (2)2.3功放电路选择 (3)第三章系统设计 (4)3.1单片机的介绍 (4)3.1.1单片机AT89S52基本知识 (4)3.1.2单片机AT89S52产品特点 (4)3.1.3单片机AT89S52的使用 (5)3.1.4单片机AT89S52的特性 (6)3.1.5AT89S52引脚功能与封装 (7)3.2LED数码管 (9)3.2.1LED数码管主要技术参数 (9)3.2.2LED数码管的引脚说明 (10)3.2.3数码管编码说明 (11)3.3LM386 (12)3.3.1LM386简介 (12)3.3.2LM386特性 (12)3.3.3LM386应用特点 (12)3.3.4LM386引脚图 (12)3.3.5LM386注意事项 (12)第四章硬件设计 (13)4.1总体电路设计 (13)4.2单片机最小系统电路 (14)4.3LM386功放电路 (14)4.4数码管显示电路 (15)4.5按键电路 (16)4.6按键指示灯电路 (17)4.7音乐产生方法 (17)第五章软件设计 (19)5.1程序流程图 (19)5.2S1-S8按键识别程序 (20)5.3S9键识别电路程序 (21)5.4音乐产生程序 (22)第六章调试过程 (26)6.1数码管显示乱码 (26)6.3按键处理问题 (26)结论 (26)参考文献 (27)谢辞 (28)附录 (29)附录一程序源代码 (29)附录二电路图 (41)第一章绪论1.1电子琴特点及研究意义本论文设计的为电子琴,电子琴又称作电子键盘,属于电子乐器(区别于电声乐器),发音音量可以自由调节。
1.2设计任务1.3设计系统的框架二. 软件整体方案流程图三. 硬件单元电路设计3.1复位电路3.2晶振电路3.3数码管显示电路3.4键盘电路3.5扬声器电路四. 总体模块的软件设计五. 具体模块的设计流程六. 功能及展示七.设计总结附录源程序代码参考文献实物连接图1.1设计目的本课程是继《单片机原理及应用B》课程之后,训练学生综合运用上述课程知识,进行单片机软件、硬件系统设计与调试,使学生加深对单片机结构、工作原理的理解,提高学生综合应用知识的能力、分析解决问题的能力和单片机最小应用系统的设计技能。
通过课程设计,达到理论与实际应用相结合,增强学生对综合电子系统设计的理解,掌握单片机原理就应用的设计方法以及C51编程的能力,并能够在这个基础上进行实际项目的程序设计及软硬件调试,增强学生的工程实践能力。
1.2设计任务〔包括课程设计计算说明书、图纸、实物样品等要求〕利用行列式键盘和数码管,来控制并显示和产生不同频率的声音。
其他扩展功能学生可自己添加,功能不限定与此。
(1)了解相关理论知识,掌握基本的原理,理解相关特殊功能寄存器的设置。
(2)完成电路板的组装(3)完成硬件电路的测试、以及软件的编程(4)最终完成具体的课设任务。
1.3设计系统的框架二.软件整体方案流程图三、硬件单元电路设计3.1复位电路常见的复位电路有三种形式:上电自动复位方式、按键电平复位方式和按键脉冲复位方式,本设计中采用了按键电平复位的方式,通过使RST端经电阻与VCC电源接通实现复位,电路图如图2所示。
C1图2 单片机复位电路3.2晶振电路本设计中单片机的振荡电路采用了内部时钟方式,在XTAL1和XTAL2之间跨接晶体振荡器和微调电容,组成并联谐振电路,构成稳定的自激振荡器,如图图3所示,晶体振荡器的振荡频率决定单片机的时钟频率。
此设计中振荡频率12MHz.图3 单片机晶振电路3.3数码管显示电路 1. LED 结构LED 数码管显示器,由8只发光二极管组成。
基于51单片机的简单电子琴代码#include <AT89X52.h>sbit P10=P1^0;//高音阶,红灯sbit P11=P1^1;//中音阶,黄灯sbit P12=P1^2;//低音阶,绿灯sbit P13=P1^3;//蜂鸣器控制端口sbit P31=P3^0;//低音阶按键行sbit P32=P3^1;//中音阶按键行sbit P33=P3^2;//高音阶按键行sbit P35=P3^4;//播放音乐按键unsigned int i,j,k=0,l=0;unsigned char count1=0xff,count0=0x50;/*********************************数码管码表(P0)***********************************/unsigned char Tab[]={0XBF,0X06,0X5B,0X4F,0X66,//数码管0~40X6D,0X7D,0X07,0X7F,0X6F,//数码管5~90X77,0X7C,0X39,0X5E,0X79,0X71,0X00};//数码管A~F/************************************音阶控制**************************************/music_data_high[]={0xf8,0xf9,0xfa,0xfa,0xfb,0xfb,0xfc,//数组0~6 低音0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0xfe,//数组7~13 中音0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff};//数组14~20 高音music_data_low[]= {0xf3,0xb8,0x15,0xb9,0x4a,0xcf,0x0c,//数组0~6 低音0x44,0xac,0x09,0x34,0x82,0xc8,0x05,//数组7~13 中音0x4c,0x6d,0x94,0xad,0xd2,0xf3,0x02};//数组14~20 高音/******************************************************函数名:delayms*参数:n 延时毫秒数*功能:延时N毫秒*****************************************************/void delayms(unsigned char n){unsigned char a,b;for(a=100;a>0;a--)for(b=10*n;b>0;b--);}/******************************************************函数名:key_check*参数:无*功能:扫描按键并运行对应功能*****************************************************/void key_check(void){P2=0xff;P3=0xfe;if(P2!=0xff){ delayms(20);if(P2!=0xff){P10=1;P11=1;P12=0;switch(P2){case0xfe:EA=1;count1=0xf8;count0=0xf3;P0=Tab[1];delayms(50);bre ak;case0xfd:EA=1;count1=0xf9;count0=0xb8;P0=Tab[2];delayms(50);br eak;case0xfb:EA=1;count1=0xfa;count0=0x15;P0=Tab[3];delayms(50);bre ak;case0xf7:EA=1;count1=0xfa;count0=0xb9;P0=Tab[4];delayms(50);bre ak;case0xef:EA=1;count1=0xfb;count0=0x4a;P0=Tab[5];delayms(50);bre ak;case0xdf:EA=1;count1=0xfb;count0=0xcf;P0=Tab[6];delayms(50);bre ak;case0xbf:EA=1;count1=0xfc;count0=0x0c;P0=Tab[7];delayms(50);bre ak;defaule:break;}}}//else {EA=0;P13=1;}P2=0xff;P3=0xfd;if(P2!=0xff){ delayms(20);if(P2!=0xff){P10=1;P11=0;P12=1;switch(P2){case0xfe:EA=1;count1=0xfc;count0=0x79;P0=Tab[1];delayms(50);bre ak;case0xfd:EA=1;count1=0xfc;count0=0xbc;P0=Tab[2];delayms(50);bre ak;case0xfb:EA=1;count1=0xfd;count0=0x09;P0=Tab[3];delayms(50);br eak;case0xf7:EA=1;count1=0xfd;count0=0x44;P0=Tab[4];delayms(50);bre ak;case 0xef:EA=1;count1=0xfd;count0=0xa2;P0=Tab[5];delayms(50);break;case0xdf:EA=1;count1=0xfd;count0=0xd8;P0=Tab[6];delayms(50);br eak;case0xbf:EA=1;count1=0xfe;count0=0x05;P0=Tab[7];delayms(50);br eak;// defaule:break;}}}//else {EA=0;P13=1;}P2=0xff;P3=0xfb;if(P2!=0xff){ delayms(20);if(P2!=0xff){P10=0;P11=1;P12=1;switch(P2){case0xfe:EA=1;count1=0xfe;count0=0x4c;P0=Tab[1];delayms(50);bre ak;case0xfd:EA=1;count1=0xfe;count0=0x6d;P0=Tab[2];delayms(50);br eak;case0xfb:EA=1;count1=0xfe;count0=0x9f;P0=Tab[3];delayms(50);bre ak;case0xf7:EA=1;count1=0xfe;count0=0xad;P0=Tab[4];delayms(50);bre ak;case0xef:EA=1;count1=0xfe;count0=0xd2;P0=Tab[5];delayms(50);bre ak;case0xdf:EA=1;count1=0xfe;count0=0xf3;P0=Tab[6];delayms(50);bre ak;case0xbf:EA=1;count1=0xff;count0=0x02;P0=Tab[7];delayms(50);bre ak;// defaule:break;}}}if(P2==0xff) {EA=0;P13=1;}/******************************************************函数名:play_music*参数:无*功能:播放音乐*****************************************************/ void play_music(void){count1=music_data_high[0];count0=music_data_low[0]; EA=1;delayms(50);EA=0;delayms(5);}/******************************************************函数名:TIM0_init*参数:无*功能:定时器0初始化*****************************************************/ void TIM0_init(void){TMOD=0x01;TH0=count1;TL0=count0;EA=1;ET0=1;TR0=1;}void timer0(void) interrupt 1 using 0{TH0=count1;TL0=count0;P13=!P13;/***************************************************** *函数名:main*参数:无*功能:开跑程序*****************************************************/ void main(void){ P35=1;TIM0_init();//play_music();//while(1){ if(P35==0) {delayms(20);P35=1;play_music();} key_check();}}。
电子琴设计报告一、实验目的1.更深刻的了解、学习8051单片机的发声原理,利用定时器可以发出不同频率的脉冲,不同频率的脉冲经喇叭驱动电路放大滤波后,就会发出不同的音调。
2.其次,定时器按设置的定时参数产生中断,这一次中断发出脉冲低电平,下一次反转发出脉冲高电平,由于定时参数不同,所以发出不同频率的脉冲。
3.进一步熟悉定时器的编程方法和定时初值的计算,进一步熟悉键盘扫描电路的工作原理和编程方法,了解单片机芯片的接口技术。
二、实验要求1.能够通过键盘演奏音符。
2.能够保存演奏的音乐,并实现回放。
3.有音调调整功能(如:C调,G调)。
4.自由发挥其他功能。
5.要求有单片机硬件系统框图,电路原理图,软件流程图。
三、实验基本原理简易电子琴有主控、蜂鸣器、键盘输入、电源四部分组成。
主控部分以AT89S52 为核心,用C 语言编程,充分运用AT89S52 的8k字节闪烁可编程可擦除只读存储器及其丰富的I/O 口,实现了对键盘数据的采集,和对蜂鸣器声音的控制;键盘输入部分采用4×4的键盘键盘输入,可以实现多个音调;供电部分可对整个电路进行供电。
经测试,整机基本实现预计功能,可以实现键盘演奏音符、调整音调、保存并回放的功能。
四、实验设计分析根据实验所要求实现的功能设计实现该项实验设计的软件电路及硬件电路。
五、实验要求实现A.电路设计1. 整体设计计划利用AT89S52 单片机的功能结合C 语言编程,实现电子琴播放音符等的简单功能,然后结合AT89S52 单片机的控制功能,利用蜂鸣器将输入表达出来,结合程序编制过程中,对各个I/O 的利用设置了键盘的扫描读入,结合电子琴需要多键位的现实,加入了4×4 键盘输入,达到了预期的效果。
2.分块设计1.控制模块AT89S52单片机是美国ATMEL公司生产的低功耗,高性能CMOS 8位单片机,片内含有8kb的可系统编程的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准8051指令系统及引脚。
系统功能说明:1、通过八个按键是否按下发出相应的1234567i这8个音调2、实验中可以播放三首歌曲,通过开关控制3、播放歌曲时,液晶屏显示播放歌曲号及歌词附录1:晶振为12M的音乐频率表音符频率(Hz)简谱码(T值)低1DO 262 63628 TH0=F7H TL0=24H #1DO# 277 63731 TH0=F8H TL0=F3H 低2RE 294 63835 TH0=F9H TL0=5BH #2RE# 311 63928 TH0=F9H TL0=B8H 低3M 330 64021 TH0=FAH TL0=15H 低4FA 349 64103 TH0=FAH TL0=67H #4FA# 370 64185 TH0=FAH TL0=B9H 低5SO 392 64260 TH0=FBH TL0=04H #5SO# 415 64331 TH0=FBH TL0=4BH 低6LA 440 64400 TH0=FBH TL0=90H #6 466 64463 TH0=FBH TL0=CFH 低7SI 494 64524 TH0=FCH TL0=0CH 中1DO 523 64580 TH0=FCH TL0=44H #1DO# 554 64633 TH0=FCH TL0=79H 中2RE 587 64684 TH0=FCH TL0=ACH #2RE# 622 64732 TH0=FCH TL0=DCH 中3M 659 64777 TH0=FDH TL0=09H 中4FA 698 64820 TH0=FDH TL0=34H #4FA# 740 64860 TH0=FDH TL0=5CH 中5SO 784 64898 TH0=FDH TL0=82H #5SO# 831 64934 TH0=FDH TL0=A6H 中6LA 880 64968 TH0=FDH TL0=C8H #6 932 64994 TH0=FDH TL0=E2H 中7SI 988 65030 TH0=FEH TL0=06H 高1DO 1046 65058 TH0=FEH TL0=22H #1DO# 1109 65085 TH0=FEH TL0=3DH 高2RE 1175 65110 TH0=FEH TL0=56H #2RE# 1245 65134 TH0=FEH TL0=6EH 高3M 1318 65157 TH0=FEH TL0=85H 高4FA 1397 65178 TH0=FEH TL0=9AH #4FA# 1480 65198 TH0=FEH TL0=AEH 高5SO 1568 65217 TH0=FEH TL0=C1H #5SO# 1661 65235 TH0=FEH TL0=D3H 高6LA 1760 65252 TH0=FEH TL0=E4H #6 1865 65268 TH0=FEH TL0=F4H 高7SI 1967 65283 TH0=FFH TL0=03H 休止符用TH0=FFH ,TL0=FFH表示附录2:LCD相关资料两行液晶显示的地址:(均为十六位计数)0 1 2 3 4 5 6 7 8 9 A B C D E F40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F命令格式要求,设置地址指针的时候第8位为1,后边为地址,即AC0~AC6,就是对应上表的地址。
单片机与智能电子琴的结合构建智能电子琴系统近年来,随着科技的不断进步和发展,智能化技术在各行各业得到广泛应用。
智能电子琴作为音乐教育和娱乐领域的重要组成部分,通过结合单片机技术,可以构建一个更加先进、功能更为强大的智能电子琴系统。
一、智能电子琴系统简介智能电子琴系统是一种集音乐演奏、学习和娱乐等功能于一体的电子乐器。
它通过在电子琴中集成单片机,可以实现自动演奏、和弦伴奏、节拍控制、音色调节等多种功能。
同时,智能电子琴系统还可以配合手机或电脑等智能设备,进行音乐创作和编辑。
二、单片机在智能电子琴系统中的应用1. 自动演奏功能在传统电子琴中,演奏需要由人工操作琴键,但是通过单片机技术的应用,可以实现自动演奏的功能。
单片机可以通过程序控制琴键的按下和抬起,实现自动演奏的效果。
通过编写适当的算法和程序,可以实现自动演奏各种曲目的功能。
2. 和弦伴奏功能单片机可以通过实时采集的琴键信号来分析弹奏的和弦类型,并根据和弦类型进行和弦伴奏的控制。
通过编写合适的程序,可以实现和弦伴奏的功能,使演奏更加丰富和多样化。
3. 节拍控制功能智能电子琴系统可以通过单片机实现节拍的控制。
单片机可以根据设定的时间间隔,产生定时脉冲信号,用于控制演奏的节奏。
通过合理设置节拍的速度和模式,可以使演奏更加准确和有节奏感。
4. 音色调节功能智能电子琴系统中的音色调节功能是通过单片机对音频信号进行处理来实现的。
单片机可以采集输入的音频信号,并通过算法进行数字信号处理,从而改变音色的属性,例如音色的明亮度、响度和谐波成分等。
通过合理应用单片机技术,可以实现多种不同音色的选择与调节。
三、智能电子琴系统的优势和应用前景1. 优势:(1)通过单片机的应用,可以实现智能化的演奏、学习和娱乐功能,方便用户学习和使用。
(2)智能电子琴系统具有音色丰富、演奏灵活、功能强大等优点,能够满足不同用户的需求。
(3)智能电子琴系统可以结合智能设备,扩展更多功能,例如音乐创作、编辑和分享等。
题目基于单片机系统的简易电子琴的设计与实现设计要求:1、能实现电子琴的基本功能,可以用弹奏出简单的乐曲。
手动演奏,且能手动演奏八度音的高低音,音色纯真。
2、演奏不同的音时,数码管有对应的显示。
3、功率不大于500mw,音质悦耳,无失真。
摘要随着社会的发展进步,音乐逐渐成为我们生活中很重要的一部分,有人曾说喜欢音乐的人不会向恶。
我们都会抽空欣赏世界名曲,作为对精神的洗礼。
本论文设计一个基于单片机的简易电子琴。
我们对于电子琴如何实现其功能,如音色选择、声音强弱控制、节拍器、自动放音功能等等也很好奇。
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。
它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。
本文的主要内容是用AT89S52单片机为核心控制元件,设计一个电子琴。
以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有16个按键和扬声器。
本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。
一、系统总体设计该设计要实现一种由单片机控制的电子琴,单片机工作频率为11.0592MHZ ,使用其定时/计数器T0,工作模式为1,改变计数值TH0和TL0可以产生不同频率的脉冲信号。
该设计具有16个音节的键盘,用户可以根据乐谱在键盘上进行演奏,音乐发生器会根据用户的弹奏,通过扬声器将音乐播放出来。
由于本例实现的音乐发生器是由用户通过键盘输入弹奏乐曲的,所以节拍由用户掌握,不由程序控制。
如图1所示系统总体框图。
图1 系统总体框图键盘扫描AT89S52数码管显示扬声器播放音乐电源部分二、系统硬件设计(1)系统复位电路单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初始状态,并从这个状态开始工作。
无论是在单片机刚开始接上电源时,还是断电后或者发生故障后都要复位。
基于单片机的电子琴及音乐播放器设计————————————————————————————————作者:————————————————————————————————日期:基于单片机的电子琴及音乐播放器设计摘要随着电子技术的发展和计算机越来越普遍的使用,单片机作为这两项技术的有机结合也得到了广泛的应用。
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。
它在现代音乐扮演重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分.此次设计依据单片机技术原理,通过硬件电路制作以及软件编译,设计制作出一个基于AT89C52系列单片机的电子琴及音乐播放器,以单片机作为主控核心,主要由按键电路、复位电路、模式转换电路等组成。
利用单片机及KeilC51编程软件编程和PROTEUS单片机仿真软件和电子电工等方面知识,用KeilC51编程软件编程,用PROTEUS单片机仿真软件仿真.最后制作实物,将程序下载到单片机中,利用I/O口产生一定频率的方波,驱动喇叭,发出不同的音调,从而演奏乐曲。
本论文给出了系统方案的建立、硬件电路的详细设计及软件的程序实现。
并通过软硬件的联立调试,验证了设计方案的可行性。
通过基于单片机的音乐播放器的设计课题熟悉和理解单片机应用和开发过程,培养我们理论联系实际,实践出真知的科学严谨求学的态度,提高实践动手操作技能。
关键词:AT89C52单片机、电子琴、音乐播放器、仿真软件目录摘要 (3)1 引言 (5)2 单片机基础知识简介 (5)2。
1 单片机介绍 (5)2。
1.1单片机概念 (5)2。
1。
2 单片机的应用 (6)2。
1。
3 单片机的发展趋势 (6)3 课程设计介绍 (8)3。
1 课程设计的目的 (8)3.2 课程设计的要求 (8)3.3 系统方案的拟定与选择 (8)3.3。
1 初步方案的确定 (8)3。
3。
2方案的简单说明 (8)3。
基于单片机的电子琴设计电子琴是一种常见的乐器,通过电子元件和技术实现各种声音效果和音调的变化。
基于单片机的电子琴设计,使用单片机作为核心控制芯片,可以实现各种音色的生成、乐曲演奏和音调调整等功能。
一、基本原理1.音源生成:通过单片机的计算和控制,生成各种音色的数字波形信号。
可以使用PWM波形发生器,通过控制占空比实现不同音调的发声。
2.按键输入:通过按键进行音符的选择和演奏,按键可以通过矩阵键盘或编码器等方式实现,通过单片机的GPIO口读取按键输入信号。
3.音量控制:通过调节音量电阻或数字控制器,调整输出音量大小。
4.音色调整:通过改变生成波形的参数和算法,实现不同音色效果的切换和调整。
二、硬件设计1.单片机:选择合适的单片机,如STC89C52或ATmega328P等,作为控制核心。
2.键盘:选择合适的键盘结构和按键数量,如矩阵键盘或编码器。
3.音源:可以选择合适的音源模块或芯片,如AD9833,用于生成各种音色的波形信号。
4.音量控制:将数字音频信号通过运放进行放大,通过音量电位器或数字控制器调节输出音量大小。
5.音箱:选择合适的音箱,用于放大和放出音频信号。
三、软件设计1.按键扫描:通过单片机的GPIO口读取按键输入信号,实现按键的扫描和检测。
2.音符和音调处理:将按键输入映射为相应的音符号,通过生成不同的波形并控制频率实现不同音调的发声。
3.音量控制:通过改变音源模块的输出幅度或控制运放的增益,实现音量的调节。
4.音色调整:通过改变生成音色的参数和算法,实现不同音色效果的切换和调整。
5.乐曲演奏:通过编写相应的乐曲和音符的编码和播放算法,实现各种乐曲的演奏功能。
6.界面显示:可以通过液晶显示屏或LED显示器,实现界面的显示和操作。
四、功能扩展1.录音和播放:在单片机上添加存储模块(如SD卡或FLASH芯片),实现录音和播放功能,可以录制和回放演奏的音乐。
2.MIDI接口:添加MIDI接口,通过MIDI合成音源模块,实现与其他乐器和设备的互联。
目录目录 0一、设计内容 (1)二、方案讨论 (1)三、电路原理图 (2)四、程序设计 (5)五、电子琴发声原理 (8)六、调试结果 (8)七、电子琴程序 (9)八、参考文献 (17)一、设计内容(一)设计题目:电子琴演奏(二)目的要求1)使用4×4矩阵式键盘设计出16个音符,随意弹奏。
2)用功能键可转换成3首不同的歌曲演奏。
二、方案讨论(一)方案一:用4×4矩阵式键盘控制16个音符,用三个独立按键作为功能键,实现三首不同歌曲的演奏。
方案二:通过一个开关控制4×4矩阵式键盘的功能转换,同时控制16个音符和歌曲的演奏。
方案一虽然用的按键相对较多,但是整体结构简单明了,便于理解和编程,而且音符和歌曲两部分不易产生干扰;方案二结构紧凑,电路简单,但程序较为繁琐,易产生干扰。
故采用第二种方案。
(二)方案图(三)面板布置图(四)设计任务1)电路结构设计在PROTEUS中绘制电子琴各部分的电路,能量流要正确。
2)软件设计用汇编语言编写程序,实现电子琴的功能3)调试仿真将编译生成的.hex文件导入芯片,进行仿真。
三、电路原理图(一)时钟电路(二)复位电路(三)功放驱动电路及LM386(四)4×4矩阵式键盘电路(五)三个控制自动音乐播放的独立按键电路(六)整体电路(二)16音阶程序框图(三)T0中断服务程序框图(四)自动音乐播放程序框图YYNN返回五、电子琴发声原理一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。
现在以单片机12MHZ晶振为例,例出高中低音符与单片机计数T0相关的计数值如下表所示:音符频率(HZ)简谱码(T值)音符频率(HZ)简谱码(T值)低1 DO 262 63628 # 4 FA# 740 64860#1 DO# 277 63731 中 5 SO 784 64898低2 RE 294 63835 # 5 SO# 831 64934#2 RE# 311 63928 中 6 LA 880 64968低 3 M 330 64021 # 6 932 64994低 4 FA 349 64103 中 7 SI 988 65030# 4 FA# 370 64185 高 1 DO 1046 65058低 5 SO 392 64260 # 1 DO# 1109 65085# 5 SO# 415 64331 高 2 RE 1175 65110低 6 LA 440 64400 # 2 RE# 1245 65134# 6 466 64463 高 3 M 1318 65157低 7 SI 494 64524 高 4 FA 1397 65178中 1 DO 523 64580 # 4 FA# 1480 65198# 1 DO# 554 64633 高 5 SO 1568 65217中 2 RE 587 64684 # 5 SO# 1661 65235# 2 RE# 622 64732 高 6 LA 1760 65252中 3 M 659 64777 # 6 1865 65268中 4 FA 698 64820 高 7 SI 1967 65283六、调试结果在Keil软件中进行了程序的编写、调试以及编译,软件显示程序没有错误。
此程序是51单片机c语言编写的电子琴+音乐播放器,当用杜邦线将P1^0管脚接地时,单片机就会放出《世上只有妈妈好》,将P1^1 管脚接地时单片机就播放《祝你生日快乐》,两者为高电平时进入电子钢琴模式,利用16个矩阵键盘发出相应的哆、瑞、米、发、索。
此文档的乐谱是借鉴别人的,因为本人是音乐白痴!这是我第一次发表,我希望能帮到有需要的人啦........#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit beep=P2^3; //定义蜂鸣器sbit music=P1^0; //music为低电平播放《世上只有妈妈好》(工作模式为音乐播放器),music1为低电平时播放祝你生日快乐,music、music1都为高电平时(工作模式为电子钢琴)sbit music1=P1^1;uchar timer0h,timer0l,time,key,flag; //flag==0时为电子钢琴模式,flag==1时为音乐播放器uchar code yuepu[]={ 6,2,3,5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1, 6,2,4,3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1, 6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2, 5,2,1,6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1, 2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0 }; //世上只有妈妈好乐谱uchar code yuepu1[]={5,1,1, 5,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4,5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, 1,2,4,5,1,1, 5,1,1, 5,2,2, 3,2,2, 1,2,2, 7,1,2, 6,1,2,4,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 1,2,4};//祝你生日快乐乐谱uchar code TH_0[]={0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE, // 28个音阶高八位频率表装进定时器高八位0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,} ;uchar code TL_0[]={0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, // 28个音阶低八位频率表装进定时器低八位0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,};void delay(uchar t){uchar t1;unsigned long t2;for(t1=0;t1<t;t1++) //延时半拍函数,控制音乐节奏{for(t2=0;t2<8000;t2++){ ; }}}void song(){TH0=timer0h;TL0=timer0l; // 唱歌程序TR0=1;delay(time); //延时,让此音节播放的长短TR0=0; //关定时器,为下个音节响做准备}void delayms(uint x){uint i,j; //去抖延时for(i=x;i>0;i--)for(j=110;j>0;j--);}void keyscan() //检测十六个发出音乐按键函数{ uchar temp;P3=0xfe;temp=P3;temp=0xf0&temp;if(temp!=0x0f){ delayms(10); //检测第一行按键temp=P3 ;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xee: key=0;break;case 0xde: key=1;break;case 0xbe: key=2;break;case 0x7e: key=3;break;}TH0=TH_0[key]; //将按下的键对应发出此频率声音的初值装入TL0=TL_0[key];TR0=1; //打开定时器0while(temp!=0xf0) //一直按下就一直发声{temp=P3;temp=temp&0xf0;}TR0=0; //松手时关闭定时器0,不能发声beep=1;//使蜂鸣器置高关闭,预防在进入中断取反时将它置低打开}}P3=0xfd;temp=P3;temp=0xf0&temp;if(temp!=0x0f) // 检测第二行按键{ delayms(10);temp=P3 ;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xed: key=4;break;case 0xdd: key=5;break;case 0xbd: key=6;break;case 0x7d: key=7;break;}TH0=TH_0[key]; //将按下的键对应发出此频率声音的初值装入TL0=TL_0[key];定时器0while(temp!=0xf0) //一直按下就一直发声{temp=P3;temp=temp&0xf0;}TR0=0; //松手时关闭定时器0,不能发声beep=1; //使蜂鸣器置高关闭,预防在进入中断取反时将它置低打开}}P3=0xfb;temp=P3;temp=0xf0&temp;if(temp!=0x0f){ delayms(10);temp=P3 ;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xeb: key=8;break;case 0xdb: key=9;break;case 0xbb: key=10;break;case 0x7b: key=11;break;}TH0=TH_0[key]; //将按下的键对应发出此频率声音的初值装入TL0=TL_0[key];TR0=1; //打开定时器0while(temp!=0xf0) //一直按下就一直发声{temp=P3;temp=temp&0xf0;}手时关闭定时器0,不能发声beep=1; //使蜂鸣器置高关闭,预防在进入中断取反时将它置低打开}}P3=0xf7;temp=P3;temp=0xf0&temp;if(temp!=0x0f){ delayms(10);temp=P3 ;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xe7: key=12;break;case 0xd7: key=13;break;case 0xb7: key=14;break;case 0x77: key=15;break;}TH0=TH_0[key]; //将按下的键对应发出此频率声音的初值装入TL0=TL_0[key];TR0=1; //打开定时器0while(temp!=0xf0) //一直按下就一直发声{temp=P3;temp=temp&0xf0;}TR0=0; //松手时关闭定时器0,不能发声beep=1; //使蜂鸣器置高关闭,预防在进入中断取反时将它置低打开}}}void main(){uchar k,i;TMOD=1;EA=1;ET0=1;while(1){if(music&&music1) //当两个都为高电平时没有放音乐,扫描键盘{ flag=0;keyscan();}if(!music) //当P1^0管脚为低电平时,播放《世上只有妈妈好》{ flag=1;i=0;while(i<100) //音乐数组长度,唱完从头再来{if(music) //在播放音乐时P1^0为高电平时退出播放此歌曲{ beep=1; //使蜂鸣器置高关闭,预防在进入中断取反时将它置低打开break;}k=yuepu[i]+7*yuepu[i+1]-1;timer0h=TH_0[k]; // 把对应的音乐频率放进定时器0timer0l=TL_0[k];time=yuepu[i+2]; //音乐节拍i+=3;song();}}if(!music1) // music为低电平时,播放《祝你生日快乐》{ flag=1;i=0;while(i<75) //乐谱的长度{if(music1){beep=1;break;}k=yuepu1[i]+7*yuepu1[i+1]-1;timer0h=TH_0[k];timer0l=TL_0[k];time=yuepu1[i+2];i+=3;song();}}}}void time0() interrupt 1{if(flag==0){beep=!beep; //电子琴模式时进入此语句TH0=TH_0[key];TL0=TL_0[key];}else{ beep=!beep;TH0=timer0h; //音乐播放器模式进入此语句TL0=timer0l;}}。
矩阵按键分布:K0 K1 K2 K3K4 K5 K6 K7K8 K9 K10 K11K12 K13 K14 K15按键功能介绍:弹奏模式下:K0:录制按键。
按下后,开始录制接下来弹奏的歌曲,再次按下录制结束。
按右下角的播放按键,播放刚才弹奏的歌曲。
K1~K3:低5音~低7音K4:0音K5~K11:中1音~中7音K12~K15 :高1音~高4音。
播放模式下:K12:上一首歌曲K13:暂停、再次播放K14:下一首歌曲K15:播放模式时功能是,退出播放程序:#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define PSMG P0 //数码管IO口#define PKEY P1 //定义4x4按键接的IO口行扫描#define PLED P2 //LED接的IO口sbit PLAY = P3^1;sbit SPK = P3^0;#define ALLSONG 3 //歌曲总数按实际写#define CODEMAX 30 //最大音符数uchar tone_h;uchar tone_l;uchar t1_flag = 0; //用于记录定时器1进入中断的次数uchar PressTime = 0; //按键按下的时间(节拍)uchar code chuzhi[3][16]={ //音调对应的计数初值0xff,0xff, //用任意值占0位,因为音调从1开始0xf8,0x8c,//低10xf9,0x5b,// 20xfa,0x15,// 30xfa,0x67,// 40xfb,0x04,// 50xfb,0x90,// 60xfc,0x0c,//低70xff,0xff,//占0位0xfc,0x44,//中10xfc,0xac,// 20xfd,0x09,// 30xfd,0x34,// 40xfd,0x82,// 50xfd,0xc8,// 60xfe,0x06,//中70xff,0xff,//占0位0xfe,0x22,//高10xfe,0x56,// 20xfe,0x85,// 30xfe,0x9a,// 40xfe,0xc1,// 50xfe,0xe4,// 60xff,0x03 //高7};//共阴数码管段码表uchar code YDTAB[23]={0x00, //各段全灭【0】0x77,0x7c,0x39,0x5e,0x79,0x71,0x3d, //a - g 【1~7】0x3f, //0 【8】0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //1 - 7 【9~15】0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87 //1. - 7. 【16~22】};//发光二极管闪烁表uchar code LEDTAB[9]={0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};//****** 生日快乐******uint code srkl[] = {205,205,406,405,411,807,205,205,406,405,412,811,205,205,415,413,411,407,406,314,114,413,411,413,812,305,105,406,405,411,807,305,105,406,405,412,811,305,105,415,413,411,407,406,314,114,413,411,412,811,410,0xffff};//*******恋曲1990*******uint code lq1990[] = {613,213,412,411,613,213,412,411,613,213,412,411,1213, 110, //前奏215,215,215,215,413,412, //乌溜溜的黑眼珠613,211,211,212,413,1206, //和你的笑脸212,213,212,213,415,213,212, //怎么也难忘记612,211,211,206,405,1213,110, //你容颜的转变215,215,215,215,213,212, //轻飘飘的旧时613,211,211,212,213,1206, //光就这么溜走212,213,212,213,415,213,212, //转头回去看看612,205,213,212,413,1211,110, //时已匆匆数年215,215,215,215,413,412, //苍茫茫的天涯613,211,211,212,413,1206, //路是你的漂泊212,213,212,213,415,213,212, //寻寻觅觅长相612,211,211,206,405,1213,110, //守是我的脚步215,215,215,215,213,212, //黑漆漆的孤枕613,211,211,212,213,1206, //边是你的温柔212,213,212,213,415,213,212, //醒来时的清晨612,205,213,212,413,1211,110, //里是我的哀愁215,215,215,215,413,412, //轰隆隆的雷雨613,211,211,212,413,1206, //声在我的窗前212,213,212,213,415,213,212, //怎么也难忘记612,211,211,206,405,1213,110, //你离去的转变215,215,215,215,213,212, //孤单单的身影613,211,211,212,213,1206, //后寂寥的心情212,213,212,213,415,213,212, //永远无怨612,205,213,212,413,1211,110, //的是我的双眼615,213,415,416, //或许明日621,216,421,416, //太阳西下415,415,415,416,1213, //倦鸟已归时212,213,212,213,415,413, //你将已经踏上612,211,411,413,1212,210, //旧时的归途613,213,412,413, //人生难得615,213,415,416, //再次寻觅421,421,421,422,1216, //相知的伴侣221,221,221,221,416,415, //生命终究难舍212,412,212,412,413,1215,1610, 1610, //蓝蓝的白云天0xFFFF,};//==========================//粗略延时函数//==========================void delayms(uint ms)//延时?个ms{uchar a,b,c;while(ms--){for(c=1;c>0;c--)for(b=142;b>0;b--)for(a=2;a>0;a--);}}//======================//定时器1 测量按键持续的节拍数//======================void Timer1_Init(void){EA = 1;ET1 = 1;TMOD &= 0x0F;TMOD |= 0x10;TH1 = (65536-25000)/256;TL1 = (65536-25000)%256; //25ms中断一次}void timer1() interrupt 3{TH1 = (65536-25000)/256;TL1 = (65536-25000)%256; //25ms中断一次t1_flag++;if(t1_flag == 5) //125ms{t1_flag = 0;if(PressTime < 16) //最多16 即最长4秒PressTime++;//8个LED显示节拍if(PressTime <= 8)PLED = LEDTAB[PressTime];else PLED = LEDTAB[8];}}//======================//按键扫描函数【行扫描】//低4位接行,高4位接列/*键值分布0 1 2 34 5 6 78 9 10 1112 13 14 15*///======================uchar keyScan(void){uchar hang;uchar key;uchar temp;for(hang = 0;hang < 4;hang++){PKEY = ~(1<<hang);temp = PKEY&0xF0; //取高4位的值temp >>= 4; //将高四位右移到低四位if(temp != 0x0F) //有按键按下{switch(temp){case 14: key = 4*hang+0;break; //temp:1110case 13: key = 4*hang+1;break; //temp:1101case 11: key = 4*hang+2;break; //temp:1011case 7: key = 4*hang+3;break; //temp:0111 }break; //有键按下,获取键值后,终止扫描}else //没有按键按下返回255key = 255;}return key;}//======================//节拍延时//======================void delay125ms(uint pai) //延时?*125ms 即?个节拍{uchar a,b,c;while(pai--){for(c=239;c>0;c--)for(b=104;b>0;b--)for(a=1;a>0;a--);}}//======================//定时器0 产生音调//======================void Timer0_Init(void){EA = 1;ET0 = 1;TMOD &= 0xF0;TMOD |= 0x01;PT0 = 1;TH0 = 255;TL0 = 255;}//======================//定时器0中断每进入一次,SPK取反//======================void timer0() interrupt 1{TH0 = tone_h;TL0 = tone_l;SPK = ~SPK;}//======================//存储弹奏的歌曲//0xffff代表歌曲结束//千位与百位表示节拍//十位:低中高音[分别是0,1,2]//个位:音调[0~7] [0代表不发声]//======================uint music[CODEMAX] ={215,215,215,215,413,412, //乌溜溜的黑眼珠613,211,211,212,413,1206, //和你的笑脸212,213,212,213,415,213,212, //怎么也难忘记612,211,211,206,405,1213,110, //你容颜的转变0xffff,};//====================================//播放函数//播放完毕后返回1,否则返回0//music:歌曲数组,note:发第几个音//====================================uchar PlayMusic(uint *music,uint note){uchar yin1; //低中高音0,1,2uchar yin2; //音调0~7 0代表不发声,但有节拍uchar jiepai;if(music[note] == 0xffff)return 1;else{if(music[note]%10 != 0) //音调不为0 【音调为0时表示不发声,但有节拍】{yin1 = music[note]%100/10;yin2 = music[note]%10;tone_h = TH0 = chuzhi[yin1][yin2*2 ]; //音调高位【二维数组第1维表示低中高音,第二维表示音调】tone_l = TL0 = chuzhi[yin1][yin2*2 + 1]; //音调低位TR0 = 1; //开启定时器0 开始发声//======数码管显示音调==================if(yin1 == 0) //低音{ PSMG = YDTAB[yin2]; }else if(yin1 == 1) //中音{ PSMG = YDTAB[8+yin2];}else if(yin1 ==2) //高音{ PSMG = YDTAB[15+yin2];}//================================== }else{ P SMG = YDTAB[8]; }jiepai = music[note]/100;//===此处利用定时器1中断中的节拍显示功能t1_flag = 0;PressTime = 0;TH1 = (65536-25000)/256;TL1 = (65536-25000)%256;//25ms中断一次TR1 = 1; //开启定时器1delay125ms(jiepai); //节拍TR0 = 0; //已经响够节拍数,停止发声。
电子音调发生器一、实验目的1.了解计算机发声原理.2.熟悉定时器和键盘扫描电路的工作原理及编程方法。
二、实验完成的功能1.利用键盘1~7进行音调选择, 即按下音符产生对应音调。
2.事先存储三首歌曲, 并可进行选择播放。
3.谱曲功能:通过按键对LCD菜单选项进行选择, 进入谱曲界面, 通过按键1~7分别输入音高与几分音符类型, 由按键输入若干数据完成谱曲。
4.在播放存储歌曲与谱曲播放时,对应音符及其节奏LCD显示对应频谱。
5.在播放音乐时按“返回”键出现返回界面,由键盘按“确认”键选择返回主菜单或循环播放。
三、实验原理1.音节由不同频率的方波产生, 音节与频率的关系如表(1)所示。
要产生音频方波, 只要计算出某一音频的周期(..频率), 然后将此周期除以2, 即为半周期的时间。
利用计时器计时此半周期时间, 每当计时到后就将输出方波的I/O(P1.7)反相, 然后重复计时此半周期时间再对I/O反相, 就可在P1.7脚得到此频率的方波。
将P1.7经过驱动电路与蜂鸣器相连, 随着P1.7口输出不同频率的方波, 蜂鸣器便会发出不同的声音。
音乐的节拍是由延时实现的, 如果1拍的时间为0.4秒, 1/4拍是0.1秒。
只要设定延时时间, 就可得到节拍的时间。
延时实现基本延时时间, 节拍值只能是它的整数倍。
每个音节相应的定时器初值计算公式如下:(1/2)*(1/f)=(12/fose)*(216-x)即 x=216-(fose/24f)其中, f是音调频率, 当晶振fosc=11.0592MHz时, 音节“1”相应的定时器初值为x, 则可得到x=63777D=F921H, 其它的可同样得到。
表(1)音节与频率的关系在编写歌曲代码过程中, 音高由三位数字组成: 个位是表示1~7 这七个音符;十位是表示音符所在的音区:1-低音, -中音, -高音;百位表示这个音符是否要升半音: 0-不升, -升半音。
音长最多由三位数字组成: 个位表示音符的时值, 其对应关系是:|数值(n): |0 |1 |2 |3 | 4 | 5 | 6|几分音符: |1 |2 |4 |8 |16 |32 |64 音符=2^n 十位表示音符的演奏效果(0-2): 0-普通, -连音, -顿音, 百位是符点位: 0-无符点, 1-有符点。
基于51单片机的电子琴设计随着科技的不断发展,单片机技术已经成为了现代电子设备中的重要组成部分。
51单片机作为一种广泛应用的单片机系列,具有高性能、低功耗、高集成度等特点,被广泛应用于各种嵌入式系统开发中。
本文将介绍一种基于51单片机的电子琴设计。
一、系统硬件设计1、单片机选择本设计选用AT89C51单片机作为主控制器,AT89C51是一种低功耗、高性能的8位单片机,具有4K字节的可编程存储器和128字节的RAM,同时具有丰富的外设接口,如UART、SPI、I2C等。
2、电子琴设计电子琴采用8×8 LED点阵作为输出设备,通过单片机控制点阵的亮灭状态来展示音乐波形。
具体实现方式是将音频信号通过一个运放放大器放大,然后将其输入到LED点阵中,通过控制点阵的亮灭状态来展示音乐的波形。
3、存储模块设计为了实现电子琴曲目的存储和播放,本设计选用了一块AT24C02 EEPROM芯片作为存储设备。
AT24C02是一种串行E2PROM存储器,容量为256字节,可以通过I2C总线与单片机进行通信。
将曲目信息存储在AT24C02中,可以实现曲目的存储和播放功能。
4、按键模块设计本设计采用4×4矩阵键盘作为输入设备,通过扫描按键状态来实现音符的选择和节奏控制。
矩阵键盘的行线连接到单片机的P1口,列线连接到P2口,通过检测行列组合的变化来确定按下的键位。
二、系统软件设计1、音符解码本设计采用MIDI音符编码方式来存储和播放曲目信息。
在解码过程中,根据音符的频率和持续时间计算出对应的音高和节奏信息,然后将其用于驱动电子琴的输出设备展示音乐的波形。
2、演奏控制为了实现节奏控制,本设计采用了一种基于时间间隔的演奏方式。
在演奏过程中,单片机根据设定的节奏间隔时间来触发音符输出,从而实现对节奏的控制。
同时,为了实现曲目的停止和播放功能,我们需要在软件中加入相应的控制逻辑。
3、存储和播放在软件设计中,我们需要实现将曲目信息存储到AT24C02中以及从AT24C02中读取曲目信息的功能。