网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
实验目的:
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键?
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
CMP AL,‘a’ ;是a键?
[外链图片转存中…(img-Uzc0EaNy-1715707029332)]
[外链图片转存中…(img-9XajhFjt-1715707029332)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新