您的位置:首页 > 其它

第一篇汇编文章(基于8086)

2014-11-30 15:56 357 查看
扬声器程序设计
实验目的:

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

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

实验步骤:

1. 扬声器控制原理

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

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



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

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

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

对于600 Hz,N=计数初值=11931816/600=1983。

对于1000 Hz,N=计数初值=11931816/1000=1193。

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

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

对于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.编写电子琴程序

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

调试通过。

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

看到csdn上这么多人辛勤写博客,还有自己也需要笔记来记录自己的成长,就最快的把这篇博客写了吧,哈哈,纪念汇编的生活!

1)第一,就是关于初值的计算,前面的四句程序,就是计算脉冲初值,通过改变初值,可以使不同按键对应不同的频率声音。

2)第二,8253定时器的初始化程序,对应控制字的使用,00(选计数器0)11(在初值较大0FFH时)011(模式3)0(二进制格式)/1(BCD格式)

eg:

mov al,10 11 011 0B ;2号定时器,方式3,二进制

out 43h,al ;43h最大端口地址

mov ax,0533h

out 42h,al

mov al,ah

out 42h,al ;;先写入初值低字节,后写入初值高字节(out指令只能用al传值)

3)8255初始化程序

1(有效) 00(PA方式0) 0(PA口输出)0(PC口高办部分输出) 0(PB方式0) 0(PB口输出)0(PC口低办部分输出)

课本上有一个开关控制发光二极管的程序,赶紧熟悉!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: