现在的位置: 首页 > 综合 > 正文

扬声器程序设计

2019年05月17日 ⁄ 综合 ⁄ 共 4659字 ⁄ 字号 评论关闭

实验四 扬声器程序设计

实验目的:

1.掌握8253的工作原理及其应用编程。

2.掌握8255的工作原理及其应用编程。


实验步骤:

1. 扬声器控制原理

8255的地址为:60H~63H;PB端口地址为61H,控制口为63H;

8253的地址为:40H~43H;通道2地址42H,控制口地址43H。

PC的扬声器以计数器2为核心。计数器8255CLK2的输入频率为1.193182
MHz
,工作于方式3,改变计数器初值可以由得到不同频率的方波输出。

fCLK2频率:1.1931816*1000000=12 34DE
H

若要使扬声器输出600Hz频率信号,则8253计数初值为1983。

对于600 HzN=计数初值=11931816/600=1983

对于1000 HzN=计数初值=11931816/1000=1193

改变8253的输出频率,即可改变扬声器输出声频信号频率。

1)给定8253OUT2输出频率,获取对应计数初值:

对于1000 Hz, 这里可以用除法实现计算:(DX,AX)=0012 34DE, (DI)=1000

(DX,AX)/DI

MOV DX,12H

MOV AX,34DEH

MOV DI, 1000

DIV  DI  

这样,计数初值就在AX中。

(2) 初始化8253

MOV         AL,10110110B   ;初始化,8253计数器2,模式3,初值16位,二进制

OUT         43H,AL         ;8253的控制口地址43H

MOV         AX,1983        ;计数初值=1.19MHz, 600 Hz=1983

;MOV  DX,12H

;MOV  AX,34DEH

;MOV  DI, 600

;DIV   DI

 OUT        42H, AL             ;送计数初值低位字节,8253的计数器2的地址42H

 MOV        AL, AH

 OUT        42H, AL             ;送计数初值高位字节

扬声器受8255A芯片B口的两个输出端线控制,PB0=1,即GATE2=1,计数器2正常计数;    PB1=1,打开输出控制门,扬声器工作。8255工作于方式0输出。

2.编辑

利用编辑器(记事本,也可采用其它编辑器)建立一个名为ASM4.ASM的文本文件,内容如下:程序1:

DATA    SEGMENT

        M1  DB 'hello!', 0DH, 0AH, '$'

DATA        ENDS   

CODE    SEGMENT

        ASSUME  CS:CODE, DS:DATA

START:  MOV     AX,DATA

        MOV     DS, AX

        MOV     DX, OFFSET M1

            MOV     AH, 09H

            INT     21H

W1:         MOV     AH, 0BH        ;有键按下?

            INT     21H

            CMP     AL, 00H         

        JZ      W1              ;无键按下,转W1

        MOV        AH, 08H         ;有键,读键值AL

            INT        21H

        CMP        AL, 1BH       

            JZ     STOP            ;是ESC键,退出

        CALL    SOUND           ;不是,调用SOUND

        JMP     W1

STOP:   MOV         AH, 4CH

            INT                     21H ;退出系统

SOUND  PROC    NEAR     

        MOV         AL,10110110B   ;初始化,8253计数器2,模式3,初值16位,二进制

        OUT         43H,AL         ;8253的控制口地址43H

;MOV DX,12H

;MOV AX,34DEH

;MOV DI, 600

;DIV  DI

        MOV         AX,1988        ;计数初值=1.19 MHz, 600 Hz=1988

        OUT         42H,AL             ;送计数初值低位字节,8253的计数器2的地址42H

        MOV         AL, AH

        OUT         42H,AL             ;送计数初值高位字节

;----- 8255控制程序-----

        IN      AL,61H             ;读8255的PB口原输出值,61H为PB口的地址

            MOV         AH,AL              ;保留到AH

            OR      AL,03H             ;使PB0\PB1均为1

            OUT         61H, AL             ;打开GATE2门,输出方波到扬声器

            MOV     CX,0FFFFH

DELAY:  LOOP    DELAY           ;延时                  

        MOV        AL, AH              ;取回8255的PB口原输出值

        OUT     61H,AL         ;恢复8255的PB口

            RET

