微机实验之电子琴制作

来源:互联网 发布:医院诊断书生成器软件 编辑:程序博客网 时间:2024/04/30 04:35
微机实验之电子琴制作

http://blog.csdn.net/u012062327
一、实验目的

       (1)学习、掌握部分DOS功能调用使用方法;
       (2)学习用8254使蜂鸣器发声的编程方法;
       (3)学习LED点阵扫描显示程序的设计方法。

二、实验设备

       PC机一台,TD-PIT++实验装置一套

三、实验内容及原理

      1)内容:用户在键盘输入1--7,蜂鸣器则发出do--si音符;在键盘上输入A--G则可选择A--G调;在LED点阵显示音符(do--si)。

      2) 原理:
           a) DOS功能调用(INT 21H)
              显示字符串              入口:AH=09H;   调用参数:DS:DX=串地址,‘$’为结束字符
              键盘输入并回显       入口:AH=01H;   返回参数:AL=输出字符
                  
           b) 8254中的计数器工作在方式3(方波发生器),计数器的初值不同,就可产生不同频率的方波,用这些方                         波信号来驱动蜂鸣器就可得到do--si音
                  
           c) LED点阵为16X16共阴极

四、实验步骤

      (1)实验板接线
      (2)利用取模软件,获得do--si的字库文件
      (3)画流程图、编写程序

      实验程序:
INCLUDE yinyue.inc  .386P      IOY1           EQU   3040H      IOY0           EQU   3000H         ;片选IOY0对应的端口始地址MY8254_COUNT0  EQU   IOY0+00H*4   ;8254计数器0端口地址MY8254_COUNT1  EQU   IOY0+01H*4   ;8254计数器1端口地址MY8254_COUNT2  EQU   IOY0+02H*4   ;8254计数器2端口地址MY8254_MODE    EQU   IOY0+03H*4   ;8254控制寄存器端口地址                              STACK1 SEGMENT STACK        DW 256 DUP(?)STACK1 ENDS             DATA SEGMENT USE16        A  DW   0,441,495,556,589,661,742,833          B  DW   0,495,556,624,661,742,833,935        C  DW   0,262,294,330,350,393,441,495         D  DW   0,294,330,371,393,441,495,556        E  DW   0,371,416,441,467,525,589,661        F  DW   0,350,393,441,467,525,589,661        G  DW   0,393,441,495,525,589,661,742             MES1 DB  '--usage:',0AH,0DH,'  first, you should input A,B...or G to chose the tone' ,0AH,0DH,'  second,click 1(do) ..7(si)to play music',0AH,0DH,'  third,if you want to quit playing,please click ESC or click ENTER to chose the tone again',0AH,0DH,, '$'      STR1 DB  'please input  A,B,C,D,E,F, 0R G',0AH,0DH, '$'      STR2 DB  0AH,0DH,'you can play music',0AH,0DH, '$'       B1   DW  0      ADDR DW  0      YIN  DW  0      LB   DB  ?DATA ENDSCODE SEGMENT USE16     ASSUME  CS:CODE,DS:DATASTART: MOV AX,DATA       MOVDS,AX       MOV  DX,OFFSET MES1         ;show message   MOVAH,09H   INT 21H           MOV ADDR,OFFSET HZDOT                  BEGIN:MOV DX,OFFSET STR1      MOV AH,09H      INT 21H              ;输出字符串1             MOV SI,OFFSET A     ;装入频率表A起始地址            MOV AH,01H      INT 21H              AND AL,0FH       SUB AL,1          MOV BL,16      MUL BL      ADD SI,AX           ;A..G起始地址      MOV B1,SI                        MOV DX,OFFSET STR2      MOV AH,09H      INT 21H              ;输出字符串2PLAY: MOV DX,MY8254_MODE          ;初始化8254工作方式      MOV AL,36H                  ;定时器0、方式3      OUT DX,AL      MOV AH,01H      INT 21H                                 ;读取键盘上输入的数字      CMP AL,27      JZ QUIT                    ;ESC的时候退出            CMP AL,13                  ;点击ENTER ,选调      JZ  BEGIN             AND AL,0FH      MOV BL,AL      SUB BL,1      MOV LB,BL            XOR AH,AH                ;获得哪个音1-7      MOV BL,2      MUL BL       ADD SI,AX                 ;把偏移量给SI                     MOV DX,0FH                  ;输入时钟为1.0416667MHz,1.0416667M = 0FE502H        MOV AX,0E502H             DIV WORD PTR [SI]       ;取出频率值计算计数初值,0F4240H / 输出频率        MOV DX,MY8254_COUNT0      OUT DX,AL                   ;装入计数初值      MOV AL,AH      OUT DX,AL                     XOR AH,AH      MOV AL,LB      MOV BL,32      MUL BL      MOV YIN,AX      CALL DALLY            MOV AX,ADDR      ADD AX,YIN      MOV SI,AX      MOV  CX,29H          ;控制一屏显示时间LOOP2:CALL DSPLMSC      SUB  SI,32        LOOP LOOP2      MOV DX,MY8254_MODE      MOV AL,01H      OUT DX,AL       MOV SI,B1      JMP PLAY                     QUIT: MOV DX,MY8254_MODE       ;设置8254为方式0,out0置0      MOV AL,10H      OUT DX,AL      MOV AX,4C00H                ;结束程序退出      INT 21HDALLY PROC                        ;延时子程序D0:   MOV CX,0F00HD1:   MOV AX,0FFFFHD2:   DEC AX      JNZ D2      LOOP D1      JNZ D0      RETDALLY ENDPDALLY1 PROC      MOV AX,0FFFFH      D3: DEC AX          JNZ D3      RETDALLY1 ENDPDSPLMSC PROC;显示 1 屏汉字子程序        PUSHCX        MOV CX,16        MOVBX,0FFFEHLOOP1:  MOV  AL,BYTE PTR[SI]         MOV  AH,BYTE PTR[SI+1]        ROL  EAX,16        MOV  AX,BX         ADD  SI,2        ROL  BX,1        NOT  EAX        MOV  DX,IOY1        OUT  DX,EAX         CALL DALLY1L1:     LOOP LOOP1        POP  CX                         RETDSPLMSC ENDP             CODE  ENDS      END START

