单片机电子琴方案
单片机电子琴的设计

单片机电子琴的设计单片机电子琴的设计随着科技的发展,单片机技术在电子领域的应用已经非常广泛。
其中,单片机电子琴是一种非常受欢迎的DIY 电子产品。
通过使用单片机,我们可以实现各种各样的功能,比如手风琴、钢琴、鼓等模拟音乐乐器。
那么,本文将详细讲解单片机电子琴的设计方法和实现过程。
一、硬件设计1.主板设计在单片机电子琴的设计中,主板是最核心的部件,因为它能够控制整个电子琴的运转。
主板设计所需要的元器件如下:(1)单片机:根据需要,选择一款传统型单片机或者ARM 处理器。
(2)输入输出模块:据需要选择合适的硬件平台,比如DAC/ADC、芯片集成的PWM 或外加的DAC 等。
(3)显示模块:可以选用LCD 模块或其它显示模块。
(4)驱动模块:选择一款合适的驱动模块,比如H 桥驱动器、音频功率放大器等。
2.键盘设计键盘设计是单片机电子琴中最为重要的元部件,因为它是与用户进行交互的部分。
键盘设计可能有不同的方法,但是本文所展示的方法采用的是与传统钢琴相似的电容式设计方式。
电容式键盘设计思路是这样的:在钢琴键盘下方安装一组与钢琴键盘平行的电容板。
当按下钢琴键时,会压缩键盘下方的电容板,导致电容板之间的电容值发生变化,这样就可以识别每个键位的编号。
作为键盘电容板有很多种选择,但选择正确的条件是符合设计条件。
在这里,我们用金属箔板作为电容板,每个键位产生的电容值被电路板上面的片式电容器取样。
所以,我们使用红外线LED 与光敏二极管来驱动键盘,金属箔板放在二者之间。
在不按键的情况下,光敏二极管可以检测到被金属箔板反射的红外线,导致电容板上的电容值稳定。
当按下键时,电容板之间的电容值发生变化,此时光敏二极管检测到的红外线信号也将会变化,通过这个变化可以确定该键是否被按下。
3.音频输出在单片机电子琴的设计中,音频输出也是非常重要的。
音频输出通常使用功率放大器和喇叭来完成,我们也可以通过DAC/ADC 或PWM 来实现音频输出。
单片机应用课程设计--简易电子琴设计

