1 设计任务描述1.1设计题目:简易电子琴设计1.2设计内容利用微机原理试验箱,设计简易电子琴,要求至少可以弹出7个音阶。
1.2.1设计目的通过本学期对微机原理的学习,掌握的知识还停留在理论的上。
但是这是一门实践性较强的课程,让学生在学完该课程之后,进行一次课程设计,使学生将课堂所学的知识和实践有机结合起来,初步掌握计算机应用系统设计的步骤和接口设计的方法,提高分析和解决实际问题的能力。
通过设计实践,培养学生查阅专业资料,工具书或参考书,了解有关工业标准,掌握现代设计手段和软件工具,并能以图纸和说明书表达设计思想和结果的能力。
通过设计,不但要培养和提高学生解决工程具体问题,动脑动手的技术工作能力,而且还要逐步建立科学正确的设计和科研思想,培养良好的设计习惯,牢固树立实事求是和严肃认真的工作态度。
1.2.2基本要求1.可以弹出7个音阶。
2.弹奏简短音乐。
3.通过改变键盘输入来改变8254输出频率,实现扬声器发音2 设计思路通过8255和8254来实现电子琴模拟, 主要由两部分组成:第一部分为键盘扫描,用来确定按键位置,并给计数器赋初值。
第二部分为发声部分,由计数器1#的输出端产生一定频率的方波驱动扬声器发声。
其中8254和课本中学的8253在原理上是一样的,它为可编程定时器/计数器。
利用计数器0,并使它工作在方式3---输出对称方波,通过改变频率来实现不同的发声高低,再调用延时子程序来实现发音的长短,把输出方波送到扬声器,至此实现不同的音符发声。
过程中主要用到了8255芯片的PB0—PB4,PA—PA4它们分别与键盘单元的X 1—X4,Y1—Y4相连,其中B口低4位为输出端,B口低4位1为输入端。
由它们对键盘单元进行扫描,并确定键值工作过程为:先给所有列线输入低电平,然后读取行线,检测行线是否为低电平,如果有某条行线输出低电平,则说明该键盘有按键被按下,否则,说明无按键被按下.采用这种方法可以快速判断键盘是否有键按下。
在检查到有键按下后,再通过行扫描法判断按下的位置,从而确定按下的是什么键,经过计算得出计数器1#的初值。
3 设计原理流程图4 实际硬件接线图5 源程序清单及注释MY8255_A EQU 0600HMY8255_B EQU 0602HMY8255_C EQU 0604HMY8255_MODE EQU 0606HMY8254_MODE EQU 06C6HMY8254_A EQU 06C0H ;进行宏定义DATA SEGMENTFREQ_LIST DW 441D,495D,556D,589D,661D,742D,833D,882DDW 262D,294D,330D,373D,402D,450D,494D,-1DDATA ENDS ;建立数据段CODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AX ;实现段寄存器DS的初始化MOV DX,MY8255_MODEMOV AL,81HOUT DX,AL ;写8255芯片的控制字实现工作在方式0,A端口和B端口输出,C端口输入MOV DX,MY8254_MODEMOV AL,36HOUT DX,AL ;使8254工作在方式3,A口输入,运用计数器0,二进制方式BEGIN: CALL CCSCAN ;扫描JNZ INK1 ;有键按下时跳到INK1JMP BEGIN ;没键按下时循环执行BEGIN确定按下键的位置INK1: CALL CCSCANJNZ INK2 ;有键按下时跳到INK2JMP BEGIN ;没键按下时循环执行BEGIN INK2: MOV CH,0FEH ;确定按下键在第一列MOV CL,00H ;将CL清零COLUM: MOV AL,CHMOV DX,MY8255_A ;将8255的A口地址赋给DXOUT DX,AL ;将CPU中的AL值送到8255的A口中,即送到x1、x2、x3、x4中MOV DX,MY8255_C ; 将8255的C口地址赋给DXIN AL,DX ;将C口的值送到AL中L1: TEST AL,01H ;检验按下键是否在L1 JNZ L2 ;不是L1则跳到L2MOV AL,00H ;为了后面用来与FREQ_LIST数据段中数对应JMP KCODE ;强制跳转到KCODEL2: TEST AL,02H ;检验按下键是否在L2 JNZ L3 ;不是L2则跳到L3MOV AL,04H ;为了后面用来与FREQ_LIST数据段中数对应。
JMP KCODE ;强制跳转到KCODEL3: TEST AL,04H ;检验按下键是否在L3 JNZ L4 ;不是L3则跳到L4MOV AL,08H ;为了后面用来与FREQ_LIST数据段中数对应。
JMP KCODE ;强制跳转到KCODEL4: TEST AL,08H ;检验按下键是否在L4 JNZ NEXT ;不是L4则跳到NEXTMOV AL,0CH ;为了后面用来与FREQ_LIST数据段中数对应。
KCODE: ADD AL,CL ;实现AL与CL的无进位加法MOV DL,2DMUL DL ;将AL乘以2结果保存到AX中PLAY: MOV SI,OFFSET FREQ_LIST ; 使SI指向FREQ_LIST的首地址ADD SI,AX ;通过SI加AX 实现指针SI的移动MOV DX,0FHMOV AX,4240H ;被除数为0F4240HDIV WORD PTR[SI] ;除数为SI所指的数据MOV DX,MY8254_A ;将8255的A口地址赋给DXOUT DX,AL ;输出商的低4位MOV AL,AHOUT DX,AL ;输出商的高4位MOV CX,8D ;输入计数值CXNEXT3: CALL DALLY ;调用延时子程序DALLY CALL DALLYCALL DALLYCALL DALLYCALL DALLYLOOP NEXT3 ;CX不为0重复执行NEXT3MOV DX,0FHMOV AX,4240H ;被除数为0F4240HMOV SI ,30DDIV WORD PTR[SI] ;除数为SI=30所指的数据MOV DX,MY8254_A ;将8255的A口地址赋给DXOUT DX,ALMOV AL,AHOUT DX,AL ; 实现静音,结束一个音符的发音JMP BEGIN ;跳转到BEGIN,重复扫描NEXT: INC CL ;使CL加1,为了后面用来与FREQ_LIST数据段中数对应MOV AL,CHTEST AL,08HJZ KERR ;无键按下时跳转到KERRROL AL,1D ;向左移位MOV CH,ALJMP COLUM ;强制跳转到COLUMKERR: JMP BEGIN ;跳到BEGIN重新开始扫描键盘扫描子程序CCSCAN: MOV AL,00HMOV DX,MY8255_AOUT DX,AL ;使8255芯片A端口输出为0,既使x1、x2、x3、X4为0 MOV DX,MY8255_CIN AL,DX ;将从C端口输入的y1、y2、y3、y4送到AL中NOT AL ;将AL取反AND AL,0FH ;将AL前4位清零RET延时子程序DALLY: PUSH CX ;将CX压栈MOV CX,000FHT1: MOV AX,0009FHT2: DEC AX ;使AX减1JNZ T2 ;AX不为0重复T2LOOP T1 ;CX不为0重复T1POP CX ;将CX出栈RETCODE ENDS ;代码段定义结束END START ;程序结束6 主要元器件介绍6.1 8255简介6.1.1 8255引线图可编程并行接口8255引线图6.1.2 8255引脚功能RESET:复位输入线,当该输入端外于高电平时,所有内部寄存器(包括控制寄存器)均被清除,所有I/O口均被置成输入方式。
CS:片选信号线,当这个输入引脚为低电平时,表示芯片被选中,允许8255与CPU进行通讯。
RD:读信号线,当这个输入引脚为低电平时,允许8255通过数据总线向CPU 发送数据或状态信息,即CPU从8255读取信息或数据。
WR:写入信号,当这个输入引脚为低电平时,允许CPU将数据或控制字写入8255。
D0~D7:三态双向数据总线,8255与CPU数据传送的通道,当CPU 执行输入输出指令时,通过它实现8位数据的读/写操作,控制字和状态信息也通过数据总线传送。
PA0~PA7:端口A输入输出线,一个8位的数据输出锁存器/缓冲器,一个位的数据输入锁存器。
PB0~PB7:端口B输入输出线,一个8位的I/O锁存器,一个8位的输入输出缓冲器。
PC0~PC7:端口C输入输出线,一个8位的数据输出锁存器/缓冲器,一个8位的数据输入缓冲器。
端口C可以通过工作方式设定而分成2个4位的端口,每个4位的端口包含一个4位的锁存器,分别与端口A和端口B配合使用,可作为控制信号输出或状态信号输入端口。
A1、A0:端口地址总线,8255中有端口A、B、C和一个内部控制字寄存器,共4个端口,由A0、A1输入地址信号来寻址。
本实验用到的引脚有PA0-PA3、PC0-PC3、D0-D7、A0、A1、WR、RD、CS 、和GND6.1.3 8255的工作方式(1)基本输入/输出方式(方式0)相当于三个独立的8位简单接口各端口既可设置为输入口,也可设置为输出口,但不能同时实现输入及输出 C端口可以是一个8位的简单接口,也可以分为两个独立的4位端口常用于连接简单外设(适于无条件或查询方式)方式0的应用常使A端口和B端口作为8位数据的输入或输出口,使C口的某些位作状态输入(2)选通工作方式(方式1)利用一组选通控制信号控制A端口和B端口的数据输入输出A口、B口作输入或输出口,C口的部分位用作选通控制信号A口、B口在作为输出和输入时的选通信号不同8255方式1的输出信号定义及时序图8255方式1的输入信号定义及时序图方式1的应用方式1主要用于中断控制方式下的输入输出 C口的8位除用作选通信号外,其余位可工作于方式0下,作为输入或输出口(3)双向传送方式(方式2)双向输入输出方式-------可以既作为输入口,又作为输出口只有A端口可工作在方式2下8255方式2的信号定义及时序图方式2的应用可使A端口作为双向端口用于中断控制方式当A口工作于方式2时,B口可工作于方式1(此时C口的所有位都用作选通控制信号的输入输出),也可工作于方式0(此时C口的剩余位也可工作于方式0)6.2 8254简介:6.2.1 简介8254具有3个独立的16位计数器,6种不同的工作方式。
计数寄存器用来寄存计数初值,计数工作单元为16位减1计数器,它的初值便是计数寄存器内容,计数单元对CLK脉冲计数,每出现一个CLK脉冲,计数器减1,当减为零时,通过OUT输出指示信号表明计数单元已为零。