您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > 汇编语言课程设计 电子闹钟
电子闹钟一、课题内容和要求题目描述:利用汇编语言实现一个可以在显示器上显示时、分、秒的电子时钟,并能提供整点报时功能。基本要求:(1)设计一个基本的具有显示时、分、秒的电子时钟。(2)到整点或预定的报警时间,能够以不同的音乐进行报时,可以自行设置闹钟报警时间;(3)实物演示时要求讲出程序原理和设计思想;(4)程序运行良好、界面清晰。提高要求:设计一个具有钟面、分针、秒针的指针式钟表,在圆盘上有均匀分布的60根刻度,对应小时的刻度用不同颜色的长刻度区别,并且将12、3、6、9对应的拉丁文绘制于表盘外。设计提示:(1)指针式钟表的绘制。将屏幕设置成图形显示方式,通过画点、画线,画圆等基本程序完成钟表的绘制。表盘圆周上刻度线段两端点坐标计算是钟表绘制的核心部分。(2)秒针、分针、时针的转动。是经过一定的延时时间,通过在下一位置重新画一个,在原来的位置用背景色覆盖的方法实现。(3)音乐的演奏。利用CPU支持的外围电路8254与8255,通过汇编程序改变8255的PB0,PB1口,接通扬声器,使得计算机能够发出一定频率的声音,同时通过8254的与8255连接的2号计数器控制指定频率,从而达到控制扬声器的音乐的效果。通过建立适当的延时程序达到一定时间后则改变2号计数器产生的方波的频率,实现音乐程序的演奏。二、需求和思路分析经分析本次程序设计的主要内容主要分为如下的几个模块:当前时间的获取并显示,码制转换,设定闹钟报鸣的时间,不同频率的闹铃声,钟表的绘制和并实现动态等模块。其中钟表的绘制和动态走动部分比较难是本次课程设计的提高部分,且改模块可单独形成一个模块,所以放到最后进行考虑1时间的获取可以用INT21H的2CH功能,该功能调用DOS时间调用功能,功能号:2CH,小时,分钟,秒数分别保存在,保存的形式是以二进制的形式,故显示时要2码制转化利用ASCII码与二进制码的关系ASCII=二进制+30H3闹钟鸣叫主要利用8254的二号计数器和8255的PB0和PB1来设定4闹钟的表盘,指针的绘制,并实现时针,分针,秒针的走动。主要通过过图形的画点进行操作,并通过在固定的区域内不断的刷屏来实现。三、概要设计(一)算法设计及重要程序流程图1)程序整体流程check开始display取当前系统时间int21h的2ch功能callbctd进行二进制转ASCII清屏程序clear整点or定点取出闹钟定时时间与当前时间比较打开扬声器鸣叫是否有键入?显示提示信息,并等待键入选择判断键入的选项键入ESC退出calleditmusic设定闹钟音乐种类calledittime设定闹钟时间结束退出设定完毕2)edittime子程序流程图CALLEDITTIME显示修改时间的格式提示(INT21H的9号功能)int21h的0ah功能等待用户输入设定的时间格式(hh:mm:ss)从t_buffer中取出设定的时间一次取出小时第一位ascii值十位数减30H--dhadddh,10十位数减30H--dladddl,10分秒处理与小时相同incbx(地址)取第二位moval,dhaddal,dlmovtemphor,al2)editmusic子程序CALLEDITMUSIC显示修改音乐的种类提示(INT21H的9号功能)等待用户输入设定的时间种类代号int21h的0ah功能从t_buffer中取出键入的选项取出用户键入music代号分别与1、2、3比较movmusic,800movmusic,3200movmusic,1600设定不同的鸣叫频率3)打开和关闭扬声器此处重要用到了8254和8255的相关知识,书中P238有相关代码首先,应该读出8255的PB端口当前的状态,将PB0和PB1分别置1,以读修改写的方式修改PB0和PB1接通扬声器。其次,利用8254的2号计数器产生XXXHz的方波,此处计数初值利用公式N=fclk1/fout2对8254先写低8位,再写高8位,out2输出方波最后,将8255的PB0和PB1回复位00,用ANDAL,11111100B来修改CALLOPENCALLCLOSE8254设定计数初值4)BCTD子程序的流程图该子程序程序功能主要是实现二进制转化成相应BCD码AX输入参数AX输出参数,存放调整过的BCD码MOVDX,AXMOVAX,0MOVCX,16;设循环次数XCHGAL,AH;交换高、低八位ADCAL,ALDAAXCHGAL,AHclc;清进位标志Crcldx,1;通过进位的循环右移adcal,al;带进位加法daa;加法的十进制调整CALLBCTDLOOPBCTD1(二)变量名声明DATASEGMENTMESS1DB'****************ASMASSIGNMENT****************',0AH,0DHDB'',0AH,0DHDB'***************ELECTRONICCLOCK***************',0AH,0DHDB'',0AH,0DHDB'',0AH,0DHDB'*******PRESSCORCTOEDITTHEALARMTIMEPRESSMORMTOCHANGESOUND!****',0AH,0DHDB'',0AH,0DHDB'***********PRESSESCBUTTONTOEXIT***********',0AH,0DH,'$'TNDB'PLEASEINPUTTHENEWTIME(HH:MM:SS):',0DH,0AH,'$'MUSICMESSDB'PLEASECHOOSETHETYPEOFMUSIC:1(FAST)2(MIDDLE)3(SLOW)',0DH,0AH,'$'MESS2DB'*******TIMEIS:',0AH,0DH,'$'T_BUFFDB40;在数据段开一段时间显示缓冲区DB?DB40DUP(?)TEMPHORDB?;存放键入的定时时间的小时TEMPMINDB?;存放键入的定时时间的分钟TEMPSECDB?;存放键入的定时时间的秒数MUSICDW800;存放默认音乐的频率数DATAENDSSTACKSEGMENTDB100DUP(?)STACKENDS四、详细设计课题任务实现的源程序(可以是一组源程序,每个功能模块采用不同的函数实现),源程序要按照写程序的规则来编写。要结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。(一)1主函数代码CODESEGMENTASSUMECS:CODE,SS:STACK,DS:DATA;确定各个逻辑段的类型START:MOVAX,DATAMOVDS,AXCALLCLEAR;调用清屏子程序DISPLAY:;时间显示部分MOVAX,DATAMOVDS,AXMOVBX,OFFSETT_BUFF;送T_BUFF的偏移地址到BXMOVAH,2CH;调用DOS时间调用功能,功能号:2CH,小时,分钟,秒数分别保存在CH,CL,DH中INT21H;判断时间是否相等SUBDH,1;秒钟+1修正CALLCHECKMOVAL,CH;小时数设定MOVAH,0CALLBCTD;调用进制转换子程序二进制转BCD码子程序PUSHAXANDAL,0F0H;选取AL高四位MOVCL,4;设置右循环的次数ROLAL,CL;右循环ORAL,30H;加30H得到ACSII码MOV[BX],AL;将得到的结果送到T_BUFF缓冲区INCBX;BX自加1,指针指向下一个缓冲区的下一个地址POPAXANDAL,0FH;选取低四位ORAL,30HMOV[BX],AL;将转换后的低四位值送入缓冲区的第二个地址INCBX;----------------------------------------------------------MOVAL,':';显示分隔符号MOV[BX],ALINCBX;-------------------------------------------------------MOVAH,2CHINT21HMOVAL,CL;分钟数设定MOVAH,0CALLBCTDPUSHAXANDAL,0F0HMOVCL,4ROLAL,CLORAL,30HMOV[BX],ALINCBXPOPAXANDAL,0FHORAL,30HMOV[BX],ALINCBX;-------------------------------------------------------------------------MOVAL,':';显示分隔符号MOV[BX],ALINCBX;-------------------------------------------------------------------------MOVAH,2CH;秒设定INT21HMOVAL,DHMOVAH,0CALLBCTDPUSHAXANDAL,0F0HMOVCL,4ROLAL,CLORAL,30HMOV[BX],ALINCBXPOPAXANDAL,0FHORAL,30HMOV[BX],ALINCBX;----------------------------------------------------------------------MOVAL,'$';将字符串的结束位送至显示缓冲区的最后一位MOV[BX],AL;------------------------------------------------------------------------PUSHBX;置光标位置,AH=2,BH=0,DH跟DL分别为行号与列号,并入栈保护BXMOVAH,2;0~1用于此程序快下边的在下面的两个置光标位置MOVBH,0MOVDH,17MOVDL,41INT10HPOPBXLEADX,T_BUFF;送T_BUFF偏移地址到DX,并调用DOS显示功能,功能号为9MOVAH,9INT21H;至此当前事前时间的显示功能结束!PUSHBX;置光标位置MOVAH,2MOVBH,0MOVDH,0MOVDL,0INT10HPOPBXLEADX,MESS1MOVAH,9INT21H;显示MESS1PUSHBX;置光标位置MOVAH,2MOVBH,0MOVDH,17MOVDL,21INT10HPOPBXLEADX,MESS2MOVAH,9INT21H;显示MESS2;-----------------------------CALLDELAY1MOVAH,1;调用键盘I/O中断功能号1,获取键值到ALINT16HCMPAL,'C';是C键,转到时间修改程序JEEDITTIMECMPAL,'C';是C键,转到时间修改程序JEEDITTIMECMPAL,'M';是M键,转到闹铃种类设定程序JEEDITMUSICCMPAL,'M';是M键,转到闹铃种类设定程序JEEDITMUSICCMPAL,1BHJZQUIT;是ESC键,退出程序JMPDISPLAYQUIT:MOVAH,4CH;程序终止功能号INT21HRET2功能函数代码1)二进制转BCD码子程序BCTDPROCNEAR;二进制转BCD码子程序;AX输入参数;AX输出参数,存放调整过的BCD码MOVDX,AXMOVAX,0MOVCX,16;设循环次数BCTD1:CLC;清进位标志CRCLDX,1;通过进位的循环右移ADCAL,AL;带进位加法DAA;加法的十进制调整XCHGAL,AH;交换高、低八位ADCAL,ALDAAXCHGAL,AHLOOPBCTD1;循环次数保存在CX里RETBCTDENDP2)清屏CLEAR子程序CLEARPROCNEARPUSHAX;入栈保护现场PUSHBXPUSHCXPUSHDXMOVAX,0600H;AH=06(滚动)AL=00(全屏空白)MOVBH,3EH;设置背景颜色(2)和前景颜色(E)SUBCX,CXMOVDX,5F5FHINT10HPOPDX;出栈恢复现场POPCXPOPBXPOPAXRETCLEARENDP3)精确延迟时间子程序delay1DELAY1PROC;精确延迟时间子程
本文标题:汇编语言课程设计 电子闹钟
链接地址:https://www.777doc.com/doc-4411661 .html