汇编实验四——扬声器程序设计
一、实验要求
- 通过8253和8255使扬声器发声
- 编写电子琴程序,要求程序能响应三个键,每个键对应不同频率的声音,按下发声,松开静音。
二、实现原理
8255的地址为:60H~63H;PB端口地址为61H,控制口为63H
8253的地址为:40H~43H;通道2地址42H,控制口地址43H
1、发声原理
人能听到的声音频率范围为20Hz~20000Hz。但是人耳最敏感声音频率范围是1000Hz-----3000Hz之间的声音。
扬声器可以产生不同频率、不同振幅的震动,振幅决定了音量,频率决定了音色、品质,本次实验就是改变电流输出频率从而发声。
2、8253计算初值
PC的扬声器以计数器2为核心。计数器8255的CLK2的输入频率为1.193182 MHz,工作于方式3,改变计数器初值可以由得到不同频率的方波输出。
fCLK频率:1.1931816*1000000=0012 34DE H
若要使扬声器输出600Hz频率信号,则8253计数初值为1983
若要使扬声器输出1000Hz频率信号,则8253计数初值为1193
对于600 Hz, N=计数初值=11931816/600=1983
对于1000 Hz,N=计数初值=11931816/1000=1193
改变8253的输出频率,即可改变扬声器输出声频信号频率。
3、8255控制开关
扬声器受8255A芯片B口的两个输出端线控制,8255工作于方式0输出。
PB0=1,即GATE2=1,计数器2正常计数
PB1=1,打开输出控制门,扬声器工作
三、代码及解释
1、任务一
(1)按下 a 键时:对8253定时器初始化,设置通道2,方式3;然后用该计数器,计数当输出1000Hz时的计数次数,以产生1000Hz频率的方波,并从42H(OUT2)端口输出。即该子程序功能为:初始化定时器,设置计数初值,并输出1KHz频率信号。
(2)按下 b 键时:使PB1=1,输出高电平,驱动扬声器,以开启扬声器。
(3)按下 c 键时:使PB1=0,关闭扬声器的驱动,使扬声器无法工作。
(4)按下 d 键时:使PB0=1,输出高电平,驱动8253定时器,以开启定时器。
(5)按下 e 键时:使PB0=0,关闭定时器驱动电压,使定时器无法工作。
(6)按下 ESC 键时:退出整个程序,回到DOS。
ASSUME CS:seg2,DS:seg1
seg1 SEGMENTpstart DB 'Program start.',0DH,0AH,'$' ;0D回车,0A换行pend DB 'Program will end when input',27H,'ESC',27H,'.',0DH,0AH,'$'sec DB 10
seg1 ENDS
seg2 SEGMENT
start: MOV AX,seg1MOV DS,AXMOV DX,OFFSET pstartMOV AH,09HINT 21HMOV DX,OFFSET pendMOV AH,09HINT 21H
;--------------键盘控制-------------------
wait1: MOV AH,01H ;输入一个字符=AL,DOS系统功能调用INT 21HCMP AL,1BH ;是否ESC键JE keyESCCMP AL,'a' ;是a键?JE keya ;a键处理,初始化定时器8253CMP 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 ;设定时器工作方式,方式3OUT 43H,AL ;送8253的控制端口43HMOV DX,0012H ;输入频率送DX,AXMOV AX,34DEHMOV DI,1000 ;将频率1000Hz转换为计数初值DIV DI ;计数初值在AX中OUT 42H,AL ;计数初值送定时器2,即送42H端口MOV AL,AHOUT 42H,AL ;输出频率为1000HZ信号JMP wait1
;------‘b’键处理,并行接口8255,扬声器开启控制--------------
keyb: IN AL,61H ;读8255PB口OR AL,00000010B ;并行接口8255,使得PB1=1OUT 61H,AL ;置PB1=1,开扬声器JMP wait1
;------‘c’键处理,扬声器关闭控制----------------------------
keyc: IN AL,61HAND AL,11111101B ;并行接口8255,PB1=0,关扬声器OUT 61H,ALJMP wait1
;-------‘d’键处理,定时器开启控制---------------------------
keyd: IN AL,61HOR AL,00000001B ;并行接口8255,启动定时器2,GATE=PB0=1OUT 61H,ALJMP wait1
;------‘e’键处理,定时器关闭控制----------------------------
keye: IN AL,61HAND AL,11111110B ;并行接口8255,停止定时器2,GATE=PB0=0 OUT 61H,ALJMP wait1
;------‘ESC’键处理,退出系统--------------------------------
keyESC: MOV AH,4CHINT 21H
seg2 ENDSEND start
2、任务二
要求程序能响应三个键,每个键对应不同频率的声音,按下发声,松开静音。
(1)需要三种频率对应三个按键
(2)按下发声,松开静音:需要判断按键情况,持续按下、按一下、没按,可以短暂延时再次查看按键情况,如果延时后按键还有输入说明按键持续按下,否则说明只按了一下。
其实写两个延时程序更好(本人偷懒不想改)
发声应该延时长,人听到才不会因为太短而变声
检测按键状态应该延时短,电脑响应才不会延时(明明没按了,但是还是在响应)
为了更正式,可以改成两个延时程序
为什么又七个按键,因为网上有现成的且对应简单的七个音阶,稍微修改了下,如果只要三个可以自己去掉一些就可以了。
ASSUME DS:DATA,SS:STACK,CS:CODE
DATA SEGMENTpstart DB 'Program start.',0DH,0AH,'$' ;0D回车,0A换行pend DB 'Program will end when input',27H,'ESC',27H,'.',0DH,0AH,'$'sec DB ?TABLE DW 262 ;k1 发 do 的音,261.6HZDW 294 ;k2 发 re 的音,293.6HZDW 330 ;k3 发 mi 的音,329.6HZDW 349 ;k4 发 fa 的音,349.2HZDW 392 ;k5 发 sol 的音,392HZDW 440 ;k6 发 la 的音,440HZDW 494 ;k7 发 si 的音,493.8HZ
DATA ENDSSTACK SEGMENT PARA STACK 'STACK'STA DB 48 DUP(?)TOP EQU LENGTH STA
STACK ENDSCODE SEGMENT
;--------------初始化-------------------
start: MOV AX,DATAMOV DS,AXMOV DX,OFFSET pstartMOV AH,09H ;功能号09H,显示字符串INT 21HMOV DX,OFFSET pendMOV AH,09HINT 21HMOV AX,STACKMOV SS,AXMOV AX,TOPMOV SP,AX
;--------------键盘控制-------------------
key: MOV AH,01H ;功能号01H,键盘输入并回显 INT 21HCMP AL,1BH ;ASCII表,1BH 是 ESCJE keyESC CMP AL,'1' ;分别对应 7 个音阶JE key1CMP AL,'2'JE key2CMP AL,'3'JE key3CMP AL,'4'JE key4CMP AL,'5'JE key5CMP AL,'6'JE key6CMP AL,'7'JE key7
;--------------是否持续按下-----------------
always: MOV AH,0BH ;功能号0BH,检测键盘状态INT 21HAND AL,0FFH ;无按键按下 AL=00,有按键按下 AL=FFCALL delay ;调用延时,判断按键是否持续按下JNZ always ;是就继续发声IN AL,61H AND AL,11111100B ;否就关闭,PB1=PB0=0OUT 61H,ALJMP key
;--------------按键选择-------------------
keyESC: MOV AH,4CHINT 21H
key1: MOV BX,TABLE ;TABLE对应频率JMP TOSOUND
key2: MOV BX,TABLE+2JMP TOSOUND
key3: MOV BX,TABLE+4JMP TOSOUND
key4: MOV BX,TABLE+6JMP TOSOUND
key5: MOV BX,TABLE+8JMP TOSOUND
key6: MOV BX,TABLE+10JMP TOSOUND
key7: MOV BX,TABLE+12JMP TOSOUND
;--------------计算初值-------------------
TOSOUND:MOV DX,0012HMOV AX,34DEHDIV BX ;计算初值CALL SOUND ;调用发音子程序CALL delay ;调用延时JMP always ;跳转判断按键是否持续按下
;--------------发声程序-------------------
SOUND PROC NEARPUSH AXMOV AL,10110110B ;设定时器工作方式,方式3OUT 43H,AL ;送8253的控制端口43HPOP AXOUT 42H,AL ;计数初值送低8位定时器2,即送42H端口MOV AL,AHOUT 42H,AL ;计数初值送高8位定时器2,即送42H端口IN AL,61HOR AL,00000011B ;打开扬声器,PB1=PB0=1OUT 61H,ALRET
SOUND ENDP
;--------------延时程序-------------------
delay PROC NEARPUSH CXPUSH AXMOV AX,100H
for1: MOV CX,0FFFH
for2: LOOP for2DEC AXJNZ for1POP AXPOP CXRET
delay ENDPCODE ENDSEND start
四、结果
1、扬声器发声
a 是初始化
b 是扬声器开启
c 是扬声器关闭
d 是定时器开启
e 是定时器关闭
所以发声输入 abd
即可,不发声输入 ce
其中之一就可以了。
2、电子琴程序
(1)随便乱打
(2)两只老虎琴谱
汇编实验四——扬声器程序设计相关推荐
- 微机实验课-实验四扬声器程序设计
微机实验四操作参考 2018年11月 William 〇.实验准备 本次实验是设计汇编程序,控制8253和8255的工作原理及其应用编程.8253为微机系统中使用的定时/计数器,8255为并行接口,即 ...
- 汇编实验(扬声器程序设计)
实验目的: 1.掌握8253的工作原理及其应用编程. 2.掌握8255的工作原理及其应用编程. 实验步骤与任务: 扬声器控制原理(预习) 8255的地址为:60H~63H;PB端口地址为61H,控制口 ...
- 20155321 实验四 Android程序设计
20155321 实验四 Android程序设计 安装Android studio成功 任务一:Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)( ...
- 20165235实验四 Android程序设计
20165235实验四 Android程序设计 实验课程:JAVA编程设计 实验名称:Android开发 姓名:祁瑛 学号:20165235 实验时间:2018.05.16 指导老师:娄家鹏 Andr ...
- 实验四 Android程序设计
实验四 Android程序设计 课程:Java程序设计 班级:1652 姓名:孔月 学号:20165208 指导教师:娄嘉鹏 实验日期:2018.5.14 实验名称:Android程序设计 实验要求: ...
- 20155330 实验四 Android程序设计
20155330 实验四 Android程序设计 实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android.组件.布局管理器的使用: 3.掌握An ...
- # 20155224 实验四 Android程序设计
20155224 实验四 Android程序设计 任务一 Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java for And ...
- 20165226 实验四 Android程序设计
实验四 Android程序设计 实验目的 一.Android Studio的安装测试 二.Activity测试 三.UI测试 四.布局测试 五.事件处理测试 实验内容及步骤 (一)Android St ...
- 20145312《信息安全系统设计基础》实验四 驱动程序设计
20145312<信息安全系统设计基础>实验四 驱动程序设计 实验目的与要求 学习在 LINUX 下进行驱动设计的原理 掌握使用模块方式进行驱动开发调试的过程 实验内容 在 PC 机上编写 ...
最新文章
- java和python可以在一个项目中同时使用么-java调用python的几种用法(看这篇就够了)...
- python中接口测试垃圾数据如何清理_接口测试---Python数据处理需要注意的细节
- ie bug(如果不足,留言大家一起分享)
- POJ1088 滑雪 记忆化搜索
- [原]ASP.NET中使用JQUERY-EASYUI后,解决ClientScript.RegisterStartupScript 所注册脚本执行两次...
- 机器学习基础(五十六)—— tanh、sign 与 softsign
- 动荡之秋,谁能用 AI 制衡全球
- 3801.最佳连续子数组-AcWing题库
- 打游戏 cpu占用率多少是正常的_游戏玩家的CPU选择
- 张朝阳建议年轻人不要努力过头,要现实点,网友:不拼搞不好就被裁了
- 服务器磁盘,内存测试,坏道检查【实战】
- STM32F1 W5500 TCP Client 回环测试
- vue中设置移动的盒子
- 中兴捧月比特派E题——反复横跳
- Android ToastUtil
- MVC发布出现:未能将文件bin\xxx.xml 复制到 obj\Release\PackageTmp\bin\xxx.xml,未能找到文件
- 软件版本各阶段英文名称
- Codeforces Round#466 E. Cashback
- 工厂ERP管理系统如何引入
- 限电网络舆情管控方案