基于Proteus仿真8253音乐发生器

 

《8253基于Proteus仿真模拟音乐发生器》

二、实验目的

(1)了解和熟悉8253/8254接口芯片的工作原理和应用方法。

(2)掌握8253/8254接口芯片的设计与调试技巧。

(3)掌握8253/8254定时器/计数器的工作方式和编程原理。

三、实验内容

  • 功能介绍

82bbeab06578439a961bed31de8698d2.png

 

图1 含有三个开关

如上图1所示,当开始仿真运行后:

①按下开关SW1:启动音乐《虫儿飞》

②按下开关SW2:启动音乐《我和我的祖国》

③按下开关SW3:启动音乐《小毛驴》

  • 设计的元件的介绍及相关知识点

⑴ 涉及的元件:

     本次实验主要使用了8253、8086、8255元件,还包括7411、74LS138、74LS32、74LS273、SOUNDER、SW-SPST元件的应用。接下来主要针对8253介绍。

⑵ 芯片8253简介:

①外部介绍

  1. 面向CPU的信号源

D0~D7:数据线

/CS片选端,A0A1片内端口地址

/RD/WR读写信号

  1. 面向I/O设备的信号

CLKi时钟脉冲信号,用作计数脉冲

GATEi门控信号,用于定时/计数的启动/停止、允许/禁止

OUTi输出信号,用于实现I/O设备的定时/计数操作

3d6e14eda396453c8fa8fdd3faa29429.png

图2 8253的外部引脚图

②内部介绍

它由数据总线缓冲器、读/写逻辑、控制字寄存器用于处理CPU与8253之间命令、数据、地址及数据的交换。3个独立的16位计数器组成,其中,计数值寄存器用于存放计数初值;减法计数器,用于进行减法计数操作,在装入计数初数器同时也装入减法计数器,然后,每来一个计数脉冲,它就减1,直至将计数初值减为0;当前计数值锁存器(16位),用于锁存减法计数器的内容,以供读出和查询当前计数值。其内部结构如下:

0ebc5f3a9b8e40c9ba5ac310943a3664.png

 

图3  8253内部结构

  1. 数据总线缓冲器

数据总线与系统总线连接,8位双向,与CPU交换信息的通道。是8253与CPU之间的数据接口,它由8位双向三态缓冲存储器构成,是CPU与8253之间交换信息的必经之路。

  1. 控制寄存器

用来保存来着CPU的控制字。每个计数器都有一个控制命令寄存器,用来保存该计数器的控制信息。控制字将决定计数器的工作方式、计数器形式以及输出方式。8253的3个控制寄存器只占用一个地址号,而靠控制字的最高两位来决定将控制信息送入哪个计数器的控制寄存器中保存。控制寄存器只能写入不能读出。

  1. 读/写逻辑

它的任务是接收CPU的控制信号,完成对8253内部的操作控制。这些控制信号包括读信号/RD、写信号/WR、片选信号/CS以及用于片内寄存器寻址的地址信号A0、A1。当片选信号有效,即/CS=0时,读写逻辑才能正常工作。该控制逻辑根据读/写命令即送来的地址信息,决定3个计数器和控制寄存器中哪一个工作,并控制内部总线上数据传送的方向。8253共占用4个I/O端口,CPU可对写操作。这4个端口地址由最低2位地址码A1和A0来选择,如表1所示。

/CS

/RD

/WR

A1

A0

操作

0

1

0

0

0

写计数值到计数器0的CR

0

1

0

0

1

写计数值到计数器1的CR

0

1

0

1

0

写计数值到计数器2的CR

0

1

0

1

1

写控制字,并根据控制字高两位将其送到相应的控制寄存器

0

0

1

0

0

从计数器0的OL中读出当前计数值

0

0

1

0

1

从计数器1的OL中读出当前计数值

0

0

1

1

0

从计数器2的OL中读出当前计数值

0

0

1

1

1

无操作

1

*

*

*

*

未选中

0

1

1

*

*

无操作

表1  8253端口地址以及内部操作

②工作方式选择控制字

66cf52fdaa8341dda540014695a8cdd9.png

 

图4  8253控制字段

④工作方式

  1. 方式0:计数结束产生中断方式
  2. 方式1:可编程单次脉冲方式
  3. 方式2:频率发生器方式
  4. 方式3:方波发生器
  5. 方式4:软件出发选通方式
  6. 方式5:硬件触发方式计数
  • 实现过程

⑴实现平台及安装过程

  1. Proteus8.6
  2. 过程:

下载安装Proteus8.6(选择合适的存储地址)

