第一篇:微机原理课程设计音乐跑马灯程序
dseg segment numdw 0
num1dw 0
data1db 0FEh,0FDh,0FBh,0F7h,0EFh,0DFh,0BFh,7Fh data2db 7Fh,0BFh,0DFh,0EFh,0F7h,0FBh,0FDh,0FEh data3db 7Eh,0BDh,0DBh,0E7h,0E7h,0DBh,0BDh,7Eh
data4db 0fch,0f9h,0f3h,0e7h,0e7h,0cfh,09fh,03fh data5db 03fh,09fh,0cfh,0e7h,0e7h,0f3h,0f9h,0fch
dseg ends
code segment assumecs:code,ds:dseg start:
movax,dseg movds,ax mov dx,406h mov al,36h outdx,al mov ax,20000 mov dx,400h outdx,al moval,ah mov dx,400h out dx,al;初始化8253 mov dx,0206h
;取8255A的控制端口的地址
mov al,8bh
;初始化8255A的A口为输出模式,B口为输入模式,c输入 outdx,al mov dx,0200h
;取8255的端口A的地址 mov al,0FFh
;使8255的PA0-PA7全为1 outdx,al mov dx,0202h
;取8255的端口B的地址 in al,dx
;检测B口输入信号 mov dx,0200h
;取8255的端口A的地址 mov al,0FFh
;使8255的PA0-PA7全为1 out dx,al
;使所有的灯LED全灭
ledflashproc
;检测开关闭合,以便确定哪种闪烁方式
mov dx,0202h
;取8255A的端口B的地址
in al,dx
;检测B口输入信号 choice1:
incnum
;改变数字变量的值 cmp num,09h je exit
call delay jmpledflash exit:
mov num,0 jmpledflash ret ledflashendp
delayproc near dl4: mov dx,0204h inal,dx and al,01h cmp al,1
jz dl4
ret
delay endp
code ends end start
第二篇:微机原理课程设计跑马灯
微机原理课程设计走马灯
运用8086最小模式和8255等芯片设计出一个跑马灯电路,要求至少有5中花式,在ISIS 7 Professional软件中运行。
设计电路图如图所示:
源代码
DATA SEGMENT DATA ENDS CODE SEGMENT
ASSUME CS:CODE ,DS:DATA
START :MOV AX,DATA
MOV DS,AX
MOV AL,10010000B
OUT 96H,AL
A0:
IN AL,90H
NOT AL
MOV BL,AL
OUT 92H,AL
CMP AL,1
JNZ A3
A2:
MOV DL,AL
;第一个开关实现从上至下的流水
OUT 92H,AL
IN AL,90H
NOT AL
CMP AL,BL
JNZ A0
MOV CX,50000
A1:
LOOP A1
MOV AL,DL
ROL AL,1
JMP A2
A3:
CMP AL,2
JNZ A6
MOV AL,80H
A5:
MOV DL,AL
OUT 92H,AL
MOV CX,50000
A4:
LOOP A4
IN AL,90H
NOT AL
CMP AL,BL
JNZ A0
;实现第二个开关从下至上的流水
MOV AL,DL
ROR AL,1
JMP A5
A6:
CMP AL,4
;第三个开关实现相隔的两个灯自上而下流水
JNZ A9
MOV AL, 05H
A8:
MOV DL,AL
OUT 92H,AL
MOV CX,20000
A7:
LOOP A7
IN AL,90H
NOT AL
CMP AL,BL
JNZ A0
MOV AL,DL
ROL AL,1
JMP A8
A9:
CMP AL,8
;第四个开关实现相隔的两个灯从下而上流水
JNZ A12
MOV AL,0A0H
A11: MOV DL,AL
OUT 92H,AL
MOV CX,20000
A10: LOOP A10
IN AL,90H
NOT AL
CMP AL,BL
JNZ A0
MOV AL,DL
ROR AL,1
JMP A11
A12:
CMP AL,10H
JNZ A17 A16:
MOV AL,18H;第五个开关实现从中间向两边流水
A14:
MOV DL,AL
OUT 92H,AL
MOV CX,20000 A13:
LOOP A13
IN AL,90H
NOT AL
CMP AL,BL
JNZ A0
MOV AL,DL
CMP AL,81H
JZ A16
AND AL,0F0H
MOV CX,0
MOV CH,AL
ROL CH,1
MOV AL,DL
AND AL,0FH
MOV CL,AL
ROR CL,1
ADD CH,CL
MOV AL,CH
JMP A14 A17:
CMP AL,20H;第六个开关实现从两边向中间流水
JNZ A0 A19:
MOV AL,81H A20:
MOV DL,AL
OUT 92H,AL
MOV CX,20000 A18:
LOOP A18
IN AL,90H
NOT AL
CMP AL,BL
JNZ A0
MOV AL,DL
CMP AL,18H
JZ A19
AND AL,0F0H
MOV CX,0
MOV CH,AL
ROR CH,1
MOV AL,DL
AND AL,0FH
MOV CL,AL
ROL CL,1
ADD CH,CL
MOV AL,CH
JMP A20
RET
CODE ENDS
END START 运行后程序如图所示:
第三篇:微机原理微机原理课程设计程序.asm
微机原理课程设计程序
CODE
SEGMENT
ASSUME
CS:CODE;初始化8255A,A口工作方式0,输出 START: MOV
DX,63H
MOV
AL,08BH
MOV
BL,OAH
OUT
DX,AL DY:
MOV
CX,30C4H;置定时外循环初始值 MM:
MOV
BH,0AH;置定时内循环初始值
DEC
LP:
MOV
IN
DEC
CMP
JZ
CMP
JZ
CMP
JZ
CMP
JZ
CMP
JZ
CMP
JZ
CMP
JZ
CMP
JZ
CMP
JZ
CMP
JZ
CMP
JZ
JMP
LP1:
MOV
MOV
JMP
LP2:
MOV
MOV
JMP
LP3:
MOV
MOV
CX DX,62H AL,DX;读取C口值 BH BH,00H MM CX,0000H XD;转向剩余时间显示程序 AL,00H;判断是否有键按下 LP AL,01H;判断是否是1号键按下 LP1 AL,02H;判断是否是2号键按下 LP2 AL,04H;判断是否是3号键按下 LP3 AL,08H;判断是否是4号键按下 LP4 AL,10H;判断是否是5号键按下 LP5 AL,20H;判断是否是6号键按下 LP6 AL,40H;判断是否是7号键按下 LP7 AL,80H;判断是否是8号键按下 LP8 LP AL,86H AH,01H EN
;显示1号抢答成功者并锋鸣
AL,0CBH AL,02H EN
;显示2号抢答成功者并锋鸣
AL,0CFH AH,0CFH
JMP
EN
;显示3号抢答成功者并锋鸣 LP4:
MOV
AL,0E6H
MOV
AH,08H
JMP
EN
;显示4号抢答成功者并锋鸣 LP5:
MOV
AL,0EDH
MOV
AH,10H
JMP
EN
;显示5号抢答成功者并锋鸣 LP6:
MOV
AL,0FDH
MOV
AH,20H
JMP
LP7:
MOV
MOV
JMP
LP8:
MOV
MOV
JMP
EN:
MOV
OUT
MOV
MOV
OUT
JMP
XD:
DEC
CMP
JZ
CMP
JZ
CMP
JZ
CMP
JZ
CMP
JZ
CMP
JZ
CMP
JZ
CMP
JZ
CMP
JZ
CMP
JZ
XD9:
MOV EN
;显示6号抢答成功者并锋鸣 AL,87H AH,40H EN
;显示7号抢答成功者并锋鸣 AL,0FFH AH,80H EN
;显示8号抢答成功者并锋鸣 DX,60H DX,AL DX,61H AL,AH DX,AL MD BL
;判断剩余时间并转向显示程序 BL,09H XD9 BL,08H XD8 BL,07H XD7 BL,06H XD6 BL,05H XD5 BL,04H XD4 BL,03H XD3 BL,02H XD2 BL,01H XD1 BL,00H XD0 AL,6FH;显示剩余9秒
JMP
EN1 XD8:
MOV
AL,7FH;显示剩余8秒
JMP
EN1 XD7:
MOV
AL,07FH;显示剩余7秒
JMP
EN1 XD6:
MOV
AL,7DH;显示剩余6秒
JMP
EN1 XD5:
MOV
AL,6DH;显示剩余5秒
JMP
EN1 XD4:
MOV
JMP
XD3:
MOV
JMP
XD2:
MOV
JMP
XD1:
MOV
JMP
XD0:
MOV
JMP
EN1:
MOV
OUT
CMP
JZ
JMP
MD:
MOV
IN
CMP
JZ
JMP
MOV
INT
CODE
ENDS
END
AL,66H;显示剩余4秒
EN1 AL,4FH;显示剩余3秒
EN1 AL,4BH;显示剩余2秒
EN1 AL,06H;显示剩余1秒
EN1 AL,3FH;显示剩余0秒,结束。
EN1 DX,60H DX,AL AL,3FH MD DY DX,61H;一定时间后,若再有输入,则转向某剩余时间AL,DX AL,00H MD DY AH,4CH 21H START
第四篇:微机原理课程设计——音乐播放器
一. 课程设计目的
1.通过D/A装换器产生模拟信号,使PC机作为简易音乐播放器。2.了解利用数模转换器产生音乐的基本方法。
二.课程设计任务
设计并实现一个键控音乐播放器。要求:
(1)自己选用合适的芯片,不少于两种。
(2)自行设计电路并使用汇编语言编写程序完成键控音乐播放器功能。
(3)该播放器有若干首歌曲可以选择,开始时输出说明,要用户选择要播放的歌曲,然后根据用户按键进行播放、退出或出错提示。
三、总体设计方案
1、总体设计方案一
所有音乐都是由各个不同频率的音阶和其延续时间的长短来实现的。不同的音乐是由各个音阶按某种排列各自播放一定时间形成的,将各音乐音阶和其延续时间存在数据段中,然后根据不同按键值选择不同的音阶和时间表,再使用计数器产生该音阶频率。而我们学过的有计数器可以产生各种频率,所以我们主要采用计数器8253产生各音符,用8255并行接口来控制扬声器的开关,达到播放音乐的功能。
2、总体设计方案二
可以使用0832(数模转换器)来产生频率,原理图:
更连续,效果更好点。
提出这个方案是因为我想产生模拟信号,来驱动扬声器,这样产生的声音更加圆润感觉我们想把一个周期的波形分成32份,然后每份给8253一个值让他转换成模拟信号,不同的频率可以用8253计数器控制,比如要产生261Hz的频率,使用1MHz的话,周期就为1/261=3.83ms,分成32份,每份间隔时间就是3.83ms/32=0.12ms,换句话说就是送计数器0的初值为1M/261/32=120次。
3、各个音符的对应频率表:
音符 频率/HZ 半周期/us 音符 频率/HZ 半周期/us 低1DO 262 1908 #4FA# 740 0676 #1DO# 277 1805 中5SO 784 0638 低2RE 294 1700 #5SO# 831 0602 #2RE# 311 1608 中6LA 880 0568 低3M 330 1516 #6LA# 932 0536 低4FA 349 1433 中7SI 988 0506 #4FA# 370 1350 高1DO 1046 0478 低5SO 392 1276 #DO# 1109 0451 #5SO# 415 1205 高2RE 1175 0426 低6LA 440 1136 #2RE# 1245 0402 #6LA# 466 1072 高3M 1318 0372 低7SI 494 1012 高4FA 1397 0358 中1DO 523 0956 #4FA# 1480 0338 #1DO# 554 0903 高5SO 1568 0319 中2RE 578 0842 #5S0# 1661 0292 #2RE# 622 0804 高6LA 1760 0284 中3M 659 0759 #6LA# 1865 0268 中4FA 698 0716 高7SI 1976 0253
四.部分电路设计及功能解说
1、频率发生电路
使用8253产生音符频率。8253采用方式3,产生方波信号,根据输入计数初值的不同产生不同频率的方波信号来驱动扬声器。
2、扬声器开关控制电路
使用8255并行接口芯片来控制扬声器的开和关,PC0始终接低电平,PA0和8253的OUT0接在与门上,这样只有PA0=1时扬声器才有可能开通,否则不发声。关闭的方法是,从PC口读入数据再从PA口输出;而开扬声器时只要在输出PA口数据前对数据进行一个取反操作就可以了。
设某音符频率为fHz,而CLK脉冲是1MHz,则计数初值N=1M/f。8253的控制端口为28BH,控制字为36H。五.硬件接线图
六.软件设计流程图
1、总流程图
开始输出说明读取按键是‘1’?N是‘2’?Y播放曲1Y播放曲2N是‘3’?Y播放曲3N是‘0’?Y结束Y选择无效程序总流程图
2、音乐播放子程序流程图
开始保护现场曲N各音符频率设置曲N各音符时间设置读取频率F频率是-1 ?Y恢复现场N读取时间T结束返回计算机计数次数送计数器,产生该频率F信号启动喇叭延时T关闭喇叭音符间延时播音流程图
七.程序段功能汇总
1、MAIN程序
MAIN程序是总程序,输出说明,等待用户按键并读取键值。根据不同的按键选择调用播音子程序播放不同的歌曲。
2、PLAY子程序
PLAY子程序是播音子程序,SI指向音节表中的频率,BP指向音节表中的时间。从SI的指向的音节表中取一个频率,只要不是-1,即有效就再读取时间,然后计算计数初值送入计数器,产生各种频率。开启扬声器,根据所取的时间调用若干次延时子程序。这段时间扬声器就发出该频率的声音,延时结束,就关闭扬声器,调用音节之间的小延时程序。最后修改SI和BP,指向下一个频率,重复上面的工作。
3、DELAY子程序和DELAY_OFF子程序
两个都是子程序,采用空操作循环多次的方法,只是第二个延时时间较短,大概为5ms。八.程序清单
SSEG SEGMENT PARA STACK 'stack'
dw 100h dup(0);Resize the stack by changing the number '100' SSEG ENDS
DSEG SEGMENT
;TO DO: Add your program's data here INFO1 DB 0DH,0AH,'--------------------------',0DH,0AH,'THERE ARE 3 SONGS:',0DH,0AH,0DH,0AH,'$' INFO2 DB '1.HAPPY BIRTHDAY',0DH,0AH,'$' INFO3 DB '2.SHEEP',0DH,0AH,'$' INFO4 DB '3.RIVER',0DH,0AH,'$' INFO5 DB '0.EXIT',0DH,0AH,'$' INFO6 DB 'YOU HAVE CHOSEN :$'
INFO7 DB 'THANK YOU FOR YOUR USE',0DH,0AH,'$' INFO8 DB '---------------------------',0DH,0AH,'PRESS THE KEY TO SELECT SONG!',0DH,0AH,'$' INFO9 DB 0DH,0AH,'-------------------',0DH,0AH,'|INVALID SELECTION|',0DH,0AH,'-------------------',0DH,0AH,'$' FREG1 DW 2 dup(262),294,262,349,262,262,294,262,392,249,262,262,523,440,349
;曲1的频率
DW 330,294,466,266,440,349,392,349,-1 TIME1 DW
1,1,2,2,2,4,1,1,2,2,2,4,1,1,2,2,2,2,4,1,1,2,2,2,4
;曲1的时间 FREG2 DW 330,294,262,294,3 DUP(330)
;曲2的频率
DW 3 DUP(294),330,392,392 DW 330,294,262,294,4 DUP(330)DW 294,294,330,294,262,-1 TIME2 DW 6 DUP(1),2
;曲2的时间
DW 2 DUP(1,1,2)DW 12 DUP(1),4 FREG3 DW 330,392,330,294,330,392,330,294,330,330,392,330,294,262,294,330,392,294 ;曲3的频率
DW 262,262,220,196,220,262,294,332,262,-1 TIME3 DW 3 DUP(2),1,1,2,1,1,4
;曲3的时间
DW 2 DUP(2,2,1,1),4 DW 3 DUP(2,1,1,1),4 DSEG ENDS
CSEG SEGMENT
assume cs:CSEG, ds:DSEG, es:DSEG, ss:SSEG
INIT PROC;Initialize procedure
mov ax, dseg mov ds, ax
mov es, ax;TO DO: Add your initialize code here(as your requirement)ret
;return to the MAIN procedure
INIT ENDP
MAIN PROC
;Here is your program entry point
call INIT;call the INIT procedure to initialize the program
;**TO DO: Add your main code here**
RE: MOV DX,28BH
;关闭扬声器
MOV AL,89H OUT DX,AL
MOV DX,28AH IN AL,DX MOV DX,288H OUT DX,AL
LEA DX,INFO1 MOV AH,09H INT 21H LEA DX,INFO2 INT 21H LEA DX,INFO3 INT 21H LEA DX,INFO4 INT 21H LEA DX,INFO5 INT 21H LEA DX,INFO8 INT 21H
MOV AH,01H
INT 21H CMP AL,'1'
JE MUSIC1 CMP AL,'2' JE MUSIC2 CMP AL,'3' JE MUSIC3 CMP AL,'0' JE EXIT
LEA DX,INFO9 MOV AH,09H INT 21H JMP RE
;输出说明信息
;读取按键
;根据不同的按键播放不同的曲子
;无效选择,输出错误提示
MUSIC1: MOV SI,OFFSET FREG1
;指向曲1的表
MOV BP,OFFSET TIME1 CALL PLAY JMP RE MUSIC2: MOV SI,OFFSET FREG2
;指向曲2的表
MOV BP,OFFSET TIME2 CALL PLAY JMP RE MUSIC3: MOV SI,OFFSET FREG3
;指向曲3的表
MOV BP,OFFSET TIME3 CALL PLAY JMP RE EXIT: MOV DX,28BH
;关闭扬声器
MOV DX,28AH IN AL,DX MOV DX,288H OUT DX,AL LEA DX,INFO7
;输出欢迎使用信息,增加界面友好度 MOV AH,09H INT 21H mov ax, 4c00h;The end of the program, return to the system MOV AL,89H OUT DX,AL
int 21h
MAIN ENDP
;TO DO: Add other procedures(PROC)here(as your requirement)
;THE PROGRAMME OF PLAYING THE MUSIC
PLAY PROC
;PLAY子程序,功能上面介绍过
L1: MOV BX,DS:[SI]
;取频率
CMP BX,-1
;看是否有效
JE L0
;无效就退出
MOV CX,DS:[BP]
;读取时间
MOV DL,CL
;保存时间
ADD DL,30H
MOV AH,02H
INT 21H
MOV DX,0FH
;计算计数初值,1M的十六进制为0F4240H
MOV AX,4240H
DIV BX
MOV BX,AX
MOV DX,283H
;设置计数器工作方式
MOV AL,36H
OUT DX,AL
MOV DX,280H
;输入计数初值
MOV AX,BX
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV DX,28BH
MOV AL,89H OUT DX,AL MOV DX,28AH IN AL,DX NOT AL MOV DX,288H OUT DX,AL
ROD:CALL DELAY
LOOP ROD
MOV DX,28BH
MOV AL,89H OUT DX,AL MOV DX,28AH IN AL,DX MOV DX,288H OUT DX,AL CALL DELAY_OFF
ADD SI,2
ADD BP,2
JMP L1
L0: RET
PLAY ENDP
DELAY PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV BX,09FH LL1:MOV CX,0FFFFH
;开扬声器 ;延时
;关扬声器
;延时子程序
;循环这么多次
;音节间延时
LOP: LOOP LOP DEC BX JNZ LL1 POP DX
POP CX
POP BX
POP AX
RET
DELAY ENDP
DELAY_OFF PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV BX,0FH LL2:MOV CX,0CFFFH LOP2: LOOP LOP2 DEC BX JNZ LL2 POP DX
POP CX
POP BX
POP AX
RET DELAY_OFF ENDP CSEG ENDS;TO DO: Add other segments here(as your requirement)
END MAIN
九.试验结果和分析
1、试验结果:
程序初始运行界面
如果按错了键,会出现如下界面
如果选择正确,将出现如下界面:
2、分析
这是按照方案一做的结果,按1~3分别播放“生日快乐”等歌,但由于本组人对音乐都是外行,各音阶频率的排序和延时时间搭配不好,导致音乐严重走调,但基本能听出不是噪音。
按照方案二做的电路和程序,无论怎么样都不出声,后来我们直接送数据到0832产生三角波信号(程序在我们的一次作业中写的)。还是无法让扬声器发出声音,因此按这个方案失败了。
十.课程设计总结和体会
1.实验过程中碰到了很多的难题和障碍,我认识到平时基础知识的重要性,只有能够熟练的掌握才能在实验过程中得心应手,否则一步错则整个试验都会陷入困境,因而,严谨的态度是试验成功的重要保障!
2.通过这次课程设计,我们对各个芯片有了进一步的了解,对各个芯片的功能有了更深刻的认识和体会,平时上课的理论知识只是停留在理论的层面,只有通过了这样的试验才能更好的体会到,做到了理论和实际的相结合,使理论知识真正运用到了实践中去。在课程设计过程中,同组人员之间相互合作,共同研究使我更加坚信了团体的力量。在团体的共同协作和努力下,任何的难题都可以被解决!
3.我们大家在实验的时候都团结合作,遇到问题时候一起探讨,增强了我们的合作精神。
十一.参考文献
1、《〈微机原理与接口技术〉学生实验指导书》 扬州大学 罗加奇
2、《微机原理及应用》 机械工业出版社 胡钢 主编
第五篇:微机原理课程设计音乐播放器
《微机原理与接口技术》课程设计
关智杰
一、课程设计的任务和目的
课程设计题目:音乐播放器
课程设计的实现目的:本课程设计主要是通过汇编语言用软件编程的方法实现简单的音乐播放功能。通过在《微机原理与接口技术》课程上所学的汇编知识和8253/8254芯片相关知识,来完成本课程设计;用汇编程序完成键控音乐播放器的,用8253/8254定时器来产生声音。该播放器有若干首歌曲可以选择,开始时输出说明,要用户选择要播放的歌曲,然后根据用户按键进行播放、退出或出错提示。通过课程设计环节来加强对所学知识的理解和应用。
二、课程设计相关知识
2.1 定时/计数器8253/58254
在微机及控制系统中,经常要用到定时信号。如系统的日历时钟,动态存储器刷新。对外部执行机构控制时也需要定时中断、定时检测、定时查询等。定时的方法主要是两种:
软件定时:利用指令的执行时间设计循环程序,使CPU 执行延迟子程序的时间就是定时时间。缺点:执行延迟时,CPU 一直被占用,降低了CPU 的效率。
硬件定时:用计数器/定时器作为主要硬件,在软件简单指令的控制下产生精确的时间延迟。突出优点为计数时不占用CPU 时间,如利用定时器/计数器产生中断信号,可建立多作业环境,提高了CPU 效率。
作为定时器可用8253或者8254,二者功能基本相同,知识工作的最高频率不一样。本实验就采用了8254,其主要功能为:
(1)每片上有3 个独立的16 位的减计数器通道。
(2)对于每个计数器,都可以单独作为定时器或计数器使用,并且都可以按照二进制或十进制来计数。
(3)每个通道都有6 种工作方式,都可以通过程序设置或改变。(4)每个计数器的速率可高达10MHz。
主要部分有:数据总线缓冲器、读/写控制逻辑、控制字寄存器、计数通道0#、1#、2#: 内部结构如下图:
《微机原理与接口技术》课程设计
关智杰
8254内部结构
2.2 8254外部引脚
8254芯片是具有24个引脚的双列直插式集成电路芯片,其引脚分布如图所示。8254芯片的24个引脚分为两组,一组面向CPU,另一组面向外部设备,各个引脚及其所传送信号的情况,介绍如下:
8254的引脚
(1)D7~D0:双向、三态数据线引脚,与系统的数据线连接,传送控制、数据及状态信息。
(2)RD:来自于CPU的读控制信号输入引脚,低电平有效。(3)WR:来自于CPU的写控制信号输入引脚,低电平有效。(4)CS:芯片选择信号输入引脚,低电平有效。
(5)A1、A0:地址信号输入引脚,用以选择8254芯片的通道及控制字寄存器。(6).VCC及GND:+5V电源及接地引脚。
(7)CLKi: i=0,1,2,第i个通道的计数脉冲输入引脚,8254规定,加在CLK引脚的输入时钟信号的频率不得高于2.6MHZ,即时钟周期不能小于380ns。
《微机原理与接口技术》课程设计
关智杰
(8)GATEi: i=0,1,2,第i个通道的门控信号输入引脚,门控信号的作用与通道的工作方式有关。
(9)OUTi:i=0,1,2,第i个通道的定时/计数到信号输出引脚,输出信号的形式由通道的工作方式确定,此输出信号可用于触发其它电路工作,或作为向CPU发出的中断请求信号。
2.3 8254端口地址
8254控制字
说明 :(1)8254每个通道对输入CLK按二进制或二十进制从预置值开始减1计数,减到0时从OUT输出一个信号。
(2)8254编程时先写控制字,再写时间常数。
2.4 8254工作方式
《微机原理与接口技术》课程设计
关智杰
(1)方式0:计数结束产生中断方式
当写入控制字后,OUT变为低电平,当写入初值后立即开始计数,当计数结束时,变成高电平。
(2)方式1:可编程单次脉冲方式
当初值装入后且GATE由低变高时,OUT变为低电平,计数结束变为高电平。(3)方式2:频率发生器方式
当初值装入时,OUT变为高;计数结束,OUT变为低。该方式下如果计数未结束,但GATE为低时,立即停止计数,强制OUT变高,当GATE再变高时,便启动一次新的计数周期。
(4)方式3:方波发生器
当装入初值后,在GATE上升沿启动计数,OUT 输出高电平; 当计数完成一半时,OUT输出低电平。方式3与方式2的工作方式类似,也是在初始化完成后能重复循环计数,只是输出的波形不同。
(5)方式4:软件出发选通方式
进入工作方式4,OUTi输出高电平。装入计数值n后,如果GATE为高电平,则立即开始减“1”计数,直到计数值减到“0”为止,OUTi输出宽度为一个CLKi周期的负脉冲。由软件装入的计数值只有一次有效,如果要继续操作,必须重新置入计数初值n。如果在操作的过程中,GATE变为无效,则停止减“1”计数,到GATE再次有效时,重新从初值开始减“1”计数。
(6)方式5:硬件触发方式计数
进入工作方式5,OUTi输出高电平,硬件触发信号由GATE端引入。因此,开始时GATE应输入为0,装入计数初值n后,减“1”计数并不工作,一定要等到硬件触发信号由GATE端引入一个正阶跃信号,减“1”计数才会开始,待计数值计到“0”,OUTi将输出负脉冲,其宽度固定为一个CLKi周期,表示定时时间到或计数次数到。
三、程序设计思路
所有音乐都是由各个不同频率的音阶和其延续时间的长短来实现的。不同的音乐是由各个音阶按某种排列各自播放一定时间形成的,将各音乐音阶和其延续时间存在数据段中,然后根据不同按键值选择不同的音阶和时间表,再使用计数器产生该音阶频率。
CPU通过对定时器的通道2(端口地址为42)进行编程,使其I/O寄存器接收一个控制声音频率的16位计数值,端口61H的最低控制通道2门控的开断。以产生特殊的音响。当定时器接收的计数值为533H时,能产生896Hz的声音,因此产生其他频率的计数值就可算出来:
《微机原理与接口技术》课程设计
关智杰
533Hz×896÷频率=1234DC÷频率
在送出频率计数值之前,还要给方式寄存器送一个方式值,该数决定对哪一个通道编程,采用什么模式,送入通道的计数值是一字节还是两字节,是二进制码还是BCD码。其位组合的格式如下:
当通道2用于发声时,采用的是模式3,在模式3下,输出线为“1”和为“0”的时间各占计数时间的一半,因而产生一系列间隔均匀的脉冲。
产生指定频率声音的程序段如下:
MOV AL,0B6H OUT 43H,AL ;43H为8254的控制字端口 MOV DX,12H MOV AX,34DCH DIV DI ;(DI)=频率
OUT 42H,AL ;42H为8254的通道2端口 MOV AL,AH MOV 42H,AL 从定时器输出的方波信号,经功率放大和滤波后驱动扬声器。送到扬声器的信号还受到了从并行接口芯片8255(端口地址为61H)来的双重控制,端口61H的最低位控制通道2的门控开断,以产生特殊的音频信号,端口61H的PA1位和定时器的输出信号同时作为与门的输入,PA0和PA1位可由程序决定为0还是为1。显然只有PA0和PA1都是1时,才能使扬声器发出声音。控制音长的时间可以简单地通过反复执行指令来得到。我们知道执行2801次LOOP指令约需要10MS的时间。因此用10MS的倍数值来控制扬声器开关的时间间隔,就可控制发声的音长了。实现程序如下:
IN AL,61H MOV AH,AL OR AL,3 OUT 61H,AL;开扬声器 L: MOV CX,2801 DY:LOOP DY DEC BX JNZ L MOV AL,AH OUT 61H,AL;关扬声器
《微机原理与接口技术》课程设计
关智杰
四、功能流程图及子程序说明
1、总流程图
MAIN程序:MAIN程序是总程序,输出说明,等待用户按键并读取键值。根据不同的按键选择调用播音子程序播放不同的歌曲。
开始输出说明读取按键是‘1’?N是‘2’?Y播放曲1Y播放曲2N是‘3’?Y播放曲3N是‘0’?Y结束Y选择无效程序总流程图
2、音乐播放子程序流程图
PLAY子程序:PLAY子程序是播音子程序,SI指向音节表中的频率,BP指向音节表中的时间。从SI的指向的音节表中取一个频率,只要不是-1,即有效就再读取时间,然后计算计数初值送入计数器,产生各种频率。开启扬声器,根据所取的时间调用若干次延时子程序。这段时间扬声器就发出该频率的声音,延时结束,就关闭扬声器,调用音节之间的小延时程序。最后修改SI和BP,指向下一个频率,重复上面的工作
DELAY子程序和DELAY_OFF子程序:两个都是子程序,采用空操作循环多次的方法,只是第二个延时时间较短,大概为5ms。
《微机原理与接口技术》课程设计
关智杰
开始保护现场曲N各音符频率设置曲N各音符时间设置读取频率F频率是-1 ?Y恢复现场N读取时间T结束返回计算机计数次数送计数器,产生该频率F信号启动喇叭延时T关闭喇叭音符间延时播音流程图
五、试验结果截屏:
初始界面:
如果按错了键,会出现如下界面:
《微机原理与接口技术》课程设计
关智杰
如果选择正确,将出现如下界面:
六、参考文献
【1】李长青.微机原理与接口技术.徐州:中国矿业大学出版社,2006 【2】沈美明.汇编语言程序设计实验教程.北京:清华大学出版社,2002年 【3】周明德.微机原理与接口技术.北京:人民邮电出版社,2002年
七、总结
在本次设计中,可以说是一次成功的经验。在我们学完了《微型计算机原理与接口技术》这门课的基础上来做这个设计,通过设计后,使我们对这门课的理论知识的理解有很大程度上的加强。微机原理这门课程本身是一门实验性和工程性很强的专业技术课,因此不仅要重视理论教学,更应注意实践技能的培养和训练。课程设计是这门课程的一个重要环节,通过课程设计,巩固、加深和拓宽了学习的理解,本课程设计的重点目标是使用汇编语言,而不过多涉及硬件方面的太多知识。
《微机原理与接口技术》课程设计
关智杰
在编程方面我通过本次课程设计学到了很多。一开始面对很长的程序往往有畏难情绪,感觉无法下手,没办法只能硬着头皮啃下去,多看几个和音乐播放有关的汇编程序,然后我就能慢慢看懂了并理解了别的作者的设计思路。然后再根据自己的思路,对照本人在图书馆借的汇编语言指导书慢慢编写符合自己思路的程序。一次写出来的程序肯定不会是正确的,还需要进一步调试它。检查程序过程中,在充分思考的基础上多次实验是检查改正程序的良方。编写程序的过程中,体会最深的是子程序的调用和程序的条理问题,一个程序就算功能实现了,但是也要使主程序和子程序的条理分明,易读性高,才能算一个比较好的程序。调试程序中,学习了DEBUG 的使用,DEBUG对检查程序的错误作用很大。同时,也要灵活使用各种调试方法,来缩小寻找错误的范围。
书到用时方恨少。在课程设计过程中,我才体会到这句话的深意。课堂上学的8254的知识和汇编语言都太少,还不足以完成本次课设,为此我经常跑图书馆借了各种各样的工具书。有的书用处较大,有的书仅能用到一小块知识,就是这样,一步步在知识的海洋里我寻觅着自己需要的东西,确实克服了不少困难,解决了不少问题。或许坎坷才能更好的使人成长。在这次的课程设计中,我的收获是不但做出了一个符合要求的音乐播放器,而且为自己积累了一些宝贵的经验。同时我也对音乐方面的频率知识有了一些认识,我想如果不是本次课程设计中用到这方面知识,我这辈子可能没有机会去接触这方面的知识了。这,或许也是我比别的同学多出的一点收获吧!
六、附录
1、源程序代码:
SSEG SEGMENT PARA STACK 'stack'
dw 100h dup(0);Resize the stack by changing the number '100' SSEG ENDS
DSEG SEGMENT INFO1 DB 0DH,0AH,'--------------------------',0DH,0AH,'THERE ARE 3 SONGS:',0DH,0AH,0DH,0AH,'$' INFO2 DB '1.HAPPY BIRTHDAY',0DH,0AH,'$' INFO3 DB '2.SHEEP',0DH,0AH,'$' INFO4 DB '3.RIVER',0DH,0AH,'$' INFO5 DB '0.EXIT',0DH,0AH,'$' INFO6 DB 'YOU HAVE CHOSEN :$' INFO7 DB 'THANK YOU FOR YOUR USE',0DH,0AH,'$' INFO8 DB '---------------------------',0DH,0AH,'PRESS THE KEY TO SELECT SONG!',0DH,0AH,'$' INFO9 DB 0DH,0AH,'-------------------',0DH,0AH,'|INVALID
《微机原理与接口技术》课程设计
关智杰
SELECTION|',0DH,0AH,'-------------------',0DH,0AH,'$' FREG1 DW 2 dup(262),294,262,349,262,262,294,262,392,249,262,262,523,440,349
;曲1的频率
DW 330,294,466,266,440,349,392,349,-1 TIME1 DW
1,1,2,2,2,4,1,1,2,2,2,4,1,1,2,2,2,2,4,1,1,2,2,2,4
;曲1的时间 FREG2 DW 330,294,262,294,3 DUP(330)
;曲2的频率
DW 3 DUP(294),330,392,392 DW 330,294,262,294,4 DUP(330)DW 294,294,330,294,262,-1 TIME2 DW 6 DUP(1),2
;曲2的时间
DW 2 DUP(1,1,2)DW 12 DUP(1),4 FREG3 DW 330,392,330,294,330,392,330,294,330,330,392,330,294,262,294,330,392,294;曲3的频率
DW 262,262,220,196,220,262,294,332,262,-1 TIME3 DW 3 DUP(2),1,1,2,1,1,4
;曲3的时间
DW 2 DUP(2,2,1,1),4 DW 3 DUP(2,1,1,1),4 DSEG ENDS
CSEG SEGMENT
assume cs:CSEG, ds:DSEG, es:DSEG, ss:SSEG
INIT PROC
;初始化程序
mov ax, dseg mov ds, ax mov es, ax
INIT ENDP
MAIN PROC
;程序入口
call INIT
RE: MOV DX,28BH
;关闭扬声器
MOV AL,89H OUT DX,AL
MOV DX,28AH IN AL,DX MOV DX,288H OUT DX,AL
LEA DX,INFO1
;输出说明信息
MOV AH,09H INT 21H LEA DX,INFO2 INT 21H LEA DX,INFO3 INT 21H
《微机原理与接口技术》课程设计
关智杰
LEA DX,INFO4 INT 21H LEA DX,INFO5 INT 21H LEA DX,INFO8 INT 21H
MOV AH,01H
;读取按键
INT 21H CMP AL,'1'
;根据不同的按键播放不同的曲子
JE MUSIC1 CMP AL,'2' JE MUSIC2 CMP AL,'3' JE MUSIC3 CMP AL,'0' JE EXIT
LEA DX,INFO9
MOV AH,09H INT 21H JMP RE
MUSIC1: MOV SI,OFFSET FREG1
MOV BP,OFFSET TIME1 CALL PLAY JMP RE MUSIC2: MOV SI,OFFSET FREG2
MOV BP,OFFSET TIME2 CALL PLAY JMP RE MUSIC3: MOV SI,OFFSET FREG3
MOV BP,OFFSET TIME3 CALL PLAY JMP RE EXIT: MOV DX,28BH
MOV AL,89H OUT DX,AL
MOV DX,28AH IN AL,DX
;无效选择,输出错误提示
;指向曲1的表;指向曲2的表;指向曲3的表;关闭扬声器
《微机原理与接口技术》课程设计
关智杰
MOV DX,288H OUT DX,AL
LEA DX,INFO7
;输出欢迎使用信息,增加界面友好度
MOV AH,09H INT 21H mov ax, 4c00h;The end of the program, return to the system
int 21h
MAIN ENDP
PLAY PROC
L1: MOV BX,DS:[SI]
CMP BX,-1
JE L0
MOV CX,DS:[BP]
MOV DL,CL
ADD DL,30H
MOV AH,02H
INT 21H
MOV DX,0FH
MOV AX,4240H
DIV BX
MOV BX,AX
MOV DX,283H
MOV AL,36H
OUT DX,AL
MOV DX,280H
MOV AX,BX
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV DX,28BH
MOV AL,89H OUT DX,AL MOV DX,28AH IN AL,DX NOT AL MOV DX,288H OUT DX,AL
ROD:CALL DELAY
LOOP ROD
MOV DX,28BH
MOV AL,89H
;PLAY子程序,功能上面介绍过
;取频率
;看是否有效
;无效就退出
;读取时间
;保存时间
;计算计数初值,1M的十六进制为0F4240H
;设置计数器工作方式
;输入计数初值
;开扬声器
;延时
;关扬声器
《微机原理与接口技术》课程设计
关智杰
OUT DX,AL MOV DX,28AH IN AL,DX MOV DX,288H OUT DX,AL
CALL DELAY_OFF
;音节间延时
ADD SI,2
ADD BP,2
JMP L1
L0: RET
PLAY ENDP
DELAY PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV BX,09FH LL1:MOV CX,0FFFFH
LOP: LOOP LOP DEC BX JNZ LL1 POP DX
POP CX
POP BX
POP AX
RET
DELAY ENDP
DELAY_OFF PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV BX,0FH LL2:MOV CX,0CFFFH LOP2: LOOP LOP2 DEC BX JNZ LL2 POP DX
POP CX
POP BX
POP AX
RET
;延时子程序
;循环这么多次
《微机原理与接口技术》课程设计
关智杰
DELAY_OFF ENDP CSEG ENDS END MAIN
2、各个音符的对应频率表:
音符 频率/HZ 半周期/us 音符 频率/HZ 半周期/us 低1DO 262 1908 #4FA# 740 0676 #1DO# 277 1805 中5SO 784 0638 低2RE 294 1700 #5SO# 831 0602 #2RE# 311 1608 中6LA 880 0568 低3M 330 1516 #6LA# 932 0536 低4FA 349 1433 中7SI 988 0506 #4FA# 370 1350 高1DO 1046 0478 低5SO 392 1276 #DO# 1109 0451 #5SO# 415 1205 高2RE 1175 0426 低6LA 440 1136 #2RE# 1245 0402 #6LA# 466 1072 高3M 1318 0372 低7SI 494 1012 高4FA 1397 0358 中1DO 523 0956 #4FA# 1480 0338 #1DO# 554 0903 高5SO 1568 0319 中2RE 578 0842 #5S0# 1661 0292 #2RE# 622 0804 高6LA 1760 0284 中3M 659 0759 #6LA# 1865 0268 中4FA 698 0716 高7SI 1976 0253