资源描述
武汉理工大学《微机原理与接口技术》课程设计报告书
摘要
汇编语言是能够利用计算机所有硬件特征且能直接用来控制硬件的一种程序设计语言,是计算机能够提供给用户的最快且最有效的编程语言。
本次课设的题目是键盘钢琴汇编语言程序设计,利用PC机的发声原理,编程在键盘上设置若干键对应音阶,并对计算机里的8253和8255A等芯片进行控制,运行程序后,当按下这些键时,计算机的扬声器发出相应的声音。
关键词:汇编语言,PC机发声原理,编程,键盘钢琴
目录
1.总体方案论证 1
1.1课程设计任务与要求 1
1.2设计原理 1
1.3总体设计思路 1
2程序流程图设计及其说明 2
3程序段落的说明 4
3.1列写频率表和提示信息字符串 4
3.2显示提示信息 5
3.3字符的输入与判断 6
3.4发声程序 6
3.5延时功能 7
4程序调试说明、结果记录与分析 7
4.1程序调试过程 7
4.2结果记录 7
心得体会 9
参考文献 10
附录 11
13
键盘钢琴汇编语言程序设计
1.总体方案论证
1.1课程设计任务与要求
课程设计任务:键盘钢琴汇编语言程序设计
课程设计要求:设计汇编语言程序,实现键盘钢琴功能,具体功能要求如下:
1)在键盘上自定义若干键对应钢琴键;
2)单击钢琴键,计算机发出相应音阶,发声时间自定义;
3)单击”ESC”键退出程序。
1.2设计原理
PC机的发声原理为:可编程时间间隔定时器8253,能根据程序提供的计数值和工作模式产生不同频率的脉冲作为扬声器的声源。PC机上大多数I/O都是由主板上的8255(或8255A)可编程外围接口芯片(PPI)管理的。 PPI包括三个8位寄存器: 两个输入寄存器,端口地址分别是60H、62H; 一个输出寄存器,端口地址为61H。 由PPI输出寄存器中的,也就是61H端口的D0、D1位来控制扬声器的驱动。 连接到扬声器上的是8253的定时器2。Couter2的GATE2与端口61H的PB0相连,当PB0=1时,GATE2获得高电平,使Counter2在模式3下工作。Couter2的OUT2与端口61H的PB1通过一个与门与扬声器的驱动电路相连。当PB1=1时,允许OUT2的输出信号到达扬声器。即PB1、PB0=11时,扬声器发声。
1.3总体设计思路
用DOC 21H中断类型的9号功能调用来显示提示信息,提示键盘上的键对应的音阶,然后用DOC 16H中断类型的0号功能调用来从键盘上读入一个字符,然后与Esc的进行比较,如果相同则退出,如果不同则与A的ASCII码进行比较,如果小于则重新出入,如不小于则与N的ASCII码进行比较,如大于则重新输入,如在A-N之间则取对应频率,然后对8253进行初始化,使其2号计数器工作在方式3下,然后用给定频率计算出计数初值,送给此计数器,令8255A的PB0和PB1置1,则发声,然后进行一秒钟的延时,然后重新输入一个字符,直到按Esc键退出。
2程序流程图设计及其说明
程序包括三大部分,即主程序,发声子程序,延时子程序。
主程序包括显示提示信息、循环输入、对读入的字符的值进行检测并赋给相应频率、调用发声子程序、退出等功能,流程图如图2-1所示。
发声子程序包括初始化8253和8255A、计算计数初值并送8253、调用延时子程序等功能,流程图如图2-2所示。
延时子程序可制造10ms延时,流程图如图2-3所示。
Y
N
N
Y
开始
显示提示信息
键盘输入一个字符
是Esc吗?
是A~N键吗?
退出
调用发声子程序
赋相应频率值
图2-1 主程序流程图
N
Y
开始
初始化8253
计算计数初值送8253
初始化8255A,发声
令BX=100,CX=663
调用延时子程序
BX=0?
结束
BX-1
图2-2 发声子程序流程图
开始
8255A的B口内容送AL,
将PB4保留,其它位置零
AL=AH?
令AH=AL
CX-1
CX=0?
结束
N
Y
Y
N
图2-3 延时子程序流程图
3程序段落的说明
3.1列写频率表和提示信息字符串
列写频率表,当输入的字符在定义的钢琴键之中时,便可通过查表得方式得到其对应频率。列写提示信息字符串,便可通过DOS 21H中断类型的 9号功能调用,来显示提示信息。
DATA SEGMENT
FREQ DW 175 ;频率表
DW 196
DW 220
DW 247
DW 262
DW 294
DW 330
DW 349
DW 392
DW 440
DW 494
DW 523
DW 587
DW 659
MSG1 DB'press key A-D for low 4-7',0DH,0AH,'$' ;提示信息
MSG2 DB'Press key E-K for normal 1-7',0DH,0AH,'$'
MSG3 DB'Press key L-N for high 1-3',0DH,0AH,'$'
MSG4 DB'Press key Esc to quit',0DH,0AH,'$'
DATA ENDS
3.2显示提示信息
依次将MSG1,MSG2,MSG3,MSG4所在段的首偏移地址送给DX,用DOS 21H中断类型的9号功能调用将其显示出来
MOV DX,OFFSET MSG1 ;显示提示信息
MOV AH,9
INT 21H
MOV DX,OFFSET MSG2
MOV AH,9
INT 21H
MOV DX,OFFSET MSG3
MOV AH,9
INT 21H
MOV DX,OFFSET MSG4
MOV AH,9
INT 21H
3.3字符的输入与判断
用DOS 16H中断类型的0号功能调用,从键盘输入一个字符,判断其是否为Esc,若是则退出,若不是,则判断其是否在A-N之间,如果是则用查表得方式求得其频率。
MOV AH,0H
INT 16H
CMP AL,1BH ;如为Esc则退出
JE EXIT
MOV BX,OFFSET FREQ
CMP AL,'A' ;如不是指定键则重新输入
JB PIANO
CMP AL,'N'
JA PIANO
AND AX,0FH
SHL AX,1H
SUB AX,2H
MOV SI,AX
MOV DI,[BX][SI]
3.4发声程序
初始化8253,令2号计数器工作在方式3下,计算计数初值送给2号计数器,令8255A的PB0和PB1置1,则扬声器发出相应音阶。
MOV AL,0B6H ;对8253写控制字
OUT 43H,AL
MOV DX,12H ;计算计数初值
MOV AX,348CH
DIV DI
OUT 42H,AL
MOV AL,AH
OUT 42H,AL
IN AL,61H ;存储8255A的B口内容,令PB0,PB1置1
MOV AH,AL
OR AL,03H
OUT 61H,AL
3.5延时功能
在调用发声程序之前令BX中的内容为100D,将CX设为663,则会产生1S的延时。
BACK: MOV CX,663
CALL WAITF
DEC BX
JNZ BACK
WAITF PROC NEAR
PUSH AX
WAIT1:IN AL,61H
AND AL,10H
CMP AL,AH
JE WAIT1
MOV AH,AL
LOOP WAIT1
4程序调试说明、结果记录与分析
4.1程序调试过程
程序调试,是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程。这是保证计算机信息系统正确性的必不可少的步骤。编完计算机程序,必须送入计算机中测试。
在调试过程中,会发现程序中的错误,例如分号不是在英文输入状态下输入的,在编译时会出现错误,还有提示信息显示有乱码。将这些错误改正后,程序可正常运行,完成设计要求中的功能。
4.2结果记录
运行程序,出现界面如图4-1所示。
图4-1 程序运行界面图
当输入的字符为A-N中的字符时,发出相应的音阶;当按Esc键时,退出程序;当按其他键时,不作出反应,需重新输入。运行结果满足任务要求。
心得体会
这次的微机原理课程设计就要结束了,通过这两个星期的课程设计,我对于微机原理这门课程的知识有了更深的理解。之前的课程结束后,我仅仅可以读懂和编写一些简单的程序。经过这次课程设计,我学会了如何更好地应用课上所学的编程知识和一些接口芯片的知识。
这次课程设计中的编程是用汇编语言来完成的,汇编语言是能够利用计算机所有硬件特征且能直接用来控制硬件的一种程序设计语言,是计算机能够提供给用户的最快且最有效的编程语言。汇编语言是面向机器的。在汇编语言中,用助记符代替操作码,用地址符号或标号代替地址码,这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言。
本次课程设计我所做的题目是键盘钢琴汇编语言程序设计,应用到的编程指令和接口芯片是课上就学过的知识,但PC机的发声原理却是原来没有接触过的知识,通过查阅资料,我弄懂了PC机的发声原理,知道了原来我们的计算机里用的芯片是我们在课上曾经学过的,这让我觉得微机原理这门课程是很有实用性的,也激发了我对微机原理这方面知识的学习兴趣。
这次我编的程序达到了任务书上的要求,但仍然有美中不足的地方,在以后的学习中我将进一步提高和完善自己。
参考文献
[1]周佩玲.彭虎等.微机原理与接口技术. 北京:电子工业出版社,2005.4
[2]齐志儒.高福祥等编.新版汇编语言程序设计. 沈阳:东北大学出版社,2001
[3]沈美明.温冬蝉等编. IBM-PC汇编语言程序设计. 北京:清华大学出版社,2001
[4]任向明,卢惠林.汇编语言程序设计实用教程.北京:清华大学出版社,2009
[5]孙德文.微型计算机技术.高等教育出版社,2001
附录
DATA SEGMENT
FREQ DW 175 ;频率表
DW 196
DW 220
DW 247
DW 262
DW 294
DW 330
DW 349
DW 392
DW 440
DW 494
DW 523
DW 587
DW 659
MSG1 DB'press key A-D for low 4-7',0DH,0AH,'$' ;提示信息
MSG2 DB'Press key E-K for normal 1-7',0DH,0AH,'$'
MSG3 DB'Press key L-N for high 1-3',0DH,0AH,'$'
MSG4 DB'Press key Esc to quit',0DH,0AH,'$'
DATA ENDS
STACK SEGMENT
DB 100 DUP('STACK')
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET MSG1 ;显示提示信息
MOV AH,9
INT 21H
MOV DX,OFFSET MSG2
MOV AH,9
INT 21H
MOV DX,OFFSET MSG3
MOV AH,9
INT 21H
MOV DX,OFFSET MSG4
MOV AH,9
INT 21H
PIANO:MOV AH,0H
INT 16H
CMP AL,1BH ;如为Esc则退出
JE EXIT
MOV BX,OFFSET FREQ
CMP AL,'A' ;如不是指定键则重新输入
JB PIANO
CMP AL,'N'
JA PIANO
AND AX,0FH
SHL AX,1H
SUB AX,2H
MOV SI,AX
MOV DI,[BX][SI]
;*******************
IN AL,61H ;令PB0,PB1为0
AND AL,0FCH
OUT 61H,AL
;*******************
CALL SOUNDF
JMP PIANO
EXIT: MOV AH,4CH
INT 21H
;----------------------- ;发声子程序
SOUNDF PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
;*************
MOV AL,0B6H ;对8253写控制字
OUT 43H,AL
;*************
MOV DX,12H ;计算计数初值
MOV AX,348CH
DIV DI
OUT 42H,AL
MOV AL,AH
OUT 42H,AL
;*************
IN AL,61H ;存储8255A的B口内容,令PB0,PB1置1
MOV AH,AL
OR AL,03H
OUT 61H,AL
MOV BX,100D ;产生1S的延迟时间
;*************
BACK: MOV CX,663
CALL WAITF
DEC BX
JNZ BACK
MOV AL,AH
OUT 61H,AL
POP DI
POP DX
POP CX
POP BX
POP AX
RET
SOUNDF ENDP
;--------------------- ;延时子程序
WAITF PROC NEAR
PUSH AX
WAIT1:IN AL,61H
AND AL,10H
CMP AL,AH
JE WAIT1
MOV AH,AL
LOOP WAIT1
POP AX
RET
WAITF ENDP
;------------------------
CODE ENDS
END START
展开阅读全文