当前位置:文档之家› 51单片机数码管时钟电路的设计_AT89C51

51单片机数码管时钟电路的设计_AT89C51

广东石油化工学院《51单片机原理与实践》课程设计报告学院计算机与电子信息学院专业班级学号姓名指导教师课程成绩完成日期 2010年12月27日数码管时钟电路的设计一、设计目的:通过这次课程设计掌握单片机系统的基本设计步骤及设计思路,掌握汇编语言的用法及各种指令的含义,比较熟练的运用指令进行单片机系统的设计的,熟悉用KEIL软件进行汇编语言的汇编,以及把代码写入实验板中,观测代码结合实际的运行结果后进行调整,体会到编程的分析问题、确定算法、画程序流程图、编写程序、程序功能模块化的优点的各各步骤。

二、设计要求:LED数码管时钟电路采用24h计时方式,时、分、秒用六位数码管显示。

该电路采用AT89C2051单片机,使用3V电池供电,只使用一个按键开关即可进入调时、省电(不显示LED数码管)和正常显示三种状态。

三、设计实验内容:1. 硬件的设计其采用AT89C51单片机应用设计,LED显示采用动态扫描方式实现,P0口输出段码数据,P2口输出位码数据,P1.1、P1.2接按钮开关。

为了提供LED数码管的驱动电流,采用6MHz晶振。

2. 系统总体分析系统主要包含四大模块:显示模块、时间计时模块、模式切换模块和模式设置模块。

显示模块:主要由主循环负责。

内存中开辟了一段8字节的内存空间,用作数据显示的字符缓冲区。

主循环不断将缓冲区中的字符呈现至数码管。

● 时间计时模块:电子钟的核心模块,记录了时间的时、分、秒信息。

●模式切换模块(MODE ):切换电子钟的设置模式,包括时设置、分设置、秒设置、闹铃开关设置、闹铃时设置和闹铃分设置。

相关数据被设置时将闪烁显示。

●模式设置模块(CONFIG ):通过判断设置模式(MODE ),执行相应的设置。

如时、分、秒的增1以及闹铃开关的变换。

另外,主循环还负责扫描键盘,检测相应键是否被按下,若MODE 键被按下则在特定单元中登记该功能,并启动定时器1,然后返回继续执行显示功能。

在定时器1中断时,被登记的功能正式执行。

期间用时约10ms ,用以消除机械抖动。

主循环流程图大致如下:图(一)主循环流程图定时器1中断服务程序流程图如下:开始键被按下登记相应功能数码管显示是否定时器1中断MODE CONFIGlogf unc = ?执行MODE 执行CONFIG结束图(二)定时器1中断服务程序流程图3. 系统主要程序的设计1)主程序本设计中的主程序主要负责对键盘扫描及显示数据,还包括判断是否闹钟正在活动。

若键盘中的P1.6(模式键)或P1.7(设置键)被按下,登记将被执行的功能,主循环不负责功能模块的执行。

若闹钟正在活动,调用蜂鸣函数。

其中bPalse标识了一秒的前半秒和后半秒,是为了控制显示数据的半秒闪烁。

主函数还包含初始化操作,以下省略。

loop:MOV B, #01111111B;位选通信号MOV R0, #prebuf - 01H ;数据缓冲区nextnu m:ACALL keyscan ;扫描键盘INC R0MOV A, @R0PUSH ACCMOV A, BRL AMOV B, AJB b Palse, showOR L A, dmaskJNB bAlaIng, showMOV led, #0FFHACALL beeponce 若闹铃活动,调用蜂鸣函数DEC SPshow:PUSH ACCACALL displayone 在特定数码管显示数据。

DEC SPDEC SPACALL delayCJNE R0, #prebufend, nextnu mSJMP loopkeyscan:JNB keym, keymode ;若切换键被按下,登记“切换”功能JNB keyc, keyconf ;若设置键被按下,登记“设置”功能RET;=====================;;log fu nction 'mode';;=====================keymode:MOV funclog, #01H ;key actACALL funcperform ;激活“功能执行模块”(见下文),RET;=====================;;log fu nction 'config';;=====================keyconf:MOV funclog, #02HACALL funcperform ;激活“功能执行模块”(见下文)RET2)显示子程序在特定数码管显示数据,通过堆栈传递参数。

第一个参数是待显示的字符,第二个参数是位选通信号。

函数通过查字形码表将字形显示至数码管。

