资源描述
南通大学电气工程学院
微机原理课程设计
报 告 书
课 题 名 按键选择音乐播放和步进电机正反转控制
班 级 电084班
姓 名 陈彬
小组成员 陈彬 陈海冬 张晓天
指导教师 胡慧
日 期 2011.6.21 ~ 2011.6.30
第一部分——软件设计
按键选择音乐播放
目 录
1、设计目的----------------------------------------------------------------------------------2
2、设计内容-------------------------------------------------------2
3、设计过程--------------------------------------------------------2
-------3.1流程图----------------------------------------------------2
-------3.2通用发声程序设计原理--------------------------------------3
--------3.3主要的宏和过程的实现-------------------------------------4
------------------3.3.1DISPLAY显示宏 ----------------------4
------------------3.3.2ADDRESS音乐地址宏-----------------5
------------------3.3.3MUSIC宏----------------------------5
------------------3.3.4通用发生程序GENSOUND-------------6
------------------3.3.5WAITF延时程序 ----------------------6
------------------3.3.6CLEAR清屏程序----------------------7
------------------3.3.7RETU退出 --------------------------7
--------3.4主程序实现------------------------------------------------8
------------------3.4.1数据段定义 --------------------------8
------------------3.4.2堆栈段定义 --------------------------8
------------------3.4.3初始化 ------------------------------9
------------------3.4.4程序执行过程------------------------9
4、系统调试------------------------------------------------------9
5、附录(程序清单)---------------------------------------------------------------------11
6、收获体会---------------------------------------------------------------------------------17
7、参考文献------------------------------------------------------17
1、设计目的
1.能够较全面地巩固和应用课堂中所学的基本理论和程序设计方法,能够较熟练地完成汇编语言程序的设计和调试。
2.培养综合运用所学知识独立完成汇编程序课题的能力。
2、设计内容
要求完成一个音乐程序,即通过按下键盘上某个按键就可以按预先设定的程序播放音乐或者终止程序。
3、设计过程
3.1流程图
图2-1 系统流程图
开始
显示提示信息
接收键盘输入
是“Q”?
是“A”?
是“B”?
退出程序
将音乐节拍频率地址导入ADDRESS
调用MUSIC,播放音乐
显示错误提示调用清屏程序
是
是
是
否
否
否
3.2通用发声程序设计原理
发声程序包括3个步骤:
(1)在8253中的42端口送一个控制字0B6H(10110110B),该控制字对定时器2进行初始化,使定时器2准备接收计数初值。
(2)在8253中的42H端口(Timer2)装入一个16位的计数值(533H×895/频率),以建立将要产生的声音频率。
(3)把输出端口61H的PB0、PB1两位置1,发出声音。
对于发音部分。PC机上的大多数输入/输出(I/O)都是由主板上的8255(或8255A)可编程序外围接口芯片(PPI)管理的。PPI包括3个8位寄存器,两个用于输入功能,一个用于输出功能。输入寄存器分配的I/O端口号为60H和62H,输出寄存器分配的I/O端口号为61H。由PPI输出寄存器中的0、1两位来选择扬声器的驱动方式。
连接到扬声器上的是定时器2,从上图可以看到,GATE2与端口61H的PB0相连,当PB0=1时,GATE2获得高电平,使定时器2可以在模式3(方波)下工作。定时器2的OUT2与端口61H的PB1通过一个与门与扬声器的驱动电路相连。当PB1=1时,允许OUT2的输出信号到达扬声器电路。因此,只有PB0和PB1同时为“1”时,才能驱动扬声器地声。通过以下指令实现:
IN AL,61H
OR AL,3
OUT 61H,AL
上面的指令用以打开扬声器,如要关闭扬声器时则为:
AND AL,0FCH
OUT 61H,AL
当从8255中采集到输入的数据时,需要确定相应的频率,所以在软件编程时要建立一个数据表:
TABLE DW 493,440,392,349,329,293,261
把相应的频率送到一个寄存器上,通过公式:
计数值=533H×896÷ f=1234DCH÷ f
算出计数值,再把算得的计数值送给8253,就可产生所要频率的方波。在把计数值送8253前,必须先把8253进行初始化:
MOV AL,0B6H
OUT 43H,AL
使其选用通道2,工作在方式3下。
就整个电路而言,接好电路后,通过软件编程不断地采集从8255口中输入的信号,而8个开关都接在8255的A口上,只要有开关按下,就会采集到一个数据,根据这个数据与事先编好的表对应,得到一个计数值,把这个计数值送给8253的通道2,8253的通道2工作的方式3下,这样就可以产生满足频率要求的发声方波。这个方波经驱动放大就可以使扬声器发出相应的声音。 所以8255在这里完成两个任务,它不仅从A口中采集到数据,而且B口的PB1和PB0两个位要控制发声。8253的主要任务就是产生所要求发声的不同频率的方波。
3.3主要的宏和过程的实现
3.3.1 DISPLAY显示宏
为将事先定义的数据段字符串显示在屏幕上,定一个参数为b的宏。将b的地址传到DX。随后调用DOS09号功能调用。将字符串显示到屏幕。调用DISPLAY的实例为:
DISPLAY INFO1
DISPLAY INFO2
DISPLAY INFO3
DISPLAY MUSLIST
在此段代码中,程序显示提示作用的字符串和歌曲列表。
DISPLAY宏具体实现如下:
DISPLAY MACRO b
LEA DX,b
MOV AH,9
INT 21H
ENDM
3.3.2 ADDRESS音乐地址宏
歌曲包含节拍和频率。此处定义的音乐地址宏包含两个参数,将歌曲频率地址导入SI将歌曲节拍导入BP。当选择不同的歌曲时,主程序调用该宏,将用户要求的歌曲的频率和节拍导入,以便在MUSIC中实现发声。
音乐地址宏实现如下:
ADDRESS MACRO A,B
LEA SI,A
LEA BP,DS:B
ENDM
3.3.4 MUSIC宏
在ADDRESS中,程序已经将歌曲的首个频率地址和首个节拍地址分别导入SI、BP。为了检测歌曲是否结束,在MUSIC中,首先将SI传递到DI,DI与-1相减,如等于0,则得出该频率定义为-1 。在歌曲频率表定义中将-1定为该歌曲结束标志,此时MUSIC跳出结束。
若该频率不为-1。调用通用发生程序GENSOUND,将该音符按照频率和节拍表发声。发声后SI、BP分别加2,跳转到下一个音符的频率和节拍,继续检测歌曲是否结束。如频率不为0,继续将该音符发声,并循环此过程。
具体实现方法如下:
MUSIC PROC NEAR
PUSH DS
SUB AX,AX
PUSH AX
FREG:
MOV DI,[SI]
CMP DI,-1
JE END_MUS
MOV BX,DS:[BP]
CALL GENSOUND
ADD SI,2
ADD BP,2
JMP FREG
END_MUS:
RET
MUSIC ENDP
3.3.5通用发生程序GENSOUND
该发生程序是在修改BEEP发声程序的基础上,以实现为8088/86编写一个任意频率和任意持续时间的通用发声程序。该程序包括以下三个步骤:
(1)在8253/54 中的43端口送一个控制字0B6H(10110110B),该控制字对定时器2进行初始化,使得定时器2准备接受计数初值。
(2)在8253/54中的42H端口装入一个16位计数值,已建立将要产生的声音频率。
(3)把输出端口61H的0、1两位置1,发出声音。
具体实现过程见程序清单。
该GENSOUND程序能产生19~65535Hz的声音,这个频率的下限是使除法不产生溢出的最小值。此外一般情况下,GENSOUND程序产生的声音不单单和频率有关,还和CPU有关。CPU工作频率越高,时延越短,产生的声音越急促。为了使程序产生一个与CPU工作频率无关的合适时延,在MUSCI中调用了一个时间延时程序WAITF。
3.3.6WAITF延时程序
80x86的各种处理器采取了6~66MHz的工作频率,loop指令的执行时间在这些处理器上也不相同。为了建立一个与处理器无关的延时,IBM采用了一种利用硬件产生时间延时的方法,即通过监控端口61H和PB4,使PB4每15.08微秒触发一次,一产生一个固定不变的时间基准
利用WAITF子程序能获得任意的时间延时,而不必在考虑CPU的型号和工作频率。
具体实现如下:
waitf proc near
push ax
waitf1:
in al,61h
and al,10h
cmp al,ah
je waitf1
mov ah,al
loop waitf1
pop ax
ret
waitf endp
3.3.7 CLEAR清屏程序
当程序初始化或用户输入错误时,程序调用CLEAR清屏程序。
清屏程序将AX、BX、CX、DX先入栈,以保存现场,保证清屏后重新执行不会出现错误。随后启用BIOS功能调用,将屏幕初始化或上卷。
其中AL=0表示初始化窗口,AL=上卷行数, BH=卷入行属性,CH/CL=左上角行/列号,DH/DL=右上角行/列号。该程序段表示从左起0行0列到右起24行79列全部清屏。
将屏幕清空后重新将AX、BX、CX、DX出栈。
3.3.8 RETU退出
当程序要求退出时,主程序会调用RETU进行退出。RETU程序内容实际为一个BIOS功能调用。
RETU:
MOV AH,4CH
INT 21H
3.4主程序实现
3.4.1数据段定义
数据段分别定义了INFO1、INFO2、INFO3 、INFO4、INFO5各字符串分别显示程序运行之初对用户的提示。MUSLIST 中显示用户能选择的三首歌曲列表。
程序用MUS_FREG、MUS_TIME分别定义了音乐频率和节拍。使得发声程序可以按照理想的要求发出连续的乐曲。节拍和频率定义原理如下:
乐曲是按照一定的高低、长短和强弱关系组成的音调,在每一首乐曲中,每个音符的音高和音长与发声系统中的频率、节拍有关。可参考下表:
音名 C D E F G A B C D E F G A B C
唱名 1 2 3 4 5 6 7 1 2 3 4 5 6 7 i频率(HZ) 131 147 165 175 196 220 247 262 294 330 349 392 440 492 523
其中,低音阶从低音C(131HZ)到中央C(262HZ),高音阶从中央C(262HZ)到高音C(523HZ)。组成乐曲的音符的频率值和持续时间是乐曲程序发声所必需的两组数据,频率可以查上表,音符的持续时间根据乐曲的速度及每个音符的节拍数来确定。在4/4拍中,四分音符为一拍,每小节四拍,全音符持续四拍,二分音符持续二拍,四分音符持续一拍,八分音符持续半拍。如果给全音符分配1秒(100*10ms)的时间,则二分音符持续时间为0.5秒,四分音符持续时间为0.25秒,八分音符持续时间为0.125秒。
知道了音调及频率、时间的关系后,可以按照乐曲的乐谱将每个音符的频率和持续时间定义为两个数据表,然后编写程序依次取出表中的频率值和时间值。
3.4.2堆栈段定义
程序定义了一个长度了200的堆栈段,如下:
STACK SEGMENT
DB 200 DUP ('STACK')
STACK ENDS
3.4.3初始化
程序初始化使用了BIOS功能调用。使用0AH号功能设置显示方式。本程序对显示要求较为简单,故使用40x25黑白文本、16级灰度方式显示。若要求改变显示方式,可以根据0AH功能设置表自行添加。
3.4.4程序执行过程
详细参见附录中INPUT部分,以及程序流程图。
4、系统调试
编译程序,如下图所示
编译连接正确
待装载成功后,运行程序,运行情况如图
程序初始界面,如下图所示
程序报错要求重新输入,如下图所示
播放后退出,如下图所示
5、附录(程序清单)
本程序的代码如下:
DATA SEGMENT
INFO1 DB 0DH,0AH,'welcome to this programe!$'
INFO2 DB 0DH,0AH,'there are some music!$'
INFO3 DB 0DH,0AH,'please select which one to play!$'
INFO4 DB 0DH,0AH,'please input again!$'
MUSLIST DB 0DH,0AH,'A MUSIC:Mary has a little ship'
DB 0DH,0AH,'B MUSIC:the boat on Taihu lake'
DB 0DH,0AH,'Q EXIT'
db 0dh,0ah,'$'
;****************************************** 音乐一 玛丽有只小羊羔
MUS_FREG1 DW 330,294,262,294,3 DUP (330)
DW 3 DUP (294),330,392,392
DW 330,294,262,294,4 DUP (330)
DW 294,294,330,294,262,-1
MUS_TIME1 DW 6 DUP (25*8),50*8
DW 2 DUP (25*8,25*8,50*8)
DW 12 DUP (25*8),100*8
;****************************************** *音乐二 太湖船
MUS_FREG2 DW 330,392,330,294,330,392,330,294,330
DW 330,392,330,294,262,294,330,392,294
DW 262,262,220,196,196,220,262,294,332,262,-1
MUS_TIME2 DW 3 DUP(50),25,25,50,25,25,100
DW 2 DUP(50,50,25,25),100
DW 3 DUP(50,25,25),100
DATA ENDS
STACK SEGMENT
DB 200 DUP ('STACK')
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,SS:STACK,CS:CODE
START:
MOV AX,DATA ;**********************初始化
MOV DS,AX
MOV aH, 0
MOV AL,00
INT 10H
;********** 定义一个宏显示
DISPLAY MACRO b ;*****虚参
LEA DX,b ;****偏移地址传送到DX
MOV AH,9 ;******************DOS 9号功能,多个字符输出到屏幕显示
INT 21H
ENDM
ADDRESS MACRO A,B ;**********************音乐地址宏
LEA SI,A ;***歌曲频率地址A导入SI将歌曲节拍导入BP
LEA BP,DS:B ;***歌曲节拍地址B导入BP
ENDM
DISPLAY INFO1 ;*********************** 宏调用
DISPLAY INFO2
DISPLAY INFO3
DISPLAY MUSLIST
INPUT:
MOV AH,01H ;*******DOS 1号功能,从键盘输入一个字符
INT 21H
CMP AL,'Q' ;****AL和Q相减,影响标志位
JZ RETU
CMP AL,'A' ;*****AL和A相减,影响标志位
JNZ B0 ;****ZF标志为0,则转移,转到B0(说明不是A)
ADDRESS MUS_FREG1,MUS_TIME1 ;****宏调用(玛丽有只小羊羔)
CALL MUSIC
JMP EXIT1
B0:
CMP AL,'B'
JNZ exit
ADDRESS MUS_FREG2,MUS_TIME2 ;****(太湖船)
CALL MUSIC
EXIT1:
DISPLAY INFO4
JMP INPUT
EXIT:
call clear
DISPLAY INFO4
DISPLAY INFO1
DISPLAY INFO2
DISPLAY INFO3
DISPLAY MUSLIST
jmp input
RETU:
MOV AH,4CH
INT 21H
GENSOUND PROC NEAR ;******************************************发声
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV AL,0B6H ;*****8253初始化,10110110,通道1,读写16位,方式3
OUT 43H,AL
MOV DX,12H
MOV AX,348CH
DIV DI
OUT 42H,AL
MOV AL,AH
OUT 42H,AL
IN AL,61H
MOV AH,AL
OR AL,3
OUT 61H,AL ;*****打开扬声器
WAIT1:
MOV CX,3314
call waitf
DELAY1:
DEC BX
JNZ WAIT1
MOV AL,AH
OUT 61H,AL
POP DI
POP DX
POP CX
POP BX
POP AX
RET
GENSOUND ENDP
waitf proc near ;******************************************** 延时程序
push ax
waitf1:
in al,61h
and al,10h
cmp al,ah
je waitf1
mov ah,al
loop waitf1
pop ax
ret
waitf endp
MUSIC PROC NEAR ;********************************************* 音乐播放
PUSH DS
SUB AX,AX
PUSH AX
FREG:
MOV DI,[SI]
CMP DI,-1 ;******将-1定为该歌曲结束标
JE END_MUS
MOV BX,DS:[BP]
CALL GENSOUND
ADD SI,2
ADD BP,2
JMP FREG
END_MUS:
RET
MUSIC ENDP
clear proc near ;************************************ clear!!! 清屏程序
push ax
push bx
push cx
push dx ;*****AX、BX、CX、DX先入栈,以保存现场
mov ah,6
mov al,0 ;*****AL=0初始化窗口
mov ch,0
mov cl,0
mov dh,24
mov dl,79 ;******表示从左起0行0列到右起24行79列全部清屏。
mov bh,7 ;******BH=卷入行属性
int 10h
pop dx
pop cx
pop bx
pop ax
ret
clear endp
CODE ENDS
END START
6、心得体会
经过一周的磨炼和努力,在老师的耐心指导和同学的热情帮助下,无论从学习上还是从自身角度,我认为自己有了意想不到的收获和进步。
这次汇编课程设计为我们提供了与众不同的学习方法和学习机会,让我们从传统的被动授学转变为主动求学;从死记硬背的模式中脱离出来,转变为在实践中学习,增强了领悟、创新和推断的能力。掌握自学的方法,形成工程理论整体模式,使工作、学习、生活都步入系统化流程。这些方法的提高是终身受益的,我认为这难得的一周,让我真正懂得了生活和学习的基本规律。
紧张忙碌的课程设计虽然在历经一个周的时间后结束了,完成了课程设计的任务,但是从中发现的问题也是值得去深思的。我想经过这一个周的课程设计所发现的问题对我们会有很大的启示,比如整个课程设计过程一定要亲力亲为,我们才能收获的更多,在以后的学习中也会大有帮助。在以后的学习中我会不断的改进学习方法,在实践中学习,不断提高自我,完美自我,全面提高自己。
7、参考文献
[1]彭虎,周佩玲,傅中谦编著.微机原理与接口技术[M].电子工业出版社,2008年3月
[2]王元珍,曹忠升,韩宗芬编著.80x86 汇编语言程序设计[M].湖北:华中科技大学出版社,2005年4月.
[3]王成端,李晓波编著.汇编语言程序设计[M].北京:高等教育出版社,2003年8月.
18
展开阅读全文