安装Masm32(可直接实现在Proteus软件中编程)

⑵模拟过程

  1. 首先设计并连接电路图

39661db80730433aa4a87af38188202f.png

 

  1. 进SOURCE CODE页面新建工程文件选编译环境MASM32(可下载)
  2. 进行程序编译
  3. 修改8086的Internal Memory Size为0x10000
  4. 修改CLK的脉冲频率为307.2k
  5. 音频表

93d3862ed7554727b0fa90c77a23c4a2.png

 

  • 汇编源代码

;*******根据 CHECR 配置信息修改下列符号值********

 

MY8255_A      EQU   0C400H+00H*4       ;8255的A口地址

MY8255_B      EQU   0C400H+01H*4       ;8255的B口地址

MY8255_C      EQU   0C400H+02H*4       ;8255的C口地址

MY8255_MODE   EQU   0C400H+03H*4    ;8255的控制寄存器地址

 

MY8253_COUNT0    EQU   0c440H+00H*4   ;8253计数器0端口地址

MY8253_COUNT1    EQU   0c440H+01H*4   ;8253计数器1端口地址

MY8253_COUNT2    EQU   0c440H+02H*4   ;8253计数器2端口地址

MY8253_MODE      EQU   0c440H+03H*4   ;8253控制寄存器端口地址

STACK SEGMENT STACK

          DW 256 DUP(0)

STACK ENDS

 

DATA SEGMENT

FREQ_LIST  DW  330,330,330,350,393,330,294    ;频率表

           DW  262,262,262,294,330,330,248,248

            DW  221,330,294,221,330,294

            DW  221,330,294,262

            DW  262,0     ; 时间表

TIME_LIST  DB   4,2,2,4,4,8,8

            DB   4,2,2,4,4,6,2,8

            DB   4,4,8,4,4,8

            DB   4,4,6,2

            DB   16

FREQ_LIST1  DW 495,556,495,441,393,350,330,248

             DW 330,393,661,624,556,393,495,495

             DW 556,624,556,495,441,393,393,278

             DW 312,278,248,495,330,350,393,393,0

TIME_LIST1   DB 4,2,2,4,2,2,8,8

             DB 3,3,3,3,3,3,8,8

             DB 3,3,3,3,3,3,8,8

             DB 3,3,3,3,3,3,8,8

FREQ_LIST2 DW 495,495,495,624,742,742,742,742,833

           DW 833,833,990,742,661,661,833,833,624

            DW 624,624,624,556,556,556,556,742,65535,742

            DW 495,495,495,624,742,742,742,742,833

            DW 833,833,990,742,661,6661,661,833,624

            DW 624,624,624,624,556,556,556,624,495

            DW 0

TIME_LIST2 DB 4,4,4,4,4,4,4,4,4

           DB 4,4,4,16,4,4,4,4,4

            DB 4,4,4,4,4,4,4,10,2,4

            DB 4,4,4,4,4,4,4,4,4

            DB 4,4,4,16,4,4,4,4,4

            DB 2,2,4,4,4,4,4,4,16

DATA ENDS

CODE SEGMENT

     ASSUME CS:CODE,DS:DATA,SS:STACK

    

START:

   ;DS SS DP寄存器写入对应的数值

   MOV AX,DATA

   MOV DS,AX

   MOV AX,STACK

   MOV SS,AX

   MOV AX,256

   MOV SP,AX

   ;8255初始化,A输出,b输入

   MOV DX,MY8255_MODE

   MOV AL,82h

   OUT DX,AL

   ;初始化8254工作方式

   MOV DX,MY8253_MODE

   MOV AL,36h

   OUT DX,AL            ;定时器0,方式3

main:

      MOV DX,MY8255_B;检测开关信号

      IN AL,DX

      TEST AL,01H;检测按键1是否被按下

      JZ BEGIN0

      TEST AL,02H;检测开关2是否被按下

      JZ BEGIN1

      TEST AL,04H;检测按键3是否被按下

      JZ BEGIN2

      ;无有效按键时输出关蜂鸣器

      MOV DX,MY8255_A

      MOV AL,0H

      OUT DX,AL

      JMP MAIN

      

BEGIN0:

   MOV DX,MY8255_A

   MOV AL,1H

   OUT DX,AL

   MOV SI,OFFSET FREQ_LIST  ;装入频率表起始地址

   MOV DI,OFFSET TIME_LIST   ;装入时间表起始地址