displayone:PUSH ACCPUSH PSWMOV A, R0PUSH ACCPUSH BMOV PSW, #00HMOV A, SPSUBB A, #07HMOV R0, AMOV A, @R0INC R0MOV B, @R0PUSH DPHMOV DPTR, #metrixMOVC A, @A + DPTRJNB b Palse, noftANL A, ftnoft:MOV lmask, BMOV led, APOP DPHPOP DPLPOP BPOP ACCMOV R0, APOP PSWPOP ACCRET3)定时器TO中断服务程序电子钟的计秒程序,负责计算时间。

act: ;main timer actorCJNE R2, #0B H, conCLR b Palse ;palse per second con:DJNZ R2, leaveMOV R2, #14HPUSH ACCPUSH PSWMOV PSW, #00HMOV A, s ;sINC ADA AMOV s, ACJNE A, #60H, incnMOV s, #00HMOV A, m ;mINC ADA AMOV m, ACJNE A, #60H, incnMOV m, #00HMOV A, h ;hINC ADA AMOV h, ACJNE A, #24H, incnMOV h, #00Hincn:SETB b PalseJNB bAlaOn, alarmoffACALL checkala ;check alarm when alarm is ON alarmoff:MOV A, npageANL A, #02HJNZ skipACALL prepareskip:POP PSWPOP ACCleave:MOV TH0,#03CHMOV TL0,#0B0HRETI4)模式切换程序切换设置模式,包括时间时设置、时间分设置、时间秒设置、闹铃开关设置、闹铃时设置、闹铃分设置。

mode: ;mode;SETB P3.2PUSH ACCPUSH PSWPUSH DPLPUSH DPHJNB bAlaIng, modeskipSETB bKick ;stop alarmCLR bAlaIngSJMP modeleavemodeskip:MOV npage, #00HMOV DPTR, #maskdatMOV A, cmodeINC ACJNE A, #07H, enmodeMOV A, #00Henmode:MOV cmode, AANL A, #04HJZ notalapageMOV npage, #02HACALL preala ;时钟调整页准备notalapage:MOV A, cmodeMOVC A, @A + DPTRMOV d mask, A ;设置时闪烁modeleave:POP DPHPOP DPLPOP PSWPOP ACCRET5)模式设置程序对时间量执行加1,特别的闹铃开关执行开关设置。

conf: ;conf;SETB P3.3PUSH ACCPUSH PSWMOV PSW, #00HMOV A, cmodePUSH DPLPUSH DPHJNB bAlaIng, confskip;SETB bKick ;stop alarm;CLR bAlaIngSJMP confleaveconfskip:MOV DPTR, #confsetRL AJMP @A + DPTRset1: ;时设置MOV A, hINC ADA AMOV h, ACJNE A, #24H, notsetMOV h, #00HSJMP notsetset2: ;分设置MOV A, mINC ADA AMOV m, ACJNE A, #60H, notsetMOV m, #00HSJMP notsetset3: ;秒设置MOV A, sINC ADA AMOV s, ACJNE A, #60H, notsetMOV s, #00HSJMP notsetsetae:C PL bAlaOn ;闹钟开关SJMP notsetasetah:MOV A, ah ;闹钟时设置INC ADA AMOV ah, ACJNE A, #24H, notsetaMOV ah, #00HSJMP notsetasetam:MOV A, am ;闹钟分设置INC ADA AMOV am, ACJNE A, #60H, notsetaMOV am, #00Hnotseta:ACALL prealaCLR bKickSJMP confleavenotset:ACALL prepareconfleave:POP DPHPOP DPLPOP PSWPOP ACCRETconfset:SJMP confleaveSJMP set1SJMP set2SJMP set3SJMP setaeSJMP setahSJMP setam6)功能执行程序执行程序负责执行被登记的功能,功能由主循环扫描键盘并登记。

主循环中,当扫描到有键盘按下时,登记下将被执行的功能,然后启动定时器1,定时器1的中断服务程序即是功能执行程序,中断程序分析并执行被登记的功能。

