《基于单片机的带存储播放功能的简易电子琴》由会员分享,可在线阅读,更多相关《基于单片机的带存储播放功能的简易电子琴(34页珍藏版)》请在金锄头文库上搜索。
1、单片机课程设计, 基于单片机的带存储播放功能的简易电子琴,091班 姓名: 指导老师: 尹海昌,摘要,音乐是由许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合来构成我们想要的音乐,本次的项目设计任务就是使用AT89C52单片机设计的电子琴,使它能够发出高低音的音乐效果。 即: 由4X4组成16个按钮矩阵,设计成16个音调; 可随意弹奏想要表达的音乐; 可无数次存储自己弹奏的音乐。 另外,我还移植了挥着翅膀的女孩、同一首歌和两只蝴蝶进去,供读者随心所欲的播放。,操作说明,如图当按下任意矩阵键盘时,发出不同音调,数码管显示相应的数字; 当按下“调试播放”时,就会
2、把刚才发出的音调全部播放出来; 当按下“调试清零”时,系统自动把刚刚播放的音乐清除掉;即按下“调试播放”没调; 当按下“写入内存”时,写入指示灯亮,当灯灭时,表示写入完毕;即实现断电保持; 当按下“播放内存”时,读取并播放存储的音乐。 当按下“挥着翅膀的女孩”或“同一首歌”或“两只蝴蝶”时,即播放对应的音乐。,目录,摘 要 操作说明 一、系统框原理图 二、硬件系统的介绍 三、音乐产生的原理 四、数据存储的原理 五、单片机工作流程图 六、小结,一、系统原理框图,AT89C52,蜂鸣器,数码管,写入指示灯,4x4矩阵键盘,AT24C08,独立键盘,二、硬件系统的介绍,本设计的硬件系统主要包括三大部
3、分,分别由单片机系统、矩阵键盘系统和外部存储系统组成。 1.(At89c52)单片机系统的介绍; 2.(4 x 4)矩阵键盘系统的介绍; 3.(At24c08)外部存储系统的介绍;,1.(At89c52)单片机系统的介绍,目前社会上使用最为广泛的就是89c52系列的单片机。由于其价格低廉,硬件电路要求较低,稳定性高,程序设计及写入方便、简单,所以受广大学生及单位的青睐。,At89C52引脚图,At89c52各引脚功能,Vcc:电源+5 V。Vss:接地。 XTAL1、XTAL2:使用内部时钟时,用来接石英晶体和电容;使用外部时钟时,用来输入时钟脉冲。 P0口(3932) :双向IO口,既可作地
4、址数据总线口用,也可作普通IO口用。 P1口(18) :准双向通用IO口。 P2口(2128) :准双向口,既可作地址总线,也可作普通IO口用。 P3口(1017) :多用途端口,既可作普通IO口用,也可按每位定义的第二功能操作。 ALEPROG :地址锁存信号输出端。在访问片外存储器时,ALE为有效高电平时,P0口输出地址低8 位,ALE信号作外部地址锁存器的锁存信号。 PROG是对8751的EPROM编程时的编程 脉冲输入端。 RSTVpd :复位信号输入端。接通电源后,该脚出现两个机器周期(24个振荡周期)以上的高电平, 使内部复位。Vpd即备用电源输入端。当主电源Vcc发生故障,Vpd
5、将为RAM提供备用 电源。 Vpp :内部和外部程序存储器选择线(为0时访问外部)。在对8751的EPROM编程时,此引 脚接编程电压12.5 V。片外程序存储器选通信号,低电平有效。,89C52片内RAM区结构图,定时器的四种工作方式,1、方式的选择:根据M1,M0来选择。 00:方式0 01:方式1 10:方式2 11:方式3 2、主要特点: 方式0:13位定时器。 TH0的8位+TL0的低5位 方式1:16位定时器。 TH0的8位+TL0的8位 方式2:能重复置初始值的8位定时器 。 TL0和TH0必须赋相同的值。 方式3:只适用于定时器0,T0被拆成两个独立的8位定时器TL0,TH0。
6、 其中 :TL0与方式0、1相同,可定时或计数。用定时器T0的GATE、C/T、TR0、TF0、T0、和INT0控制。 TH0只可用作简单的内部定时功能。占用T1的控制位TF1、TR1和INT1,启动关闭仅受TR1控制。,中断源和中断标志,89C52单片机有5个中断请求源,分别为: 1、2个外部输入中断源INT0(P3.2)和INT1(P3.3); 2、2个片内定时器T0和Tl的溢出中断源TF0(TCON.5)和TF1(TCON.7); 3、l个片内串行口发送或接收中断源TI(SCON.1)或RI(SCON.0)。,中断地址,0003H000AH 外部中断0中断地址区 000BH0012H 定
7、时/计数器0中断地址区 0013H001AH 外部中断1中断地址区 001BH0022H 定时/计数器1中断地址区 0023H002AH 串行口中断地址区,2.(4 x 4)矩阵键盘系统的介绍,本设计主要用At89c52单片机的P2口对键盘进行动态扫描,利用8个脚控制16个按键,不同按键发出不同的音调。下面,主要讲解(4x4)矩阵键盘是如何工作的。,16个音调的按键,利用行列扫描的方法,检测所按的键的位置。即:先定义P247是行扫描,P203是列扫描。然后给P24=0, P257=1。系统就在第一行扫描,当按下第一个按键,系统就会检测到P24=P20=0,所以系统就捕捉到第一个按键备按下;当按
8、下第二个按键,系统就会检测到P24=P21=0接着给P247=1 ,P25=0。系统扫描到第二行,当,当按下第一个按键,系统就会检测到P25=P20=0,当按下第二个按键,系统就会检测到P25=P21=0 ,依次类推。(该程序请看下页),第一行的扫描:,P2=0 xef; /赋给P24一个低电平 temp=P2; /把捕捉到的信号赋给一个变量 temp=temp /第四列有键按下 其余三行的扫描略同,3.(At24c08)外部存储系统的介绍,为了让电子琴有存储功能,我另外附加了一个At24c08供单片机存储数据,使其掉电后数据不会丢失。At24c08有1k字节,采用I2C总线协议,操作方便,稳
9、定性高。,AT24C08引脚图,AT24C08与单片机的接线图,图上只有2个单片机控制的引脚(即I2C总线的一根是数据线SDA,另一根是时钟线SCL),及一个读写保护管脚。其他引脚除了VCC接5v以外,默认接地。A0A2为地址码。,AT24C08工作原理,I2C总线在传送数据过程中共有三种类型信号:开始信号、停止信号和应答信号。 开始信号:SCL保持高电平的状态下,SDA出现下降沿。出现开始信号以后,总线被认为“忙”。 停止信号:SCL保持高电平的状态下,SDA出现上升沿。停止信号过后,总线被认为“空闲”。 应答信号:接收数据的器件在接收到8位数据后,向发送数据的器件发出特定的低电平脉冲,表示
10、已收到数据。 总线空闲:SCL和SDA都保持高电平。 总线忙:在数据传送开始以后,SCL为高电平的时候,SDA的数据必须保持稳定,只有当SCL为低电平的时候才允许SDA上的数据改变。,1.初始化数据线 void i2c_init() sda=1; delay(); scl=1; delay(); 2.开始信号 void i2c_start() sda=1; delay(); scl=1; delay(); sda=0; delay();,3.停止信号 void i2c_stop() sda=0; delay(); scl=1; delay(); sda=1; delay(); 4.应答信号 v
11、oid i2c_respons() uchar i; scl=1; delay(); while(sda=1),数据传送格式:字节传送与应答,4.读一个字节即8位数据 uchar i2c_read_byte( )/一位一位读数据 uchar i,k; scl=0;delay();sda=1;delay(); for(i=0;i8;i+) /一位一位的接收8次赋给k scl=1;delay();k=(k1)|sda;scl=0;delay(); return k; /返回一个8位长度的数据 5.写一个字节即8位数据 void i2c_write_byte(uchar date) uchar i,
12、temp;temp=date;/数据赋给变量 for(i=0;i8;i+) /一位一位的发送8次给sda temp=temp1; scl=0; delay(); sda=CY; delay(); scl=1; delay(); scl=0; delay(); sda=1; delay();,数据传送格式:字节传送与应答 每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。如果一段时间内没有收到从机的应答信号,则自动认为从机已正确接收到数据。,数据写入,void i2c_write_add(uchar address,u
13、char date) i2c_start();/发送起始信号 i2c_write_byte(0 xa0);/写入一个字节a0为器件地址以及为写操作 i2c_respons();/发送应答信号 i2c_write_byte(address);/发送数据存储地址 i2c_respons();/再发送应答信号 i2c_write_byte(date);/发送数据 i2c_respons();/再发送应答信号 i2c_stop();/发送终止信号,表示数据写入操作结束 如图写入字节A0的A就是图上的高4位 1010,而A2A0为器件地址,最后一位 为读写操作位,低电平写,高电平读。,数据读出,ucha
14、r i2c_read_add(uchar address) uchar date; i2c_start(); i2c_write_byte(0 xa0); i2c_respons(); i2c_write_byte(address); i2c_respons(); i2c_start(); i2c_write_byte(0 xa1); i2c_respons(); date=i2c_read_byte(); i2c_stop(); return date; ,数据的读出与写入大同小异,我就不一一列出来,但是在读数据之前,也得写入一位字节,告诉系统要读哪个存储区域的数据。然后一位一位的读出一个字
15、节的数据,再赋给一个变量。这就实现了掉电存储功能,但是要在掉电前把数据写入AT24C08内,这样,即使掉电数据也不会丢失。,三、音乐产生原理,一首音乐是由许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了。当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。现在以单片机12MHZ晶振为例,例出高中低音符与单片机计数T0相关的计数值如下表所示,16个按键对应的值,下面这个音符的表格,有助于单片机通过查表的方式来获得相应的数据,低音07
16、之间,高音在815 之间 64021,64103,64260,64400, 64524,64580,64684,64777, 64820,64898,64968,65030, 65058,65110,65157,65178,音乐的产生,spreak=spreak; P0=tablekey-1; STH0=tabkey/256; STL0=tabkey%256; TR0=1; temp=temp spreak对应的是蜂鸣器,当检测到有键按下时,蜂鸣器响,把初值的高低位分别赋给T0,TR0值1中断响应,并打开定时器T0开始减数,当T0的值减到0时产生溢出,并蜂鸣器不响。同时主程序检测按键是否被松开,若真,即关闭定时器T0。就此,实现了装初值改变频率从而产生音调。,void t0(void) interrupt 1 using 0 TH0=STH0; TL0=STL0; spreak=spreak; ,四、数据的存储原理,本次设计中,我设计了两种存储方式,一种是直接存储在数组里,另一种是从数组把数据复制给外部存储器,从而实现掉电存储功能。下面我们来分析数据存储的原理:,直接存储在数组里,if