扬声器程序设计
实验目的:
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口低办部分输出)
课本上有一个开关控制发光二极管的程序,赶紧熟悉!