数码管时钟电路的设计一、设计目的:通过这次课程设计掌握单片机系统的基本设计步骤及设计思路,掌握汇编语言的用法及各种指令的含义,比较熟练的运用指令进行单片机系统的设计的,熟悉用KEIL软件进行汇编语言的汇编,以及把代码写入实验板中,观测代码结合实际的运行结果后进行调整,体会到编程的分析问题、确定算法、画程序流程图、编写程序、程序功能模块化的优点的各各步骤。二、设计要求:LED数码管时钟电路采用24h计时方式,时、分、秒用六位数码管显示。该电路采用AT89C2051单片机,使用3V电池供电,只使用一个按键开关即可进入调时、省电(不显示LED数码管)和正常显示三种状态。三、设计实验内容:1.硬件的设计其采用AT89C51单片机应用设计,LED显示采用动态扫描方式实现,P0口输出段码数据,P2口输出位码数据,P1.1、P1.2接按钮开关。为了提供LED数码管的驱动电流,采用6MHz晶振。12.系统总体分析系统主要包含四大模块:显示模块、时间计时模块、模式切换模块和模式设置模块。显示模块:主要由主循环负责。内存中开辟了一段8字节的内存空间,用作数据显示的字符缓冲区。主循环不断将缓冲区中的字符呈现至数码管。时间计时模块:电子钟的核心模块,记录了时间的时、分、秒信息。模式切换模块(MODE):切换电子钟的设置模式,包括时设置、分设置、秒设置、闹铃开关设置、闹铃时设置和闹铃分设置。相关数据被设置时将闪烁显示。模式设置模块(CONFIG):通过判断设置模式(MODE),执行相应的设置。如时、分、秒的增1以及闹铃开关的变换。另外,主循环还负责扫描键盘,检测相应键是否被按下,若MODE键被按下则在特定单元中登记该功能,并启动定时器1,然后返回继续执行显示功能。在定时器1中断时,被登记的功能正式执行。期间用时约10ms,用以消除机械抖动。主循环流程图大致如下:图(一)主循环流程图开始键被按下登记相应功能数码管显示是否2定时器1中断服务程序流程图如下:图(二)定时器1中断服务程序流程图3.系统主要程序的设计1)主程序本设计中的主程序主要负责对键盘扫描及显示数据,还包括判断是否闹钟正在活动。若键盘中的P1.6(模式键)或P1.7(设置键)被按下,登记将被执行的功能,主循环不负责功能模块的执行。若闹钟正在活动,调用蜂鸣函数。其中bPalse标识了一秒的前半秒和后半秒,是为了控制显示数据的半秒闪烁。主函数还包含初始化操作,以下省略。loop:MOVB,#01111111B;位选通信号MOVR0,#prebuf-01H;数据缓冲区nextnum:ACALLkeyscan;扫描键盘INCR0MOVA,@R0PUSHACCMOVA,BRLAMOVB,AJBbPalse,showORLA,dmaskJNBbAlaIng,show定时器1中断logfunc=?执行MODE执行CONFIG结束MODECONFIG3MOVled,#0FFHACALLbeeponce若闹铃活动,调用蜂鸣函数DECSPSJMPloopshow:PUSHACCACALLdisplayone在特定数码管显示数据。DECSPDECSPACALLdelayCJNER0,#prebufend,nextnumSJMPloopkeyscan:JNBkeym,keymode;若切换键被按下,登记“切换”功能JNBkeyc,keyconf;若设置键被按下,登记“设置”功能RET;=====================;;logfunction'mode';;=====================keymode:MOVfunclog,#01H;keyactACALLfuncperform;激活“功能执行模块”(见下文),RET;=====================;;logfunction'config';;=====================keyconf:MOVfunclog,#02HACALLfuncperform;激活“功能执行模块”(见下文)RET2)显示子程序在特定数码管显示数据,通过堆栈传递参数。第一个参数是待显示的字符,第二个参数是位选通信号。函数通过查字形码表将字形显示至数码管。displayone:PUSHACCPUSHPSWMOVA,R0PUSHACCPUSHBMOVPSW,#00HMOVA,SPSUBBA,#07HMOVR0,A4MOVA,@R0INCR0MOVB,@R0PUSHDPLPUSHDPHMOVDPTR,#metrixMOVCA,@A+DPTRJNBbPalse,noftANLA,ftnoft:MOVlmask,BMOVled,APOPDPHPOPDPLPOPBPOPACCMOVR0,APOPPSWPOPACCRET3)定时器TO中断服务程序电子钟的计秒程序,负责计算时间。act:;maintimeractorCJNER2,#0BH,conCLRbPalse;palsepersecondcon:DJNZR2,leaveMOVR2,#14HPUSHACCPUSHPSWMOVPSW,#00HMOVA,s;sINCADAAMOVs,ACJNEA,#60H,incnMOVs,#00HMOVA,m;mINCADAAMOVm,ACJNEA,#60H,incnMOVm,#00HMOVA,h;hINCADAAMOVh,ACJNEA,#24H,incnMOVh,#00Hincn:SETBbPalse5JNBbAlaOn,alarmoffACALLcheckala;checkalarmwhenalarmisONalarmoff:MOVA,npageANLA,#02HJNZskipACALLprepareskip:POPPSWPOPACCleave:MOVTH0,#03CHMOVTL0,#0B0HRETI4)模式切换程序切换设置模式,包括时间时设置、时间分设置、时间秒设置、闹铃开关设置、闹铃时设置、闹铃分设置。mode:;mode;SETBP3.2PUSHACCPUSHPSWPUSHDPLPUSHDPHJNBbAlaIng,modeskipSETBbKick;stopalarmCLRbAlaIngSJMPmodeleavemodeskip:MOVnpage,#00HMOVDPTR,#maskdatMOVA,cmodeINCACJNEA,#07H,enmodeMOVA,#00Henmode:MOVcmode,AANLA,#04HJZnotalapageMOVnpage,#02HACALLpreala;时钟调整页准备notalapage:MOVA,cmodeMOVCA,@A+DPTRMOVdmask,A;设置时闪烁modeleave:POPDPHPOPDPLPOPPSWPOPACCRET65)模式设置程序对时间量执行加1,特别的闹铃开关执行开关设置。conf:;conf;SETBP3.3PUSHACCPUSHPSWMOVPSW,#00HMOVA,cmodePUSHDPLPUSHDPHJNBbAlaIng,confskip;SETBbKick;stopalarm;CLRbAlaIngSJMPconfleaveconfskip:MOVDPTR,#confsetRLAJMP@A+DPTRset1:;时设置MOVA,hINCADAAMOVh,ACJNEA,#24H,notsetMOVh,#00HSJMPnotsetset2:;分设置MOVA,mINCADAAMOVm,ACJNEA,#60H,notsetMOVm,#00HSJMPnotsetset3:;秒设置MOVA,sINCADAAMOVs,ACJNEA,#60H,notsetMOVs,#00HSJMPnotsetsetae:CPLbAlaOn;闹钟开关SJMPnotsetasetah:MOVA,ah;闹钟时设置INCADAAMOVah,ACJNEA,#24H,notsetaMOVah,#00HSJMPnotsetasetam:MOVA,am;闹钟分设置7INCADAAMOVam,ACJNEA,#60H,notsetaMOVam,#00Hnotseta:ACALLprealaCLRbKickSJMPconfleavenotset:ACALLprepareconfleave:POPDPHPOPDPLPOPPSWPOPACCRETconfset:SJMPconfleaveSJMPset1SJMPset2SJMPset3SJMPsetaeSJMPsetahSJMPsetam6)功能执行程序执行程序负责执行被登记的功能,功能由主循环扫描键盘并登记。主循环中,当扫描到有键盘按下时,登记下将被执行的功能,然后启动定时器1,定时器1的中断服务程序即是功能执行程序,中断程序分析并执行被登记的功能。encperform:CLRTR1;actoncePUSHACCPUSHPSWMOVA,funclogCJNEA,#01H,encconfJNBkeym,encperformleave;actionjustatbuttonup;ACALLmode;do'mode'functionSJMPencperformleaveencconf:CJNEA,#02H,encperformleaveJNBkeyc,encperformleave;actionjustatbuttonup;ACALLconf;do'config'functionencperformleave:POPPSWPOPACCRETI四、完整源代码sEQU30HmEQU31HhEQU32HdmaskEQU33HcmodeEQU34HftEQU36HprebufEQU37H;8bytebufferprebufendEQU3EHamEQU3FH;alarmminiteahEQU40H;alarmhournpageEQU41H;functionpagefunclogEQU42H;functoactstackEQU4FH;pinledEQUP0lmaskEQUP2beepEQUP3.3keymEQUP1.6;key'mode'keycEQUP1.7;key'config';bitaddrbPalseEQU00HbAlaIngEQU01HbAlaOnEQU02HbKickEQU03H;metrixelementm_noneEQU0AHm_oEQU0BHm_fEQU0CHm_nEQU0DHorg0000HLJMPstartorg0003HLJMPmodelogger;INT0tomodeorg000BHLJMPact;timerorg0013HLJMPconflogger;INT1toconfigorg001BHLJMPencperform;performer1org0100Hstart:MOVSP,#stackMOVTMOD,#11HMOVTH0,#3CHMOVTL0,#0B0HMOVR2,#14H;R2usedbyT0MOVs,#00HMOVm,#00HMOVh,#00HMOVdmask,#00HMOVcmode,#00HMOVnpage,#00HMOVah,#23HMOVam,#59HSETBEASETBET0;T0SETBPT0SETBTR0SETBET1;T1SETBEX0;INT0SETBIT0SETBEX1;INT1SETBIT1SETBP3.2SETBP3.3SETBkeymSETBkeycCLRbAlaIngCLRbAlaOnCLRbKickloop:MOVB,#01111111BMOVR0,#prebuf-01Hnextnum:ACALLkeyscanINCR0MOVA,@R0PUSHACCMOVA,BRLAMOVB,AJBbPalse,showORLA,dmaskJNBbAlaIng,showMOVled,#0FFH;clrledwhenalarmACALLbeeponceDECSPSJMPloopshow:2PUSHACCACALLdisplayoneDECSPDECSP