简易电子琴设计报告.

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

技能训练报告
一、设计指标
1.1 设计任务
1.设计一个4X4的16个按键矩阵,并且每个键对应一个音,显示对应音键号。

2.用AT89C51将键盘连接设计成为电子琴。

3.编写电子琴的程序,要达到可以随意弹奏想要表达的音乐的目的。

4.程序的分析与调试,显示波形。

1.2 设计要求
1.用汇编语言编程实现程序设计。

2.利用查表,中断等方式实现目的。

3.系统的各各功能模块要清楚,有序。

4.程序运行时有友好的用户界面。

二、设计方框图
图2.1 系统主程序流程图
技能训练报告
图2.2
三、元器件介绍
该设计主要由以下几个部件组成:
1:单片机AT89C51 :
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗称单片机。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效的微控制器。

引脚说明:P0口:P0口为一个8位双向三态I/O口,每脚可驱动8个TTL负载。

P0既可作为通用I/O口,又可作为外部扩展时的数据总线及低8位地址总线的分时复用口。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,每个引脚可驱动4TTL 负载。

P1口管脚写入1后,被内部上拉为高,可用作输入, P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,驱动4个TTL门电流。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可驱动4个TTL负载。

当P3口写入"1"后,它们被内部上拉为高电平,并用作输入。

作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

P3口也可作为AT89C51的一些特殊功能,管脚备选功能:P3.0 RXD(串行数据接受口) P3.1 TXD(串行数据发送口) P3.2 /INT0(外部中断0请求输入) P3.3 /INT1(外部中断1请求输入) P3.4 T0(定时器/计数器0外部输入口) P3.5 T1(定时器/计数器1外部输入口) P3.6 /WR(外部数据存储器RAM写选通) P3.7 /RD(外部数据存储器RAM读选通) P3口同时为闪烁编程和编程校验接收一些控制信号。

RST:复位输入。

当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

技能训练报告
ALE/PROG:当访问外部存储器时,地址锁存允许ALE的输出电平用于锁存地址的地位字节。

当不访问其时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。

/PSEN:外部程序存储器ROM的选通信号。

/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2:反向振荡放大器的出及内部时钟工作电路的输出。

2:电源:电源部分有二部分组成。

一部分是由220V的市电通过变压、整流稳压来得到+5V电压,维持系统的正常工作;另一部分是由3V的电池供电,以保证停电时正常走时。

正常情况下电池是不提供电能的,以保证电池的寿命。

3:4*4的16个按钮矩阵。

4:模拟示波器:模拟产生的波形。

5:LM386音频功率放大器,LM386是美国国家半导体公司生产的音频功率放大器,主要应用于低电压消费类产品。

为使外围元件最少,电压增益内置为20。

但在1脚和8脚之间增加一只外接电阻和电容,便可将电压增益调为任意值,直至 200。

输入端以地位参考,同时输出端被自动偏置到电源电压的一半,在6V电源电压下,它的静态功耗仅为24mW,使得LM386特别适用于电池供电的场合。

6:74LS244锁存器:74LS244为3态8位地址锁存器,地址锁存器就是一个暂存器,它根据控制信号的状态,将总线上地址代码暂存起来首先由CPU发出存储器地址,同时发出允许锁存信号ALE给锁存器,当锁存器接到该信号后将地址/数据总线上的地址锁存在总线上,随后才能传输数据。

四、设计原理
4.1 电路原理
主要分为二个部分:
(1)4X4行列式键盘识别;
(2)音乐产生的方法;
①一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同
的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。

现在以单片机
12MHZ晶振为例,列出高中低音符与单片机计数T0相关的计数值如表3.1所示. 下面我们要为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据:低音0-19之间,中音在20-39之间,高音在40-59之间
TABLE: DW 0,63628,63835,64021,64103,64260,64400,64524,0,0
DW 0,63731,63928,0,64185,64331,64463,0,0,0
技能训练报告
DW 0,64580,64684,64777,64820,64898,64968,65030,0,0 DW
0,64633,64732,0,64860,64934,64994,0,0,0
DW 0,65058,65110,65157,65178,65217,65252,65283,0,0 DW
0,65085,65134,0,65198,65235,65268,0,0,0 DW 0
音符
低1 DO
#1 DO#
低2 RE
#2 RE#
低 3 M
低 4 FA
# 4 FA#
低 5 SO
# 5 SO#
低 6 LA
# 6
低 7 SI
中 1 DO
表3.1 高中低音符与单片机计数T0相关的计数值表频率(HZ)简谱码(T值)音符频率(HZ)简谱码(T值)262 63628 # 4 FA# 740 64860 277 63731 中 5 SO 784 64898 294 63835 # 5 SO# 831 64934 311 63928 中 6 LA 880 64968 330 64021 # 6 932 64994 349 64103 中 7 SI 988 65030 370 64185 高 1 DO 1046 65058 392 64260 # 1 DO# 1109 65085 415 64331 高 2 RE 1175 65110 440 64400 # 2 RE# 1245 65134 466 64463 高 3 M 1318 65157 494 64524 高 4 FA 1397 65178 523 64580 # 4 FA# 1480 65198 4
技能训练报告
# 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
②音乐的音拍,一个节拍为单位(C调)
曲调值
调4/4
调3/4
调2/4 DELAY 125ms 187ms 250ms 曲调值调4/4 调3/4 调2/4 DELAY 62ms 94ms 125ms
对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。

