单片机电子琴方案.docx
- 文档编号:15432419
- 上传时间:2023-07-04
- 格式:DOCX
- 页数:20
- 大小:164.06KB
单片机电子琴方案.docx
《单片机电子琴方案.docx》由会员分享,可在线阅读,更多相关《单片机电子琴方案.docx(20页珍藏版)》请在冰点文库上搜索。
单片机电子琴方案
方案设计
1电子琴设计框图
晶振
89S52
控制模块
显示模块
发声模块
图1 电子琴设计框图
2总体设计
2.1硬件部分
采用AT89S52单片机作为主控制部件,AT89S52用上电自动复位,12MHZ的晶振和两个电容形成晶振电路。
面键,用于输入音符。
2.2软件部分
软件部分采用汇编语言编写程序,单片机汇编语言程序设计步骤如下:
第一步:
分析问题。
第二步:
画出程序的基本轮廓。
第三步:
实现该程序。
2.3软硬件调试
使用KEIL软件,将程序输入进行编译,编译通过后,则将制作的电路进行联机仿真,检测功能和设计任务能不能实现。
如果不能达到预期效果,则必须重新检查硬件或修改程序。
2.4程序固化
经过调试,实现了预期的成果和功能,就可以开始程序固化了。
将程序烧录到AT89S52内部ROM中,然后将单片机放入到电路中,再进行观察。
一.相关技术简介
用电子琴可以演奏出各种美妙的音乐,而音乐是有音符组成的。
不同的音符是由相应频率的振动产生不同频率的声音电信号经扬声器发音后,人耳所听到的便是不同的声音,换言之,只要向扬声器中输入不同频率的电信号就可以产生不同的声音。
若将不同的音节于不同的节拍组合在一起便形成一定的曲调,因此一个单片机I/O口,通过软件,控制其输出不同频率的信号,就可以产生8个基本音节,将音节以一定的节拍进行组合,便可以产生歌曲。
乐曲中每一音符对应着确定的频率,表1给出C调时各音符频率。
如果单片机某个口线输出“高”“低”电平的频率和某个音符的频率一样,那么将此口线接上喇叭就可以发出此音符。
二.硬件设计
1.AT89S52单片机
图2AT89S52单片机
<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”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚因为内部电阻的原因,将输出电流 此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入 在flash编程和校验时,P1口接收低8位地址字节。 表1 P1引脚功能 引脚号 第二功能 P1.0 T2<定时器/计数器T2的外部计数输入),时钟输出 P1.1 T2EX<定时器/计数器T2的捕捉/重载触发信号和方向控制) P1.5 MOSI<在系统编程用) P1.6 MISO<在系统编程用) P1.7 SCK<在系统编程用) 5. P2口: P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。 对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。 作为输入使用时,被外部拉低的引脚因为内部电阻的原因,将输出电流 在访问外部程序存储器或用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”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。 作为输入使用时,被外部拉低的引脚因为内部电阻的原因,将输出电流 P3口亦作为AT89S52特殊功能<第二功能)使用,如下表所示。 在flash编程和校验时,P3口也接收一些控制信号。 表2 P3引脚功能 引脚号 第二功能 P3.0 RXD<串行输入) P3.1 TXD<串行输出) P3.2 INT0(外部中断0> P3.3 INT0(外部中断0> P3.4 T0<定时器0外部输入) P3.5 T1<定时器1外部输入) P3.6 WR(外部数据存储器写选通> P3.7 RD(外部数据存储器写选通> 7. RST: 复位输入。 晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。 看门狗计时完成后,RST脚输出96个晶振周期的高电平。 特殊寄存器AUXR(地址8EH>上的DISRTO位可以使此功能无效。 DISRTO默认状态下,复位高电平有效。 8. ALE/PROG: 地址锁存控制信号 在flash编程时,此引脚 在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。 然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。 如果需要,通过将地址为8EH的SFR的第0位置“1”,ALE操作将无效。 这一位置“1”,ALE仅在执行MOVX或MOVC指令时有效。 否则,ALE将被微弱拉高。 这个ALE使能标志位<地址为8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。 9. 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数码管 图6LED显示 显示模块是利用AT89S52单片机的P0端口的P0.0-P0.7连接到一个共阳数码管的a-h的笔段上。 在数码管上循环显示0-7数字,时间间隔0.2秒。 LED显示模块七段LED数码管内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管的极管的接线形式,可分成共阴极型和共阳极型。 LED数码管的七个发光二极管因加正电压而发亮,因加零电压而不以发亮,不同亮暗的组合就能形成不同的字形,这种组合称之为字形码,表3给出了共阴极LED数码管的字形码表。 表3共阳极LED数码管的字形码表 显示字符 共阳极段选码 显示字符 共阳极段选码 0 C0H 8 80H 1 F9H 9 90H 2 A4H A 88H 3 B0H B 83H 4 99H C C6H 5 92H D A1H 6 82H E 86H 7 F8H F 8EH 三.软件设计 开始 初始化 是否有按键按下 发声程序 键盘程序 结束 图7 主程序流程图 1.发声程序 表4 音符频率表 音符 频率 简谱码 中fa 698 64820 低dao 262 63628 中sao 784 64898 低re 294 63835 中la 880 64968 低mi 330 64021 中xi 988 65030 低fa 349 64103 高dao 1046 65058 低sao 392 64260 高re 1175 65110 低la 440 6440 高mi 1318 65157 低xi 494 64524 高fa 1397 65178 中dao 523 64580 高sao 1568 65217 中re 587 64684 高la 1760 65252 中mi 659 64777 高xi 1967 65283 T0中断入口 重置TH0 TH1 P1.0取反 图8发声程序流程图。 2.定时中断 定时中断 保护现场 停止计时 输入音频脉冲电平 音频脉冲电平反转 中断返回 恢复现场 图9 定时中断程序框图 中断是单片机适时的处理内部或外部事件的一种内部机制,当某种内部或外部事件发生时,单片机中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理,中断处理完毕后,又返回被中断程序处,继续向下执行。 AT89S52有6个中断源: 两个外部中断 每个中断源都可以通过置位或清除特殊寄存器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 中断允许控制寄存器 EA - ET2 ES ET1 EX1 ET0 EX0 中断允许控制位=1,允许中断 中断允许控制位=0,禁止中断 符号 位地址 功能 EA IE.7 中断总允许控制位。 EA=0,中断总禁止;EA=1,各中断由各自的控制位设定 - IE.6 预留 ET2 IE.5 定时器2中断允许控制位 ES IE.4 串行口中断允许控制位 ET1 IE.3 定时器1中断允许控制位 EX1 IE.2 外部中断1允许控制位 ET0 IE.1 定时器0中断允许控制位 EX0 IE.0 外部中断1允许控制位 五设计感受 这次专业设计结束了,我对于52单片机又有了一个全新的认识,原来以前的学习还差很多,在对于学科和未来的工作上,我还有很长的一段路要走。 学海无涯,这句话虽然有点老生常谈,但却是我现在最真实的心理感受,电子琴的设计其实难度并不大,而如今如此吃力的原因值得我好好反思。 最后,感谢老师对于我们专业设计无私的指导和帮助。 六附录 //简易电子琴 #include sbitP14=P1^4。 //将P14位定义为P1.4引脚 sbitP15=P1^5。 //将P15位定义为P1.5引脚 sbitP16=P1^6。 //将P16位定义为P1.6引脚 sbitP17=P1^7。 //将P17位定义为P1.7引脚 unsignedcharkeyval。 //定义变量储存按键值 sbitsound=P3^6。 //将sound位定义为P3.7 unsignedintC。 //全局变量,储存定时器的定时常数 unsignedintf。 //全局变量,储存音阶的频率 //以下是C调低音的音频宏定义 #definel_dao262//将“l_dao”宏定义为低音“1”的频率262Hz #definel_re286//将“l_re”宏定义为低音“2”的频率286Hz #definel_mi311//将“l_mi”宏定义为低音“3”的频率311Hz #definel_fa349//将“l_fa”宏定义为低音“4”的频率349Hz #definel_sao392//将“l_sao”宏定义为低音“5”的频率392Hz #definel_la440//将“l_a”宏定义为低音“6”的频率440Hz #definel_xi494//将“l_xi”宏定义为低音“7”的频率494Hz //以下是C调中音的音频宏定义 #definedao523//将“dao”宏定义为中音“1”的频率523Hz #definere587//将“re”宏定义为中音“2”的频率587Hz #definemi659//将“mi”宏定义为中音“3”的频率659Hz #definefa698//将“fa”宏定义为中音“4”的频率698Hz #definesao784//将“sao”宏定义为中音“5”的频率784Hz #definela880//将“la”宏定义为中音“6”的频率880Hz #definexi987//将“xi”宏定义为中音“7”的频率53 //以下是C调高音的音频宏定义 #defineh_dao1046//将“h_dao”宏定义为高音“1”的频率1046Hz #defineh_re1174//将“h_re”宏定义为高音“2”的频率1174Hz #defineh_mi1318//将“h_mi”宏定义为高音“3”的频率1318Hz #defineh_fa1396//将“h_fa”宏定义为高音“4”的频率1396Hz #defineh_sao1567//将“h_sao”宏定义为高音“5”的频率1567Hz #defineh_la1760//将“h_la”宏定义为高音“6”的频率1760Hz #defineh_xi1975//将“h_xi”宏定义为高音“7”的频率1975Hz /************************************************************** 函数功能: 软件延时子程序 **************************************************************/ voiddelay20ms(void> { unsignedchari,j。 for(i=0。 i<100。 i++> for(j=0。 j<60。 j++> 。 } /******************************************* 函数功能: 节拍的延时的基本单位,延时200ms ******************************************/ voiddelay(> { unsignedchari,j。 for(i=0。 i<250。 i++> for(j=0。 j<250。 j++> 。 } /******************************************* 函数功能: 输出音频 入口参数: F ******************************************/ voidOutput_Sound(void> { C=(46083/f>*10。 //计算定时常数 TH0=(8192-C>/32。 //可证明这是13位计数器TH0高8位的赋初值方法 TL0=(8192-C>%32。 //可证明这是13位计数器TL0低5位的赋初值方法 TR0=1。 //开定时T0 delay(>。 //延时200ms,播放音频 TR0=0。 //关闭定时器 sound=1。 //关闭蜂鸣器 keyval=0xff。 //播放按键音频后,将按键值更改,停止播放 } /******************************************* 函数功能: 主函数 ******************************************/ voidmain(void> { EA=1。 //开总中断 ET0=1。 //定时器T0中断允许 ET1=1。 //定时器T1中断允许 TR1=1。 //定时器T1启动,开始键盘扫描 TMOD=0x10。 //分别使用定时器T1的模式1,T0的模式0 TH1=(65536-500>/256。 //定时器T1的高8位赋初值 TL1=(65536-500>%256。 //定时器T1的高8位赋初值 while(1>//无限循环 { switch(keyval> { case1: f=dao。 //如果第1个键按下,将中音1的频率赋给f Output_Sound(>。 //转去计算定时常数 break。 case2: f=l_xi。 //如果第2个键按下,将低音7的频率赋给f Output_Sound(>。 //转去计算定时常数 break。 case3: f=l_la。 //如果第3个键按下,将低音6的频率赋给f Output_Sound(>。 //转去计算定时常数 break。 case4: f=l_sao。 //如果第4个键按下,将低音5的频率赋给f Output_Sound(>。 //转去计算定时常数 break。 case5: f=sao。 //如果第5个键按下,将中音5的频率赋给f Output_Sound(>。 //转去计算定时常数 break。 case6: f=fa。 //如果第6个键按下,将中音4的频率赋给f Output_Sound(>。 //转去计算定时常数 break。 case7: f=mi。 //如果第7个键按下,将中音3的频率赋给f Output_Sound(>。 //转去计算定时常数 break。 case8: f=re。 //如果第8个键按下,将中音2的频率赋给f Output_Sound(>。 //转去计算定时常数 break。 case9: f=h_re。 //如果第9个键按下,将高音2的频率赋给f Output_Sound(>。 //转去计算定时常数 break。 case10: f=h_dao。 //如果第10个键按下,将高音1的频率赋给f Output_Sound(>。 //转去计算定时常数 break。 case11: f=xi。 //如果第11个键按下,将中音7的频率赋给f Output_Sound(>。 //转去计算定时常数 break。 case12: f=la。 //如果第12个键按下,将中音6的频率赋给f Output_Sound(>。 //转去计算定时常数 break。 case13: f=h_la。 //如果第13个键按下,将高音6的频率赋给f Output_Sound(>。 //转去计算定时常数 break。 case14: f=h_sao。 //如果第14个键按下,将高音5的频率赋给f Output_Sound(>。 //转去计算定时常数 break。 case15: f=h_fa。 //如果第15个键按下,将高音4的频率赋给f Output_Sound(>。 //转去计算定时常数 break。 case16: f=h_mi。 //如果第16个键按下,将高音3的频率赋给f Output_Sound(>。 //转去计算定时常数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 电子琴 方案