encperform:CLR TR1 ;act oncePUSH ACCPUSH PSWMOV A, funclogCJNE A, #01H, encconfJNB keym, encperformleave ;action just at bu tton u p;ACALL mode ;d o 'm ode'fu nctionSJMP encperformleaveencconf:CJNE A, #02H, encperformleaveJNB keyc, encperformleave ;action just at button up;ACALL conf ;d o 'config' functionencperformleave:POP PSWPOP ACCRETI四、完整源代码s EQU 30Hm EQU 31Hh EQU 32Hdmask EQU 33Hcmode EQU 34Hft EQU 36Hprebuf EQU 37H ;8 byte buffer prebufend EQU 3EHam EQU 3FH ;alarm miniteah EQU 40H ;alarm hournpage EQU 41H ;function pagefunclog EQU 42H ;func to actstack EQU 4FH;pinled EQU P0lmask EQU P2beep EQU P3.3keym EQU P1.6 ;key 'm ode'keyc EQU P1.7 ;key 'config';bit addrbPalse EQU 00HbAlaIng EQU 01HbAlaOn EQU 02HbKick EQU 03H;metrix elementm_none EQU 0AHm_o EQU 0BHm_f EQU 0CHm_n EQU 0DHorg 0000HLJMP startorg 0003HLJMP modelogger ;INT0 to modeorg 000BHLJMP act ;timerorg 0013HLJMP conflogger ;INT1 to configorg 001BHLJMP encperform ;performerorg 0100Hstart:MOV S P, #stackMOV TMOD,#11HMOV TH0,#3C HMOV TL0,#0B0HMOV R2, #14H ;R2 used by T0MOV s, #00HMOV m, #00HMOV h, #00HMOV d mask, #00HMOV cmode, #00HMOV npage, #00HMOV ah, #23HMOV am, #59HSETB EASETB ET0 ;T0SETB PT0SETB TR0SETB ET1 ;T1SETB EX0 ;INT0SETB IT0SETB EX1 ;INT1SETB IT1SETB P3.2SETB P3.3SETB keymSETB keycCLR bAlaIngCLR bAlaOnCLR bKickloop:MOV B, #01111111BMOV R0, #prebuf - 01Hnextnu m:ACALL keyscanINC R0MOV A, @R0PUSH ACCMOV A, BRL AMOV B, AJB b Palse, showOR L A, dmaskJNB bAlaIng, showMOV led, #0FFH ;clr led when alarm ACALL beeponceDEC SPSJMP loopshow:PUSH ACCACALL displayoneDEC SPDEC SPACALL delayCJNE R0, #prebufend, nextnu mSJMP loop ; end start beeponce:C PL beepMOV R5, #02Hbeeploop2:MOV R6, #0FFHbeeploop1:NOPDJNZ R6, beeploop1DJNZ R5, beeploop2RET ;end beeponce;=====================;;display one character;;@param char Character to display;@param mask Position character to display;=====================displayone:PUSH ACCPUSH PSWMOV A, R0PUSH ACCPUSH BMOV PSW, #00HMOV A, SPSUBB A, #07HMOV R0, AMOV A, @R0INC R0MOV B, @R0PUSH DPLPUSH DPHMOV DPTR, #metrixMOVC A, @A + DPTRJNB b Palse, noftANL A, ftnoft:MOV lmask, BMOV led, APOP DPHPOP DPLPOP BPOP ACCMOV R0, APOP PSWPOP ACCRET ;end displayonedelay:PUSH ACCMOV A, R5PUSH ACCMOV A, R6PUSH ACCMOV R5, #03Hdloopo:MOV R6, #0FFHdloop:NOPDJNZ R6, dloopDJNZ R5, dloopoPOP ACCMOV R6, APOP ACCMOV R5, APOP ACCRET ;end delayORG 0200H;=====================;;prepare time datas;to the display buffer;;=====================prepare:MOV ft, #11011111B;enable ftPUSH ACCPUSH PSWPUSH BMOV A, R1PUSH ACCMOV R1, #prebufMOV@R1, #m_noneINC R1MOV@R1, #m_noneINC R1MOV A, h ;hMOV B, ASWAP AANL A, #0FHMOV@R1, AANL B, #0FHINC R1MOV@R1, BMOV A, m ;mMOV B, ASWAP AANL A, #0FHINC R1MOV@R1, AANL B, #0FHMOV@R1, BMOV A, s ;sMOV B, ASWAP AANL A, #0FHINC R1MOV@R1, AANL B, #0FHINC R1MOV@R1, BPOP ACCMOV R1, APOP BPOP PSWPOP ACCRET ;end prepare ;=====================;;prepare alarm datas;to the display buffer;;=====================preala:MOV ft, #0FFH ;no ftPUSH ACCPUSH PSWMOV R1, #prebufMOV@R1, #m_oINC R1JNB bAlaOn, alaoffMOV@R1, #m_nINC R1MOV@R1, #m_noneSJMP alaconalaoff:MOV@R1, #m_fINC R1MOV@R1, #m_falacon:INC R1MOV@R1, #m_noneMOV A, ahSWAP AANL A, #0FHINC R1MOV@R1, AMOV A, ahANL A, #0FHMOV@R1, AMOV A, amSWAP AANL A, #0FHINC R1MOV@R1, AMOV A, amANL A, #0FHINC R1MOV@R1, APOP PSWPOP ACCRET ;end prealaORG 0300H;=====================;;perform action;;=====================encperform:CLR TR1 ;act oncePUSH ACCPUSH PSWMOV A, funclogCJNE A, #01H, encconfJNB keym, encperformleave ;action just at bu tton u p;ACALL mode ;d o 'm ode'fu nction SJMP encperformleaveencconf:CJNE A, #02H, encperformleaveJNB keyc, encperformleave ;action just at button up;ACALL conf ;d o 'config' function encperformleave:POP PSWPOP ACCRETI;=====================;;prepare to d o function;;=====================funcperform:MOV TH1, #0D8HMOV TL1, #0F0HSETB TR1RET;=====================;;log fu nction 'mode';;===================== modelogger:MOV funclog, #01HACALL funcperformRETI;=====================;;log fu nction 'config';;===================== conflogger:MOV funclog, #02HACALL funcperformRETIORG 0400H;=====================;;mode;;to change function;or stop alarm when;alarming;;=====================mode: ;mode;SETB P3.2PUSH ACCPUSH PSWPUSH DPLPUSH DPHJNB bAlaIng, modeskipSETB bKick ;stop alarmCLR bAlaIngSJMP modeleavemodeskip:MOV npage, #00HMOV DPTR, #maskdatMOV A, cmodeINC ACJNE A, #07H, enmodeMOV A, #00Henmode:MOV cmode, AANL A, #04HJZ notalapageMOV npage, #02HACALL prealanotalapage:MOV A, cmodeMOVC A, @A + DPTRMOV d mask, Amodeleave:POP DPHPOP DPLPOP PSWPOP ACCRET ;end mode;=====================;;conf;;to change setting;that the 'mode' decided;;=====================conf: ;conf;SETB P3.3PUSH ACCPUSH PSWMOV PSW, #00HMOV A, cmodePUSH DPLPUSH DPHJNB bAlaIng, confskip;SETB bKick ;stop alarm;CLR bAlaIngSJMP confleaveconfskip:MOV DPTR, #confsetRL AJMP @A + DPTRset1:MOV A, hINC A ;hDA AMOV h, ACJNE A, #24H, notsetMOV h, #00HSJMP notsetset2:MOV A, mINC A ;mDA AMOV m, ACJNE A, #60H, notsetMOV m, #00HSJMP notsetset3:MOV A, sINC A ;sDA AMOV s, ACJNE A, #60H, notsetMOV s, #00HSJMP notsetsetae:C PL bAlaOn ;ala enableSJMP notsetasetah:MOV A, ah ;ala hINC ADA AMOV ah, ACJNE A, #24H, notsetaMOV ah, #00HSJMP notsetasetam:MOV A, am ;ala mINC ADA AMOV am, ACJNE A, #60H, notsetaMOV am, #00Hnotseta:ACALL prealaCLR bKickSJMP confleavenotset:ACALL prepareconfleave:POP DPHPOP DPLPOP PSWPOP ACCRETconfset:SJMP confleaveSJMP set1SJMP set2SJMP set3SJMP setaeSJMP setahSJMP setam ; end confORG 0500Hkeyscan:JNB keym, keymodeJNB keyc, keyconfRET;=====================;;log fu nction 'mode';;=====================keymode:MOV funclog, #01H ;key actACALL funcperformRET;=====================;;log fu nction 'config';;=====================keyconf:MOV funclog, #02HACALL funcperformRETORG 0600Hact: ;main timer actorCJNE R2, #0B H, conCLR b Palse ;palse per second con:DJNZ R2, leaveMOV R2, #14HPUSH ACCPUSH PSWMOV PSW, #00HMOV A, s ;sINC ADA AMOV s, ACJNE A, #60H, incnMOV s, #00HMOV A, m ;mINC ADA AMOV m, ACJNE A, #60H, incnMOV m, #00HMOV A, h ;hINC ADA AMOV h, ACJNE A, #24H, incnMOV h, #00Hincn:SETB b PalseJNB bAlaOn, alarmoffACALL checkala ;check alarm when alarm is ON alarmoff:MOV A, npageANL A, #02HJNZ skipACALL prepareskip:POP PSWPOP ACCleave:MOV TH0,#03CHMOV TL0,#0B0HRETI ;end actcheckala:MOV A, mCJNE A, am, alashu tMOV A, hCJNE A, ah, alashu tJB bKick, notala ;ala stopSETB bAlaIngSJMP notalaalashu t:CLR bAlaIngCLR bKicknotala:RETmaskdat:DB 00000000B, 00001100B, 00110000B, 11000000B, 00000111B, 00110000B, 11000000B metrix:;DB 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6FDB 0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20, 0x60DB 0xFF ;0X0A: NONEDB 0X27 ;0X0B: 'O'DB 0XB1 ;0X0C: 'F'DB 0X37 ;0x0D: 'n'END。

相关主题