delay(5);
if (key1 == 0)
{
key_in_flag = 0;
key_value = 4;
}
}
else
{
key_in_flag = 1;
}
key8 = 1;
key7 = 0;
if (key4 == 0)
{
delay(5);
if (key4 == 0)
{
key_in_flag = 0;
参考文献
[1] 赵鑫,蒋亮,齐兆群.数字电路设计[M].北京机械工业出版社,2005年6月第一版
[2] 苏家健,曹柏荣,汪志锋.单片机原理及应用技术[M].高等教育出版社
[3] 李朝青.单片机原理及接口技术[M].北京:北京航天航空大学出版色,2001
[4] 胡汉才.单片机原理及其接口技术[M].北京:清华大学出版社,2004
{
key_in_flag = 0;
key_value = 2;
}
}
else
{
key_in_flag = 1;
}
if (key2 == 0)
{
delay(5);
if (key2 == 0)
{
key_in_flag = 0;
key_value = 3;
}
}
else
{
key_in_flag = 1;
}
if (key1 == 0)
方案二: 采用AT89C51单片机进行控制,由于AT89C51不具备ISP功能, 因此Atmel公司已经停产在市面上已经不常见,况且其ROM只有4K在系统将来升级方面没有潜力。
方案三:采用AT89S52单片机进行控制,由于其性价比高,完全满足了本作品智能化的要求,它的内部程序存储空间达到8K,使软件设计有足够的内部使用空间并且方便日后系统升级,使用方便,抗干扰性能提高。
单片机简易电子琴课程设计

单片机简易电子琴课程设计简易电子琴实验一、课程设计目的与要求1、掌握蜂鸣器的使用方法;2、掌握蜂鸣器的不同发音的方法;3、通过本次课程设计加深对单片机课程的认识和掌握,对单片机的应用做进一步了解。
二、课程设计设备STAR 序列试验仪一套、PC 机一台三、课程设计内容1、简易电子琴原理(1)蜂鸣器输入不同频率的方波,会发出不同的声音;(2)通过按键,由单片机控制产生不同频率的方波,从而发出不同的声音。
2、课程设计过程(1)通过单片机,是G6区的1-7号键由低到高发出1-7的音阶。
四、课程设计原理图1234567P1.0P1.1P1.2P1.3P1.4P1.5P1.6VccBuzzerLS12KR15.1KR28550Q60.01uFC40Ctrl100R11P1.7五、课程设计框图主程序:节拍1子程序(手动按键时用) 节拍2子程序(手动按键时用)0FFH->P1 开始 播放一段音乐 P1.0=0调用节拍1子程序 N Y 调用节拍2子程序 Y调用节拍3子程序Y 调用节拍4子程序 调用节拍5子程序 调用节拍6子程序 调用节拍7子程序P1.1=0P1.2=0N P1.3=0Y Y Y P1.4=0P1.5=0N P1.6=0Y N N N 0->P1.7 延时180us 1->P1.7 延时190us开始 返回0->P1.7 延时200us 1->P1.7 延时200us开始 返回节拍3子程序(手动按键时用)节拍4子程序(手动按键时用)开始0->P1.7延时180us1->P1.7延时170us返回开始0->P1.7延时160us1->P1.7延时160us返回节拍5子程序(手动按键时用)节拍6子程序(手动按键时用)开始0->P1.7延时150us1->P1.7延时150us返回开始0->P1.7延时140us1->P1.7延时140us返回节拍7子程序(手动按键时用)节拍1子程序(自动放音时用,时间约0.2s )节拍2子程序(自动放音时用,时间约0.2s ) 节拍3子程序(自动放音时用,时间约0.2s )0->P1.7 延时220us 计数器-1 1->P1.7 延时210us 1100->计数器 N计数器-1=0返回Y 0->P1.7 延时130us 1->P1.7 延时130us开始 返回开始节拍4子程序(自动放音时用,时间约0.2s ) 节拍5子程序(自动放音时用,时间约0.2s )节拍6子程序(自动放音时用,时间约0.2s ) 节拍7子程序(自动放音时用,时间约0.2s )NY 0->P1.7 延时170us 计数器-1 1->P1.7 延时170us开始 1300->计数器 计数器-1=0返回Y N0->P1.7 延时180us 计数器-1 1->P1.7 延时180us 开始 1250->计数器 计数器-1=0返回0->P1.7 延时185us 计数器-1 1->P1.7 延时180us开始 1200->计数器 Y N计数器-1=0返回NY 0->P1.7 延时190us 计数器-1 1->P1.7 延时190us 开始 1150->计数器 计数器-1=0返回六、课程设计步骤1、主机连线说明D1区:Ctrl — A3区:P1.7 G6区:JP74 —A3区:JP51(P1口)2、运行程序,按G6区的1-7号键,输出7种音阶。
单片机电子琴实施方案

方案设计1电子琴设计框图图1电子琴设计框图2 总体设计2.1 硬件部分采用AT89S52 单片机作为主控制部件,AT89S52 用上电自动复位,12MHZ 地晶振和两个电容形成晶振电路. 面键,用于输入音符.2.2 软件部分软件部分采用汇编语言编写程序,单片机汇编语言程序设计步骤如下:第一步:分析问题.第二步:画出程序地基本轮廓.第三步:实现该程序.2.3 软硬件调试使用KEIL 软件,将程序输入进行编译,编译通过后,则将制作地电路进行联机仿真,检测功能和设计任务能不能实现. 如果不能达到预期效果,则必须重新检查硬件或修改程序.2.4 程序固化经过调试,实现了预期地成果和功能,就可以开始程序固化了. 将程序烧录到AT89S52 内部ROM 中,然后将单片机放入到电路中,再进行观察.一.相关技术简介用电子琴可以演奏出各种美妙地音乐,而音乐是有音符组成地.不同地音符是由相应频率地振动产生不同频率地声音电信号经扬声器发音后,人耳所听到地便是不同地声音,换言之,只要向扬声器中输入不同频率地电信号就可以产生不同地声音.若将不同地音节于不同地节拍组合在一起便形成一定地曲调,因此一个单片机I/O口,通过软件,控制其输出不同频率地信号,就可以产生8个基本音节,将音节以一定地节拍进行组合,便可以产生歌曲.乐曲中每一音符对应着确定地频率,表1 给出C 调时各音符频率.如果单片机某个口线输出“高”“低”电平地频率和某个音符地频率一样,那么将此口线接上喇叭就可以发出此音符.二.硬件设计1. AT89S52单片机图2 AT89S52单片机(1)简介AT89S52 是一种低功耗、高性能CMOS8 位微控制器,具有8K 在系统可编程Flash 存储器.使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容.片上Flash 允许程序存储器在系统可编程,亦适于常规编程器.在单芯片上,拥有灵巧地8 位CPU 和在系统可编程Flash,使得AT89S52 为众多嵌入式控制应用系统提供高灵活、超有效地解决方案.AT89S52 具有以下标准功能:8k 字节Flash,256 字节RAM,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个 6 向量 2 级中断结构,全双工串行口,片内晶振及时钟电路.另外,AT89S52 可降至0Hz 静态逻辑操作,支持 2 种软件可选择节电模式.空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作.掉电保护方式下,RAM 内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止.(2).引脚功能1.VCC : 电源2.GND: 地3.P0 口:P0 口是一个8 位漏极开路地双向I/O 口.作为输出口,每位能驱动8 个TTL 逻辑电平.对P0 端口写“1”时,引脚用作高阻抗输入.当访问外部程序和数据存储器时,P0 口也被作为低8 位地址/数据复用.在这种模式下,P0 具有内部上拉电阻.在flash 编程时,P0 口也用来接收指令字节;在程序校验时,输出指令字节.程序校验时,需要外部上拉电阻.4.P1 口:P1 口是一个具有内部上拉电阻地8 位双向I/O 口,p1 输出缓冲器能驱动4 个TTL 逻辑电平.对P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用.作为输入使用时,被外部拉低地引脚由于内部电阻地原因,将输出电流(IIL).此外,P1.0 和P1.2 分别作定时器/计数器 2 地外部计数输入(P1.0/T2)和时器/计数器2地触发输入(P1.1/T2EX),具体如下表所示.在flash 编程和校验时,P1 口接收低8 位地址字节.表1P1引脚功能5.P2 口:P2 口是一个具有内部上拉电阻地8 位双向I/O 口,P2 输出缓冲器能驱动4 个TTL 逻辑电平.对P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用.作为输入使用时,被外部拉低地引脚由于内部电阻地原因,将输出电流(IIL).在访问外部程序存储器或用16 位地址读取外部数据存储器(例如执行MOVX @DPTR)时,P2 口送出高八位地址.在这种应用中,P2 口使用很强地内部上拉发送 1.在使用8 位地址(如MOVX @RI)访问外部数据存储器时,P2 口输出P2 锁存器地内容.在flash 编程和校验时,P2 口也接收高8 位地址字节和一些控制信号.6.p3 口:P3 口是一个具有内部上拉电阻地8 位双向I/O 口,p2 输出缓冲器能驱动4 个TTL 逻辑电平.对P3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用.作为输入使用时,被外部拉低地引脚由于内部电阻地原因,将输出电流(IIL).P3 口亦作为AT89S52 特殊功能(第二功能)使用,如下表所示.在flash 编程和校验时,P3 口也接收一些控制信号.表2P3引脚功能7.RST: 复位输入.晶振工作时,RST 脚持续2 个机器周期高电平将使单片机复位.看门狗计时完成后,RST 脚输出96 个晶振周期地高电平.特殊寄存器AUXR(地址8EH)上地DISRTO 位可以使此功能无效.DISRTO 默认状态下,复位高电平有效.8.ALE/PROG:地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8 位地址地输出脉冲.在flash 编程时,此引脚(PROG)也用作编程输入脉冲.在一般情况下,ALE 以晶振六分之一地固定频率输出脉冲,可用来作为外部定时器或时钟使用.然而,特别强调,在每次访问外部数据存储器时,ALE 脉冲将会跳过.如果需要,通过将地址为8EH 地SFR 地第0 位置“1”,ALE 操作将无效.这一位置“1”,ALE 仅在执行MOVX 或MOVC 指令时有效.否则,ALE 将被微弱拉高.这个ALE 使能标志位(地址为8EH 地SFR 地第0 位)地设置对微控制器处于外部执行模式下无效.9.PSEN:外部程序存储器选通信号(PSEN)是外部程序存储器选通信号.当AT89S52 从外部程序存储器执行外部代码时,PSEN 在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN 将不被激活.10.EA/VPP:访问外部程序存储器控制信号.为使能从0000H 到FFFFH地外部程序存储器读取指令,EA 必须接GND.为了执行内部程序指令,EA 应该接VCC.在flash 编程期间,EA 也接收12 伏VPP电压.11.XTAL1:振荡器反相放大器和内部时钟发生电路地输入端.12.XTAL2:振荡器反相放大器地输出端.2.蜂鸣器图3 蜂鸣器蜂鸣器是一种一体化结构地电子讯响器,采用直流电压供电,广泛应用于计算机,打印机,复印机,报警器,电子玩具,汽车电子设备,电话机,定时器等电子产品中做发声器件.3.键盘图4 键盘本设计键盘模块采用4*4 矩阵键盘,原理图如图4所示.在键盘中按键数量较多时,为了减少I/O 口地占用,通常将按键排列成矩阵形式,如图 4 所示. 在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接. 这样,一个端口(如P1 口)就可以构成4*4=16 个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20 键地键盘,而直接用端口线则只能多出一键(9 键).由此可见,在键盘中按键数量较多时,为了减少I/O 口地占用,通常将按键排列成矩阵形式.4. 时钟电路(1)振荡电路AT89S52内部有一个用于构成振荡器地可控高增益反向放大器,两个引脚XTAL1和XTAL2分别是该放大器地输入端和输出端,其中匹配电容C11和C12要根据石英晶体振荡器地要求选取,一般选用20-30PF地瓷片电容.振荡频率根据实际要求地工作速度,从几百KHZ-24MHZ中适当选取.(2)时钟电路图5定时电路5 .LED数码管图6 LED显示显示模块是利用AT89S52 单片机地P0 端口地P0.0-P0.7 连接到一个共阳数码管地a-h 地笔段上.在数码管上循环显示0-7 数字,时间间隔0.2 秒.LED 显示模块七段LED 数码管内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管地极管地接线形式,可分成共阴极型和共阳极型.LED 数码管地七个发光二极管因加正电压而发亮,因加零电压而不以发亮,不同亮暗地组合就能形成不同地字形,这种组合称之为字形码,表3给出了共阴极LED 数码管地字形码表.表3共阳极LED 数码管地字形码表三.软件设计图7主程序流程图1.发声程序表4音符频率表图8 发声程序流程图. 2.定时中断图9定时中断程序框图中断是单片机适时地处理内部或外部事件地一种内部机制,当某种内部或外部事件发生时,单片机中断系统将迫使CPU暂停正在执行地程序,转而去进行中断事件地处理,中断处理完毕后,又返回被中断程序处,继续向下执行.AT89S52 有6 个中断源:两个外部中断(INT0 和INT1),三个定时中断(定时器0、1、2)和一个串行中断.每个中断源都可以通过置位或清除特殊寄存器IE 中地相关中断允许控制位分别使得中断源有效或无效.IE 还包括一个中断允许总控制位EA,它能一次禁止所有中断.如表 5 所示,IE.6 位是不可用地.对于AT89S52,IE.5 位也是不能用地.用户软件不应给这些位写 1.它们为AT89 系列新产品预留.定时器2 可以被寄存器T2CON 中地TF2 和EXF2 地或逻辑触发.程序进入中断服务后,这些标志位都可以由硬件清0.实际上,中断服务程序必须判定是否是TF2 或EXF2 激活中断,标志位也必须由软件清0.定时器0 和定时器 1 标志位TF0 和TF1 在计数溢出地那个周期地S5P2 被置位.它们地值一直到下一个周期被电路捕捉下来.然而,定时器 2 地标志位TF2 在计数溢出地那个周期地S2P2 被置位,在同一个周期被电路捕捉下来.表5中断允许控制寄存器五设计感受这次专业设计结束了,我对于52单片机又有了一个全新地认识,原来以前地学习还差很多,在对于学科和未来地工作上,我还有很长地一段路要走.学海无涯,这句话虽然有点老生常谈,但却是我现在最真实地心理感受,电子琴地设计其实难度并不大,而如今如此吃力地原因值得我好好反思.最后,感谢老师对于我们专业设计无私地指导和帮助.六附录//简易电子琴#include<reg52.h> //包含51单片机寄存器定义地头文件sbit P14=P1^4; //将P14位定义为P1.4引脚sbit P15=P1^5; //将P15位定义为P1.5引脚sbit P16=P1^6; //将P16位定义为P1.6引脚sbit P17=P1^7; //将P17位定义为P1.7引脚unsigned char keyval; //定义变量储存按键值sbit sound=P3^6; //将sound位定义为P3.7unsigned int C; //全局变量,储存定时器地定时常数unsigned int f; //全局变量,储存音阶地频率//以下是C调低音地音频宏定义#define l_dao 262 //将“l_dao”宏定义为低音“1”地频率262Hz#define l_re 286 //将“l_re”宏定义为低音“2”地频率286Hz#define l_mi 311 //将“l_mi”宏定义为低音“3”地频率311Hz#define l_fa 349 //将“l_fa”宏定义为低音“4”地频率349Hz#define l_sao 392 //将“l_sao”宏定义为低音“5”地频率392Hz#define l_la 440 //将“l_a”宏定义为低音“6”地频率440Hz#define l_xi 494 //将“l_xi”宏定义为低音“7”地频率494Hz//以下是C调中音地音频宏定义#define dao 523 //将“dao”宏定义为中音“1”地频率523Hz#define re 587 //将“re”宏定义为中音“2”地频率587Hz#define mi 659 //将“mi”宏定义为中音“3”地频率659Hz#define fa 698 //将“fa”宏定义为中音“4”地频率698Hz#define sao 784 //将“sao”宏定义为中音“5”地频率784Hz#define la 880 //将“la”宏定义为中音“6”地频率880Hz#define xi 987 //将“xi”宏定义为中音“7”地频率53//以下是C调高音地音频宏定义#define h_dao 1046 //将“h_dao”宏定义为高音“1”地频率1046Hz#define h_re 1174 //将“h_re”宏定义为高音“2”地频率1174Hz#define h_mi 1318 //将“h_mi”宏定义为高音“3”地频率1318Hz#define h_fa 1396 //将“h_fa”宏定义为高音“4”地频率1396Hz#define h_sao 1567 //将“h_sao”宏定义为高音“5”地频率1567Hz#define h_la 1760 //将“h_la”宏定义为高音“6”地频率1760Hz#define h_xi 1975 //将“h_xi”宏定义为高音“7”地频率1975Hz/**************************************************************函数功能:软件延时子程序**************************************************************/void delay20ms(void){unsigned char i,j;for(i=0;i<100;i++)for(j=0;j<60;j++);}/*******************************************函数功能:节拍地延时地基本单位,延时200ms******************************************/void delay(){unsigned char i,j;for(i=0;i<250;i++)for(j=0;j<250;j++);}/*******************************************函数功能:输出音频入口参数:F******************************************/void Output_Sound(void){C=(46083/f)*10; //计算定时常数TH0=(8192-C)/32; //可证明这是13位计数器TH0高8位地赋初值方法 TL0=(8192-C)%32; //可证明这是13位计数器TL0低5位地赋初值方法 TR0=1; //开定时T0delay(); //延时200ms,播放音频TR0=0; //关闭定时器sound=1; //关闭蜂鸣器keyval=0xff; //播放按键音频后,将按键值更改,停止播放}/*******************************************函数功能:主函数******************************************/void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许ET1=1; //定时器T1中断允许TR1=1; //定时器T1启动,开始键盘扫描TMOD=0x10; //分别使用定时器T1地模式1,T0地模式0TH1=(65536-500)/256; //定时器T1地高8位赋初值TL1=(65536-500)%256; //定时器T1地高8位赋初值while(1) //无限循环{switch(keyval){case 1:f=dao; //如果第1个键按下,将中音1地频率赋给fOutput_Sound(); //转去计算定时常数break;case 2:f=l_xi; //如果第2个键按下,将低音7地频率赋给fOutput_Sound(); //转去计算定时常数break;case 3:f=l_la; //如果第3个键按下,将低音6地频率赋给fOutput_Sound(); //转去计算定时常数break;case 4:f=l_sao; //如果第4个键按下,将低音5地频率赋给fOutput_Sound(); //转去计算定时常数break;case 5:f=sao; //如果第5个键按下,将中音5地频率赋给fOutput_Sound(); //转去计算定时常数break;case 6:f=fa; //如果第6个键按下,将中音4地频率赋给fOutput_Sound(); //转去计算定时常数break;case 7:f=mi; //如果第7个键按下,将中音3地频率赋给fOutput_Sound(); //转去计算定时常数break;case 8:f=re; //如果第8个键按下,将中音2地频率赋给fOutput_Sound(); //转去计算定时常数break;case 9:f=h_re; //如果第9个键按下,将高音2地频率赋给fOutput_Sound(); //转去计算定时常数break;case 10:f=h_dao; //如果第10个键按下,将高音1地频率赋给fOutput_Sound(); //转去计算定时常数break;case 11:f=xi; //如果第11个键按下,将中音7地频率赋给fOutput_Sound(); //转去计算定时常数break;case 12:f=la; //如果第12个键按下,将中音6地频率赋给fOutput_Sound(); //转去计算定时常数break;case 13:f=h_la; //如果第13个键按下,将高音6地频率赋给fOutput_Sound(); //转去计算定时常数break;case 14:f=h_sao; //如果第14个键按下,将高音5地频率赋给fOutput_Sound(); //转去计算定时常数break;case 15:f=h_fa; //如果第15个键按下,将高音4地频率赋给fOutput_Sound(); //转去计算定时常数break;case 16:f=h_mi; //如果第16个键按下,将高音3地频率赋给fOutput_Sound(); //转去计算定时常数break;}}}/**************************************************************函数功能:定时器T0地中断服务子程序,使P3.7引脚输出音频方波**************************************************************/void Time0_serve(void ) interrupt 1 using 1{TH0=(8192-C)/32; //可证明这是13位计数器TH0高8位地赋初值方法TL0=(8192-C)%32; //可证明这是13位计数器TL0低5位地赋初值方法sound=!sound; //将P3.7引脚取反,输出音频方波}/**************************************************************函数功能:定时器T1地中断服务子程序,进行键盘扫描,判断键位**************************************************************/void time1_serve(void) interrupt 3 using 2 //定时器T1地中断编号为3,使用第2组寄存器{TR1=0; //关闭定时器T0P1=0xf0; //所有行线置为低电平“0”,所有列线置为高电平“1”if((P1&0xf0)!=0xf0) //列线中有一位为低电平“0”,说明有键按下{delay20ms(); //延时一段时间、软件消抖 if((P1&0xf0)!=0xf0) //确实有键按下{P1=0xfe; //第一行置为低电平“0”(P1.0输出低电平“0”)if(P14==0) //如果检测到接P1.4引脚地列线为低电平“0”keyval=1; //可判断是S1键被按下if(P15==0) //如果检测到接P1.5引脚地列线为低电平“0”keyval=2; //可判断是S2键被按下if(P16==0) //如果检测到接P1.6引脚地列线为低电平“0”keyval=3; //可判断是S3键被按下if(P17==0) //如果检测到接P1.7引脚地列线为低电平“0”keyval=4; //可判断是S4键被按下P1=0xfd; //第二行置为低电平“0”(P1.1输出低电平“0”)if(P14==0) //如果检测到接P1.4引脚地列线为低电平“0”keyval=5; //可判断是S5键被按下if(P15==0) //如果检测到接P1.5引脚地列线为低电平“0”keyval=6; //可判断是S6键被按下if(P16==0) //如果检测到接P1.6引脚地列线为低电平“0”keyval=7; //可判断是S7键被按下if(P17==0) //如果检测到接P1.7引脚地列线为低电平“0”keyval=8; //可判断是S8键被按下P1=0xfb; //第三行置为低电平“0”(P1.2输出低电平“0”)if(P14==0) //如果检测到接P1.4引脚地列线为低电平“0”keyval=9; //可判断是S9键被按下if(P15==0) //如果检测到接P1.5引脚地列线为低电平“0”keyval=10; //可判断是S10键被按下if(P16==0) //如果检测到接P1.6引脚地列线为低电平“0”keyval=11; //可判断是S11键被按下if(P17==0) //如果检测到接P1.7引脚地列线为低电平“0”keyval=12; //可判断是S12键被按下P1=0xf7; //第四行置为低电平“0”(P1.3输出低电平“0”)if(P14==0) //如果检测到接P1.4引脚地列线为低电平“0”keyval=13; //可判断是S13键被按下if(P15==0) //如果检测到接P1.5引脚地列线为低电平“0”keyval=14; //可判断是S14键被按下if(P16==0) //如果检测到接P1.6引脚地列线为低电平“0”keyval=15; //可判断是S15键被按下if(P17==0) //如果检测到接P1.7引脚地列线为低电平“0”keyval=16; //可判断是S16键被按下}}TR1=1; //开启定时器T1TH1=(65536-500)/256; //定时器T1地高8位赋初值TL1=(65536-500)%256; //定时器T1地高8位赋初值}七参考文献[1] 龙威林,杨冠声,胡山.单片机应用入门:AT89S51 和 AVR[M].北京:化学工业出版社,2008.[2] 黄鑫,马善农,赵永科.基于 CPLD 地电子琴研究与设计[J].科技广场,2007(5).[3] 赵亮,侯国锐.单片机 C 语言编程与实例[M].北京:人民邮电出版社,2003.[4] 杨恢先,黄辉先.单片机原理及应用[M].北京:人民邮电出版社,2006.[5] 张虹.单片机原理及应用[M].北京:中国电力出版社,2009.[6] 李云钢,邹逢兴,龙志强. 单片机原理与应用系统计[J].北京:中国水利水电出版社,2008.版权申明本文部分内容,包括文字、图片、以及设计等在网上搜集整理.版权为个人所有This article includes some parts, including text, pictures, and design. Copyright is personal ownership.V7l4j。
基于单片机的电子琴设计

基于单片机的电子琴设计一、引言二、总体设计方案(一)设计目标设计一款基于单片机的电子琴,能够实现基本的音符演奏、音色切换、节奏控制等功能,并且具有良好的音质和稳定性。
(二)系统组成本电子琴系统主要由单片机控制模块、键盘输入模块、音频输出模块、显示模块和电源模块等部分组成。
1、单片机控制模块选用 STM32 系列单片机作为控制核心,负责处理键盘输入信号、生成音频信号、控制显示等功能。
2、键盘输入模块采用矩阵键盘,通过扫描键盘获取用户的按键操作,将其转换为对应的音符编码发送给单片机。
3、音频输出模块使用DAC 芯片将单片机生成的数字音频信号转换为模拟音频信号,再通过放大器和扬声器输出声音。
4、显示模块采用液晶显示屏,用于显示当前的演奏状态、音色选择、节奏模式等信息。
5、电源模块为整个系统提供稳定的电源供应,可采用电池供电或外接电源适配器。
三、硬件设计(一)单片机最小系统STM32 单片机的最小系统包括时钟电路、复位电路和电源电路。
时钟电路为单片机提供工作时钟,复位电路用于系统初始化,电源电路为单片机提供稳定的电源。
(二)键盘电路矩阵键盘由行线和列线组成,通过逐行扫描的方式检测按键状态。
将键盘的行线和列线分别连接到单片机的 GPIO 引脚,通过编程实现键盘扫描和按键识别。
(三)音频输出电路选用高性能的 DAC 芯片,如 PCM1794,将单片机输出的数字音频信号转换为模拟音频信号。
为了提高音频输出的质量,还需要添加放大器和滤波电路,以增强信号的功率和去除噪声。
(四)显示电路液晶显示屏通过 SPI 接口或 I2C 接口与单片机连接,单片机通过发送指令和数据来控制显示屏的显示内容。
(五)电源电路根据系统的工作电压和电流需求,选择合适的电源芯片,如LM7805 等,将输入电源转换为所需的电压,并通过滤波电容等元件提高电源的稳定性。
四、软件设计(一)主程序流程主程序首先进行系统初始化,包括单片机初始化、键盘初始化、音频输出初始化、显示初始化等。
基于单片机的微型电子琴建模

基于单片机的微型电子琴建模引言随着科技的不断发展,电子琴已经成为了音乐爱好者们的最爱之一。
传统的电子琴大多采用单片机和其他电子元件来实现各种音效和功能,但是这种电子琴通常比较大而且价格昂贵。
为了满足人们对小巧便携且质量优良的需求,我们打算通过使用单片机来设计一种微型电子琴。
本文将介绍该微型电子琴的设计思路、具体实现方法以及未来的发展方向。
一、微型电子琴的设计思路1. 硬件设计我们打算采用STM32F103C8T6单片机作为微型电子琴的核心处理器。
这款单片机具有较高的性能和丰富的外设资源,能够满足我们对音乐输出和按键输入的需求。
我们还会使用一块音频解码芯片来解码各种音色样本,并通过单片机进行控制和输出。
在按键方面,我们打算使用一组多功能按键来实现琴键的弹奏和功能的选择。
为了提高音质和音量,我们还会加入一组功放电路和扬声器。
2. 软件设计在软件设计方面,我们将会使用C语言来编写单片机的驱动程序和控制程序。
通过对按键输入的检测和音频解码芯片的控制,我们能够实现琴键的弹奏和音色的切换。
我们还会对整个系统进行优化,以确保微型电子琴的稳定性和响应速度,并且可以支持各种音乐演奏模式。
二、微型电子琴的具体实现方法1. 硬件实现我们需要搭建一套原型系统来验证我们的设计方案。
我们会使用原型板来连接单片机、音频解码芯片、按键和功放电路,并且通过软件调试来保证各部分的正常工作。
一旦原型系统稳定运行,我们就可以进行电路的PCB设计和制作,以便于后期的小批量生产。
在PCB设计中,我们需要注意每个电子元件的布局和连线,以减少信号干扰和提高整个系统的可靠性。
2. 软件实现在软件实现方面,我们需要编写音频解码程序、按键检测程序和功放控制程序。
通过音频解码程序,我们能够实现各种音色样本的解码和播放,以满足不同演奏需求。
通过按键检测程序,我们能够实现琴键的弹奏和功能的选择。
通过功放控制程序,我们能够控制扬声器的音量和音质,以提供更好的音乐体验。
单片机课程设计电子琴

单片机课程设计 电子琴一、课程目标知识目标:1. 让学生理解单片机的基本原理,掌握单片机在电子琴设计中的应用。
2. 使学生掌握电子琴的基本结构,能运用单片机编程实现电子琴的基本功能。
3. 帮助学生了解电子琴音调产生原理,掌握音调与频率的关系。
技能目标:1. 培养学生运用单片机进行电子琴设计与编程的能力,能独立完成一个简单的电子琴项目。
2. 培养学生动手实践能力,提高焊接、调试和故障排除等技能。
3. 培养学生团队协作和沟通能力,能在项目过程中进行有效分工与合作。
情感态度价值观目标:1. 激发学生对单片机及电子制作的兴趣,提高学习积极性。
2. 培养学生勇于尝试、不断探索的精神,增强克服困难的信心。
3. 引导学生关注科技发展,认识到所学知识在现实生活中的应用,培养创新意识。
分析课程性质、学生特点和教学要求,本课程目标具体、可衡量,有助于学生和教师在教学过程中明确预期成果。
将目标分解为具体学习成果,为后续教学设计和评估提供依据。
在教学过程中,注重理论与实践相结合,充分调动学生的积极性,提高学生的实践能力。
二、教学内容1. 单片机基础知识:介绍单片机的组成、工作原理,重点讲解CPU、内存、I/O口等部分的功能与应用。
教材章节:第一章单片机基础2. 电子琴结构与原理:讲解电子琴的基本结构,音调产生原理,键盘与发音电路的连接方式。
教材章节:第三章电子乐器原理3. 单片机编程:以C语言为基础,讲解单片机编程方法,重点掌握延时、中断、I/O口控制等编程技巧。
教材章节:第二章单片机编程基础、第五章中断与定时器4. 电子琴设计与制作:结合单片机知识,指导学生进行电子琴设计,包括硬件电路设计、程序编写、调试与优化。
教材章节:第四章单片机应用实例、第六章电子琴设计与制作5. 实践操作:安排学生进行电子琴硬件焊接、程序烧写、调试与测试,培养动手实践能力。
教材章节:第七章实践操作教学内容安排与进度:第一周:单片机基础知识学习,完成CPU、内存、I/O口等功能的学习。
单片机电子琴设计

2
硬件设计
NO作为微控制器。Arduino UNO具 有丰富的IO端口和内置的音频放大器,非常适合用于电 子琴设计
硬件设计
2. 按键矩阵
为了方便用户操作,本设计采用一个4x4的按键矩阵,共有16个按键,分别代表不同的音 符
3. 音频放大器
由于Arduino UNO的 输出功率较小,不足 以驱动扬声器产生清 晰的音符,因此需要 使用一个音频放大器 来放大音频信号。本 设计选用一个内置音 频放大器的芯片,如 LM386
-
感谢倾听
硬件设计
硬件设计
4. 扬声器
为了产生美妙的音乐 ,本设计选用一个8 欧姆、0.5瓦的扬声 器
硬件设计
5. 电路图
请参考以下电路图
3
软件设计
1. 代码框架
本设计的代码框架如下
软件设计
软件设计
2. 按键检测和音符播放
在loop()函数中,我们使用一个switch语句来检测按键事件,并根据不同的按键触发不同 的音符。为了简化代码,我们使用一个库来播放音符。这个库可以是Arduino内置的tone 库或者其他第三方库。以下是示例代码
单片机电子琴设 计
-
引言 硬件设计 软件设计
1
引言
引言
单片机电子琴是一种基 于微控制器的音乐设备 ,能够通过按键触发不 同的音符,从而演奏出 美妙的音乐
这种设计具有简单、便 携、节能等优点,因此 广泛应用于音乐教育、 儿童玩具等领域
本文将介绍一种基于 Arduino单片机的电子 琴设计,包括硬件和软 件部分
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
方案设计1电子琴设计框图图1电子琴设计框图2 总体设计2.1 硬件部分采用AT89S52 单片机作为主控制部件,AT89S52 用上电自动复位,12MHZ 的晶振和两个电容形成晶振电路。
面键,用于输入音符。
2.2 软件部分软件部分采用汇编语言编写程序,单片机汇编语言程序设计步骤如下:第一步:分析问题。
第二步:画出程序的基本轮廓。
第三步:实现该程序。
2.3 软硬件调试使用KEIL 软件,将程序输入进行编译,编译通过后,则将制作的电路进行联机仿真,检测功能和设计任务能不能实现。
如果不能达到预期效果,则必须重新检查硬件或修改程序。
2.4 程序固化经过调试,实现了预期的成果和功能,就可以开始程序固化了。
将程序烧录到 AT89S52 内部ROM 中,然后将单片机放入到电路中,再进行观察。
一.相关技术简介用电子琴可以演奏出各种美妙的音乐,而音乐是有音符组成的。
不同的音符是由相应频率的振动产生不同频率的声音电信号经扬声器发音后,人耳所听到的便是不同的声音,换言之,只要向扬声器中输入不同频率的电信号就可以产生不同的声音。
若将不同的音节于不同的节拍组合在一起便形成一定的曲调,因此一个单片机I/O口,通过软件,控制其输出不同频率的信号,就可以产生8个基本音节,将音节以一定的节拍进行组合,便可以产生歌曲。
乐曲中每一音符对应着确定的频率,表1 给出C 调时各音符频率。
如果单片机某个口线输出“高”“低”电平的频率和某个音符的频率一样,那么将此口线接上喇叭就可以发出此音符。
二.硬件设计1. AT89S52单片机图2 AT89S52单片机<1)简介AT89S52 是一种低功耗、高性能 CMOS8 位微控制器,具有8K 在系统可编程 Flash 存储器。
使用 Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。
片上 Flash 允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的 8 位 CPU 和在系统可编程 Flash,使得 AT89S52 为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52 具有以下标准功能:8k 字节 Flash,256 字节 RAM,32 位 I/O 口线,看门狗定时器,2 个数据指针,三个 16 位定时器/计数器,一个 6 向量 2 级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52 可降至 0Hz 静态逻辑操作,支持 2 种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM 内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
<2).引脚功能1.VCC : 电源2.GND: 地3.P0 口:P0 口是一个 8 位漏极开路的双向 I/O 口。
作为输出口,每位能驱动 8 个 TTL 逻辑电平。
对 P0 端口写“1”时,引脚用作高阻抗输入。
当访问外部程序和数据存储器时,P0 口也被作为低 8 位地址/数据复用。
在这种模式下,P0 具有内部上拉电阻。
在 flash 编程时,P0 口也用来接收指令字节;在程序校验时,输出指令字节。
程序校验时,需要外部上拉电阻。
4.P1 口:P1 口是一个具有内部上拉电阻的 8 位双向 I/O 口,p1 输出缓冲器能驱动 4 个TTL 逻辑电平。
对 P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚因为内部电阻的原因,将输出电流<IIL)。
此外,P1.0 和 P1.2 分别作定时器/计数器 2 的外部计数输入<P1.0/T2)和时器/计数器 2的触发输入<P1.1/T2EX),具体如下表所示。
在 flash 编程和校验时,P1 口接收低 8 位地址字节。
表1P1引脚功能5.P2 口:P2 口是一个具有内部上拉电阻的 8 位双向 I/O 口,P2 输出缓冲器能驱动 4 个TTL 逻辑电平。
对 P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚因为内部电阻的原因,将输出电流<IIL)。
在访问外部程序存储器或用 16 位地址读取外部数据存储器<例如执行 MOVX @DPTR)时,P2 口送出高八位地址。
在这种应用中,P2 口使用很强的内部上拉发送 1。
在使用8 位地址<如 MOVX @RI)访问外部数据存储器时,P2 口输出 P2 锁存器的内容。
在 flash 编程和校验时,P2 口也接收高 8 位地址字节和一些控制信号。
6.p3 口:P3 口是一个具有内部上拉电阻的 8 位双向 I/O 口,p2 输出缓冲器能驱动 4 个TTL 逻辑电平。
对 P3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚因为内部电阻的原因,将输出电流<IIL)。
P3 口亦作为 AT89S52 特殊功能<第二功能)使用,如下表所示。
在 flash 编程和校验时,P3 口也接收一些控制信号。
表2P3引脚功能7.RST: 复位输入。
晶振工作时,RST 脚持续 2 个机器周期高电平将使单片机复位。
看门狗计时完成后,RST 脚输出 96 个晶振周期的高电平。
特殊寄存器 AUXR(地址 8EH>上的 DISRTO 位可以使此功能无效。
DISRTO 默认状态下,复位高电平有效。
8.ALE/PROG:地址锁存控制信号<ALE)是访问外部程序存储器时,锁存低 8 位地址的输出脉冲。
在 flash 编程时,此引脚<PROG)也用作编程输入脉冲。
在一般情况下,ALE 以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。
然而,特别强调,在每次访问外部数据存储器时,ALE 脉冲将会跳过。
如果需要,通过将地址为 8EH 的 SFR 的第 0 位置“1”,ALE 操作将无效。
这一位置“1”,ALE 仅在执行 MOVX 或 MOVC 指令时有效。
否则,ALE 将被微弱拉高。
这个 ALE 使能标志位<地址为 8EH 的 SFR 的第 0 位)的设置对微控制器处于外部执行模式下无效。
9.PSEN:外部程序存储器选通信号<PSEN)是外部程序存储器选通信号。
当 AT89S52 从外部程序存储器执行外部代码时,PSEN 在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN 将不被激活。
10.EA/VPP:访问外部程序存储器控制信号。
为使能从 0000H 到 FFFFH 的外部程序存储器读取指令,EA 必须接 GND。
为了执行内部程序指令,EA 应该接 VCC。
在 flash 编程期间,EA 也接收 12 伏 VPP电压。
11.XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。
12.XTAL2:振荡器反相放大器的输出端。
2.蜂鸣器图3 蜂鸣器蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机,打印机,复印机,报警器,电子玩具,汽车电子设备,电话机,定时器等电子产品中做发声器件。
3.键盘图4 键盘本设计键盘模块采用 4*4 矩阵键盘,原理图如图4所示。
在键盘中按键数量较多时,为了减少I/O 口的占用,通常将按键排列成矩阵形式,如图4 所示。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。
这样,一个端口<如P1 口)就可以构成4*4=16 个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20 键的键盘,而直接用端口线则只能多出一键<9 键)。
由此可见,在键盘中按键数量较多时,为了减少I/O 口的占用,通常将按键排列成矩阵形式。
4. 时钟电路<1)振荡电路AT89S52内部有一个用于构成振荡器的可控高增益反向放大器,两个引脚XTAL1和XTAL2分别是该放大器的输入端和输出端,其中匹配电容C11和C12要根据石英晶体振荡器的要求选取,一般选用20-30PF 的瓷片电容。
振荡频率根据实际要求的工作速度,从几百KHZ-24MHZ中适当选取。
<2)时钟电路图5定时电路5 .LED数码管图6 LED显示显示模块是利用 AT89S52 单片机的 P0 端口的 P0.0-P0.7 连接到一个共阳数码管的a-h 的笔段上。
在数码管上循环显示0-7 数字,时间间隔0.2 秒。
LED 显示模块七段LED 数码管内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管的极管的接线形式,可分成共阴极型和共阳极型。
LED 数码管的七个发光二极管因加正电压而发亮,因加零电压而不以发亮,不同亮暗的组合就能形成不同的字形,这种组合称之为字形码,表3给出了共阴极LED 数码管的字形码表。
表3共阳极 LED 数码管的字形码表显示字符共阳极段选码显示字符共阳极段选码0C0H 880H1F9H 990H2A4H A88H三.软件设计图7主程序流程图1.发声程序表4音符频率表图 8 发声程序流程图。
2.定时中断图9定时中断程序框图中断是单片机适时的处理内部或外部事件的一种内部机制,当某种内部或外部事件发生时,单片机中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理,中断处理完毕后,又返回被中断程序处,继续向下执行。
AT89S52 有 6 个中断源:两个外部中断<INT0 和 INT1),三个定时中断<定时器0、1、2)和一个串行中断。
每个中断源都可以通过置位或清除特殊寄存器IE 中的相关中断允许控制位分别使得中断源有效或无效。
IE 还包括一个中断允许总控制位 EA,它能一次禁止所有中断。
如表 5 所示,IE.6 位是不可用的。
对于AT89S52,IE.5 位也是不能用的。
用户软件不应给这些位写1。
它们为 AT89 系列新产品预留。
定时器 2 可以被寄存器 T2CON 中的TF2 和 EXF2 的或逻辑触发。
程序进入中断服务后,这些标志位都可以由硬件清0。
实际上,中断服务程序必须判定是否是TF2 或EXF2 激活中断,标志位也必须由软件清0。
定时器 0 和定时器 1 标志位 TF0 和 TF1 在计数溢出的那个周期的 S5P2 被置位。
它们的值一直到下一个周期被电路捕捉下来。
然而,定时器2 的标志位TF2 在计数溢出的那个周期的 S2P2 被置位,在同一个周期被电路捕捉下来。
表5中断允许控制寄存器五设计感受这次专业设计结束了,我对于52单片机又有了一个全新的认识,原来以前的学习还差很多,在对于学科和未来的工作上,我还有很长的一段路要走。
学海无涯,这句话虽然有点老生常谈,但却是我现在最真实的心理感受,电子琴的设计其实难度并不大,而如今如此吃力的原因值得我好好反思。