汇编语言产生警报声程序设计实验报告.docx

上传人:b****5 文档编号:8364157 上传时间:2023-01-30 格式:DOCX 页数:12 大小:140.68KB
下载 相关 举报
汇编语言产生警报声程序设计实验报告.docx_第1页
第1页 / 共12页
汇编语言产生警报声程序设计实验报告.docx_第2页
第2页 / 共12页
汇编语言产生警报声程序设计实验报告.docx_第3页
第3页 / 共12页
汇编语言产生警报声程序设计实验报告.docx_第4页
第4页 / 共12页
汇编语言产生警报声程序设计实验报告.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

汇编语言产生警报声程序设计实验报告.docx

《汇编语言产生警报声程序设计实验报告.docx》由会员分享,可在线阅读,更多相关《汇编语言产生警报声程序设计实验报告.docx(12页珍藏版)》请在冰豆网上搜索。

汇编语言产生警报声程序设计实验报告.docx

汇编语言产生警报声程序设计实验报告

产生警报声程序设计

1绪论

1.1设计目的和意义

在广泛使用的微型机系统中,外部设备是以实现人际交换和机间通信为目的的一些机电设备。

计算机系统通过硬件接口以及I/O控制程序对外部设备进行控制,使其能协调地、有效地完成输入输出工作。

在对外部设备的控制过程中,主机不可避免地,有时甚至要很频繁地对设备接口进行联络和控制,因此,能直接控制硬件的汇编语言就成了编写高性能I/O程序最有效的程序设计语言。

本实验通过编写一个控制主板蜂鸣器发声的程序来掌握编写I/O程序的基本思想与方法。

1.2背景知识交代

I/O接口部件中一般有三种寄存器:

一是用作数据缓冲的数据寄存器;二是用作保存设备和接口的状态信息,提供CPU对外设进行测试的状态寄存器;三是用来保存CPU发出的命令以控制接口和设备的操作的命令寄存器,这些寄存器都分配有各自的端口号,CPU就是通过不同的端口号来选择各种外部设备的。

在自然中,各种声音都是通过振动产生的。

人耳能听到的频率大概在20Hz~20KHz范围内。

查阅相关资料,可以得到如下常见警报声的频率表:

车型音调名称音响频率(Hz)重复变调周期(s)

警车紧急调频调6000-50~15000+500.333~0.385

双音转换调f1:

800±50f2:

1000±500.455~0.556

消防车连续调频调6000-50~15000+503.000~5.000

救护车慢速双音转换调f1:

800±50f2:

1000±501.667~2.500

工程抢险车单音断鸣高800±500.455~0.556

1.3设计内容

产生急速上滑报警音响,要求变化率可控,由键盘输入控制值。

按“Q”键退出。

1.4程序设计说明

根据1.2中所述,常见警报声的频率基本是固定的,分别作不同的用途,因此本程序中规定警报声的频率从20Hz~1500Hz。

变化率的改变则是通过每次选择不同的频率增量来实现。

而不同的频率增量已经提前存储在程序中,提供给用户的是选择几种比较感性的选项:

非常慢,慢速,常速,快速以及非常快。

2程序设计

2.1程序设计原理

计算机的发声原理:

在计算机内部有一个可编程时间间隔定时器8253/54(Programmableinternaltimer,PIT),它能根据程序提供的计数值和工作模式,产生各种形状和各种频率的计数/定时脉冲,提供给系统的各个部件使用。

例如,提供计时信号给系统日时期,提供刷新定时信号给动态存储器,对分时系统产生时间片等。

它还可以产生不同频率的脉冲作为扬声器的声源。

2.2设计环境与工具

DOS操作系统

编辑工具EDIT.EXE

汇编工具MASM.EXE(5.0)

连接工具LINK.EXE

调试工具DEBUG.EXE

2.3发声程序设计主要步骤

1.在8253/54中的43端口送一个控制字0B6H(10110110B),该控制字对定时器2进行初始化,使定时器2准备接收计数初值。

2.在8253/54中的42H端口(Timer2)装入一个16位的计数值(533H*896/频率),以建立要产生的声音频率。

3.把输出端口61H的0、1两位置1,发出声音。

2.4程序流程图

3程序运行与调试

3.1程序源码

;******************************************

;Programmer:

孔祥振

;Date:

2010/1/3-2010/1-6

;Function:

Togeneratealarmsoundthatcan

;becontrolled.

;Press'Q'toexit

;******************************************

;******************************************

datassegment

messinfo1db'———Pleaseinput1~5,whichrepresentsthechanginglevelofthealarm,———','$'

messveryslowdb'|1.veryslow|','$'

messslowdb'|2.slow|','$'

messnormaldb'|3.normal|','$'

messfastdb'|4.fast|','$'

