1、课程设计报告 ( 20132014 年度第 一 学期) 课 程: 微机原理及应用 题 目: 电子琴及电子播放器 院 系: 自动化系 班 级: 自动化 1103 学 号: 201111010122 201109010113 201102020331 学生姓名: 詹文超 靳朝阳 张晓 指导教师: 张妍 设计周数: 一周 成 绩: 日期:2014 年 1 月 10 日 微机原理及应用课程设计报告 一、 目的与要求 1 通过对微机系统分析和具体设计,使学生加深对所学课程的理解。 2 掌握汇编语言程序设计的基本方法和典型接口电路的基本设计方法。 3 培养学生分析问题、解决问题的能力。 4 培养学生对微型
2、计算机应用系统的基本设计能力。 5 提高学生的实践动手能力和创新能力。 二、 主要内容 1. 电子琴及电子播放器 2. 系统介绍 本设计不仅可以实现小键盘电子琴演奏,还可以通过拨码开关播放不同的电子音乐,主要有小星星, 两只老虎和欢乐颂。硬件设计用到 8253 和 8255 芯片,8253 工作在方式 3,产生一定的频率方波,同时 对应着不同音调;8255 为可编程接口芯片,用于整个系统的开关控制功能。 3. 系统实现的功能 系统主要实现三个功能: 1、自动演奏 3 首歌曲; 2、利用小键盘手动演奏; 3、歌曲之间的相互切换。 4.所用芯片的工作原理 (1)8253 原理 8253 有 3 个
3、独立的计数通道,每个通道结构相同,例若 clk0 给定频率,向控制字寄存器写入控制字, 并向计数器 0 写入计数初值,采用不同的方式即可产生不同的频率。 8253 的内部结构 (1) 数据总线缓冲器 实现 8253 与 CPU 数据总线连接的 8 位双向三态缓冲器,用以传送 CPU 向 8253 的控制 信息、数据信息以及 CPU 从 8253 读取的状态信息,包括某时刻的实时计数值。 (2) 读/写控制逻辑 控制 8253 的片选及对内部相关寄存器的读/写操作,它接收 CPU 发来的地址信号以实 现片选、内部通道选择以及对读/写操作进行控制。 (3) 控制字寄存器 在 8253 的初始化编程
4、时,由 CPU 写入控制字,以决定通道的工作方式,此寄存器只能 写入,不能读出。 (4) 计数通道 0#、1#、2#: 这是三个独立的,结构相同的计数器/定时器通道,每一个通道包含一个 16 位的计数 寄存器,用以存放计数初始值,一个 16 位的减法计数器和一个 16 位的锁存器,锁存器在 计数器工作的过程中,跟随计数值的变化,在接收到 CPU 发来的读计数值命令时,用以锁 存计数值,供 CPU 读取,读取完毕之后,输出锁存器又跟随减 1 计数器变化。 (5) 8253 外部引脚 8253 芯片是具有 24 个引脚的双列直插式集成电路芯片,其引脚分布如图所示。8253 芯 片的 24 个引脚分
5、为两组,一组面向 CPU,另一组面向外部设备,各个引脚及其所传送信号 的情况,介绍如下: 1D7D0:双向、三态数据线引脚,与系统的数据线连接,传送控制、数据及状态信息。 2 :来自于 CPU 的读控制信号输入引脚,低电平有效。RD 3 :来自于 CPU 的写控制信号输入引脚,低电平有效。W 4 :芯片选择信号输入引脚,低电平有效。CS (6). 8253 端口地址 (2)8255 原理 8255 有 3 种工作方式:方式 0,方式 1,方式 3,本次设计用方式 0。在这种方式下,任何一个端口 可以通过方式控制字规定作为输入口,也可作为输出口; 8255A 有两个控制字:方式选择控制字和端口
6、C 置位/复位控制字。方式选择控制字的最高位总是 1,而端口 C 置位复位控制字的最高位总是 0,用来 区分两个控制字。 8255 初始化方式如下图 5.系统分析 (1)系统原理 在了解 8253,8255 工作原理之后,我们利用 2 个开关从 8255 芯片 A 口输入不同数值, 00,01,10,11.利用编程区分 4 中状态,跳入 4 个循环,即可演奏 3 首歌曲和手动电子琴。8253 则是事 先算好初值,送如计数器。每个频率可产生不同的音。每个音之间停顿相应时间,每个句子之间停顿相 应时间,即可演奏完每首歌曲。 每首歌曲和每个句子末尾有数字 1,2 判断是否停顿或者跳入下一首歌,实现每
7、首歌之间的转换。 小键盘演奏则是利用一些算法得知每个健的值会存入 al 寄存器中,利用 al 中的值,判断 al 大小, 设置数据段 7 个健值,取出响应频率设置循环即可弹奏。 (2)系统思路分析 系统从实现一个音开始,到完成一首歌的编曲,之后加入判断语句,进行第二首,第三首歌的编曲 即已完成自动播放部分。之后单独进行小键盘分析,取出主要部分,判断出运作原理利用最终 al 的值进 行频率换算。融入前一部分完成的歌曲中,反复调试完成。 6.系统流程图 8253、8255 初始化 判断开关状态 00:电子琴键盘 01:小星星 10:两只老虎 11:欢乐颂 01,10,11 电子播放器 00:电子琴
8、程序 开始 统一取节奏偏移地址 8253 计数器 0 赋初值, 得频率,发声,延时 1 读入键码并判断 17 之 间? 否 是 关闭扬声器一次,延时 2 判断键入? 否 是 歌曲结束,判断开关 8253 计数器 0 赋初值, 得频率,发声,延时 歌曲结束,判断开关 3实验总结 1.实验要点和问题分析 (1)计数值足够,所以只采用 1 个计数器,计数初值在程序中计算不便,所以定义数据段,根据 clk0 的频率和要产生的频率,计算初值,写入数据段; (2)改变开关状态,读入数据相应跳转,3 首固定歌曲都跳入同一循环 W1 进行演唱,简短程序; (3)演唱完一首歌曲才可以进入下首歌曲,所以要在这首歌
9、曲演唱完之前,改变开关状态; (4)每首歌曲句末为 1,2 是判断是否加停顿和换歌; (4)为防止程序太长,超出跳转地址,每次判断都跳到 Wo 处,简短程序; (6)小键盘的程序需要看懂如何判别是那个健,最终值存入 al 中,根据 al 的值为 1-7 定义数据段 1-7 的频率,用 si+al*2 的值作为地址即可取出相应频率。 (7)1-7 之外的数据不要等待,1-7 的键入后,去掉停顿,按键长按则一直发生,可控制长短调。 2.实验心得 本次试验从最开始的尝试到最后全部完成,历经很长时间,做了很多努力,让我们都非常欣慰,在 做实验的过程中,不断尝试,优化,大大提高了我们的团队合作能力和专业
10、知识的掌握,关键是学和玩 相结合,设计的过程虽然有点辛苦,但都很开心,我认为这点很重要。希望每次的实验都可以从兴趣而 发,以乐趣结束,不再为书本而苦恼。相信我们会越做越好。另外感谢老师的耐心指导,给了我们很大 的帮助。本次课设圆满成功。 四参考文献 微机原理及应用 马平 姚万业 王柄谦 中国电力出版社 2003 年 4 月第一版 附录 程序代码设计 DATA SEGMENT TIME_CTR EQU 0A003H ;8253 地址 TIME_R0 EQU 0A000H TIME_R1 EQU 0A001H OUTBIT equ 09002h ; 位控制口 IN_KEY equ 09001h ;
11、 键盘读入口 Music dw 0,3816,3401,3030,2865,2551,2273,2024 KeyTable: ; 键码定义 db 16h, 15h, 14h, 0ffh db 13h, 12h, 11h, 10h db 0dh, 0ch, 0bh, 0ah db 0eh, 03h, 06h, 09h db 0fh, 02h, 05h, 08h db 00h, 01h, 04h, 07h FREQ1 DW 2,3816,3816,2551,2551,2273,2273,2551,2 ;小星星 DW 2865,2865,3030,3030,3401,3401,3816,2 DW 2
12、551,2551,2865,2865,3030,3030,3401,2 DW 2551,2551,2865,2865,3030,3030,3401,2 DW 3816,3816,2551,2551,2273,2273,2551,2 DW 2865,2865,3030,3030,3401,3401,3816,1 FREQ2 DW 2,3816,3401,3030,3816,3816,3401,3030,3816,2 ;两只老虎 DW 3030,2865,2551,2,3030,2865,2551,2 DW 2551,2273,2551,2865,3030,3816,2 DW 2551,2273,
13、2551,2865,3030,3816,1 FREQ3 DW 2,3030,3030,2865,2551,2551,2865,3030,3401,3816,3816 ;欢乐颂 DW 3401,3030,3030,3401,3401,2 DW 3030,3030,2865,2551,2551,2865,3030,3401,3816,3816 DW 3401,3030,3401,3816,3816,1 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AL,00110111B ;8253 初
14、始化 MOV DX,TIME_CTR OUT DX,AL MOV DX,8003H ;8255 初始化 MOV AL,90H OUT DX,AL W0: MOV DX,8000H ;开关判断 IN AL,DX AND AL,03H CMP AL,0 JNA MLoop ;电子琴 CMP AL,01H JNA SONG1 ;歌曲 1 CMP AL,02H JNA SONG2 ;歌曲 2 JMP SONG3 ;歌曲 3 SONG1: LEA SI,FREQ1 JMP W1 SONG2: LEA SI,FREQ2 JMP W1 SONG3: LEA SI,FREQ3 JMP W1 W1: MOV A
15、X,SI ;取节奏 MOV DX,TIME_R0 OUT DX,AL MOV AL,AH OUT DX,AL INC SI INC SI CALL DELAY1 MOV AX,2 ;关扬声器一次 MOV DX,TIME_R0 OUT DX,AL MOV AL,AH OUT DX,AL CALL DELAY2 CMP SI, 2 ;判断句停顿 JZ W2 CMP SI,1 ;判断歌曲是否结束 JNZ W1 JMP W0 ;若歌曲结束 重新判断 W2: CALL DELAY2 JMP W1 DELAY1 PROC NEAR ;音长 MOV BX,400 LP1:MOV CX,200 LP2:LOO
16、P LP2 DEC BX JNZ LP1 RET DELAY1 ENDP DELAY2 PROC NEAR ;字间隔 MOV BX,100 LP11:MOV CX,200 LP22:LOOP LP22 DEC BX JNZ LP11 RET DELAY2 ENDP MLoop: call TestKey ; 有键入? je MLoop ; 无键入, 继续显示 call GetKey ; 读入键码 cmp al,1 ;判断键盘是否为 17 jl MLoop cmp al,7 ja MLoop mov si,offset Music ;取键盘节奏首地址 mov ah,0 mov bx,ax add
17、 bx,bx ;dw 字 mov ax,bx+si mov dx,0a000h ;8253 计数器 0 初值 out dx,al mov al,ah out dx,al call delay MOV AX,2 ;关扬声器一次 MOV DX,0a000h OUT DX,AL MOV AL,AH OUT DX,AL JMP W0 ;判断开关 TestKey proc near mov dx, OUTBIT mov al, 0 out dx, al ; 输出线置为 0 mov dx, IN_KEY in al, dx ; 读入键 not al and al, 0fh ; 高四位不用 ret Test
18、Key endp GetKey proc near mov ch, 00100000b mov cl, 6 KLoop: mov dx, OUTBIT mov al, ch ; 找出键所在列 not al out dx, al shr ch, 1 mov dx, IN_KEY in al, dx not al and al, 0fh jne Goon_ ; 该列有键入 dec cl jnz KLoop mov cl, 0ffh ; 没有键按下, 返回 0ffh jmp Exit1 Goon_: dec cl shl cl, 2 ; 键值 = 列 X 4 + 行 mov ch, 4 LoopC:
19、 test al, 1 jnz Exit1 shr al, 1 inc cl dec ch jnz LoopC Exit1: mov dx, OUTBIT mov al, 0 out dx, al mov ch, 0 mov bx, offset KeyTable add bx, cx mov al, bx ; 取出键码 ret GetKey endp delay PROC NEAR ;按键音长 push bx MOV BX,200 LP13:MOV CX,200 LP23:LOOP LP23 DEC BX JNZ LP13 pop bx RET delay ENDP CODE ENDS END START