1、 摘 要 本次课设主要是熟练老师上课讲的内容,对自己有一个很好的测量。这次课设题目是设计一个定时报警器,主要是利用学过的时钟调用,时间的修改,外加我们自己理解的声音输出的播放,利用汇编语言实现一个可以在显示器上显示时、分、秒的电子时钟,并能提供在设定的时间发出声音的功能。目 录1课题名称12课题小组成员23课题内容和要求34软件设计44.1软件流程图44.2 汇编程序75结论206参考文献227心得体会23241 课题名称定时报警器2 课题小组成员王春来,熊小龙,徐晶,易思谦,占涛王春来,易思谦和占涛负责资料收集整理,熊小龙与徐晶负责程序的调试,修改。3 课题内容和要求题目描述:利用汇编语言实
2、现一个可以在显示器上显示时、分、秒的电子时钟,并能提供定时报警功能。基本要求:(1)设计一个基本的具有显示时、分、秒的电子时钟。(2)到整点或预定的报警时间,能够以不同的音乐进行报时,可以自行设置闹钟报警时间; (3)实物演示时要求讲出程序原理和设计思想;(4)程序运行良好、界面清晰。提高要求:设计一个具有钟面、分针、秒针的指针式钟表,在圆盘上有均匀分布的60根刻度,对应小时的刻度用不同颜色的长刻度区别,并且将12、3、6、9对应的拉丁文绘制于表盘外。设计提示:(1)指针式钟表的绘制。将屏幕设置成图形显示方式,通过画点、画线,画圆等基本程序完成钟表的绘制。表盘圆周上刻度线段两端点坐标计算是钟表
3、绘制的核心部分。 (2)秒针、分针、时针的转动。是经过一定的延时时间,通过在下一位置重新画一个,在原来的位置用背景色覆盖的方法实现。 (3)音乐的演奏。利用CPU支持的外围电路8254与8255,通过汇编程序改变8255的PB0,PB1口,接通扬声器,使得计算机能够发出一定频率的声音,同时通过8254的与8255连接的2号计数器控制指定频率,从而达到控制扬声器的音乐的效果。通过建立适当的延时程序达到一定时间后则改变2号计数器产生的方波的频率,实现音乐程序的演奏。4 软件设计4.1软件流程图1) 程序整体流程2) edittime子程序流程图3)editmusic子程序4)打开和关闭扬声器此处重
4、要用到了8254和8255的相关知识,书中P238有相关代码首先,应该读出8255的PB端口当前的状态,将PB0和PB1分别置1,以读修改写的方式修改PB0和PB1接通扬声器。其次,利用8254的2号计数器产生XXX Hz 的方波,此处计数初值利用公式 N=fclk1 /fout2 对8254先写低8位,再写高8位,out2输出方波最后,将8255的PB0和PB1回复位00,用AND AL,11111100B来修改 5)BCTD子程序的流程图该子程序程序功能主要是实现二进制转化成相应BCD码AX输入参数 AX输出参数,存放调整过的BCD码 4.2 汇编程序 课题任务实现的源程序(可以是一组源程
5、序,每个功能模块采用不同的函数实现),源程序要按照写程序的规则来编写。要结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。1)变量名声明DATA SEGMENTMESS1 DB *ASM ASSIGNMENT* ,0AH,0DHDB ,0AH,0DHDB *ELECTRONIC CLOCK* ,0AH,0DHDB ,0AH,0DHDB ,0AH,0DHDB *PRESS C OR C TO EDIT THE ALARM TIME PRESS M OR M TO CHANGE SOUND!* ,0AH,0DHDB ,0AH,0DHDB *PRESS ESC BUTTON TO EX
6、IT* ,0AH,0DH,$TN DB PLEASE INPUT THE NEW TIME (HH:MM:SS):,0DH,0AH,$MUSICMESS DB PLEASE CHOOSE THE TYPE OF MUSIC:1(FAST) 2(MIDDLE) 3(SLOW),0DH,0AH,$MESS2 DB *TIME IS:,0AH,0DH,$T_BUFF DB 40 ;在数据段开一段时间显示缓冲区DB ?DB 40 DUP (?)TEMPHOR DB ? ;存放键入的定时时间的小时TEMPMIN DB ? ;存放键入的定时时间的分钟TEMPSEC DB ? ;存放键入的定时时间的秒数MU
7、SIC DW 800 ;存放默认音乐的频率数DATA ENDSSTACK SEGMENT DB 100 DUP(?) STACK ENDS 2)主函数代码DATA SEGMENTMESS1 DB *ASM ASSIGNMENT* ,0AH,0DHDB ,0AH,0DHDB *ELECTRONIC CLOCK* ,0AH,0DHDB ,0AH,0DHDB ,0AH,0DHDB *PRESS C OR C TO EDIT THE ALARM TIME PRESS M OR M TO CHANGE SOUND!* ,0AH,0DHDB ,0AH,0DHDB *PRESS ESC BUTTON TO
8、EXIT* ,0AH,0DH,$TN DB PLEASE INPUT THE NEW TIME (HH:MM:SS):,0DH,0AH,$MUSICMESS DB PLEASE CHOOSE THE TYPE OF MUSIC:1(FAST) 2(MIDDLE) 3(SLOW),0DH,0AH,$MESS2 DB *TIME IS:,0AH,0DH,$T_BUFF DB 40 ;在数据段开一段时间显示缓冲区DB ?DB 40 DUP (?)TEMPHOR DB ? ;存放键入的定时时间的小时TEMPMIN DB ? ;存放键入的定时时间的分钟TEMPSEC DB ? ;存放键入的定时时间的秒数
9、MUSIC DW 800 ;存放默认音乐的频率数DATA ENDSSTACK SEGMENT DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,SS:STACK,DS:DATA ;确定各个逻辑段的类型 START: MOV AX,DATA MOV DS,AX CALL CLEAR ;调用清屏子程序 DISPLAY: ;时间显示部分 MOV AX,DATA MOV DS,AX MOV BX,OFFSET T_BUFF ;送T_BUFF的偏移地址到BX MOV AH,2CH ;调用DOS时间调用功能,功能号:2CH,小时,分钟,秒数分别保存在
10、CH,CL,DH中 INT 21H ;判断时间是否相等SUB DH,1 ;秒钟+1修正CALL CHECKMOV AL,CH ;小时数设定 MOV AH,0 CALL BCTD ;调用进制转换子程序 二进制转BCD码子程序PUSH AX AND AL,0F0H ;选取AL高四位 MOV CL,4 ;设置右循环的次数 ROL AL,CL ;右循环 OR AL,30H ;加30H得到ACSII码 MOV BX,AL ;将得到的结果送到T_BUFF缓冲区 INC BX ;BX自加1,指针指向下一个缓冲区的下一个地址 POP AX AND AL,0FH ;选取低四位 OR AL,30H MOV BX,
11、AL ;将转换后的低四位值送入缓冲区的第二个地址 INC BX MOV AL,: ;显示分隔符号 MOV BX,AL INC BX MOV AH,2CH INT 21H MOV AL,CL ;分钟数设定 MOV AH,0 CALL BCTD PUSH AX AND AL,0F0H MOV CL,4 ROL AL,CL OR AL,30H MOV BX,AL INC BX POP AX AND AL,0FH OR AL,30H MOV BX,AL INC BX MOV AL,: ;显示分隔符号 MOV BX,AL INC BX MOV AH,2CH ;秒设定 INT 21H MOV AL,DH
12、MOV AH,0 CALL BCTD PUSH AX AND AL,0F0H MOV CL,4 ROL AL,CL OR AL,30H MOV BX,AL INC BX POP AX AND AL,0FH OR AL,30H MOV BX,AL INC BX MOV AL,$ ;将字符串的结束位送至显示缓冲区的最后一位 MOV BX,AL PUSH BX ;置光标位置 ,AH=2,BH=0,DH跟DL分别为行号与列号,并入栈保护BX MOV AH,2 ;01用于此程序快下边的 在下面的两个置光标位置MOV BH,0 MOV DH,17 MOV DL,41 INT 10H POP BX LEA
13、DX,T_BUFF ;送T_BUFF偏移地址到DX,并调用DOS显示功能,功能号为9 MOV AH,9 INT 21H ;至此当前事前时间的显示功能结束!PUSH BX ;置光标位置 MOV AH,2 MOV BH,0 MOV DH,0 MOV DL,0 INT 10H POP BX LEA DX,MESS1 MOV AH,9 INT 21H ; 显示MESS1PUSH BX ;置光标位置 MOV AH,2 MOV BH,0 MOV DH,17 MOV DL,21 INT 10H POP BX LEA DX,MESS2 MOV AH,9 INT 21H ; 显示MESS2CALL DELAY1
14、 MOV AH,1 ;调用键盘I/O中断功能号1,获取键值到AL INT 16H CMP AL,C ;是C键,转到时间修改程序 JE EDITTIME CMP AL,M ;是M键,转到闹铃种类设定程序,但超出跳转字节范围,现跳转到过渡指令JE XJCMP AL,1BH JZ QUIT ;是ESC键,退出程序 JMP DISPLAY QUIT: MOV AH,4CH ;程序终止功能号 INT 21H RET BCTD PROC NEAR ;二进制转BCD码子程序 ;AX输入参数 ;AX输出参数,存放调整过的BCD码 MOV DX,AX MOV AX,0 MOV CX,16 ;设循环次数 BCTD
15、1: CLC ;清进位标志C RCL DX,1 ;通过进位的循环右移 ADC AL,AL ;带进位加法 DAA ;加法的十进制调整 XCHG AL,AH ;交换高、低八位 ADC AL,AL DAA XCHG AL,AH LOOP BCTD1 ;循环次数保存在CX里 RET BCTD ENDP CLEAR PROC NEAR PUSH AX ;入栈保护现场 PUSH BX PUSH CX PUSH DX MOV AX,0600H ;AH=06(滚动)AL=00(全屏空白) MOV BH,3EH ;设置背景颜色(2)和前景颜色(E) SUB CX,CX MOV DX,5F5FH INT 10H
16、POP DX ;出栈恢复现场 POP CX POP BX POP AX RET CLEAR ENDP XJ PROC;过渡跳转指令,跳转到editmusicJMP EDITMUSICXJ ENDPDELAY1 PROC ;精确延迟时间子程序 MOV DX,04FFH ;循环次数 UP: XOR CX,CX A: NOP LOOP A DEC DX JNZ UP RETDELAY1 ENDP EDITTIME PROC ;时间修改子程序 PUSH AX ;入栈保护数据 PUSH BX PUSH CX PUSH DX PUSHF MOV DX,OFFSET TN ;显示修改时间的格式提示 MOV
17、AH,09H INT 21H MOV DX,OFFSET T_BUFF ;数据缓冲区的数据输入MOV AH,0AH INT 21H AND DX,0H LEA BX,T_BUFF INC BX INC BX INC BXMOV DH,BX SUB DH,30H INC BX MOV DL,BX SUB DL,30H MOV CL,10 MOV AL,DH MUL CL ADD AL,DLMOV CH,AL MOV TEMPHOR,ALINC BX INC BX MOV DH,BX SUB DH,30H INC BX MOV DL,BX SUB DL,30H MOV CL,10 MOV AL,D
18、H MUL CL ADD AL,DL MOV CL,AL MOV TEMPMIN,ALINC BX INC BX MOV DH,BX SUB DH,30H INC BX MOV DL,BX SUB DL,30H MOV CL,10 MOV AL,DH MUL CL ADD AL,DL MOV DH,AL MOV TEMPSEC,ALPOPF ;出栈恢复数据 POP DX POP CX POP BX POP AX JMP START RET EDITTIME ENDPCHECK PROC PUSH AX PUSH BX CMP CH,TEMPHOR ;设置定点报时 JNE CF CMP CL,T
19、EMPMIN JNE CF CMP DH,TEMPSEC JNE CFXIANG: CALL OPEN ;打开扬声器 PUSH DX PUSH CX MOV DX,12H MOV AX,34DEH MOV CX,MUSIC DIV CX OUT 42H,AL MOV AL,AH OUT 42H,AL MOV AH,1 INT 21H POP CX POP DX CALL CLOSE ;关闭扬声器CF: POP BX POP AX RETCHECK ENDPOPEN PROC PUSH AX IN AL,61H OR AL,03H OUT 61H,AL POP AX RETOPEN ENDP C
20、LOSE PROC PUSH AX IN AL,61H AND AL,0FCH OUT 61H,AL POP AX RETCLOSE ENDPEDITMUSIC PROC PUSH AX ;入栈保护数据 PUSH BX PUSH CX PUSH DX PUSHF MOV DX,OFFSET MUSICMESS ;显示修改音乐的种类提示 MOV AH,09H INT 21H MOV DX,OFFSET T_BUFF ;数据缓冲区的数据输入 MOV AH,0AH INT 21H AND DX,0H LEA BX,T_BUFF INC BX INC BX INC BX MOV AL,BX CMP A
21、L,1 JE M800TO CMP AL,2 JE M1600TO CMP AL,3 JE M3200TOM800TO: MOV MUSIC,800 JMP TM1600TO: MOV MUSIC,1600 JMP TM3200TO: MOV MUSIC,3200 T: POPF ;出栈恢复数据 POP DX POP CX POP BX POP AX JMP START RET EDITMUSIC ENDPCODE ENDSEND5 结论1)运行画面2)测试结果A)键入c或C 会出现提示“PLEASE INPUT THE NEW TIME (HH:MM:SS):”再输入19:08:40。回车结
22、束后,在19:08:40时,闹钟会鸣叫。B)键入m或M 会出现提示“PLEASE CHOOSE THE TYPE OF MUSIC:1(FAST) 2(MIDDLE) 3(SLOW):” 回车后会设定此时的闹铃鸣叫的频率3)调试过程中的问题:本次程序设计中遇到了很多的问题,在设计每一个模块都有遇到了一定的难度。首先关于,如何获得系统当前的时间,查阅了INT 21H,21H的2CH可以返回的的CH,CL,DH中分别为时,分,秒但是都是二进制的,故需要的进行二进制的码制,写代码时发现通过寄存器移位的可以十分的节省寄存器的使用数目。 其次在写EDITTIME的子程序是发生了一个错误,很久才改正。我在
23、使用21H的0AH向T_BUFFER内存空间输入字符串是,第一个位置是初始化时设定的T_BUFFER的最大长度,第二个位置是实际输入的长度,我于是INC BX两次(BX发的T_BUFFER的地址),以为能够得到我的输入的第一个字符,但是结果是错误的,查了了很久才发现,其实我在调用该子程序前的一个控制已经输入了一个字符,该字符已经存入了T_BUFFER,故此处应该在INC BX。在EDITMUSIC的子程序中同样会遇到类似问题。在编写程序中由于经常的要使用寄存器,有时没有将其压栈保存,导致寄存器的值发生了不可知的变化。所以一定要注意压栈的使用在实验中使用MASM开发环境,因为开始发现未来汇编的J
24、NE等功能的转移范围有限制,但是在MASM中转移的范围很大。本程序并没有对一些异常输入和其他的异常进行处理,所以在程序的健壮性上有所欠缺。后来一直在看关于绘制钟表的相关代码,看懂了一半,但是还是没能完成,希望以后有机会能够完成。6 参考文献 1王元珍,曹忠升,韩宗芬编著.80x86 汇编语言程序设计M.湖北:华中科技大学出版社,2005年4月.2王成端,李晓波编著.汇编语言程序设计M.北京:高等教育出版社,2003年8月.3孙琦,郑硕编著.汇编语言程序设计复习与考试指导(第二版)M.北京:高等教育出版社,2006年7月.4 沈美明,温冬婵.IBMPC汇编语言程序设计(第2版)M. 北京:清华大
25、学出版社,2001年8月.5CSDN 网站,7 心得体会通过本次的课程设计,对汇编语言有了更加深刻认识。看完代码后深切的感觉到,编写代码前的设计十分的重要。因为,如果等到完成了许多功能后,再需要增添一个功能,或改写一个光标的位置,十分不好改,毕竟汇编是一种低级语言,没有面向对象的概念,很有可能大部分带都重写,导致效率十分低。在编写程序的时候发现许多的技巧,比如要学会多利用左移或右移的操作,这样会十分的节省寄存器的使用。同时,发现编程开始时,画流程图也是必不可少的步骤,这样才能掌控全局,不至于出大错或者出现出错后不知如何的问题!刚开始,调试程序的时候出现了三个错误,两个错误是“Jump out
26、of the range by 143/139 bytes”既跳转语句超出了字节范围,一个错误是提示语句定义错误,后来小组秉承不抛弃不放弃的精神,同心协力查找错误原因,查资料、查书籍后再讨论结果,最后终于拨开云雾现天明,实现了定时闹钟的功能!我们的做法是:对于前两个错误,使用了一段无条件跳转语句“XJ PROC;JMP EDITMUSIC;XJ ENDP”,对于后一个错误,把定义语句改为了“CF:”,由此可见,团队的力量是强大的啊!有时,感觉汇编语言真的有些很令人头疼,相同的程序在不同的系统(如Win7 32位/Win XP/Win 2000),不同的MASM(5.0/6.0)软件上,却出现了
27、一系列的问题,就比如说,团队成员的电脑(Win7 32位/Win XP系统)出现了编译完成后,居然出现了界面键入无效,无硬件设备不发声,甚至出现乱码等问题,最后,还是在实验室的电脑(Win 2000系统)中,经过调试编译后才实现了程序的功能,可谓是千辛万苦!这次的经历也使我们深刻的感受到了汇编语言“小问题大麻烦”的特点!从这次实验中,我们也注意到了以下几点细节:(1) 字符串的定义、显示、输入、输出的语句使用,注意功能调用引用的中断类型(如INT 21H/INT 16H/INT 10H)及确定调用几号功能(如1号/2号/9号/OAH号等)(2) 跳转语句的应用,注意范围限制及跳转语句的选取(3
28、) 子程序的应用,避免重复使用同一程序段,注意与跳转语句的结合使用(4) 数据区设立缓冲空间,方便一次性输出,避免反复使用寄存器(5) 栈的使用,注意先进后出的存取规则,同时进栈保护现场,出栈恢复数据总之,这次的汇编实验整体感觉挺难的,还好最后把基本功能完成了,能够实现一个电子闹钟的定时鸣叫,设定闹钟铃声的种类。但是很遗憾的是,我们原本有个整点报时的程序,终究因为设置闹钟时间的时候,发现只是实现了整点报时,并没有实现定点报时,所以,经过小组讨论结果,最后删除了整点报时的程序,同时,程序中并没有实现闹铃间隔时间功能的程序段,原本还想添加一段程序以实现这个功能,不至于一直闹个不停,但是搜索以后发现这两段程序要结合在一起非常难,团队努力以后还是没有成功,这次的失败也让我们也认识到了自身学习的不足之处,以后还得继续加油!不过,还是希望以后有机会的话,能够对无论是汇编的图形绘制还是其他高级语言的图形绘制再次实践一下,充分锻炼一下自己和整个团队的协作能力! .
版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。
Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1
陕公网安备 61072602000132号 违法和不良信息举报:0916-4228922