yinyue.inc
DATA SEGMENTC444F  EQU  00000H;DO C5245  EQU  C444F+1;RE C4D49  EQU  C5245+1;MI C4641  EQU  C4D49+1;FA C534F  EQU  C4641+1;SO C4C41  EQU  C534F+1;LA C5349  EQU  C4C41+1;SI HZDOT:;DO   C444FDB 000H,000H,000H,000H,01FH,01CH,036H,036H,066H,063H,066H,063H,066H,063H,066H,063HDB 066H,063H,066H,063H,036H,036H,01FH,01CH,000H,000H,000H,000H,000H,000H,000H,000H;RE   C5245DB 000H,000H,000H,000H,03FH,07FH,066H,066H,066H,046H,066H,016H,03EH,01EH,036H,016HDB 066H,006H,066H,046H,066H,066H,067H,07FH,000H,000H,000H,000H,000H,000H,000H,000H;MI   C4D49DB 000H,000H,000H,000H,063H,03CH,077H,018H,07FH,018H,07FH,018H,06BH,018H,063H,018HDB 063H,018H,063H,018H,063H,018H,063H,03CH,000H,000H,000H,000H,000H,000H,000H,000H;FA   C4641DB 000H,000H,000H,000H,07FH,008H,066H,01CH,046H,036H,016H,063H,01EH,063H,016H,07FHDB 006H,063H,006H,063H,006H,063H,00FH,063H,000H,000H,000H,000H,000H,000H,000H,000H;SO   C534FDB 000H,000H,000H,000H,03EH,01CH,063H,036H,063H,063H,006H,063H,01CH,063H,030H,063HDB 060H,063H,063H,063H,063H,036H,03EH,01CH,000H,000H,000H,000H,000H,000H,000H,000H;LA   C4C41DB 000H,000H,000H,000H,00FH,008H,006H,01CH,006H,036H,006H,063H,006H,063H,006H,07FHDB 006H,063H,046H,063H,066H,063H,07FH,063H,000H,000H,000H,000H,000H,000H,000H,000H;SI   C5349DB 000H,000H,000H,000H,03EH,03CH,063H,018H,063H,018H,006H,018H,01CH,018H,030H,018HDB 060H,018H,063H,018H,063H,018H,03EH,03CH,000H,000H,000H,000H,000H,000H,000H,000HDATA ENDS


      
0 0
原创粉丝点击