接口课设报告
- 格式:docx
- 大小:451.83 KB
- 文档页数:6
微机原理与接口技术课程设计报告
设计名称:八音盒
专业:计算机科学与技术
班级:24020904
姓名:张浩朱英龙
学号:2402090409 2402090403 指导教师:马荣贵
2012 年6 月21 日
一、功能分析
本次课设制作的八音盒里面有一首歌曲,利用程序的跳转功能,实现了音乐的开,关,暂停,还有程序的退出功能。
二、设计原理
1)设计中采用了三个原件,两个芯片8254和8255,还有一个扬声器。
2)8254芯片是一款可编程的定时、计数芯片,主要由数据总线缓冲器,读写逻辑,控制字寄存器和计数器四部分构成。
其内部有三个计数器,分别称为计数器0、计数器1和计数器2。
共有6种工作方式,常用的有两种,方式0和方式3。
课设中只利用了其工作方式3即方波发生器和计数器0产生固定的频率,控制扬声器的发声。
3) 8255芯片是可编程并行I/O接口芯片,有3个8位并行I/O口,即A,B,C 口。
能适应CPU与端口之间的多种数据传送方式,如无条件传送、查询方式传送、中断方式传送,与此相应,8255设置了方式0、方式1以及方式2。
C口比较特殊,除了用做数据口外,在方式1和方式2下,它的部分信号线被分配作专用的联络应答信号。
课设中只利用了其工作方式0,两个端口,A口作为输出,B 口作为输入。
4)扬声器只要给定频率就可以发出相应的声音,我们上网查了相应音节的频率,然后再利用简单的延迟程序就可以控制音阶的演奏长短时间,从而演奏出具有一定节奏的歌曲。
5)课设中利用了8254产生与音节频率一样的方波,输入到扬声器中,就可以产生音律。
用8255的B口作输入读开关的状态,B口输出让8254接收,这样就可以控制8254的输出。
三、软件流程图
说明:监视死循环只有11的时候才能跳出,其余状态输入一直在循环。
开关输入00,表示暂停。
01表示关。
10表示退出程序,11表示开。
四、软件代码
;****************根据查看端口资源修改下列符号值*******************
IOY0 EQU 9C00H
IOY2 EQU 9C80H
;*****************************************************************
MY8254_COUNT0 EQU IOY0+00H*4 ;8254计数器0端口地址
MY8254_COUNT1 EQU IOY0+01H*4 ;8254计数器1端口地址
MY8254_COUNT2 EQU IOY0+02H*4 ;8254计数器2端口地址
MY8254_MODE EQU IOY0+03H*4 ;8254控制寄存器端口地址
M8255A EQU IOY2+00H*4 ;8255计数器0端口地址
M8255B EQU IOY2+01H*4 ;8255计数器1端口地址
M8255MODE EQU IOY2+03H*4 ;8255控制寄存器端口地址
STACK1 SEGMENT STACK ;设置堆栈段
DW 256 DUP(?)
STACK1 ENDS
DATA SEGMENT
;*************************同一首歌的频率表***************************** FREQ_LIST
DW 392,523,578,659,698,659,523,578,523,440,523,392,523,578,659,
659,698,784,523 ;19
DW 698,659,784,578,659,659,578,578,659,784,988,988,880,880,784, 784,880,988,880,784,659 ;21
DW 698,698,784,880,784,698,659,578,494,494,440,392,440,523,1046,
880,698,784,880 ;19
;******************************频率延时表******************************** TIME_LIST
DB 8,4,4,6,2,4,4,8,4,4,16,8,4,2,2,4,4,16,8
DB 6,2,4,2,2,2,2,16,8,4,4,6,2,8,4,2,2,4,2,2,16
DB 6,4,4,4,4,2,2,8,4,2,2,4,4,16,8,8,6,2,8
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX ;设置用户数据段
MOV DX,MY8254_MODE ;初始化8254工作方式
MOV AL,36H ;0011 0110端口0、方式3
OUT DX,AL
MOV DX,M8255MODE ;初始化8255的工作方式
MOV AL,82H ;1000 0010 A输出,B输入,方式0
OUT DX,AL
BEGIN:MOV SI,OFFSET FREQ_LIST ;装入频率表起始地址
MOV DI,OFFSET TIME_LIST ;装入时间表起始地址
AA: MOV DX,M8255B
IN AL,DX
MOV AH,AL
CMP AH,03H ;判断开关键是否是3
JNZ AA ;不是的话跳回继续监视开关键
MOV DX,M8255A
OUT DX,AL
PLAY: MOV DX,0FH ;输入时钟0FE502H
MOV AX,0E502H
DIV WORD PTR [SI] ;取出频率值计算计数初值,强制定义为字大小
(两字节)。
DX,AX表示的32位数除以DS,[SI]
指向内存数据的16位数,结果商放在AX,余数
放在DX内
MOV DX,MY8254_COUNT0
OUT DX,AL ;装入计数初值
MOV AL,AH
OUT DX,AL
MOV DL,[DI] ;取出演奏相对时间,调用延时子程序
CALL DALLY
MOV DX,M8255B
IN AL,DX
MOV AH,AL
CMP AH,01H ;判断开关按下的是否是01
MOV DX,M8255A
OUT DX,AL
JZ BEGIN ;是的话,重唱
MOV DX,M8255B
IN AL,DX
MOV AH,AL
CMP AH,10H ;判断开关按下的是否是10
MOV DX,M8255A
OUT DX,AL
JZ QUIT ;是的话,退出程序
ADD SI,2
INC DI
MOV DX, M8255B
IN AL,DX
MOV AH,AL
CMP AH,00H ;判断开关键按下的是否是00
MOV DX,M8255A
OUT DX,AL
JZ AA ;是的话,暂停
CMP WORD PTR [SI],0 ;判断是否到曲末?
JE BEGIN ;如果结束,重唱
MOV AH,1 ;判断是否有按键按下?
INT 16H
JZ PLAY
QUIT: MOV DX,MY8254_MODE ;退出时设置8254为方式2,OUT0置0
MOV AL,10H ;0端口0方式0,只读/写计数器低字节
OUT DX,AL
MOV AX,4C00H ;结束程序退出,返回操作系统
INT 21H
DALLY PROC ;延时子程序
D0: MOV CX,0A00H ;循环2560次
D1: MOV AX,0FFFFH ;65535
D2: DEC AX ;AX-1
JNZ D2 ;如果结果不为0,跳至D2
LOOP D1
DEC DL ;DL=DL-1
JNZ D0 ;如果结果不为0,跳至D0
RET ;过程返回
DALLY ENDP ;子程序结束
CODE ENDS
END START
五、设计收获
本学期学习芯片的时间虽然不多,对其掌握的深度不够,但通过此次课程设计,却改变了很多,首先对于硬件电路的工作原理有了进一步的学习,同样就有了进一步的认识;其次软件方面,在程序的设计,程序的调试方面都学到了很多东西,很有成就感。
本次的设计还是有很多缺陷的,如那个结束键,虽然表面上是结束了,但内部程序还是在运行,与现实中肯定不符,所以我们设置了10这个退出程序键,但还是觉得不妥,要真的做的话,应该有个断电键与开始和结束键结合起来那样才能节约资源。
编程过程中为了结构分明造成了一些代码的冗余,没有化简。
最后非常感谢马老师对我们的热情指导,谢谢!。