微型计算机课程设计设计并实现随音乐伴奏而按某种规律显示的彩灯.docx
《微型计算机课程设计设计并实现随音乐伴奏而按某种规律显示的彩灯.docx》由会员分享,可在线阅读,更多相关《微型计算机课程设计设计并实现随音乐伴奏而按某种规律显示的彩灯.docx(12页珍藏版)》请在冰豆网上搜索。
微型计算机课程设计设计并实现随音乐伴奏而按某种规律显示的彩灯
《微机系统与汇编语言》
课程设计
(题目)
姓名
班级
学号
20**/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.程序代码
IOY0EQU0600H
IOY2EQU0680H
MY8254_COUNT0EQUIOY2+00H;8254计数器0端口地址
MY8254_COUNT1EQUIOY2+02H;8254计数器1端口地址
MY8254_COUNT2EQUIOY2+04H;8254计数器2端口地址
MY8254_MODEEQUIOY2+06H;8254控制寄存器端口地址
MY8259_ICWEQU20H
;MY8255_AEQU0600H
MY8255_BEQU0602H
MY8255_CONEQU0606H
SSTACKSEGMENTSTACK
DW32DUP(?
)
SSTACKENDS
DATASEGMENT
COUNTSONGDB0
INT_FLAGDB0
FREQ_LISTDWFREQ_ONE
TIME_LISTDWTIME_ONE
FREQ_ONEDW393,393,441,393,525,495;频率表
DW393,393,441,393,589,525
DW393,393,786,661,525,495,441
DW350,350,661,525,589,525,0
TIME_ONEDB4,2,5,5,5,10;时间表
DB3,2,5,5,5,10
DB2,4,5,5,5,3,3
DB4,1,5,5,5,10
LED_ONEDB25,23,03,44,75,26,07,08,19
DB01,05,63,04,05,06,47,08,09
DB01,32,03,46,02,06,54,08,29
DB01,62,03,34,25,06,67,28,09
DB01,02,83,04,05,46,37,68,09
DB01,62,03,24,05,06,57,58,09,42,34
FREQ_SECDW262,294,330,262,262,294,330,262;频率表
DW330,350,393,330,350,393,393,441,393,350,330,262
DW393,441,393,350,330,262,262,393,262,262,393,0
TIME_SECDB6,6,6,6,6,6,6,6;时间表
DB6,6,12,6,6,12,4,2,4,2,6,6
DB4,2,4,2,6,6,6,6,12,6,6,12
LED_SECDB01,62,03,34,25,06,67,28,09
DB01,02,83,04,05,46,37,68,09
DB01,62,03,24,05,06,57,58,09,42,34
DB25,23,03,44,75,26,07,08,19
DB01,05,63,04,05,06,47,08,09
DB01,32,03,46,02,06,54,08,29
FREQ_THIRDDW371,495,495,495,624,556,495,556,624;频率表
DW495,495,624,742,833,833,833,742,624
DW624,495,556,495,556,624,495,416,416,371
DW495,833,742,624,624,495,556,495,556,833
DW742,624,624,742,833,990,742,624,624,495
DW556,495,556,624,495,416,416,371,495,0
TIME_THIRDDB4,6,2,4,4,6,2,4,4;时间表
DB6,2,4,4,12,1,3,6,2
DB4,4,6,2,4,4,6,2,4,4
DB12,4,6,2,4,4,6,2,4,4
DB6,2,4,4,12,4,6,2,4,4
DB6,2,4,4,6,2,4,4,12
LED_THIRDDB01,05,63,04,05,06,47,08,09
DB01,32,03,46,02,06,54,08,29
DB01,62,03,34,25,06,67,28,09
DB25,23,03,44,75,26,07,08,19
DB01,02,83,04,05,46,37,68,09
DB01,62,03,24,05,06,57,58,09,42,34
SING_FREQDWFREQ_ONE,FREQ_SEC,FREQ_THIRD
SING_TIMEDWTIME_ONE,TIME_SEC,TIME_THIRD
LED_TABDWLED_ONE,LED_SEC,LED_THIRD
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
PUSHDS
MOVAX,0000H
MOVDS,AX
;MIR7
MOVAX,OFFSETMIR7;取中断入口地址
MOVSI,006FH*4;中断矢量地址,低位存偏移地址
MOV[SI],AX;填IRQ7的偏移矢量
MOVAX,CS;段地址
MOVSI,006FH*4+2;高位存段地址
MOV[SI],AX;填IRQ7的段地址矢量
;SIR1
MOVAX,OFFSETSIR1
MOVSI,71H*4
MOV[SI],AX
MOVAX,CS
MOVSI,71H*4+2
MOV[SI],AX
CLI;中断允许标志置0
POPDS
;初始化主片8259
MOVAL,11H
OUT20H,AL;ICW1,11H=00010001,IRx为上升沿触发,多片8259级联,需要ICW4
MOVAL,68H
OUT21H,AL;ICW2,68H=01101000,程序设定的中断类型码的高5位内容为01101,中断源为?
?
?
MOVAL,04H
OUT21H,AL;ICW3仅用于8259的级联方式,04H=00000100,IR2上接有从片8259
MOVAL,05H
OUT21H,AL;ICW4,01H=00000101,优先级管理采用正常的完全嵌套方式,非缓冲方式,作为从片,非自动中断结束方式
MOVAL,6BH
OUT21H,AL;OCW1用来设置中断源的屏蔽状态,6BH=01101011,IR4和IR7没被屏蔽,主片IR2不屏蔽
;初始化从片
MOVAL,11H
OUT0A0H,AL;ICW1
MOVAL,70H
OUT0A1H,AL;ICW2
MOVAL,02H
OUT0A1H,AL;ICW3
MOVAL,01H
OUT0A1H,AL;ICW4
MOVAL,0FDH
OUT0A1H,AL;OCW1=11111101从片IR1不被屏蔽
STI;中断允许标志置1
;初始化8254
MOVDX,MY8254_MODE;初始化8254工作方式
MOVAL,76H;00110110设置定时器1,先读写低8位,后读写高8位,工作方式3,软硬件启动
OUTDX,AL
;初始化8255
MOVDX,MY8255_CON;初始化8255工作方式
MOVAL,80H;10000000B口工作在方式0,做输出
OUTDX,AL
MOVAX,DATA
MOVDS,AX
AA1:
NOP
JMPPLAY1
;CALLBEGIN
JMPAA1
;子程序功能
MIR7:
PUSHAX
MOVINT_FLAG,0FFH
INCCOUNTSONG;增量加(加1)
CMPCOUNTSONG,3;比较
JCRETT;条件转移,有进位(借位)转移
MOVCOUNTSONG,0;大于等于3时,从第0首歌开始唱
SIR1:
PUSHAX
MOVINT_FLAG,0FFH
INCCOUNTSONG;增量加(加1)
CMPCOUNTSONG,3;比较
JCRETT;条件转移,有进位(借位)转移
MOVCOUNTSONG,0;大于等于3时,从第0首歌开始唱
;---------是那首歌就唱哪首歌----------
RETT:
MOVAH,1
MOVAL,COUNTSONG
;----------
ORAL,30H
INT10H
MOVAL,20H
;-----------
OUT20H,AL;中断结束命令
OUT0A0H,AL
POPAX
IRET
;----------使程序顺序执行---------
PLAY1:
XORBX,BX
MOVBL,COUNTSONG
SHLBX,1
MOVBP,BX
MOVSI,DS:
SING_FREQ
MOVDI,DS:
SING_TIME
MOVBX,DS:
LED_TAB
;MOVBX,DS:
LED_TAB[BP]
;MOVSI,SING_FREQ
;MOVDI,SING_TIME
;响应中断
SONG1:
CMPINT_FLAG,0H
JZPLAY
MOVINT_FLAG,0H
XORBX,BX
MOVBL,COUNTSONG
SHLBX,1
MOVBP,BX
MOVSI,DS:
SING_FREQ[BP]
MOVDI,DS:
SING_TIME[BP]
MOVBX,DS:
LED_TAB[BP]
;MOVBX,DS:
LED_TAB[BP]
;-------------------------------------;
;CMPINT_FLAG,0H
;JZSONG0
;MOVINT_FLAG,0H
;XORBX,BX
;MOVBL,COUNTSONG
;ADDBX,OFFSETSING_FREQ
;MOVSI,[BX]
;ADDBX,OFFSETSING_TIME
;MOVDI,[BX]
PLAY:
;输入时钟为1MHz,1M=0F4240H
MOVAX,4240H
MOVDX,0FH
DIVWORDPTR[SI]
MOVDX,MY8254_COUNT1
OUTDX,AL;装入计数初值
MOVAL,AH
OUTDX,AL
MOVDL,[DI];取出演奏相对时间,调用延时子程序
CALLDALLY
MOVAX,BX
MOVDX,MY8255_B
OUTDX,AL;从B口输出音符到LED
ADDSI,2
INCDI
INCBX
;POPBX
CMPWORDPTR[SI],0;判断是否到曲末?
JEPLAY1
JMPSONG1
;MOVDI,OFFSETTIME_LIST;装入时间表起始地址
DALLYPROC;延时子程序
D0:
MOVCX,0010H
D1:
MOVAX,0F00H
D2:
DECAX
JNZD2
LOOPD1
DECDL
JNZD0
RET
DALLYENDP
CODEENDS
ENDSTART
四.心得体会
通过课程设计我对8259A、8254、8255等芯片有了更深刻的认识。
对于实验中用到的8255,8254,8259等芯片都有了较为深刻的认识,知道了如何使用这几个芯片,对于它们的初始化,赋初值,写命令字都有了较为熟悉的了解,对于8254,8055的端口地址以及命令字格式都已经差不多记下来了,使用8253芯片,主要是用来得到我们需要的音乐频率,8255工作方式控制字用来设定A、B口和C口的数据传送方向是输入还是输出,设定各口的工作方式是3种方式的哪一种。
对于8253芯片作为计数器的用法基本上已经掌握,相关的操作命令能相对熟练的运用,对于8255芯片作为并行输入输出的本质有了一定的了解,对8255的A口,B口,C口做不同的输入输出工作的具体应用有了一定的经验
因为之前几次实验都是针对单个芯片,虽然当时很多有疑问的地方都差不多弄明白了,但是综合起来应用的能力还是欠缺,通过这次的课程设计,我把课本的知识应用在了实践中,并且取得了预期的成果,不仅把自己所学知识进行了一次检验,同时锻炼了自己的动手实践能力,为自己以后将知识学以致用提供了很好的经验和借鉴。