data segment freq dw 262,294,330,349,392l,440,494 data ends code segment assume ds:data, cs:code main proc far start: push ds mov ax,0 push ax mov ax,data mov ds,ax mov al,10110110b ;8253定时器2初始化 out 43h, al in al,61h ;读pb口 or al,03h out 61h,al ;pb0, pb1=’1’, 打开声音 again: mov ah, 1 ;dos功能调用,键盘输入并回显 int 21h ;按键(键入的ascii码值在al中) cmp al,1bh ; ‘Esc’退出 jz exit lea si, freq and ax,0fh ;ax中得到按键值1~7。 shl ax, 1;双字节 sub ax, 2;地址从0000开始 add si, ax ;si 指向对应的频率值 mov di, [si] mov dx, 12h mov ax, 34f0h 【微机接口8253】实验主要涉及8253定时器的使用,通过编程实现秒表功能和音乐播放。8253是Intel公司生产的可编程定时/计数器,广泛应用于微处理器系统中,它有三个独立的16位计数通道,每个通道都有多种工作模式。 在实验中,8253定时器2被初始化为产生特定频率的方波,用于控制声音的产生。初始化步骤包括: 1. 发送控制字到8253的控制寄存器(地址43h),设置定时器的工作模式。在给出的代码中,`mov al,10110110b`表示将定时器2设置为方式3,允许二进制计数,并设置计数时钟分频系数为1。 2. 读取并修改脉冲缓冲器(Port 61h)状态,使PB0和PB1置1,打开声音。 3. 使用DOS功能调用读取键盘输入,当用户按下'Esc'键时退出程序。 4. 根据用户输入的键值,计算对应的频率地址,然后读取该频率的值,通过8253定时器2设置计数初值,从而产生相应频率的声音。 8253的计数初值计算方法如下: - 输入频率fin为1.1932MHz,输出频率fout与计数初值的关系为`fout = fin / (2^n * 初值)`,其中n是分频系数。 - 为了产生特定频率的声音,需要将fin除以fout,结果存储在AX寄存器中。例如,要产生10ms的时间间隔,可以使用如下的程序段: ```assembly MOV CX, 2801 ; 2801为10ms的循环次数 DELAY: LOOP DELAY ``` - 若要产生1秒的延时,可以将循环次数乘以100,如`MOV BX, 100`,然后嵌套循环。 实验电路部分,8253接口电路连接到PC机的I/O端口40H-43H,用于接收控制命令和计数值。定时器0通常在系统启动时设置为方式3,每55ms中断一次。为了实现1s精确计时,需要重新配置定时器0,使其每隔10ms中断一次,并使用软件计数器来累计这些中断,达到1s时执行相应的操作。 实验内容分为两部分: 1. 计时器实现秒表功能,通过改变定时器0的计数初值,每隔10ms中断一次,软件计数器减1,当减到0时,表示1s已过。 2. 音乐演奏程序,利用定时器2工作于方式3,通过设置不同计数初值产生不同频率的声音,用户通过键盘选择音符,程序读取输入并播放相应频率的音符。 在编写音乐程序时,可以根据给定的频率表,根据用户输入的键值计算出对应的计数初值,然后将其写入8253定时器2的计数寄存器,产生音乐效果。 总结来说,8253实验通过编程控制定时器,实现了秒表计时和音乐播放功能,展示了8253在实时控制和音频生成中的应用。同时,实验还涵盖了中断程序设计和端口操作等基本的汇编语言编程技术。
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
评论5