SOUND   ENDP  

        CODE        ENDS

        END     START

 

 

参考程序2:

    ASSUME  CS:seg2,DS:seg1

seg1        SEGMENT

    pstart  DB  'Program start.',0DH,0AH,'$'

    pend    DB  'Program will end when input'

       DB   27H,'ESC',27H,'.',0DH,0AH,'$'

        sec DB  10

seg1        ENDS

seg2        SEGMENT

start:  MOV AX,seg1

        MOV DS,AX

        MOV DX,OFFSET pstart

        MOV AH,09H

        INT 21H

        MOV DX,OFFSET pend

        MOV AH,09H

        INT 21H

;--------------键盘控制-------------------

wait1:      MOV    AH,01H          ;输入一个字符=AL,DOS系统功能调用

        INT     21H

        CMP    AL,1BH          ;是否ESC键

        JE      keyESC

        CMP    AL,'a'         ;是a键?

        JE      keya                ;a键处理,初始化定时器8253

        CMP        AL,'b'

        JE      keyb            ;b开启扬声器

        CMP    AL,'c'

        JE      keyc            ;c关启扬声器

        CMP    AL,'d'

        JE      keyd           ;d启动定时器

        CMP        AL,'e'         

        JE      keye                ;e停止定时器

        JMP    wait1

;-----‘a’键处理,定时器8253通道2初始化,将频率转为计数初值--------

keya:  MOV    AL,10110110B   ;设定时器工作方式,方式3

        OUT    43H,AL           ;送8253的控制端口43H

        MOV    DX,0012H            ;输入频率送DX,AX

        MOV     AX,34DEH

        MOV     DI,1000             ;将频率1000Hz转换为计数初值

        DIV     DI                  ;计数初值在AX中

        OUT     42H,AL          ;计数初值送定时器2,即送42H端口

        MOV     AL,AH

        OUT     42H,AL          ;输出频率为1000HZ信号

        JMP     wait1

;------‘b’键处理,并行接口8255,扬声器开启控制--------------

keyb:  IN      AL,61H          ;读8255PB口

        OR      AL,00000010B        ; 并行接口8255,使得PB1=1

        OUT     61H,AL          ;置PB1=1,开扬声器

        JMP     wait1

;------‘c’键处理,扬声器关闭控制----------------------------

keyc:   IN      AL,61H

        AND     AL,11111101B        ; 并行接口8255,PB1=0,关扬声器

        OUT     61H,AL

        JMP     wait1

;-------‘d’键处理,定时器开启控制---------------------------

keyd:  IN      AL,61H

        OR      AL,00000001B     ; 并行接口8255,启动定时器2,GATE=PB0=1

        OUT     61H,AL

        JMP     wait1

;------‘e’键处理,定时器关闭控制----------------------------

keye:   IN      AL,61H

        AND     AL,11111110B    ; 并行接口8255,停止定时器2,GATE=PB0=0
       

        OUT     61H,AL

        JMP     wait1

;------‘ESC’键处理,退出系统--------------------------------

keyESC: MOV     AH,4CH

        INT    21H

seg2    ENDS

        END    start

2.运行

经过汇编和链接后,运行程序并记录运行过程。

3.调试

利用DEBUG命令载入程序。

利用DEBUG命令单步运行,观察并记录61H端口变化产生的影响。

利用DEBUG命令单步运行,观察并记录42H端口变化产生的影响。

4.编写电子琴程序

要求程序能响应三个键,每个键对应不同频率的声音,按下发声,松开静音。

调试通过。

预习:

1. 学习发声原理。

2. 按要求编写程序。

实验报告要求:

1. 根据步骤4中的要求,画出流程图并写出源程序。

2. 记录调试的操作及其结果。

3. 回答以下问题:

程序中keya部分的作用是什么?计算8253的输出频率是多少?如果要求用BCD码计数,应该怎么改写程序。

程序中keyb、keyc、keyd、keye部分的作用是什么?

按键的先后顺序对程序运行有何影响?

 

 

 

【上篇】
【下篇】

抱歉!评论已关闭.