基于51单片机的电子琴设计说明.docx

上传人:b****0 文档编号:12836462 上传时间:2023-04-22 格式:DOCX 页数:20 大小:180.93KB
下载 相关 举报
基于51单片机的电子琴设计说明.docx_第1页
第1页 / 共20页
基于51单片机的电子琴设计说明.docx_第2页
第2页 / 共20页
基于51单片机的电子琴设计说明.docx_第3页
第3页 / 共20页
基于51单片机的电子琴设计说明.docx_第4页
第4页 / 共20页
基于51单片机的电子琴设计说明.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

基于51单片机的电子琴设计说明.docx

《基于51单片机的电子琴设计说明.docx》由会员分享,可在线阅读,更多相关《基于51单片机的电子琴设计说明.docx(20页珍藏版)》请在冰豆网上搜索。

基于51单片机的电子琴设计说明.docx

基于51单片机的电子琴设计说明

方案设计

1电子琴设计框图

图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”时,部上拉电阻把端口拉高,此时可以作为输入口使用。

作为输入使用时,被外部拉低的引脚由于部电阻的原因,将输出电流(IIL)。

此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),具体如下表所示。

在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”时,部上拉电阻把端口拉高,此时可以作为输入口使用。

作为输入使用时,被外部拉低的引脚由于部电阻的原因,将输出电流(IIL)。

在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVXDPTR)时,P2口送出高八位地址。

在这种应用中,P2口使用很强的部上拉发送1。

在使用8位地址(如MOVXRI)访问外部数据存储器时,P2口输出P2锁存器的容。

在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。

6. p3口:

P3口是一个具有部上拉电阻的8位双向I/O口,p2输出缓冲器能驱动4个TTL逻辑电平。

对P3端口写“1”时,部上拉电阻把端口拉高,此时可以作为输入口使用。

作为输入使用时,被外部拉低的引脚由于部电阻的原因,将输出电流(IIL)。

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:

地址锁存控制信号(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数码管

图6LED显示

显示模块是利用AT89S52单片机的P0端口的P0.0-P0.7连接到一个共阳数码管的a-h的笔段上。

在数码管上循环显示0-7数字,时间间隔0.2秒。

LED显示模块七段LED数码管部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管的极管的接线形式,可分成共阴极型和共阳极型。

LED数码管的七个发光二极管因加正电压而发亮,因加零电压而不以发亮,不同亮暗的组合就能形成不同的字形,这种组合称之为字形码,表3给出了共阴极LED数码管的字形码表。

表3共阳极LED数码管的字形码表

显示字符

共阳极段选码

显示字符

共阳极段选码

C0H

80H

F9H

90H

A4H

88H

B0H

83H

99H

C6H

92H

A1H

82H

86H

F8H

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

图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 中断允许控制寄存器

(MSB)            (LSB)

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//包含51单片机寄存器定义的头文件

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();//转去计算定时常数

break;

}

}

}

/**************************************************************

函数功能:

定时器T0的中断服务子程序,使P3.7引脚输出音频方波

********************************

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1