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