在这个程序中用到了两个定时/计数器来完成的。

其中T0用来产生音符频率,T1 用来产生音拍。

2、各功能模块电路的设计(用Proteus仿真)
1、晶体振荡电路
2、上电自动复位电路 5
技能训练报告
3、按键电路
4、显示按键建号
5音频功率放大电路 6、模拟示波 6
技能训练报告
3、整体电路图
四、电路安装与调试过程
1.打开并设置MedWin
打开MedWin→设置仿真器→设置工作目录→设置编译器
2.使用MedWin
(1)新建项目点击[项目管理]—[新建项目] 命令,输入项目名称,点击[确定]按钮,出现“添加项目文件”对话框,输入源代码文件名,如DITISHIYAN.ASM,单击[打开]按钮,出现代码窗口,即可开始编程。

(2)打开项目点击[项目管理]—[打开项目] 命令,点击项目文件名(项目文件后缀为.mpf),点击[打开]按钮,即可打开上次保存的项目。

(3)编译点击[项目管理]—[编译/汇编]命令,启动编译器对源文件进行语法检查并编译,在消息窗口中显示编译结果。

(3)模拟仿真当源程序编译无误后,可进行模拟仿真调试。

点击[项目管理]—[产生代码并装入]命令,生成.hex文件。

编译器对源程序进行重新编译并装入。

这时,可使用[调试]菜单中的相关命令进行调试,如设置断点、单步及全速执行等。

(4)生成目标代码点击[项目管理]—[输出Binary文件]命令,生成BIN文件,用下载工具将其下载到实验板的单片机中执行。

3.Proteus的应用
首先安装此软件,然后打开,打开之后在图形编辑窗口进行画图。

硬件电路图画7
技能训练报告
好之后,将刚在MedWin中已经编辑好的程序写入单片机中(AT89C51)中,然后进行整体仿真。

五、电路测试与使用说明
硬件部分
按照原理图连接电路,用PROTEUS模拟仿真测试电路,如果有问题就分块进行测试!
软件部分
如果硬件部分并无问题,那么就有可能是出现在软件部分。

那么就需要一一查看程序是否有误,如若有误将其改正并编译并代码,而后加载进单片机内再次运行。

六、训练总结
这次我主要的设计是一个简易电子琴,采用16个键分别代表16个音,通过对按键的随意按击从而产生不同的音乐,主要是通过每个按键所产生的频率不同来使得发出的各个音不同,从而产一音乐。

程序也实在很长,对于现在的我来说肯定一个人肯定很难编出这么长的程序,幸好有给与我帮助的同学和老师。

虽然这个程序还不是很简洁,但我们可以根据每个程序的功能各不相同来使程序简化。

不过我对目前的程序已经很满意了,但是也存在存在的问题:(1)功能单调 ,我们可以通过增加元件、模块,扩展键盘,增加子程序程序增加其功能。

(2)程序太过冗长,我们可以用其他的方法如查询等方法来精简程序,加强它的可读性。

最后,通过这次的自主完成单片机的应用系统设计,让我学会了如何去完成一个设计报告,让我更进一步了解了单片机,也让我感受到做出一个设计的开心,喜悦与担心。

相信这对以后的毕业设计也会有很大的帮助。

