微机原理课程设计课题:电子发声设计实验专业:学号:姓名:一、课题名称及设计组成员二、课题内容及要求课题名:电子发声设计实验1、要求:根据实验提供的音乐频率表和时间表,编写程序控制8254,使其输出连接到扬声器上能发出相应的乐曲。
要求至少要完成下列项目的一项(1)可播放两首不同的乐曲(2)根据不同的按键播放不同的音乐(3)可改变音乐的音调(4)可显示播放乐曲的名称2、所设计的电路实现的功能:设计中完成了实验要求中提出的要求。
设计中实现了,用按键进行随时切换两首音乐(友谊地久天长,两只老虎)和对所播放的当前音乐进行两种不同音调(中音和低音)的随时切换的控制操作,其中用总开关K_7进行播放开关的总控制,开关K_0用于音乐播放的选择,开关K_1用于对当前播放音乐的音调进行选择。
设计中还实现了对16×16的LED 管的控制运用点阵汉字输出歌名。
三、方案、系统组成框图和工作原理说明1、设计方案及原理:本设计中音乐播放控制为利用对8255和8254芯片的控制操作得以实现。
音乐名的输出为利用总线对16×16点阵地控制来实现。
(1)本设计中PC发声系统以8254的计数器0为核心。
系统初始化时,计数器0工作在方式3的“方波发声器”方式,同过将音乐频率转换为相应的计数初值,改变计数器0的计数初值就可以使扬声器发出不同的频率的音响。
(2)发生系统控制为受8255芯片控制,外界通过改变对8255芯片的PA口的不同输入来实现播放功能上的选择。
(3)演奏但音符,为利用一个音符对应一个频率,将与一个频率对应的计数初值写入计数器0,扬声器就发出相应的音调。
计数器初值的计算公式为:计数初值=1MHZ÷输出频率,其中1MHZ转换为16进制为0F4240H。
(4)控制音符的演奏时间,是通过每一个音符规定一个“单位时间”:单位时间×N=音符的演奏时间。
其中,N为调试参数,一首歌只有一个调试参数。
2、系统组成(电路图):图1. 对8254与系统的连接图2.对8255单元的连接图3.点阵汉字的接线四、程序功能描述及程序流程(1)程序功能描述:如程序流程图所示。
程序下载链接、并运行后,开始通过对外界按键扫描,来检查应进行采取的操作,根据外界不同的输入,完成不同的程序跳转,从而实现相应的播放功能。
其中K0、K1为外界电子控制单元。
分为0和1,即低电平和高电平。
(2)程序流程图:五、程序源代码及注释1.在LED单元中显示歌曲名称ROW1 EQU 0600H ;端口定义ROW2 EQU 0640HCOL1 EQU 0680HCOL2 EQU 06C0HSTACK1 SEGMENT STACKDW 256 DUP(?)STACK1 ENDS;定义为数据段INCLUDE HZDOTht.ASM ;数据字段为汉字点阵库, 在HZDOTht.ASM;文件中CODE SEGMENTASSUME CS:CODE, DS:DATASTART: MOV AX, DATAMOV DS, AXMOV DX, ROW1MOV AL, 00HOUT DX, ALMOV DX, ROW2OUT DX, ALMOV AL, 0ffHMOV DX, COL1OUT DX, ALMOV DX, COL2OUT DX, ALBG0: MOV AX, 160MOV SI, OFFSET HZDOThtBG1: CALL DISPADD SI, 2DEC AXJZ BG0JMP BG1;======显示汉字子程序======;入口参数: SI = 存放汉字起始地址DISP: MOV CX, 000FHPUSH AXML0: PUSH CXMOV BL, 01HMOV CX, 0008HML1: MOV DX, ROW1 ;控制0--7行MOV AL, 00HOUT DX, ALMOV AL, [SI]not alMOV DX, COL1 ;0--7列OUT DX, ALINC SIMOV AL, [SI]not alMOV DX, COL2 ;8--15列OUT DX, ALINC SIMOV DX, ROW1 ;控制0--7行MOV AL, BLOUT DX, ALROL BL, 1CALL DELAYLOOP ML1MOV DX, ROW1MOV AL, 00HOUT DX, ALMOV CX, 0008HML2: MOV DX, ROW2 ;控制8--15行MOV AL, 00HOUT DX, ALMOV AL, [SI]not alMOV DX, COL1 ;0--7列OUT DX, ALINC SIMOV AL, [SI]not alMOV DX, COL2 ;8--15列OUT DX, ALINC SIMOV DX, ROW2 ;控制8--15行MOV AL, BLOUT DX, ALROL BL, 1CALL DELAYLOOP ML2MOV DX, ROW2MOV AL, 00HOUT DX, ALSUB SI, 32POP CXLOOP ML0POP AXRETDELAY: PUSH CX ;延时子程序MOV CX, 0100HDL1: PUSH AXPOP AXLOOP DL1POP CXRETCODE ENDSEND START此程序中8255芯片和点阵LED单元的连接,用来实现在点阵LED显示单元来显示汉字的功能。
通过调用汉字存放单元的地址,在LED单元中可以显示出流动的字体。
此程序实现的字体是“友谊天长地久”。
2.此程序用来实现程序流程图中所示的功能,即通过开关来控制播放曲目的的切换和音调的改变。
IOY3 EQU 06C0HMY8254_COUNT0 EQU IOY3+00H ;8254计数器0端口地址MY8254_COUNT1 EQU IOY3+02H ;8254计数器1端口地址MY8254_COUNT2 EQU IOY3+04H ;8254计数器2端口地址MY8254_MODE EQU IOY3+06H ;8254控制寄存器端口地址IOY0 EQU 0600HMY8255_A EQU IOY0+00HMY8255_B EQU IOY0+02HMY8255_C EQU IOY0+04HMY8255_MODE EQU IOY0+06HSTACK1 SEGMENT STACKDW 256 DUP(?)STACK1 ENDSDA TA SEGMENTFREQ_LIST DW 371,495,495,495,624,556,495,556,624 ;第一首歌频率表DW 495,495,624,742,833,833,833,742,624DW 624,495,556,495,556,624,495,416,416,371DW 495,833,742,624,624,495,556,495,556,833DW 742,624,624,742,833,990,742,624,624,495DW 556,495,556,624,495,416,416,371,495,0TIME_LIST DB 4, 6, 2, 4, 4, 6, 2, 4, 4 ;第一首歌时间表DB 6, 2, 4, 4, 12, 1, 3, 6, 2DB 4, 4, 6, 2, 4, 4, 6, 2, 4, 4DB 12, 4, 6, 2, 4, 4, 6, 2, 4, 4DB 6, 2, 4, 4, 12, 4, 6, 2, 4, 4DB 6, 2, 4, 4, 6, 2, 4, 4, 12FREQ_LIST1 DW 330,371,416,330 ;第二首歌频率表DW 330,371,416,330DW 416,441,495DW 495,556,495,441,416,330DW 495,556,495,441,416,330DW 330,248,330DW 330,248,330,0TIME_LIST1 DB 4,4,4,4 ;第二首歌时间表DB 4,4,4,4DB 4,4,8DB 4,4,8DB 2,2,2,2,4,4DB 2,2,2,2,4,4DB 4,4,8DB 4,4,8FREQ_LIST2 ;第一首歌频率表变音后TIME_LIST2 ;第一首歌时间表变音后DB 4, 6, 2, 4, 4, 6, 2, 4, 4DB 6, 2, 4, 4, 12, 1, 3, 6, 2DB 4, 4, 6, 2, 4, 4, 6, 2, 4, 4DB 12, 4, 6, 2, 4, 4, 6, 2, 4, 4DB 6, 2, 4, 4, 12, 4, 6, 2, 4, 4DB 6, 2, 4, 4, 6, 2, 4, 4, 12FREQ_LIST3 ;第二首歌频率表变音后TIME_LIST3 ;第二首歌时间表变音后DB 4,4,4,4DB 4,4,4,4DB 4,4,8DB 4,4,8DB 2,2,2,2,4,4DB 2,2,2,2,4,4DB 4,4,8DB 4,4,8DA TA ENDSCODE SEGMENTASSUME CS:CODE, DS:DA TASTART: MOV AX, DATAMOV DS, AXMOV DX, MY8255_MODE ;初始化8254工作方式MOV AX,90HMOV DX,AX ;A口作为输入INPUT:MOV DX, MY8254_MODE ;初始化8254工作方式MOV AL, 36H ;定时器0、方式3OUT DX, ALMOV DX, MY8255_A ;检查输入,是否要设中断问题IN AL,DXCMP AL,80HJZ NEAR PTR BEGINCMP AL,81HJZ NEAR PTR BEGIN1CMP AL,82HJZ NEAR PTR BEGIN2CMP AL,83HJZ NEAR PTR BEGIN3JNZ INPUTBEGIN: MOV SI,OFFSET FREQ_LIST ;装入频率表起始地址MOV DI,OFFSET TIME_LIST ;装入时间表起始地址PLAY:MOV DX,MY8255_AIN AL,DXCMP AL,80HJNZ NEAR PTR INPUTMOV DX,0FH ;输入时钟为1MHz,1M = 0F4240H MOV AX,4240HDIV WORD PTR [SI] ;取出频率值计算计数初值,0F4240H / 输出频率MOV DX,MY8254_COUNT0OUT DX,AL ;装入计数初值MOV AL,AHOUT DX,ALMOV DL,[DI] ;取出演奏相对时间,调用延时子程序CALL DALL YADD SI,2INC DICMP WORD PTR [SI],0 ;判断是否到曲末?JE NEAR PTR INPUTJMP PLAYBEGIN1: MOV SI,OFFSET FREQ_LIST1 ;装入频率表起始地址MOV DI,OFFSET TIME_LIST1 ;装入时间表起始地址PLAY1:MOV DX,MY8255_AIN AL,DXCMP AL,81HJNZ NEAR PTR INPUTMOV DX,0FH ;输入时钟为1MHz,1M = 0F4240H MOV AX,4240HDIV WORD PTR [SI] ;取出频率值计算计数初值,0F4240H / 输出频率MOV DX,MY8254_COUNT0OUT DX,AL ;装入计数初值MOV AL,AHOUT DX,ALMOV DL,[DI] ;取出演奏相对时间,调用延时子程序CALL DALL YADD SI,2INC DICMP WORD PTR [SI],0 ;判断是否到曲末?JE NEAR PTR INPUTJMP NEAR PTR PLAY1BEGIN2: MOV SI,OFFSET FREQ_LIST2 ;装入频率表起始地址MOV DI,OFFSET TIME_LIST2 ;装入时间表起始地址PLAY2:MOV DX,MY8255_AIN AL,DXCMP AL,82HJNZ NEAR PTR INPUTMOV DX,0FH ;输入时钟为1MHz,1M = 0F4240H MOV AX,4240HDIV WORD PTR [SI] ;取出频率值计算计数初值,0F4240H / 输出频率MOV DX,MY8254_COUNT0OUT DX,AL ;装入计数初值MOV AL,AHOUT DX,ALMOV DL,[DI] ;取出演奏相对时间,调用延时子程序CALL DALL YADD SI,2INC DICMP WORD PTR [SI],0 ;判断是否到曲末?JE NEAR PTR INPUTJMP PLAY2BEGIN3: MOV SI,OFFSET FREQ_LIST3 ;装入频率表起始地址MOV DI,OFFSET TIME_LIST3 ;装入时间表起始地址PLAY3:MOV DX,MY8255_AIN AL,DXCMP AL,83HJNZ NEAR PTR INPUTMOV DX,0FH ;输入时钟为1MHz,1M = 0F4240H MOV AX,4240HDIV WORD PTR [SI] ;取出频率值计算计数初值,0F4240H / 输出频率MOV DX,MY8254_COUNT0OUT DX,AL ;装入计数初值MOV AL,AHOUT DX,ALMOV DL,[DI] ;取出演奏相对时间,调用延时子程序CALL DALL YADD SI,2INC DICMP WORD PTR [SI],0 ;判断是否到曲末?JE NEAR PTR INPUTJMP PLAY3DALL Y PROC ;延时子程序D0: MOV CX,0010HD1: MOV AX,0F00HD2: DEC AXJNZ D2LOOP D1DEC DLJNZ D0RETDALL Y ENDPDONE: MOV AX,4C00HINT 21HCODE ENDSEND START本程序中,分别设定了TIME_LIST1 TIME_LIST2 TIME_LIST3 和FREQ_LIST1 FREQ_LIST2 FREQ_LIST3,其中TIME_LIST是歌曲时间表,FREQ_LIST是歌曲频率表。