PLAY0:

   MOV DX,0FH

   MOV AX,0E502H

   DIV WORD PTR [SI]

   MOV DX,MY8253_COUNT0

   OUT DX,AL

   MOV AL,AH

   OUT DX,AL

   ;取出演奏相对时间,调用延时子程序

   MOV BX,0

   MOV Bl,[DI]

   CALL DALLY

   ADD SI,2

   INC DI

   CMP WORD PTR [SI],0

   JE BEGIN0

   MOV DX,MY8255_B

   IN AL,DX

   TEST AL,01H

   jnz main

   Jmp PLAY0

  

BEGIN1:

   MOV DX,MY8255_A

   MOV AL,1H

   OUT DX,AL

   MOV SI,OFFSET FREQ_LIST1

   MOV DI,OFFSET TIME_LIST1

PLAY1:

   MOV DX,0FH

   MOV AX,0E502H

   DIV WORD PTR [SI]

   MOV DX,MY8253_COUNT0

   OUT DX,AL

   MOV AL,AH

   OUT DX,AL

   ;取出演奏相对时间,调用延时子程序

   MOV BX,0

   MOV Bl,[DI]

   CALL DALLY

   ADD SI,2

   INC DI

   CMP WORD PTR [SI],0

   JE BEGIN1

   MOV DX,MY8255_B

   IN AL,DX

   TEST AL,02H

   jnz main

   Jmp PLAY1

  

BEGIN2:

   MOV DX,MY8255_A

   MOV AL,1H

   OUT DX,AL

   MOV SI,OFFSET FREQ_LIST2

   MOV DI,OFFSET TIME_LIST2

PLAY2:

   MOV DX,0FH

   MOV AX,0E502H

   DIV WORD PTR [SI]

   MOV DX,MY8253_COUNT0

   OUT DX,AL

   MOV AL,AH

   OUT DX,AL

   ;取出演奏相对时间,调用延时子程序

   MOV BX,0

   MOV Bl,[DI]

   CALL DALLY

   ADD SI,2

   INC DI

   CMP WORD PTR [SI],0

   JE BEGIN2

   MOV DX,MY8255_B

   IN AL,DX

   TEST AL,04H

   jnz main

   Jmp PLAY2

 

;延时函数

DALLY PROC

PUSH CX

DELAY1:

      MOV CX,08800H

      LOOP $

      DEC BX

      JNZ DELAY1

      POP CX

      RET

DALLY ENDP

 

CODE ENDS

 

     END START

  • 音乐播放器原理

其工作方式是方式3:方波发生器

当装入初值后,在GATE上升沿启动计数,OUT 输出高电平;当计数完成一半时,OUT输出低电平。

计数过程:

当把方式3的控制字写入控制字寄存器后,输出端OUT变成高电平,作为初始电平。再将计数初值写入计数初值寄存器CR中,再经过一个时钟周期,计数初值被移入计数执行单元CE中,从下一个时钟脉冲开始作减1计数,方式3的计数过程分为两种情况:

第一种情况:计数初值为偶数,当作减1计数减到N/2时,输出端OUT端变成低电平,减到0时,输出端OUT变成高电平,并重新从初值开始新的计数过程。若GATE为高电平,则一直重复同样的计数过程。可见,输出端OUT输出连续的方波,故称方波发生器。

第二种情况:计数初值为奇数,当作减1计数减到(N+1)/2以后,输出端OUT变成低电平,减到0时,输出端OUT又变成高电平。并重新从初值开始新的计数过程。若GATE为高电平,则一直重复同样的计数过程。可见,输出端OUT输出连续的方波,故称为方波发生器。

门控信号的影响:工作在方式3时,门控信号GATE的功能与工作方式2一样,即GATE 为高电平时,允许计数:GATE为低电平时停止计数。GATE引脚上的信号从低电平跳到高电平时,将会重新把计数初值寄存器CR中的内容移入计数执行单元CE中,并以新装入的值重新开始计数。

四、电路设计

  1. 整体电路图:实现可播放《虫儿飞》《我和我的祖国》《小毛驴》三首音乐的音乐播放器,实现音乐的开关及发声

4ee223f946674a95a845516145936c44.png

 

图5 音乐发生器电路图

五、流程图

通过给8253定时器装入不同的计数值,可以使其输出不同频率的波形。便可驱动扬声器发出不同频率的音调,要使该音调的声音持续一段时间,只要插入一段延时程序。SI指向曲中的频率,BP指向曲中的时间节拍。从SI的指向的音节表中取一个频率,只要不是0,即有效就再读取时间,然后转到start子程序,计算计数初值送入计数器,产生各种频率信号,再送至扬声器。

2af70a979034402f8af02b0c95d0e223.png

 

图6 整体流程图

 

 

 

 

 

  • 10
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值