messveryfastdb'|5.veryfast|','$'

messQdb'|Q.Exit|','$'

messinfo2db'————————————————————————————————————','$'

messinputdb'Pleaseinputanumber(1~5)','$'

messerrordb'ERRORINPUT!

INPUTAGAIN!

','$'

messlistendb'Pleaselistencarefully……','$'

enterdb13,10,'$'

usr_inputdb?

;该程序中警报声的频率下限和频率上限是确定的,因此不同的控制速率会导致警报声的时间不同

incvsdw2;分别存有变化的速率

incsdw5

incndw8

incfdw10

incvfdw12

maxfdw1500

minfdw20

datasends

;******************************************

;******************************************

stacksegment

db200dup('stack')

stackends

;******************************************

;******************************************

codessegment

;————————————————————

mainprocfar

assumeds:

datas,cs:

codes,ss:

stack

start:

pushds

subax,ax

pushax

movax,datas

movds,ax;初始化

;~~~~~~~;显示消息的宏

dispmacromessage

pushax

pushdx

leadx,message

movah,09

int21h

popdx

popax

endm

;~~~~~~~

callmessshow

input:

;输入选择

movbx,minf

dispmessinput

dispenter

subax,ax

movah,1;从键盘输入一个字符

int21h

dispenter

judge:

cmpal,0dh

jeinput

cmpal,51h;是否为Q

jeexit

cmpal,71h

jeexit

leabx,usr_input

subal,30h;ASCII码转化为数字

mov[bx],al;usr_input存该数字

cmpal,01h;是否为1

jesound

cmpal,02h;是否为2

jesound

cmpal,03h;是否为3

jesound

cmpal,04h;是否为4

jesound

cmpal,05h;是否为5

jesound

dispmesserror

dispenter

jmpinput

exit:

movax,4c00h

int21h

;————————————————————

sound:

dispmesslisten

dispenter

rotate:

moval,0b6h;writertimemodereg.

out43h,al

movdx,12h

movax,348ch

divbx;发声频率存在bx中,已经初始化bx值为最小频率值

out42h,al;writertimer2countlowbyte

moval,ah

out42h,al;writertimer2counthighbyte

inal,61h

movah,al

oral,03h

out61h,al;turnthespeakeron

calldelay

moval,ah;turnthespeakeroff

out61h,al

cmpusr_input,1

jeinc_vs

cmpusr_input,2

jeinc_s

cmpusr_input,3

jeinc_n

cmpusr_input,4

jeinc_f

cmpusr_input,5

jeinc_vf

inc_vs:

addbx,incvs

jmpcmpare

inc_s:

addbx,incs

jmpcmpare

inc_n:

addbx,incn

jmpcmpare

inc_f:

addbx,incf

jmpcmpare

inc_vf:

addbx,incvf

jmpcmpare

cmpare:

cmpbx,maxf

jberotate

jmpinput

 

XX文库-让每个人平等地提升自我;————————————————————

mainendp

;————————————————————

;————————————————————

messshowprocnear

dispenter

dispenter

dispmessinfo1

dispenter

dispmessveryslow

dispenter

dispmessslow

dispenter

dispmessnormal

dispenter

dispmessfast

dispenter

dispmessveryfast

dispenter

dispmessQ

dispenter

dispmessinfo2

dispenter

dispenter

ret

messshowendp

;————————————————————

;————————————————————

delayprocnear

movcx,0a000h

loop1:

pushcx

movcx,100h

loop2:

looploop2

popcx

looploop1

ret

delayendp

;————————————————————

codesends

;******************************************

endstart

3.2截图

1.编译、连接过程截图

2.运行过程截图

结语

该程序的开发是作为汇编语言课程设计的内容,经过此次实践,我增长了不少知识,获益匪浅。

通过该程序的设计,我掌握了I/O程序设计的基本原理思想以及方法,而且对汇编语言中宏定义,子过程设计有了进一步的认识。

汇编语言跳转语句比较多,为了避免程序成为“意大利面条”,应该适当的采用结构化编程的方法,例如利用子程序设计。

此外,应当注意合理地对变量进行命名可以提高程序的可读性以及可维护性。

汇编语言是较为底层的语言,有很高的执行效率,因此绝不能不重视,还应该加强学习。

由于本程序从开始的计划到后来的具体实施的这段时间,无论在时间和细致程度来说都是有限的,所以程序真正投入使用还是会有很多不妥善的地方,难免会存在一些的不足的问题。

希望老师能给予批评和指导。

希望能在今后的不断的学习中和努力中,把程序做得更好。

参考文献

[1]沈美明,温冬婵《IBM-PC汇编语言程序设计》(第2版),北京:

清华大学出版社,2001

[2]王爽,《汇编语言》,北京:

清华大学出版社,2008

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 哲学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1