回 帖 发 新 帖 刷新版面

主题:求助编写程序,运行时使PC机成为一架可弹奏的“钢琴”。

3、编写程序,程序运行时使PC机成为一架可弹奏的“钢琴”。当按下数字键0~9时,发出6,7,1,2,3,4,5,6,7,i,十个音调,按‘.’则退出“钢琴”状态。

设计提示:
1)PC机扬声器电路图如下:
61H端口第1位
61H端口第0位          8253        与门        放大器        扬声器
                      定时器2
计数值(地址42H)            控制字
(先送低位,再送高位)      (地址43H)
通过给8253定时器装入不同的计数值,可以使其输出不同频率的波形,当与门打开后,经过放大器放大的作用,便可驱动扬声器发出不同频率的音调。要使该音调的声音持续一段时间,只要插入一段延时程序,之后再将扬声器切断(关闭与门)。
另外,要使计算机成为可弹奏的钢琴,需要使用系统调用的01H功能以接收键入字符,并且要建立一张表,使键入字符与频率值构成一个对应关系。
2)程序框图:
键入字符    9     0     1     2    3      4      5     6       7    8
音  符    6     7       1     2    3      4    5     6       7    i
频率值  440   494      524    588  660     698    784   880      988   1048    

接收键入字符
        ↓
是‘.‘键?   到    Y到结束
        ↓N
键入字符值转化为查表偏移量→BX            结束
                ↓
常数120000H作被除数→(DX,AX)
                ↓
      查表得频率值作为除数
                ↓
     相除结果作为计数初值→BX
                ↓
    设置8253计数器2的工作模式
                ↓
          装入计数初值
                ↓
            打开与门
                ↓
          延迟一段时间
                ↓
             关闭与门

回复列表 (共2个回复)

沙发

DATA SEGMENT
WORDS1 DB 'THIS IS A ELECTRONIC PIANO,INPUT 1-8!','$'
WORDS2 DW 524,588,660,698,784,880,988,1048
DATA ENDS
CODE SEGMENT
         ASSUME CS:CODE,DS:DATA
START:  MOV AX,DATA
          MOV DS,AX
         MOV BX,0H
         MOV DX,OFFSET WORDS1
          MOV AH,09H
          INT 21H                        ;显示WORDS1
         CALL CR  
   P1:   MOV AH,01H                       ;输入字符
          INT 21H
          CMP AL,0DH                   ;回车就可以退出
          JZ  EXIT
         CMP AL,31H                       ;非1到8的数忽略
         JL  P1
         CMP AL,38H
         JG  P1
          SUB AL,31H                   ;ASCII码转为实际数值
         SHL AL,1H                            ;乘以2是因为表中存储的
                                           ;都是双字节的数
          MOV BL,AL                   ;键入的字符植转化为查表偏移量
         MOV DI,WORDS2[BX]         ;表中的数值传给DI寄存器
         CALL SINGING
          JMP P1
   EXIT: MOV AH,4CH
          INT 21H
   SINGING PROC                    ;发音的子程序
        MOV SI,02FFH
        MOV AL,0B6H                 ;B6H=10110110第二个计数器,
                                   ;先读低八位,再读高八位
        OUT 43H,AL    
        MOV DX,12H
        MOV AX,34DCH                ;被除数为34DCH
        DIV DI        
        OUT 42H,AL                   ;记数的初值存入计数器中
        MOV AL,AH
        OUT 42H,AL
        IN AL,61H                     ;读喇叭的端口地址61H
        MOV AH,AL
        OR AL,3                       ;打开与门
        OUT 61H,AL
        DELAY:   MOV CX,0FFFFH
            P2:   LOOP P2             ;做了一个延时
                  DEC SI
                  JNZ DELAY
                  MOV AL,AH
                  OUT 61H,AL         ;关闭与门
                  RET
    SINGING ENDP
CR:    MOV DL,0DH                  ;这里是换行
       MOV AH,02H
       INT 21H
       MOV DL,0AH
       INT 21H
       RET
CODE ENDS

板凳

你好。你做出来了吗?

我来回复

您尚未登录,请登录后再回复。点此登录或注册