微型计算机课程设计_微机课程设计计算器
微型计算机课程设计由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“微机课程设计计算器”。
《微机系统与汇编语言》
课程设计
(题目)
姓名
班级 学号
2013/12/26
内容要求: 一.设计内容
设计并实现随音乐伴奏而按某种规律显示的彩灯。
二.设计要求
①.用实验箱上的8253控制扬声器发声,演唱3首不同的歌曲。②.通过实验箱上的8255A驱动二极管发光。③.发光二极管的闪烁以音调的不同而不同 ④.通过中断信号选择歌曲。
三.总体设计
1.设计思路:
1>本次实验应用了8254,8255,8259芯片组
2>8254用于计数和连接扬声器,用计数器1实现音乐播放的控制,方式3。提供因每个音符频率不同而产生的音乐输出,片选信号接到系统总线的IOY2(端口地址为0680)
3>8255A驱动二极管发光,伴随音乐而变换。用B口作输出,片选信号接到系统总线的IOY0(端口地址为0600H)
4>8259采用级联方式,提供中断控制歌曲的切换,主片的中断类型号为68H,接MIR7.从片中断类型号为70H,接SIR1。每按一次MIR7或SIR1,切换一首歌。
5>共有三首歌,0-友谊地久天长,1-祝你生日快乐,2-两只老虎,从第一
首开始播放,然后判断有无中断,没有就继续播,有就判断计数器的值,大于等于3就重置为0(第一首),否则就用计数器的值找下一首要播放的歌曲的频率表、时间表、彩灯的控制表,然后取出播放新的音乐。
2.硬件连接图
我的改为片选CS接IOY2,用的计数器1,即把GATE0、CLK0、OUT0改为GATE1、CLK1、OUT1
我的片选信号CS接到IOY0,用的B口输出,即把PA0---PA7改为PB0---PB7 3.软件流程图
4.4.程序代码
IOY0 EQU 0600H IOY2 EQU 0680H MY8254_COUNT0 EQU IOY2+00H;8254 计数器 0 端口地址 MY8254_COUNT1 EQU IOY2+02H;8254 计数器 1 端口地址 MY8254_COUNT2 EQU IOY2+04H;8254 计数器 2 端口地址 MY8254_MODE EQU IOY2+06H;8254 控制寄存器端口地址 MY8259_ICW EQU 20H;MY8255_A EQU 0600H
MY8255_B EQU 0602H MY8255_CON EQU 0606H
SSTACK SEGMENT STACK
DW 32 DUP(?)SSTACK ENDS DATA SEGMENT
COUNTSONG DB 0 INT_FLAG DB 0
FREQ_LIST DW FREQ_ONE TIME_LIST DW TIME_ONE
FREQ_ONE DW 393,393,441,393,525,495;
DW 393,393,441,393,589,525
DW 393,393,786,661,525,495,441
DW 350,350,661,525,589,525,0
TIME_ONE DB 4,2,5,5,5,10;时间表
DB 3,2,5,5,5,10
频率表
DB 2,4,5,5,5,3,3
DB 4,1,5,5,5,10
LED_ONE
DB 25,23,03,44,75,26,07,08,19
DB 01,05,63,04,05,06,47,08,09
DB 01,32,03,46,02,06,54,08,29
DB 01,62,03,34,25,06,67,28,09
DB 01,02,83,04,05,46,37,68,09
DB 01,62,03,24,05,06,57,58,09,42,34
FREQ_SEC DW 262,294,330,262,262,294,330,262;频率表
DW 330,350,393,330,350,393,393,441,393,350,330,262
DW 393,441,393,350,330,262,262,393,262,262,393,0 TIME_SEC DB 6, 6, 6, 6, 6, 6, 6, 6;时间表
DB 6, 6, 12, 6, 6, 12, 4, 2, 4, 2, 6, 6
DB 4, 2, 4, 2, 6, 6,6, 6, 12,6, 6, 12
LED_SEC DB 01,62,03,34,25,06,67,28,09
DB 01,02,83,04,05,46,37,68,09
DB 01,62,03,24,05,06,57,58,09,42,34
DB 25,23,03,44,75,26,07,08,19
DB 01,05,63,04,05,06,47,08,09
DB 01,32,03,46,02,06,54,08,29
FREQ_THIRD DW 371,495,495,495,624,556,495,556,624;
DW 495,495,624,742,833,833,833,742,624
DW 624,495,556,495,556,624,495,416,416,371
DW 495,833,742,624,624,495,556,495,556,833
DW 742,624,624,742,833,990,742,624,624,495
DW 556,495,556,624,495,416,416,371,495,0 TIME_THIRD DB 4, 6, 2, 4, 4, 6, 2, 4, 4;时间表
DB 6, 2, 4, 4, 12, 1, 3, 6, 2
DB 4, 4, 6, 2, 4, 4, 6, 2, 4, 4
DB 12, 4, 6, 2, 4, 4, 6, 2, 4, 4
DB 6, 2, 4, 4, 12, 4, 6, 2, 4, 4
DB 6, 2, 4, 4, 6, 2, 4, 4, 12 LED_THIRD DB 01,05,63,04,05,06,47,08,09
DB 01,32,03,46,02,06,54,08,29
DB 01,62,03,34,25,06,67,28,09
DB 25,23,03,44,75,26,07,08,19
频率表
DB 01,02,83,04,05,46,37,68,09
DB 01,62,03,24,05,06,57,58,09,42,34
SING_FREQ DW FREQ_ONE,FREQ_SEC,FREQ_THIRD SING_TIME DW TIME_ONE,TIME_SEC,TIME_THIRD LED_TAB DW LED_ONE,LED_SEC,LED_THIRD
DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: PUSH DS
MOV AX, 0000H
MOV DS, AX
;MIR7
MOV AX, OFFSET MIR7;取中断入口地址
MOV SI, 006FH*4;中断矢量地址,低位存偏移地址
MOV [SI], AX;填 IRQ7 的偏移矢量
MOV AX, CS;段地址
MOV SI, 006FH*4+2;高位存段地址
MOV [SI], AX;填 IRQ7 的段地址矢量
;SIR1
MOV AX, OFFSET SIR1
MOV SI, 71H*4
MOV [SI], AX
MOV AX, CS
MOV SI, 71H*4+2
MOV [SI], AX
CLI
;中断允许标志置0
POP DS
;初始化主片 8259
MOV AL, 11H
OUT 20H, AL;ICW1,11H=0001 0001,IRx为上升沿触发,多片8259级联,需要ICW4
MOV AL, 68H
OUT 21H, AL;ICW2,68H=0110 1000,程序设定的中断类型码的高5位内容为01101,中断源为???
MOV AL, 04H
OUT 21H, AL;ICW3仅用于8259的级联方式,04H=0000 0100,IR2上接有从片8259
MOV AL, 05H
OUT 21H, AL;ICW4,01H=0000 0101,优先级管理采用正常的完全嵌套方式,非缓冲方式,作为从片,非自动中断结束方式
MOV AL, 6BH
OUT 21H, AL;OCW1 用来设置中断源的屏蔽状态,6BH=0110 1011,IR4和IR7没被屏蔽,主片IR2不屏蔽
;初始化从片
MOV AL, 11H
OUT 0A0H, AL;ICW1
MOV AL, 70H
OUT 0A1H, AL;ICW2
MOV AL, 02H
OUT 0A1H, AL;ICW3
MOV AL, 01H
OUT 0A1H, AL;ICW4
MOV AL, 0FDH
OUT 0A1H,AL;OCW1=1111 1101 从片IR1不被屏蔽
STI
;中断允许标志置1;初始化8254
MOV DX,MY8254_MODE;初始化8254工作方式
MOV AL,76H
;0011 0110设置定时器1,先读写低8位,后读写高8位,工作方式3,软硬件启动
OUT DX,AL
;初始化8255
MOV DX, MY8255_CON;初始化 8255 工作方式
MOV AL, 80H;1000 0000 B口工作在方式0,做输出
OUT DX, AL
MOV AX,DATA
MOV DS,AX
AA1: NOP JMP PLAY1;CALL BEGIN
JMP AA1;子程序功能 MIR7: PUSH AX MOV INT_FLAG,0FFH INC COUNTSONG;增量加(加1)
CMP COUNTSONG,3;比较
JC RETT;条件转移,有进位(借位)转移
MOV COUNTSONG,0;大于等于3时,从第0首歌开始唱
SIR1: PUSH AX MOV INT_FLAG,0FFH INC COUNTSONG;增量加(加1)
CMP COUNTSONG,3;比较
JC RETT;条件转移,有进位(借位)转移
MOV COUNTSONG,0;大于等于3时,从第0首歌开始唱;---------是那首歌就唱哪首歌----------RETT:
MOV AH,1
MOV AL,COUNTSONG;----------
OR AL,30H
INT 10H MOV AL, 20H;-----------
OUT 20H, AL;中断结束命令
OUT 0A0H,AL
POP AX
IRET
;----------使程序顺序执行---------PLAY1:
XOR BX,BX MOV BL,COUNTSONG SHL BX,1 MOV BP,BX MOV SI,DS:SING_FREQ MOV DI,DS:SING_TIME MOV BX,DS:LED_TAB
;MOV BX,DS:LED_TAB[BP]
;MOV SI,SING_FREQ;MOV DI,SING_TIME
;响应中断 SONG1:
CMP INT_FLAG,0H
JZ PLAY
MOV INT_FLAG,0H XOR BX,BX MOV BL,COUNTSONG SHL BX,1 MOV BP,BX MOV SI,DS:SING_FREQ[BP] MOV DI,DS:SING_TIME[BP] MOV BX,DS:LED_TAB[BP]
;MOV BX,DS:LED_TAB[BP];------;;CMP INT_FLAG,0H;JZ SONG0;MOV INT_FLAG,0H;XOR BX,BX;MOV BL,COUNTSONG;ADD BX,OFFSET SING_FREQ;MOV SI,[BX];ADD BX,OFFSET SING_TIME
;MOV DI,[BX]
PLAY:
;输入时钟为 1MHz,1M = 0F4240H
MOV AX,4240H MOV DX,0FH
DIV WORD PTR [SI]
MOV DX,MY8254_COUNT1
OUT DX,AL
;装入计数初值
MOV AL,AH
OUT DX,AL
MOV DL,[DI]
;取出演奏相对时间,调用延时子程序
CALL DALLY
MOV AX,BX
MOV DX,MY8255_B
OUT DX,AL;从B口 输出音符到LED
ADD SI,2
INC DI
INC BX
;POP BX
CMP WORD PTR [SI],0
;判断是否到曲末?
JE PLAY1
JMP SONG1
;MOV DI,OFFSET TIME_LIST;装入时间表起始地址
DALLY PROC
;延时子程序 D0: MOV CX,0010H D1: MOV AX,0F00H D2: DEC AX
JNZ D2
LOOP D1
DEC DL
JNZ D0
RET DALLY ENDP
CODE ENDS END START 四.心得体会
通过课程设计我对8259A、8254、8255等芯片有了更深刻的认识。对于实验中用到的8255,8254,8259等芯片都有了较为深刻的认识,知道了如何使用这几个芯片,对于它们的初始化,赋初值,写命令字都有了较为熟悉的了解,对于8254,8055的端口地址以及命令字格式都已经差不多记下来了,使用8253芯片,主要是用来得到我们需要的音乐频率,8255工作方式控制字用来设定A、B 口和C口的数据传送方向是输入还是输出,设定各口的工作方式是3种方式的哪一种。对于8253芯片作为计数器的用法基本上已经掌握,相关的操作命令能相对熟练的运用,对于8255芯片作为并行输入输出的本质有了一定的了解,对8255的A口,B口,C口做不同的输入输出工作的具体应用有了一定的经验
因为之前几次实验都是针对单个芯片,虽然当时很多有疑问的地方都差不多弄明白了,但是综合起来应用的能力还是欠缺,通过这次的课程设计,我把课本的知识应用在了实践中,并且取得了预期的成果,不仅把自己所学知识进行了一次检验,同时锻炼了自己的动手实践能力,为自己以后将知识学以致用提供了很好的经验和借鉴。