还剩11页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
电子闹钟
一、课题容和要求题目描述利用汇编语言实现一个可以在显示器上显示时、分、秒的电子时钟,并能提供整点报时功能根本要求1设计一个根本的具有显示时、分、秒的电子时钟2到整点或者预定的报警时间,能够以不同的音乐发展报时,可以自行设置闹钟报警时间;3实物演示时要求讲出程序原理和设计思想;4程序运行良好、界面清晰提高要求设计一个具有钟而、分针、秒针的指针式钟表,在圆盘上有均匀分布的60根刻度,对应小时的刻度用不同颜色的长刻度区别,并且将
12、
3、
6、9对应的拉丁文绘制于表盘外设计提示1指针式钟表的绘制将屏幕设置成图形显示方式,通过画点、画线,画圆等根本程序完成钟表的绘制表盘圆周上刻度线段两端点坐标计算是钟表绘制的核心局部2秒针、分针、时针的转动是经过一定的延时时间,通过在下一位置重新画一个,在原来的位置用背体面覆盖的方法实现⑶音乐的演奏利用CPU支持的外围电路8254与8255,通过汇编程序改变8255的PBO,PB1□,接通扬声器,使得计算机能够发出一定频率的声音,同时通过8254的与8255连接的2号计数器控制指定频率,从而到达控制扬声器的音乐的效果通过建立适当的延时程序到达一定时间后则改变2号计数器产生的方波的频率,实现音乐程序的演奏EDITTIME ENDP5)检验定时时间是否到CHECK子程序CHECKPROCPUSHA*PUSHB*CM CH,TEMPHOR;设置定点报时P CFJNECL,TEMPMINCM CFPDH,TEMPSECJNE*IANGCMPJNE CL,°;设置整点报时CF1CFCM DH,0pCFJNECMPJNE*IANG:CALL OPEN;翻开扬声器PUSHD*PUSHC*MOV D*,12HMOV A*,34DEHMOV C*,MUSICDIV C*OUT42H,ALMOV AL,AHOUT42H,ALMOV AH,1INT21HPOP C*POP D*CALL CLOSE;关闭扬声器CF:POP B*POP A*RETCHECKENDP6)开启和关闭扬声器子程序open和closeOPENPROCPUSHA*IN AL,61HOR AL,03Hz.OUT61H,ALPOP A*RETOPENENDPCLOSE PROCPUSHA*IN AL,61HANDAL,0FCHOUT61H,AL POPA*RETCLOSE ENDP6)设置闹钟音乐种类子程序editmusicEDITMUSIC PROCPUSHA*;入栈保护数据PUSHB*PUSHC*PUSHD*PUSHFMOV D*,OFFSET MUSICMESS;显示修改音乐的种类提示MOV AH,09HINT21HMOV D*OFFSET T.BUFF;数据缓冲区的数据输入MOV AH,0AHINT21HANDD*,0HLEA B*,T_BUFFINC B*INC B*INC B*MOVALJB*1CMPAL1JE M800TOCMPAL,2JE M1600TOCMPAL,3JE M3200TOM800TO:MOVMUSIC,800JMP TM1600TO:MOVMUSIC.1600JMP TM3200TO:MOVMUSIC.3200T:z.POPF;出栈恢复数据POPD*POPC*POPB*POPA*JMPSTARTRETEDITMUSIC ENDP
五、测试数据及其结果分析1运行画面2测试结果A键入c或者C会浮现提示“PLEASE INPUT THE NEWTIME HH:MM:SS〃再输入190840o回车完毕后,在19840时,闹钟会鸣叫B键入m或者M会浮现提示“PLEASE CHOOSE THE TYPEOF MUSIC:1FAST2MIDDLE3SLOW回车后会设定此时的闹铃鸣叫的频率
六、调试过程中的问题本次程序设计中遇到了不少的问题,在设计每一个模块都有遇到了一定的难度首先关于,如何获得系统当前的时间,查阅了INT21H,21H的2cH可以返回的的CH,CL,DH中分别为时,分,秒但是都是二进制的,故需要的发展二进制的码制,写代码时发现通过存放器移位的可以十分的节省存放器的使用数目其次在写EDITTIME的子程序是发生了一个错误,很久才改正我在使用21H的OAH向T_BUFFER存空间输入字符串是,第一个位置是初始化时设定的T_BUFFER的最大长度,第二个位置是实际输入的长度,我于是INCB*两次(B*发的T.BUFFER的地址),以为能够得到我的输入的第一个字符,但是结果是错误的,查了了很久才发现,其实我在调用该子程序前的一个控制已经输入了一个字符,该字符已经存入了T_BUFFER,故此处应该在INCB*在EDITMUSIC的子程序中同样会遇到类似问题在编写程序中由于时常的要使用存放器,有时没有将其压栈保存,导致存放器的值发生了不可知的变化所以一定要注意压栈的使用在实验中使用MASM开辟环境,因为开场发现未来汇编的JNE等功能的转移围有限制,但是在MASM中转移的围很大本程序并没有对一些异常输入和其他的异常发展处理,所以在程序的强健性上有所欠缺后来向来在看关于绘制钟表的相关代码,看懂了一半,但是还是没能完成,希翼以后有时机能够完成
七、专业课程设计总结通过本次的课程设计,对汇编语言和微型计算机接口计数,有了更加深刻认识,复习了关于8254和8255的相关知识自己设计了程序的全部的流程,对每个环节都要十分清晰代码完成后深切的感觉到,编写代码前的设计十分的重要因为,如果等到完成为了许多功能后,再需要增添一个功能,或者改写一个光标的位置,汇编语言的改写比JAVA等高级语言麻烦的多,十分不好改,毕竟汇编是一种低级语言,没有面向对象的概念,很有可能大局部带都重写,导致效率十分低在程序的调试过程中熟悉了通过观察各个存放器值的变化来跟踪程序的运行是否有误在编写程序的时候发现许多的技巧比方要学会多利用左移或者右移的操作,这样会十分的节省存放器的使用此外当你的存放器不够时,可以先把几个存放器压栈,发展操作后在弹出栈,这样可以解决存放器不够,或者*些存放器的值不知觉的被改变总之这次的汇编实验比JAVA那局部要难一点,还好最后把根本功能完成为了,能够实现一个电子闹钟的定时,整点鸣叫,设定闹钟铃声的种类自己第一次编写这么多的汇编的代码惟一有点遗憾的地方是,提高的钟表指针走动的功能没能够实现,网上找到一个例,但是只看懂了一半,只看懂了绘制的过程,对指针如何走动还是没弄懂,希翼以后有时机,能够对无论是汇编的图形绘制还是其他高级语言的图形绘制再次实践一下充分的锻炼自己!
二、需求和思路分析经分析本次程序设计的主要容主要分为如下的几个模块当前时间的获取并显示,码制转换,设定闹钟报鸣的时间,不同频率的闹铃声,钟表的绘制和并实现动态等模块其中钟表的绘制和动态走动局部比拟难是本次课程设计的提高局部,且改模块可单独形成一个模块,所以放到最后发展考虑1时间的获取可以用INT21H的2CH功能,该功能调用DOS时间调用功能,功能号2CH,小时,分钟,秒数分别保存在,保存的形式是以二进制的形式,故显示时要2码制转化利用ASCH码与二进制码的关系ASCII=二进制+30H3闹钟鸣叫主要利用8254的二号计数器和8255的PB0和PB1来设定4闹钟的表盘,指针的绘制,并实现时针,分针,秒针的走动主要通过过图形的画点发展操作,并通过在固定的区域不断的刷屏来实现
三、概要设计
(一)算法设计及重要程序流程图1)程序整体流程2)edittime子程序流程图2)edilmusic子程序3)翻开和关闭扬声器此处重要用到了8254和8255的相关知识,书中P238有相关代码首先,应该读出8255的PB端口当前的状态,将PB0和PB1分别置1,以读修改写的方式修改PB0和PB1接通扬声器其次,利用8254的2号计数器产生***Hz的方波,此处计数初值利用公式N=fclkl Zfout2对8254先写低8位,再写高8位,out2输出方波最后,将8255的PBO和PB1回复位00,用AND AL,11111100B来修改4BCTD子程序的流程图该子程序程序功能主要是实现二进制转化成相应BCD码A*输入参数A*输出参数,存放调整过的BCD码二变量名声明DATASEGMENTMESSIDB****************ASMASSIGNMENT****************,,0AH,0DH DB;0AH,0DHDB****************ELECTRONIC CLOCK****************,0AH,0DHDB,0AH.0DHDB;0AH,0DHDB,***…*PRESSCORCTOEDITTHEALARMTIMEPRESSMORMTOCHANGESOUND!****\0AH,0DHDB,0AH,0DHDB************PRESSESCBUTTON TOE*IT***********;AH,DH$TNDB PLEASEINPUTTHENEW TIMEHH:MM:SS:,,0DH,0AH;S,MUSICMESS DBPLEASECHOOSETHETYPE OFMUSIC:1FAST2MIDDLE3SLOW;ODH,OAH,$MESS2DB*******TIME IS:,0AH,0DH,ST_BUFF DB40:在数据段开一段时间显示缓冲区DBDB40DUP TEMPHORDB;存放键入的定时时间的小时TEMPMIN DB;存放键入的定时时间的分钟TEMPSECDB;存放键入的定时时间的秒数MUSIC DW800;存放默认音乐的频率数DATAENDSSTACKSEGMENTDB100DUPCSTACKENDS
四、详细设计课题任务实现的源程序可以是一组源程序,每一个功能模块采用不同的函数实现),源程序要按照写程序的规则来编写要构造清晰,重点函数的重点变量,重点功能局部要加之清晰的程序注释
(一)1主函数代码CODE SEGMENTASSUMECS:CODE,SS:ST/XCK,DS:DATA;确定各个逻辑段的类型START:MOVA*,DATAMOVDS,A*CALL CLEAR;调用清屏子程序DISPLAY:;时间显示局部MOVA*,DATAMOVDS,A*MOVB*,OFFSET T_BUFF;送T_BUFF的偏移地址到B*MOVAH,2CH;调用DOS时间调用功能,功能号:2CH,小时,分钟,秒数分别保存在CH,CL.DH中INT21H;判断时间是否相等SUBDH,1;秒钟+1修正CALL CHECKMOVAL,CH;小时数设定MOVAH,0CALL BCTD;调用进制转换子程序二进制转BCD码子程序PUSHA*ANDAL.OFOH;选取AL高四位MOVCL,4;设置右循环的次数ROL AL,CL;右循环ORAL,30H;加30H得到ACSH码MOV|B*],AL;将得到的结果送到T_BUFF缓冲区INC B*;B*自加1,指针指向下一个缓冲区的下一个地址POPA*ANDAL,0FH;选取低四位ORAL,30HMOV[B*],AL;将转换后的低四位值送入缓冲区的第二个地址INC B*MOVAL,1;显示分隔符号MOV[B*],ALINC B*MOVAH,2CHINT21HMOVAL.CL;分钟数设定MOV AH,0CALL BCTDPUSHA*ANDAL,0FOB MOVCL,4ROL AL,CL ORAL.30HMOV fB*],AL INC B*POPA*ANDAL,0FHOR AL,30HMOV[B*],AL INC B*MOVAL》;显示分隔符号MOV[B*],ALINC B*MOVAH,2CH;秒设定INT21HMOVAL,DHMOVAH,0CALL BCTDPUSHA*ANDAL.0FO HMOVCL,4ROL AL,CLOR AL,30HMOVINC B*POPA*ANDAL,0FHOR AL,3OHMOV[B*1,ALINC B*MOVAL.$;将字符串的完毕位送至显示缓冲区的最后一位MOV[B*J,ALPUSHB*;置光标位置,AH=2,BH=0,DH跟DL分别为行号与列号,并入栈保护B*MOVAH,2;〜1用于此程序快下边的在下面的两个置光标位置MOVBH.0MOVDH,17MOVDL,41INT iOHPOPB*;送T_BUFF偏移地址到D*,并调用DOS显示功能,功能号为9LEAD*,T_BUFFMOVAH,9INT21;至此当前事前时间的显示功能完毕!HPUSHB*;置光标位置MOVAH.2MOVBH,0MOVDH,0MOVDUOINT10HPOPB*LEAD*,MESSIMOVAH,9;显示MESSIINT21HPUSHB*;置光标位置MOVAH,2MOVBH,0MOVDH,17MOVDL,21INT10HPOPB*LEAD*,MESS2MOVAH,9INT21H;显示MESS2CALL DELAY1MOVAHJ;调用键盘I/O中断功能号1,获取键值到ALINT16HCMPAL,C;是C键,转到时间修改程序JE EDITTIMECMPAL,C;是C健,转到时间修改程序JE EDITTIMECMPAL,M;是M键,转到闹铃种类设定程序JE EDITMUSICCMPAL,1M;是乂键,转到闹铃种类设定程序JE EDITMUSICCMPAL,1BHJZ QUIT;是ESC键,退出程序JMPDISPLAYQUIT:MOVAH,4CH;程序终止功能号INT21HRET2功能函数代码1)二进制转BCD码子程序BCTD PROCNEAR;二进制转BCD码了程序;A*输入参数;A*输出参数,存放调整过的BCD码MOVD*,A*MOVA*,0MOVC*16;设循环次数BCTDi:CLC;清进位标志CRCLDM;通过进位的循环右移ADC AL,AL;带进位加法DAA;加法的十进制调整*CHGAL,AH;交换高、低八位ADC AL,ALDAA*CHGAL,AHLOOP BCTDI;循环次数保存在C*里RETBCTD ENDP2)清屏CLEAR子程序CLEAR PROCNEARPUSH A*;入栈保护现场PUSH B*PUSH C*PUSH D*MOV A*,0600H;AH=06(滚动)AL=00(全屏空白)MOV BH,3EH;设置背景颜色
(2)和前景颜色(E)SUB5C*MOV D*,5F5FHINT10HPOP D*;出栈恢复现场POP C*POP B*POP A*RETCLEAR ENDP3)准确延迟时间子程序delaylDELAY1PROC;准确延迟时间子程序MOVD*,04FFH;循环次数UP:*ORC*,C*A:NOPLOOP ADECD*JNZ UPRETDELAY1ENDP4)设定定时时钟EDITTIME子程序EDITTIME PROC;时间修改子程序PUSHA*;入栈保护数据PUSHB*PUSHC*PUSHD*PUSHFMOVD*,OFFSET TN;显示修改时间的格式提示MOVAH.09HINT21HMOVD*,OFFSET T_BUFF;数据缓冲区的数据输入MOVAH,0AHINT2I HANDD*,0HLEAB*,T_BUFFINC B*INC B*INC B*MOVSUBDH,3HINC B*MOVDL,[B*]SUBDL,30HMOVCL,10MOVAL,DHMUL CLADDAL,DLMOVCH,ALMOVTEMPHOR,ALINC B*INCB*MOVDH,[B*]SUBDH,3HINC B*MOVDL,[B*]SUBDL,30HMOVCL,10MOVAL,DHMUL CLADDAL,DLMOVCL,ALMOVTEMPMIN,ALINC B*INCB*MOVDH,[B*]SUBDH,30HINC B*MOVDL,[B*]SUBDL,30HMOVCL,10MOVAL,DHMUL CLADDAL,DLMOVDH,ALMOVTEMPSEC,ALPOPF;出栈恢复数据POPD*POPC*POPB*POPA*JMPSTART RET。
个人认证
优秀文档
获得点赞 0