资源描述
内容为网络收集 仅供参考
音乐盒实验报告
专业:生产过程自动化
班级:08机电(2)班
姓名:何远龙
指导老师:陈玉琼
2010-10-08
一、实验材料
1、仪器设备,软件工具
软件
用途
keil 软件
源程序的编译
Proteus软件
实现电路的仿真
Progisp软件
将程序下载到学习板上进行实验
硬件
用途
万用表
检测硬件电路
学习板
实现源程序的调试,并通过实验现象来修改程序
2、元器件清单
元件名称
参数
数量
IC插座
DIP40
1
单片机
89C51
1
晶体振荡器
12MHZ
1
瓷片电容
22PF
2
按键
4
IC插座
DIP8
1
三极管
2N5088
1
电阻
1K
4
电解电容
47uF
1
电阻
510
8
蜂鸣器
无源式
1
小喇叭
1
放大器
LM386
1
二、实验过程描述
1、设计功能描述
(1)通过改变单片机输出脉冲高低电平的保持时间和频率,可以得到音阶和调节不同的音调,运用定时中断来控制节拍,从而来演奏乐曲。
(2)用数码管显示当前播放的歌曲序号。
(3)通过功能键控制上,下曲目的选择以及乐曲的暂停和播放。
2、原理图设计思路
由P1.0口控制一个LM386功率放大器,经功率放大器控制发声器件小喇叭。当P1.0口输出低电平时,三极管导通,小喇叭通电;当P1.0口输出高电平时,三极管截止,小喇叭断电。通过连续不断周期性地改变P1.0口的高、低电平,就会产生一定频率的矩形波,小喇叭就能产生一定频率的声音,再配合延时程序控制高、低电平的持续时间,就能改变音调。由P3.2、P3.3、P3.4、P3.5分别作为开始键/停止键,暂停键、下一曲键、上一曲键。图中还将共阳级数码管相应的段选控制端用P0口控制,将数码管的公共端,也称“位选端”由P2口控制。
原理图如下:
3、程序设计思路,并画出流程图
程序思路:初始化设置,开延时与外部中断,按下P3.2键先唱第一首,然后循环播放。若有按下P3.3键则执行暂停作用,再按一次则继续播放;若有按下P3.3,P3.4键则分别执行下一曲、上一曲功能。播放歌曲是多少数码管则显示相应的数字。流程图如下:
主流程
调用del20子程序
First子程序
判断P3.2键是否释放
选曲地址清0
显示码送P0口,显示位送P2口
表1首地址送DPTR
调用music0子程序
调用next子程序
RET
Next子程序
选曲地址加1
显示码送P0口,显示位送P2口
表2首地址送DPTR
是=1?
调用music0子程序
选曲地址加1
RET
调用first子程序
是=2?
表3首地址送DPTR
显示码送P0口,显示位送P2口
调用music0子程序
选曲地址加1
是=3?
显示码送P0口,显示位送P2口
表2首地址送DPTR
调用music0子程序
表3首地址送DPTR
是=2?
选曲地址加1
Last子程序
调用music0子程序
是=1?
是=0?
表1首地址送DPTR
显示码送P0口,显示位送P2口
显示码送P0口,显示位送P2口
调用music0子程序
RET
P3.2键释放?
Music0子程序
中断计数单元清0
查表取常数
是结束符00H?
恢复初始条件A清零
延时1秒后,再循环
是休止符FFH?
P3.2键按下?
P3.4键按下?
P3.5键按下?
音阶常数送R6
R0=0?
取节拍常数送R7
启动T0定时器
P1.0取反,按R6常数延时
节拍时间到否
停止T0计数,中断计数20H单元清0,DPTR加1
RET
调用del20子程序
延时100ms
调用del20子程序
跳转到START
P3.4键释放?
P3.5键释放?
调用next子程序
调用last子程序
调用del20子程序
Del20子程序
循环次数05送R4
空操作
RET
R4-1=0?
R3-1=0?
中断响应
调用del20子程序
P3.3键释放?
R0值取反
中断返回
4、写出源程序与必要的注释
shuzhi equ 3fh ;选曲目的地址
song equ p1.0 ;扬声器播放P1.0
play equ p3.2 ;播放停止键P3.2
addone equ p3.4 ;曲目加一键P3.4
subone equ p3.5 ;曲目减一键P3.5
dul equ p0 ;数码管段选P0口
wel equ p2 ;数码管位选P2口
org 0000h
ljmp start
org 000bh ;定时器0溢出中断入口地址
ajmp cont ;指向定时器中断程序
org 0013h ;外部中断一入口地址
ajmp pause ;指向外部中断程序
org 0100h
start:
mov sp,#50h
mov th0,#0dbh ;定时器赋初值
mov tl0,#0ffh
mov tmod,#01h
mov ie,#86h ;开中断
mov tcon,#00h
mov r0,#00h
mov shuzhi,#00h
main: jnb play,first ;判断P3.2键是否按下
sjmp main
first: acall del20
jnb play,first ;判断P3.2键是否释放
mov shuzhi,#00h
mov dul,#0f9h ;显示数值1
mov wel,#7fh ;显示位送P2口
mov dptr,#dat1 ;表1首地址送DPTR
acall music0
acall next
ret
next: inc shuzhi ;shuzhi+1
mov a,shuzhi
cjne a,#01,loop3 ;A是否=1,不等就跳转到LOOP3
mov dptr,#dat2 ;表2首地址送DPTR
mov dul,#0a4h ;显示数值2
mov wel,#7fh
acall music0
inc a
loop3: cjne a,#02,loop4 ;A是否=2,不等就跳转到LOOP4
mov dptr,#dat3 ;表3首地址送DPTR
mov dul,#0b0h ;显示数值3
mov wel,#7fh
acall music0
inc a
loop4: cjne a,#03,next ;A是否=3,不等就跳转到next
acall first
ret
last:
dec shuzhi ;shuzhi-1
mov a,shuzhi
cjne a,#02,last1
mov dptr,#dat3
mov dul,#0b0h
mov wel,#7fh
acall music0
last1: cjne a,#01,last2
mov dptr,#dat2
mov dul,#0a4h
mov wel,#7fh
acall music0
last2: cjne a,#00,last
mov dptr,#dat1
mov dul,#0f9h
mov wel,#7fh
acall music0
ret
music0:
mov 20h,#00h ;中断计数单元清0
music1: clr a
movc a,@a+dptr ;查表取音阶常数
jz end0 ;是结束符?
cjne a,#0ffh,music5 ;是休止符?
ljmp music3 ;产生100ms停顿
music5:
nop
key: jnb play,k0 ;判断P3.2键是否按下
jnb addone,k1 ;判断P3.4键是否按下
jnb subone,k2 ;判断P3.5键是否按下
mov r6,a ;音阶常数送R6
inc dptr ;DPTR+1
mov a,#0
movc a,@a+dptr ;取常数送R7
mov r7,a
setb tr0 ;启动定时器T0
music2: nop
cjne r0,#0,$
cpl song ;输出电平取反
mov a, r6
mov r3,a ;音阶常数送R3
lcall del20
mov a, r7 ;节拍常数送A
cjne a,20h,music2 ;节拍时间到否
mov 20h,#00h ;为取下一音阶作准备
inc dptr
ljmp music1
music3: nop ;休止100ms
clr tr0 ;关闭定时器
mov r2, #14h ;R2=20
music4: nop
mov r3, #250 ;R3=250
lcall del20
djnz r2, music4
inc dptr ;为取下一音阶作准备
ljmp music1
end0: mov r2, #200 ;歌曲结束后,延时1s后继续
music6: mov r3, #250
lcall del20
djnz r2,music6
k1: acall del20 ;调用延时子程序
jnb addone,k1 ;判断P3.4键是否释放
acall next
k2: acall del20
jnb subone,k2 ;判断P3.5键是否释放
acall last
k0: acall del20
jnb play,k0
ljmp start
ret
del20: mov r4,#05h
del4: nop
djnz r4,del4
djnz r3,del20
ret
cont: inc 20h ;计数单元+1
mov th0,#0dbh ;重新10ms定时初值
mov tl0,#0ffh
reti ;跳出中断
pause: acall del20
jnb p3.3,pause ;判断P3.3键是否有释放
mov a,r0 ;把R0的值给A
cpl a ;A值取反
mov r0,a
reti
dat1:
db 3bh,20h,3bh,20h,30h,20h,33h,20h,3bh,80h,0ffh
db 3bh,20h,3bh,20h,26h,20h,2bh,20h,26h,80h,0ffh
db 26h,20h,26h,20h,20h,20h,26h,20h,2bh,20h,2bh,20h,30h,20h,33h,10h,33h,10h
db 3bh,60h,40h,20h,4ch,80h,0ffh
db 3bh,20h,3bh,20h,30h,20h,33h,20h,3bh,80h,0ffh
db 3bh,20h,3bh,20h,26h,20h,2bh,20h,26h,80h,0ffh
db 26h,20h,26h,20h,20h,20h,26h,20h,2bh,20h,2bh,20h,2bh,20h,30h,20h
db 33h,20h,3bh,20h,3bh,20h,40h,2bh,3bh,80h,0ffh
db 19h,20h,1ch,40h,26h,20h,19h,20h,1ch,40h,26h,20h,0ffh
db 20h,20h,1ch,20h,1ch,20h,20h,20h,26h,80h,0ffh
db 19h,20h,1ch,40h,26h,20h,19h,20h,1ch,40h,26h,20h,0ffh
db 20h,20h,1ch,20h,1ch,20h,20h,20h,26h,80h,0ffh
db 2bh,20h,2bh,40h,3bh,20h,2bh,20h,2bh,40h,2bh,20h,0ffh
db 26h,20h,2bh,20h,2bh,20h,30h,20h,2bh,80h,0ffh
db 2bh,20h,2bh,40h,3bh,20h,30h,20h,30h,40h,2bh,20h,0ffh
db 33h,20h,3bh,20h,3bh,20h,40h,20h,3bh,80h,0ffh,0ffh
dat2:
db 18h,30h,1ch,10h,20h,40h,1ch,10h
db 18h,10h,20h,10h,1ch,10h,18h,40h
db 1ch,20h,20h,20h,1ch,20h,18h,20h
db 20h,80h,0ffh,20h,30h,1ch,10h,18h
db 20h,15h,20h,1ch,20h,20h,20h,26h
db 40h,20h,20h,2bh,20h,26h,20h,20h
db 20h,30h,80h,0ffh,20h,20h,1ch,10h
db 18h,10h,20h,20h,26h,20h,2bh,20h
db 30h,20h,2bh,40h,20h,20h,1ch,10h
db 18h,10h,20h,20h,26h,20h,2bh,20h
db 30h,20h,2bh,40h,20h,30h,1ch,10h
db 18h,20h,15h,20h,1ch,20h,20h,20h
db 26h,40h,20h,20h,2bh,20h,26h,20h
db 20h,20h,30h,80h,20h,30h,1ch,10h
db 20h,10h,1ch,10h,20h,20h,26h,20h
db 2bh,20h,30h,20h,2bh,40h,20h,15h
db 1fh,05h,20h,10h,1ch,10h,20h,20h
db 26h,20h,2bh,20h,30h,20h,2bh,40h
db 20h,30h,1ch,10h,18h,20h,15h,20h
db 1ch,20h,20h,20h,26h,40h,20h,20h
db 2bh,20h,26h,20h,20h,20h,30h,30h
db 20h,30h,1ch,10h,18h,40h,1ch,20h
db 20h,20h,26h,40h,13h,60h,18h,20h
db 15h,40h,13h,40h,18h,80h,00h
dat3:
db 26h,10h,26h,20h,26h,10h,26h,10h,2bh,10h,30h,20h,26h,40h,0ffh
db 26h,10h,26h,10h, 20h,10h,1ch,10h,0ffh
db 20h,20h,20h,20h,20h,10h,26h,30h,2bh,80h,0ffh
db 1ch,10h,1ch,10h,1ch,10h,20h,10h,1ch,30h,18h,10h,20h,40h,0ffh
db 26h,10h,2bh,10h,30h,10h,2bh,10h,0ffh
db 26h,20h,20h,20h,2bh,20h,20h,20h,30h,40h,0ffh
db 30h,10h,1ch,10h,1ch,10h,19h,10h,18h,10h,19h,10h,1ch,10h,1ch,10h,0ffh
db 1ch,10h,1ch,10h,1ch,10h,18h,10h,20h,10h,20h,10h,26h,10h,20h,10h,0ffh
db 20h,30h,20h,10h,18h,20h,18h,20h,0ffh,19h,20h,20h,10h,1ch,10h,1ch,80h,0ffh
db 18h,10h,19h,10h,1ch,10h,18h,10h,18h,40h,0ffh
db 19h,20h,20h,20h,18h,20h,19h,10h,19h,10h,19h,10h,1ch,30h,1ch,0c0h,0ffh
db 13h,10h,13h,10h,13h,10h,15h,10h,13h,10h,15h,10h,18h,10h
db 18h,10h,18h,10h,15h,30h,0ffh
db 15h,10h,1ch,10h,15h,10h,1ch,10h,18h,10h,18h,10h,15h,10h,18h,10h,0ffh,18h,10h
db 26h,10h,1ch,10h,26h,10h,20h,20h,1ch,10h,20h,10h,20h,40h,0ffh
db 26h,10h,2bh,10h,2bh,10h,30h,10h,26h,20h,18h,10h,1ch,10h,20h,20h,20h,20h,0ffh
db 20h,30h,20h,10h,1ch,20h,18h,20h,18h,20h,15h,10h,18h,10h,18h,10h,15h,30h,0ffh
db 15h,10h,20h,10h,20h,10h,20h,10h,1ch,20h,18h,20h,18h,20h,15h,10h,18h,10h
db 18h,10h,15h,30h,1ch,10h,18h,20h,18h,10h,18h,20h,15h,10h,18h,10h,18h,0c0h,00h
end
5、片内RAM地址与I\O分配表
片内RAM
名称
用途
3fh
Shuzhi
选曲目的地址
R0
——
中断地址
R3
——
暂存音阶常数
20H
——
存放10ms定时中断的次数
R6
——
存放音阶常数
R7
——
存放节拍常数
R2、R4
——
改变延时时间
P0
Dul
数码管段选
P2
Wel
数码管位选
P1.0
Song
扬声器播放
P3.2
Play
播放停止功能
P3.3
——
暂停功能
P3.4
addone
曲目加一
P3.5
subone
曲目减一
6、子程序列表
子程序名称
功能
出入口
First
唱第一首曲目
无出入口
Next
执行下一曲功能
出、入口均为A
Last
执行上一曲功能
出、入口均为A
Music0
唱出相应的音阶、节拍
R0入口,无出口
Del20
延时20ms
入口R3,无出口
7、调试结果描述
(1)功能基本实现:按下P3.2键时,第一首曲目开始播放,若按下P3.3键,则曲目暂停播放,再按下此键时,曲目继续播放下去。若按下P3.4、P3.5键,则分别执行下一曲、下一曲功能。再按下一次P3.2键时,曲目停止播放。数码管上有显示相应的歌曲序数。
(2)功能不足:按下P3.2键执行停止功能时不够稳定,停止后数码管上还有数字显示。按下暂停键重新播放时,会延时一小段时间才继续播放。
8、出现问题及解决方法
(1)出现问题:按键扫描放错地方导致按键不能正常使用。
解决方法:把按键扫描程序放在取音阶常数程序前面,只有把按键扫描功能放在这里,按键的功能才会被程序所扫描到,才能执行相应按键的功能。
出现问题:暂停功能不能使用
解决方法:暂停功能不能使用是源程序开始时值没有设好,没有开中断,只要输入相应的外部中断地址和设好初值,加上给它一个地址R0,没有按下P3.3键时,R0等于0,程序往下执行,当按下P3.3键时,R0不等于0,则程序原地跳转,即执行暂停作用,再按下此键时R0取反,程序跳出中断,歌曲继续播放。
展开阅读全文