一、实验要求

  1. 通过8253和8255使扬声器发声
  2. 编写电子琴程序,要求程序能响应三个键,每个键对应不同频率的声音,按下发声,松开静音。

二、实现原理

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)两只老虎琴谱

汇编实验四——扬声器程序设计相关推荐

  1. 微机实验课-实验四扬声器程序设计

    微机实验四操作参考 2018年11月 William 〇.实验准备 本次实验是设计汇编程序,控制8253和8255的工作原理及其应用编程.8253为微机系统中使用的定时/计数器,8255为并行接口,即 ...

  2. 汇编实验(扬声器程序设计)

    实验目的: 1.掌握8253的工作原理及其应用编程. 2.掌握8255的工作原理及其应用编程. 实验步骤与任务: 扬声器控制原理(预习) 8255的地址为:60H~63H;PB端口地址为61H,控制口 ...

  3. 20155321 实验四 Android程序设计

    20155321 实验四 Android程序设计 安装Android studio成功 任务一:Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)( ...

  4. 20165235实验四 Android程序设计

    20165235实验四 Android程序设计 实验课程:JAVA编程设计 实验名称:Android开发 姓名:祁瑛 学号:20165235 实验时间:2018.05.16 指导老师:娄家鹏 Andr ...

  5. 实验四 Android程序设计

    实验四 Android程序设计 课程:Java程序设计 班级:1652 姓名:孔月 学号:20165208 指导教师:娄嘉鹏 实验日期:2018.5.14 实验名称:Android程序设计 实验要求: ...

  6. 20155330 实验四 Android程序设计

    20155330 实验四 Android程序设计 实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android.组件.布局管理器的使用: 3.掌握An ...

  7. # 20155224 实验四 Android程序设计

    20155224 实验四 Android程序设计 任务一 Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java for And ...

  8. 20165226 实验四 Android程序设计

    实验四 Android程序设计 实验目的 一.Android Studio的安装测试 二.Activity测试 三.UI测试 四.布局测试 五.事件处理测试 实验内容及步骤 (一)Android St ...

  9. 20145312《信息安全系统设计基础》实验四 驱动程序设计

    20145312<信息安全系统设计基础>实验四 驱动程序设计 实验目的与要求 学习在 LINUX 下进行驱动设计的原理 掌握使用模块方式进行驱动开发调试的过程 实验内容 在 PC 机上编写 ...

最新文章

  1. java和python可以在一个项目中同时使用么-java调用python的几种用法(看这篇就够了)...
  2. python中接口测试垃圾数据如何清理_接口测试---Python数据处理需要注意的细节
  3. ie bug(如果不足,留言大家一起分享)
  4. POJ1088 滑雪 记忆化搜索
  5. [原]ASP.NET中使用JQUERY-EASYUI后,解决ClientScript.RegisterStartupScript 所注册脚本执行两次...
  6. 机器学习基础(五十六)—— tanh、sign 与 softsign
  7. 动荡之秋,谁能用 AI 制衡全球
  8. 3801.最佳连续子数组-AcWing题库
  9. 打游戏 cpu占用率多少是正常的_游戏玩家的CPU选择
  10. 张朝阳建议年轻人不要努力过头,要现实点,网友:不拼搞不好就被裁了
  11. 服务器磁盘,内存测试,坏道检查【实战】
  12. STM32F1 W5500 TCP Client 回环测试
  13. vue中设置移动的盒子
  14. 中兴捧月比特派E题——反复横跳
  15. Android ToastUtil
  16. MVC发布出现:未能将文件bin\xxx.xml 复制到 obj\Release\PackageTmp\bin\xxx.xml,未能找到文件
  17. 软件版本各阶段英文名称
  18. Codeforces Round#466 E. Cashback
  19. 工厂ERP管理系统如何引入
  20. 限电网络舆情管控方案

热门文章

  1. pycharm跳出括号快捷键
  2. Java中接口的作用,为什么要写接口?
  3. 错误:未报告的异常错误,必须对其进行捕获或声明以便抛出
  4. load函数无法打开MAT文件:不是二进制 MAT 文件。请尝试执行 load -ASCII 以便以文本形式读取。
  5. 10种食物让女性养颜排毒又减肥(图)
  6. 共享Excel编辑的一些资源
  7. 三幅图弄懂EventBus核心原理
  8. Linux安装yum(红帽子)rpm
  9. 五年级计算机教学要点,五年级信息技术教学工作计划
  10. SOEM 源码解析 ecx_FPWR