七、附录
KEYBUF EQU 30H
STH0 EQU 31H
STL0 EQU 32H
TEMP EQU 33H
ORG 00H ; 开始地址
LJMP START
ORG 0BH ; T0中断矢量地址
LJMP INT_T0
技能训练报告
START: MOV TMOD,#01H ;写控制字
SETB ET0 ;允许T0中断 SETB EA ;开放CPU中断 WAIT:
MOV P3,#0FFH ; P3口输出 CLR P3.4 ;清零 MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY1
LCALL DELY10MS
MOV A,P3
ANL A,#0FH ;
XRL A,#0FH ;
JZ NOKEY1
MOV A,P3
ANL A,#0FH ;
CJNE A,#0EH,NK1 ;
MOV KEYBUF,#0 ;
LJMP DK1 ;
NK1: CJNE A,#0DH,NK2
MOV KEYBUF,#1
LJMP DK1
NK2: CJNE A,#0BH,NK3
MOV KEYBUF,#2
LJMP DK1 ;屏蔽高四位;判断屏蔽高四位异或运算屏蔽高四位判断A与#0eh是否相等赋初值#0 跳转
技能训练报告
NK3: CJNE A,#07H,NK4
MOV KEYBUF,#3
LJMP DK1 ; 调用DK1
NK4: NOP ; 空指令延时一个周期 DK1:
MOV A,KEYBUF
MOV DPTR,#TABLE ;
MOVC A,@A+DPTR
MOV P0,A
MOV A,KEYBUF
MOV B,#2
MUL AB ; AB
MOV TEMP,A
MOV DPTR,#TABLE1 ;
MOVC A,@A+DPTR
MOV STH0,A ;
MOV TH0,A
INC TEMP
MOV A,TEMP
MOVC A,@A+DPTR
MOV STL0,A
MOV TL0,A
SETB TR0
DK1A: MOV A,P3
ANL A,#0FH ;
XRL A,#0FH 查表赋首地址相乘查表一写定时常数屏蔽高四位
技能训练报告
JNZ DK1A
CLR TR0
NOKEY1: ; 键1子程序 MOV P3,#0FFH
CLR P3.5
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY2 ;
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY2
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK5 ;
MOV KEYBUF,#4
LJMP DK2
NK5: CJNE A,#0DH,NK6 ;
MOV KEYBUF,#5
LJMP DK2
NK6: CJNE A,#0BH,NK7
MOV KEYBUF,#6
LJMP DK2
NK7: CJNE A,#07H,NK8 判断跳转键2子程序比较跳到键5 键5子程序技能训练报告
MOV KEYBUF,#7
NK8: NOP
DK2:
MOV A,KEYBUF
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,KEYBUF
MOV B,#2
MUL AB
MOV TEMP,A
MOV DPTR,#TABLE1 ; MOVC A,@A+DPTR
MOV STH0,A
MOV TH0,A
INC TEMP ; MOV A,TEMP
MOVC A,@A+DPTR
MOV STL0,A
MOV TL0,A
SETB TR0 ; DK2A: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK2A 查表扫描表一移动TEMP,扫描键盘启动定时技能训练报告
CLR TR0
NOKEY2:
MOV P3,#0FFH
CLR P3.6
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY3
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY3 MOV A,P3
CJNE A,#0EH,NK9
MOV KEYBUF,#8
LJMP DK3 ; NK9: CJNE A,#0DH,NK10
MOV KEYBUF,#9
LJMP DK3
NK10: CJNE A,#0BH,NK11 MOV KEYBUF,#10
LJMP DK3
NK11: CJNE A,#07H,NK12 MOV KEYBUF,#11 调用DK3 技能训练报告
LJMP DK3
NK12: NOP
DK3:
MOV A,KEYBUF
MOV DPTR,#TABLE ; 查表 MOVC A,@A+DPTR
MOV P0,A
MOV A,KEYBUF
MOV B,#2
MUL AB
MOV TEMP,A
MOV DPTR,#TABLE1 ; MOVC A,@A+DPTR
MOV STH0,A
MOV TH0,A
INC TEMP
MOV A,TEMP
MOVC A,@A+DPTR
MOV STL0,A
MOV TL0,A
SETB TR0 ; DK3A: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK3A
CLR TR0 查表1 启动TR0
技能训练报告
NOKEY3:
MOV P3,#0FFH ; P3输出 CLR P3.7
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY4 ; LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY4
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK13
MOV KEYBUF,#12
LJMP DK4 ; NK13: CJNE A,#0DH,NK14
MOV KEYBUF,#13
LJMP DK4 ; NK14: CJNE A,#0BH,NK15
MOV KEYBUF,#14
LJMP DK4 ; NK15: CJNE A,#07H,NK16
MOV KEYBUF,#15
LJMP DK4 判c=0转移调用DK4 调用DK4 调用DK4 技能训练报告
NK16: NOP
DK4:
MOV A,KEYBUF
MOV DPTR,#TABLE ; 查表 MOVC A,@A+DPTR MOV P0,A ; P0输出 MOV A,KEYBUF
MOV B,#2
MUL AB
MOV TEMP,A
MOV DPTR,#TABLE1 ;
MOVC A,@A+DPTR
MOV STH0,A
MOV TH0,A
INC TEMP
MOV A,TEMP
MOVC A,@A+DPTR
MOV STL0,A
MOV TL0,A ; SETB TR0 ; DK4A: MOV A,P3
ANL A,#0FH ; XRL A,#0FH
JNZ DK4A
CLR TR0
NOKEY4: 查表1 写定时的低位启动T0 屏蔽高四位技能训练报告
LJMP WAIT
DELY10MS:
MOV R6,#10
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
INT_T0: ; 重写定时常数 MOV TH0,STH0
MOV TL0,STL0
CPL P1.0
RETI
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
TABLE1: DW 64021,64103,64260,64400
DW 64524,64580,64684,64777
DW 64820,64898,64968,65030
DW 65058,65110,65157,65178
END。

相关文档
最新文档