电子钟实验讲解
电子时钟实验报告

电⼦时钟实验报告综合实验报告(电⼦钟)⼀、实验⽬的主要⽬的是回顾《微机原理与应⽤》以及其他课程所学知识,并能灵活运⽤到实验当中。
掌握8253A、7段数码管,8259A、8255A的应⽤。
⼆、实验设备STAR 系列实验仪⼀套、PC 机⼀台。
三、实验内容利⽤STAR ES598PCI实验仪设计⼀个具有时、分、秒显⽰功能的电⼦时钟,并定义⼀个启动键,当按下该键时时钟从当前设定值开始⾛时,时间数据可⽤数码管显⽰。
(1) 利⽤8253计数器对标准时钟信号计数,分别实现时、分、秒计时(2) 键盘设定⼀个按键,当按键按下则从已设定的时间开始计时(已设定的时间值可在显⽰缓冲区中预置)(3) 时、分、秒的数值均显⽰在数码管上四、实验步骤1、主机连线说明:E5 区:CLK —— B2 区:2ME5 区:CS、A0 —— A3 区:CS5、A0E5 区:A、B、C、D —— G5 区:A、B、C、DB3 区:CS、A0 —— A3 区:CS1、A0B3 区:INT、INTA —— ES8088:INTR、INTAB3 区:IR0 —— C5 区:OUT0C5 区:CS(8253)、A0、A1 —— A3 区:CS2、A0、A1C5 区:GATE0 —— C1 区:VCCC5 区:CLK0 —— B2 区:62.5K2、运⾏程序,按G5 区的F 键,设置时钟初值;3、观察G5 区数码管上显⽰的时间是否正确。
五、实验流程图设置时间⼦程序:8253⼦程序:六、实验程序.MODEL TINYEXTRN Display8:NEAR, GetKeyA:NEAR, GetKeyB:NEAR IO8259_0 EQU 0F000HIO8259_1 EQU 0F001HCon_8253 EQU 0E003HT0_8253 EQU 0E000H.STACK 200.DATAhalfsec DB 0 ;0.5秒计数Sec DB 0 ;秒Min DB 0 ;分hour DB 0 ;时buffer DB 8 DUP(0) ;显⽰缓冲区,8个字节buffer1 DB 8 DUP(0) ;显⽰缓冲区,8个字节bNeedDisplay DB 0 ;需要刷新显⽰number DB 0 ;设置哪⼀位时间bFlash DB 0 ;设置时是否需要刷新.CODESTART: MOV AX,@DATAMOV DS,AXMOV ES,AXNOPmov sec,0 ;时分秒赋为00:00:00mov min,0mov hour,0MOV bNeedDisplay,1 ;显⽰初始值CALL Init8253CALL Init8259CALL WriIntverSTIMAIN: CALL GetKeyA ;按键扫描JNB Main1CMP AL,0FH ;设置时间JNZ Main1CALL SetTimeMain1: CMP bNeedDisplay,0JZ MAINCALL Display_LED ;显⽰时分秒MOV bNeedDisplay,0 ;1s定时到刷新转速Main2: JMP MAIN ;循环进⾏实验内容介绍与测速功能测试SetTime PROC NEAR LEA SI,buffer1CALL TimeToBufferMOV Number,0Key: CMP bFlash,0JZ Key2LEA SI,buffer1LEA DI,bufferMOV CX,8REP MOVSBCMP halfsec,0JNZ FLASHMOV BL,numberNOT BLAND BX,07HLEA SI,bufferMOV BYTE PTR [SI+BX],10H ;当前设置位置产⽣闪烁效果FLASH: LEA SI,buffer CALL Display8MOV bFlash,0Key2: CALL GetKeyAJNB KeyCMP AL,0EH ;放弃设置JNZ Key1JMP ExitKey1: CMP AL,0FHJZ SetTime8SetTime1: CMP AL,10JNB Key ;⽆效按键CMP number,0JNZ SetTime2CMP AL,3 ;调整时的⼗位数JNB KeyMOV buffer1 + 7,ALJMP SetTime7SetTime2: CMP number,1JNZ SetTime3CMP buffer1 + 7,2JB SetTime2_1 ;修改后可以在设置时间时,设置时钟为04到09之间的数值 CMP AL,4 JNB KeySetTime2_1: MOV buffer1 + 6,ALINC numberJMP SetTime7SetTime3: CMP number,3JNZ SetTime4CMP AL,6 ;调整分的⼗位数JNB KeyMOV buffer1 + 4,ALJMP SetTime7SetTime4: CMP number,4JNZ SetTime5MOV buffer1 + 3,AL ;调整分的个位数INC numberJMP SetTime7SetTime5: CMP number,6JNZ SetTime6CMP AL,6 ;调整秒的⼗位数JB SetTime5_1JMP KeySetTime5_1: MOV buffer1 + 1,ALJMP SetTime7SetTime6: MOV buffer1,AL ;调整秒的个位数SetTime7: INC numberCMP number,8JNB SetTime8MOV bFlash,1 ;需要刷新JMP KeySetTime8: MOV AL,buffer1 + 1 ;确认MOV BL,10MUL BLADD AL,buffer1MOV sec,AL ;秒MOV AL,buffer1 + 4MUL BLADD AL,buffer1 + 3MOV min,AL ;分MOV AL,buffer1 + 7MUL BLADD AL,buffer1 + 6CMP al,18h ;修改后可以解决时间设置时,时钟设置为24以上的数值 JNB exit MOV hour,AL ;时JMP ExitExit: RETSetTime ENDP;hour min sec转化成可显⽰格式TimeToBuffer PROC NEARMOV AL,secXOR AH,AHMOV BL,10DIV BLMOV [SI],AHMOV [SI + 1],AL ;秒MOV BYTE PTR [SI + 2],10H ;这位不显⽰MOV AL,minXOR AH,AHDIV BLMOV [SI + 3],AHMOV [SI + 4],AL ;分MOV BYTE PTR [SI + 5],10H ;这位不显⽰MOV AL,hourXOR AH,AHDIV BLMOV [SI + 6],AHMOV [SI + 7],AL ;时RETTimeToBuffer ENDP;显⽰时分秒Display_LED PROC NEAR LEA SI,bufferCALL TimeToBufferLEA SI,bufferCALL Display8 ;显⽰RETDisplay_LED ENDP;0.5s产⽣⼀次中断Timer0Int: PUSH AXPUSH DXMOV bFlash,1INC halfsecCMP halfsec,2JNZ Timer0Int1MOV bNeedDisplay,1MOV halfsec,0INC secCMP sec,60JNZ Timer0Int1MOV sec,0INC minCMP min,60JNZ Timer0Int1MOV min,0INC hourCMP hour,24JNZ Timer0Int1MOV hour,0Timer0Int1: MOV DX,IO8259_0 MOV AL,20HOUT DX,ALPOP DXPOP AXIRETInit8253 PROC NEARMOV DX,Con_8253MOV AL,34HOUT DX,AL ;计数器T0设置在模式2状态,HEX计数 MOV DX,T0_8253 MOV AL,12HOUT DX,ALMOV AL,7AHOUT DX,AL ;CLK0=62.5kHz,0.5s定时RETInit8253 ENDPInit8259 PROC NEARMOV DX,IO8259_0MOV AL,13HOUT DX,ALMOV DX,IO8259_1MOV AL,08HOUT DX,ALMOV AL,09HOUT DX,ALMOV AL,0FEHOUT DX,ALRETInit8259 ENDPWriIntver PROC NEARPUSH ESMOV AX,0MOV ES,AXMOV DI,20HLEA AX,Timer0IntSTOSWMOV AX,CSSTOSWPOP ESRETWriIntver ENDPEND START七、实验结果⼋、实验⼼得通过这两天的实习使我对微机原理有了更深⼊的了解,原来只是停留在想象中的,就像⼀些编写的程序也只是通过⾃我检查来看程序是否错误,有些问题很难发现,但是通过这两天的实习,使原本空洞的知识进⼊了实际的操作中,特别是对对电⼦钟的实验发现微机原理可以实验很多东西,我们现实中的很多东西都是通过微机原理的编程实现的,⽐如⼗字路⼝的红绿灯、数字式温度计、语⾳模块、光照强度的测试……,切实体验到了微机原理的功能强⼤以及它的重要性。
电子工艺实训报告电子钟

一、实习目的本次电子钟实训的目的是通过实际操作,使学生熟悉电子钟的基本原理和制作方法,掌握电子元器件的识别和选用,提高动手能力和实际操作技能,培养学生的创新意识和团队合作精神。
二、实习时间2022年X月X日~2022年X月X日三、实习地点XX职业学院电子实验室四、实习内容1. 电子钟原理及电路分析电子钟是一种利用电子元件实现的计时工具,其基本原理是通过振荡器产生稳定的脉冲信号,通过分频器将脉冲信号进行分频,最终得到1秒的脉冲信号,驱动计时机构实现计时。
2. 电子元器件的识别和选用(1)振荡器:选用555定时器作为振荡器,其内部结构简单,稳定性好,易于调试。
(2)分频器:选用CD4060十进制计数器作为分频器,其内部结构复杂,可分频10次,满足电子钟的计时需求。
(3)计时机构:选用LED数码管显示计时,LED数码管具有低功耗、高亮度、可视角度大等优点。
(4)电源:选用9V电池作为电源,方便携带和使用。
3. 电路板设计与制作(1)设计电路图:根据电子钟的原理,绘制电路图,包括振荡器、分频器、计时机构和电源等部分。
(2)制作电路板:按照电路图,在电路板上焊接各个元器件,注意焊接顺序和焊接质量。
4. 电子钟的调试与测试(1)调试振荡器:调整555定时器的R1、R2电阻,使振荡器产生稳定的脉冲信号。
(2)调试分频器:调整CD4060计数器的时钟输入端,使分频器输出1秒的脉冲信号。
(3)调试计时机构:调整LED数码管显示的时、分、秒,使电子钟准确计时。
(4)测试电子钟:观察电子钟的计时准确性,检查是否存在故障。
五、实习总结1. 通过本次电子钟实训,使学生掌握了电子钟的基本原理和制作方法,熟悉了电子元器件的识别和选用。
2. 提高了学生的动手能力和实际操作技能,培养了学生的创新意识和团队合作精神。
3. 使学生对电子技术有了更深入的了解,为今后从事电子技术相关领域的工作奠定了基础。
4. 在实习过程中,学生之间相互交流、共同探讨,提高了团队协作能力。
单片机电子时钟课程设计实验报告(1)

单片机电子时钟课程设计实验报告(1)单片机电子时钟课程设计实验报告一、实验内容本次实验的主要内容是使用单片机设计一个电子时钟,通过编程控制单片机,实现时钟的显示、报时、闹钟等功能。
二、实验步骤1.硬件设计根据实验要求,搭建电子时钟的硬件电路,包括单片机、时钟模块、显示模块、按键模块等。
2.软件设计通过C语言编写单片机程序,用于实现时钟功能。
3.程序实现(1)时钟显示功能通过读取时钟模块的时间信息,在显示模块上显示当前时间。
(2)报时功能设置定时器,在每个整点时,通过发出对应的蜂鸣声,提示时间到达整点。
(3)闹钟功能设置闹钟时间和闹铃时间,在闹钟时间到达时,发出提示蜂鸣,并在屏幕上显示“闹钟时间到了”。
(4)时间设置功能通过按键模块实现时间的设置,包括设置小时数、分钟数、秒数等。
(5)年月日设置功能通过按键模块实现年月日的设置,包括设置年份、月份、日期等。
三、实验结果经过调试,电子时钟的各项功能都能够正常实现。
在运行过程中,时钟能够准确、稳定地显示当前时间,并在整点时提示时间到达整点。
在设定的闹铃时间到达时,能够发出提示蜂鸣,并在屏幕上显示“闹钟时间到了”。
同时,在需要设置时间和年月日信息时,也能够通过按键进行相应的设置操作。
四、实验感悟通过本次实验,我深刻体会到了单片机在电子设备中的广泛应用以及C 语言在程序设计中的重要性。
通过实验,我不仅掌握了单片机的硬件设计与编程技术,还学会了在设计电子设备时,应重视系统的稳定性与可靠性,并善于寻找调试过程中的问题并解决。
在今后的学习和工作中,我将继续加强对单片机及其应用的学习与掌握,努力提升自己的实践能力,为未来的科研与工作做好充分准备。
数字电路电子钟设计实验报告

数字电路电子钟设计实验报告目录1.实验目的2.实验题目描述和要求3.设计报告内容3.1实验名称3.2实验目的3.3实验器材及主要器件3.4数字电子钟基本原理3.5数字电子钟制作与调试3.6数字电子钟电路图3.7数字电子钟的组装与调试4.实验结论5.实验心得1.实验目的※掌握组合逻辑电路、时序逻辑电路及数字逻辑电路系统的设计、安装、测试方法;※进一步巩固所学的理论知识,提高运用所学知识分析和解决实际问题的能力;※提高电路布局﹑布线及检查和排除故障的能力;※培养书写综合实验报告的能力。
2.实验题目描述和要求(1)数字电子钟基本功能数字电子钟是一个大众化产品,一般来讲应具有以下基本功能。
①能进行小时、分、秒显示。
②能进行小时、分、秒设置。
③能实现整点报时。
④能通过设置,实现任意时间报时。
(2)数字电子钟基本性能一个实用的数字电子钟应满足三个“度”:精度、亮度和响度。
①精度是指显示的时间必须准确。
②亮度是指显示的时间必须让人看得清楚。
③响度是指报时的声音必须清脆有力。
(3)数字电子钟用于教学设计时必须考虑的因素从教学角度来看,数字电子钟的设计应考虑以下几点。
①数字电路可由多种不同方案实现,在方案比较时应着重考虑所选用的方案在设计时能否把数字电路包含的主要知识全部囊括进去。
②应把数字电子钟分解成若干个模块,并在印制电路板设计时把各模块固定在不同的区域。
③应确保大多数学生能在规定时间内完成制作与调试。
④数字电子钟印制电路板(PCB)设计时除留下足够的训练内容让学生完成外,应设计一标准印制电路板设计示范区。
(4)本教材设计的数字电子钟总体方案根据以上分析,本教材把数字电子钟分解为信号电路、显示电路、计时电路、校时电路和报时电路五个功能相对独立的模块(如图8-1所示),采用如图8-2所示的设计方案,并按要求实施时参照一下规定进行。
①各模块的制作、调试按显示电路、信号电路、计时电路、校时电路和报时电路的顺序进行。
单片机实验电子钟报告

实验四 电子钟(定时器、中断综合实验)一、实验目的熟悉MCS51类CPU 的定时器、中断系统编程方法, 了解定时器的应用、实时程序的设计和调试技巧。
二、实验内容编写一个时钟程序, 产生一个50ms 的定时中断, 对定时中断计数, 将时、分、秒显示在数码管上。
三、程序框图主程序中断处理电子钟程序框图四、实验步骤 1.连线说明: E5 区A0 ←→ A3 区A0 E5 区CS ←→ A3 区CS5 E5 区CLK ←→ B2 区2MHzE5 区A.B.C.D ←→ G5 区A.B.C.D (排线每个8 位, 注意高低位一致) 2.时间显示在数码管上五、程序清单 ms50 DATA 31H ;存放多少个50ms sec DATA 32H ;秒 min DATA 33H ;分hour DATA 34H ;时buffer DATA 35H ;显示缓冲区EXTRN CODE(Display8)ORG 0000HLJMP STARORG 000BH ;定时器T0中断处理入口地址LJMP INT_Timer0ORG 0100HSTAR: MOV SP,#60H ;堆栈MOV ms50,A ;清零ms50MOV hour,#12 ;设定初值: 12:59:50MOV min,#59MOV sec,#50MOV TH0,#60 ;定时中断计数器初值MOV TL0,#176 ;定时50msMOV TMOD,#1 ;定时器0: 方式一MOV IE,#82H ;允许定时器0中断SETB TR0 ;开定时器T0STAR1: LCALL Display ;调用显示JNB F0,$CLR F0SJMP STAR1 ;需要重新显示时间;中断服务程序INT_Timer0: MOV TL0,#176-5MOV TH0,#60PUSH 01HMOV R1,#ms50INC @R1 ;50ms单元加1CJNE @R1,#20,ExitIntMOV @R1,#0 ;恢复初值INC R1INC @R1 ;秒加1CJNE @R1,#60,ExitInt1MOV @R1,#0INC R1INC @R1 ;分加1CJNE @R1,#60,ExitInt1MOV @R1,#0INC R1INC @R1 ;时加1CJNE @R1,#24,ExitInt1MOV @R1,#0ExitInt1: SETB F0ExitInt: POP 01HRETIHexToBCD: MOV B,#10DIV ABMOV @R0,BINC R0MOV @R0,AINC R0RETDisplay: MOV R0,#bufferMOV A,secACALL HexToBCDMOV @R0,#10H ;第三位不显示INC R0MOV A,minACALL HexToBCDMOV @R0,#10H ;第六位不显示INC R0MOV A,hourACALL HexToBCDMOV R0,#bufferLCALL Display8RETENDEXTRN CODE (Display8)BUFFER DA TA 60HORG 0000HAJMP MAINORG 000BHAJMP IT0PMAIN: MOV TMOD,#01HMOV 20H,#20HCLR AMOV 52H,A ;计数和显示MOV 51H,A ;空间清零MOV 50H,#50HMOV 40H,AMOV 41H,AMOV 43H,AMOV 44H,AMOV 46H,AMOV 47H,ASETB ET0SETB EAMOV TH0,#9EH ;计数器赋初值MOV TL0,#58HSETB TR0MOV 45H,#11HMOV 42H,#11HMOV R0,#BUFFERLCALL Display8HERE: AJMP HEREIT0P: PUSH PSWPUSH ACCMOV TH0,#9EH ;重新转入计数值MOV TL0,#58HDJNZ 20H,RETURN ;计数不满20返回MOV 20H,#20H ;重置中断次数MOV A,#01H ;秒加1ADD A,50HDA A ;秒单元十进制调制PUSH ACCCJNE A,#60H,SWS ;是否到60秒, 否则返回MOV A,#00HSWS: MOV R5,ASW AP AANL A,#0FHMOV 41H,AMOV A,R5ANL A,#0FHMOV 40H,A ;满60秒, 秒单元清零LCALL AAAPOP ACCMOV 50H,ACJNE A,#60H,RETURNMOV 50H,#00HMOV A,#01H ;分单元加1ADD A,51H ;分单元十进制调整DA APUSH ACCCJNE A,#60H,SWS1;是否到60分, 否则返回MOV A,#00HSWS1: MOV R5,A·SW AP AANL A,#0FHMOV 44H,AMOV A,R5ANL A,#0FHMOV 43H,ALCALL AAAPOP ACCMOV 51H,ACJNE A,#60H,RETURNMOV 51H,#00H ;满60分, 分单元清零MOV A,#01H ;时单元加1ADD A,52HDA APUSH ACCCJNE A,#24H,SWS2 ;是否到24小时, 否则返回MOV A,#00HSWS2: MOV R5,ASW AP AANL A,#0FHMOV 47H,AMOV A,R5ANL A,#0FHMOV 46H,ALCALL AAAPOP ACCMOV 52H,ACJNE A,#24H,RETURNMOV 52H,#00H ;满24小时, 时单元清零RETURN:POP PSWPOP ACCRETIAAA: MOV R0,#40H ;计数器的值赋MOV R1,#60H ;给显示空间MOV R5,#08HABC: MOV A,@R0MOV @R1,AINC R1INC R0DJNZ R5,ABCMOV R0,#BUFFERLCALL Display8RETEND六、思考题1.电子钟走时精度与哪些有关系?中断程序中给TL0赋值为什么与初始化程序中不一样?2、使用定时器方式二, 重新编写程序。
数字电子钟实验报告

一、设计目的1、熟悉集成电路的引脚安排。
2、掌握各芯片的逻辑功能及使用方法。
3、了解面包板结构及其接线方法。
4、了解数字钟的组成及工作原理。
5、熟悉数字钟的设计与制作。
二、设计技术参数1、时制式为24小时制。
2、采用LED数码管显示时、分,秒采用数字显示。
3、具有方便的时间调校功能,使其校正到标准时间。
4、其它附加功能(显示星期、报时、停电查看时间)。
三、设计原理及其框图1.数字钟的构成[电路原理图附在后面]数字钟是一个将“时”,“分”,“秒”显示于人的视觉器官的计时装置。
它的计时周期为24小时,显示满刻度为23时59分59秒,另外应有校时功能和一些显示星期、报时、停电查看时间等附加功能。
因此,一个基本的数字钟电路主要由译码显示器、“时”,“分”,“秒”计数器、校时电路、报时电路和振荡器组成。
该电路系统由秒信号发生器、“时、分、秒、星期”计数器、译码器及显示器、校时电路、整点报时电路组成。
秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,一般用石英晶体振荡器加分频器来实现,现用555定时器实现。
将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。
“分计数器”也采用60进制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”。
“时计数器”采用24进制计时器,可实现对一天24小时的累计。
译码显示电路将“时”、“分”、“秒”计数器的输出状态送到七段显示译码器译码,通过七位LED七段显示器显示出来。
整点报时电路时根据计时系统的输出状态产生一脉冲信号,然后去触发一音频发生器实现报时。
校时电路时用来对“时”、“分”、“秒”显示数字进行校对调整的。
附图 SHJ-1所示为数字钟的一般构成框图。
1)555定时器电路555定时器电路给数字钟提供一个频率稳定准确的方波信号,本设计提供R1为10KΩ,R2为5KΩ, C为150 nF,由f=1.43/{(R1+2*R2)*C}可得其提供的频率为477Hz。
电子钟实验报告

电子钟实验报告电子钟实验报告引言:电子钟是一种利用电子技术来实现时间显示的装置,它不仅能够准确地显示时间,还具备了一些其他功能,如闹钟、温度显示等。
在本次实验中,我们将通过搭建一个简单的电子钟来了解其基本原理和工作方式。
一、材料与方法本次实验所需材料包括:Arduino开发板、LCD液晶显示屏、实时时钟模块、电阻、电容等。
我们首先将这些材料按照电路图连接起来,然后通过编写Arduino代码来实现时间的显示和功能的控制。
二、电子钟的原理电子钟的核心部分是实时时钟模块,它通过与Arduino开发板的连接,提供准确的时间信号。
实时时钟模块内部有一个独立的时钟电路,可以独立运行,并通过I2C总线与Arduino进行通信。
当我们将时间信息发送给实时时钟模块后,它会自动更新时间,并通过Arduino控制LCD显示屏来显示时间。
三、电路连接与编程我们首先将Arduino开发板与实时时钟模块通过I2C总线连接,然后将LCD显示屏与Arduino开发板连接。
接下来,我们需要编写Arduino代码来实现时间的显示和功能的控制。
在代码中,我们需要使用实时时钟模块的库函数来获取当前时间,并将其发送给LCD显示屏进行显示。
同时,我们还可以通过编写代码来实现一些其他功能,如闹钟、温度显示等。
四、实验结果与分析经过搭建电路和编写代码后,我们成功地实现了一个简单的电子钟。
通过观察LCD显示屏,我们可以清晰地看到当前的时间,并且可以通过按键来控制闹钟的开关和设置温度显示。
这个电子钟不仅具备了时间显示的功能,还具备了一些其他实用的功能,为我们的生活带来了便利。
五、实验总结通过本次实验,我们深入了解了电子钟的原理和工作方式,并通过实际操作来搭建了一个简单的电子钟。
在实验过程中,我们不仅学会了如何连接电路和编写代码,还锻炼了自己的动手能力和解决问题的能力。
电子钟作为一种常见的电子设备,广泛应用于我们的日常生活中,通过本次实验,我们对其有了更深入的了解。
24时制数字电子钟设计

实验八 综合设计实验——设计24时制数字电子钟一、实验方案数字钟是一个将“ 时”,“分”,“秒”显示于人的视觉器官的计时装置.它的计时周期为24小时,显示满刻度为23时59分59秒,另外应有闹钟功能和报时功能.。
因此,一个基本的数字钟电路主要由译码显示器、“时”,“分”,“秒”计数器、校时电路、报时电路和振荡器组成.干电路系统由秒信号发生器、“时、分、秒”计数器、译码器及显示器、整点报时电路、闹钟电路组成。
秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,一般用石英晶体振荡器加分频器来实现.将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发现胡一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲.“分计数器”也采用60进制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”.“时计数器”采用24进制计时器,可实现对一天24小时的累计.译码显示电路将“时”、“分”、“秒”计数器的输出状态菁七段显示译码器译码,通过LED 七段显示器显示出来.整点报时电路及闹钟电路是根据计时系统的输出状态产生一脉冲信号,然后去触发一音频发生器实现报时.(由于EWB 元件中没有扬声器,故电路中一红色小灯泡代替)。
二、系统框图三、数字时钟的原理图:1、信号源及分频器信号源及分频器是数字电子中的核心,其作用是信号源产生一个频率标准,即时间标准信号,然后再由分频器生成秒脉冲。
由于实验室的信号源可提供10Hz 的信号,故要分频成1hz。
74290的引脚图74290的功能表分频电路的仿真图为:2、振荡器(如果要做成一个独立的电子时钟,则要一个能自动产生信号的电路,即振荡电路)振荡器是数字电子中的核心,其作用是产生一个频率标准,即时间标准信号,然后再由分频器生成秒脉冲。
我们有三种选择,即石英晶体振荡器、集成逻辑门与RC组成的时钟源振荡器和由集成电路定时器555和RC组成的多谐振荡器。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3t京理XXf微机原理(单片机)课程设计总结报告项目名称:电子钟一、设计任务电子钟上位机:完成界面设计与通讯程序(1)能够显示当前时间3个闹钟时间、复位(2)能够设置时间、至少)能够调用已有的曲子作为闹铃( 3 (4)可以对串口进行设置下位机:完成电路设计与控制程序显示当前时间和最近一次闹钟时间LCD) 1 (.(2)按键进行时间调整,按键1控制小时,按键2控制分钟,按键3控制秒,按键4时间调整和闹钟设置切换,按键5复位(3)能够播放上位机下传的曲子(4 )通过串口与上位机通讯二、总体方案:电子钟总体框图如图1所示。
图1电子钟总体功能模块图图中,控制器采用单片机89C52,通过编程来控制系统整体的设置和运行;按键扫描模块利用单片机本身的6个按键中的前5个,通过编写程序来实现任务设计中的按键要求;闹钟模块则通过改变蜂鸣器高低电平状态持续时间的长短来实现不同的响铃;输入输出模块则配合按键扫描模块来对电子钟时钟和闹钟进行初始的时间设定及修改;上位机模块则通过串口实现上下位机之间的通信。
三、硬件设计:首先,为了完成本次设计任务,我们需要认识89C52的组成结构。
它是INTEL公司MCS-51系列单片机中基本的产品,采用ATMEL公司可靠的CMOS工艺技术制造的高性能8位单片机,属于标准的MCS-51的HCMOS产品。
它结合了CMOS的高速和高密度技术及CMOS的低功耗特征,它基于标准的MCS-51单片机体系结构和指令系统,属于89C51增强型单片机版本,集成了时钟输岀和向上或向下计数器等更多的功能,适合于类似马达控制等应用场合。
89C52内置8位中央处理单元、512字节内部数据存储器RAM、8k片内程序存储器(ROM ) 32个双向输入/输岀(I/O) 口、3个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。
此外,89C52还可工作于低功耗模式,可通过两种软件选择空闲和掉电模式。
在空闲模式下冻结CPU而RAM定时器、串行口和中断系数据,时钟振荡停止,同时停止芯片内其它功能。
RAM统维持其功能。
掉电模式下,保存.其次,为了显示时钟和闹钟,需要了解LCD1602的工作原理。
1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。
它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形。
1602LCD 是指显示的内容为16*2,即可以显示两行,每行16个字符液晶模块(显示字符和数字) 。
最后,作为单片机的常识,我们应该了解单片机的最小系统。
单片机的最小系统是指单片机能正常工作所必须的基本电路,主要有单片机、复位电路、晶振电路构成,如果采用的是不带内部ROM的单片机,还需要有外部ROM扩展电路。
四、软件设计:下位机:主函数里首先进行LCD 和串口初始化,然后进入while(1) 循环中不断扫描单片机上前的状5 个按键态,如果有发生变化则进行相应的操作,主体流程图如下:~*'"*^ F_»Y<1 ■—I 麻t 总如肯总翔畔 I 轴^s^*4少在系统按照上述流程图运行的同时, 串口中断一直被屏蔽, 当有数据要通过串口从上位机向下位机发送时,串口中断开始工作,修改当前 LCD 显示的时钟和闹钟并在复位键按下后使电子钟按照新的时钟开始计时。
上位机:按下图流程图进行串口读的工作,并将读到的数据进行显示,在串口读的过程中, 为了用来保每一组数据都设定了头校验和尾校验,防止数据的丢失以及数据的显示顺序等问题,1 r卜甘rit氐 L6t>I r~知誓令泗 忡枷:—证接受到的每一组数据都是以时、分、秒的顺序传送的,这样就可以将时、分、秒分别显示的相应的区域,而且不会发生错乱。
按下图流程图进行串口写的工作,并将数据传送给单片机。
开始W触发开关二:足f串口写入数据项目所实现的功能、指标:五、下位机:(1)LCD显示当前时间(2)按键进行时间调整,按键1控制小时,按键2控制分钟,按键3控制秒,键4时间调整和闹钟设置切换,按键5复位(3)通过串口与上位机通讯上位机:(1)显示当前时间(2)能够设置时间,至少三个闹钟时间、复位(3)能够调用已有的曲子作为闹铃(4)可以对串口进行设置六、明细清单:单片机89C52: 58~65 元LCD1602: 4.8~10 元七、设计调试中遇到的疑难问题及解决方法:下位机:( 1 )在初始化LCD 显示的时钟和闹钟时间时,时钟和闹钟时间显示的位置不对,在查询LCD1602 说明书之后发现上下两行的首地址并不连续,后修改相关写的位置解决该问题。
( 2 )定时器初始化的时候由于没有考虑到定时中断和串口中断共存的情况,是两个中断无法正常工作,LCD 无法显示相对应的时间,TMOD 采用或的设置形式解决两个中断共存的问题,使其可以独立工作不互相干扰。
(3)按键操作有时会记错按键次数,再加入松手检测后问题得以解决(4)上位机通过串口向下位机传送数据时存在丢包现象,在数据前端加两位数字来判别数据修改对象是时钟还是闹钟,避免丢包。
上位机:(1)刚开始显示时间时,时间的显示总是错乱的,没有能够将数据按照预想的顺序显示出来。
研究出来的原因是没有设置校验码,由于单片机通过串口一直在传输数据,以至于数据是连续的,导致无法识别数据的顺序,最后通过在每组数据的头和尾设置校验码,上位机通过检验校验码检查数据的正确性,完成了数据的正常显示。
(2)在串口写入数据时,在初始的设计时采用触发式的开关,但是并不能完成触发时写入数据,由于对LabView 的循环结构体掌握得并不深入,所以一直没有能完成通过触发实现写入数据,最后加入了一个布尔开关,每次写入数据前首先要打开这个布尔开关,然后才能实现触发式写入数据。
八、心得体会与建议:上位机:本次微机原理的综合设计实验与以往的实验有很明显的不同之处,以前的实验大多是属于认知性的实验,关于自主设计一个系统的内容很少,这次的单片机课程设计完全是两个人的小组合作,从设计到软件的编写,再到后来的调试和修改代码,全都是自主完成,虽然电子钟完成的功能并不是很繁琐,可是对于我来说,也是一个比较大的挑战,在接到任务单时,看到了有关于上位机的设计,由于之前没有太多得接触上位机的开发,自己也一直都很想好好学习一下,所以这次就主动要求负责上位机部分的设计,在这个设计过程中,从基础的开始学习,对于我来说还是有挑战的,在咨询了一些同学和自己看书之后,做了一些简单的练习,然后就着手开始做电子钟的设计了,在设计和调试的过程中,我们组内两名成员一直进行上位机和下位机的相互通讯,查找系统的bug ,并进行修补。
通过这次实验,熟悉了使用LabView 进行上位机的设计,也通过对系统的调试积攒了一些工程上很基础的经验,在和组员的协作过程中,一起合作解决了很多问题,也能够分工明确,受益匪浅。
下位机:本次实验中由于任务要求没有使用到外加电路,所以下位机的所有难题都在单片机编程方面,由于之前微机原理课程上面学习过单片机的相关理论知识,但却没有实际操作,所以借着这次机会不仅系统的整理了有关单片机方面的相关知识,更通过实际编程调试认识到自身的不足,学会了单片机编程和调试的一般步骤,在刚开始应该有所规划不应该盲目的去编写程序,这样不仅在后期会打乱所有思路,畏怯在程序调试时也会带来很大的困难,应该分块编程调试,一步一步的慢慢解决问题,通过一点一滴的积累最后完成任务要求。
在这次课程设计中通过小组合作获益匪浅。
九、工作量说明:我主要负责上位机的设计以及调试,同组同学主要负责下位机的单片机编程以及调试,在后期,上位机与下位机进行通讯,一起调试各种性能指标。
附录:下位机单片机代码:#include <reg52.h> #include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit lcdrs=P1A0; //定义LCD 的RS 端sbit lcdrw=P1Ai;//定义LCD 的R/W 端sbit lcden=P1A2; //定义LCD 的使能端sbit s1=P3A7; //1 控制小时sbit s2=P3A6; //2 控制分钟sbit s3=P3A5; //3 控制秒sbit s4=P3A4; //4 控制时间调整和闹钟设置切换sbit s5=P3A3; //5 控制复位sbit beep=P"5; // 蜂鸣器uchar xs[15];uint i=0;uchar a1,b1,cl,d1=1;int clock_count1=0,clock_int1=0;int clock_count2=0,clock_int2=0;int clock_count3=0,clock_int3=0;uchar count=0,s=0,s1num=0,s2num=0,s3num=0,s4num=0,s5num=0;uchar shi,fen,miao; //定义时间和闹钟的时分秒uchar nshi1,nfen1;uchar nshi2,nfen2;uchar nshi3,nfen3;uchar code table[]=uchar code table1[]= uchar code table2[]= uchar code table3[]=void delay(uint z){uint x,y;for (x=z;x>0;x --) for (y=110;y>0;y --);//初始上电时时间默认状态//初始上电时闹钟默认状态//按键延时函数//液晶写命令函数{//选择写指令void write_com(uchar com) lcdrs=0;使能端为低// lcden=0;// 传送要写的数据P0=com;//延时待数据稳定delay(5);// 触发脉冲将数据写入lcden=1;延时// delay(5);完成高脉冲// lcden=0;void write_date(uchar date) // 液晶写数据函数{ lcdrs=1;lcden=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;}void init(){//初始子函数// 设置 16*2 显示, 5*7 点阵, 8 位数据接口uchar num; lcdrw=0; lcden=0;//定义变量用来调用数组 //只写数据到液晶write_com(0x0c); //开显示但不显示光标write_com(0x06); // 写一个字符指针自动加一 write_com(0x01); // 显示清零,数据指针清零 将数据指针定位到第一行第一个字处 //write_com(0x80); for (num=0;num<8;num++) write_date(table[num]); delay(20); // 写时钟 { write_com(0x80+0x09); for (num=0;num<5;num++) // write_date(table1[num]); delay(20); } 写时间数组数据 {write_com(0x80+0x40); for (num=0;num<5;num++) // { write_date(table2[num]); delay(20); } 写闹钟名称write_com(0x80+0x49); // 选择移屏第二行 for (num=0;num<5;num++) // 写闹钟数据 { write_date(table3[num]); delay(20);write_com(0x38);TMOD=0x01; // 定时器0 工作方式为方式1 TH0=(65536 -50000)/256; // 装初值TL0=(65536 -50000)%6;EA=1; // 开中断ET0=1; // 选择定时器0TR0=0; // 关定时器0}void init1() // 串口初始化{SCON = 0x50; // SCON: 模式1, 8-bit UART, 使能接收TMOD |= 0x20; // TMOD: timer 1, mode 2, 8 -bit 重装11.0592MHz 晶振波特率9600 重装值// TH1: TH1 = 0xFD;TL1 = 0xfd; //用T1 定时器设置波特率TR1 = 1; // TR1: timer 1 打开REN=1; // 串口允许接收SM0=0; //SM1=1; // 串行口工作方式1EA = 1; // 打开总中断ES = 1; // 打开串口中断}void send(uchar a) 将下位机时间同步到上位机//{ES=0;,即将单片机的数据发送到计算机SBUF 到SBUF=a; a 发送数据// while(!TI);TI=0;ES=1;}子函数写时间到液晶屏上// void write_sfm(uchar add,uchar date){ 定义变量用以分离十位和个位上的数字// uchar pshi,ge;pshi=date/10; ge=date_x0010_;write_com(0x80+add); 给出写的位置指令// // write_date(0x30+pshi); 数字写个位上写十位上的的数字// write_date(0x30+ge);}void write_sfn(uchar add,uchar date) 子函数写闹钟时间到液晶屏上 //{ 定义变量用以分离十位和个位上的数字 //uchar pshi,ge; pshi=date/10;ge=date_x0010_;void write_sfn1(uchar add,uchar date)// 子函数写闹钟时间到液晶屏上 { uchar pshi,ge;// 定义变量用以分离十位和个位上的数字 pshi=date/10;ge=date_x0010_;write_com(0x80+0x40+add);// 给出写的位置指令 write_date(0x30+pshi);// 写十位上的数字 写个位上的数字 // write_date(0x30+ge);} // 按键子函数 void keyscan() {if (s5==0){delay(100);if (s5==0){while(!s5); write_com(0x0c);TR0=~TR0;}}if (s4==0){delay(5);if (s4==0){s4num++;while(!s4);}}//修改时钟if (s4num%4==0)write_com(0x80+add);write_date(0x30+pshi);write_date(0x30+ge);//写个位上的数字} //给出写的位置指令 //写十位上的数字{if (s1==0) //判断s1 是否被按下{delay(5); // 延迟再测判断是否真被按下if (s1==0){s1num++;while(!s1);}if (s1num>0){// 关定时器TR0=0;//确定光标在时间时钟位置write_com(0x80+0x01);// 光标开始闪烁write_com(0x0f);}for (;s1num>0;s1num --){shi++;if (shi==24)shi=0;将修改后的时钟写到指定位置// write_sfm(0,shi); write_com(0x80+0x01); //不让指针后移}}if (s2==0) //判断s2 是否被按下{delay(5); // 延迟再测判断是否真被按下if (s2==0){s2num++;while(!s2);if (s2num>0){关定时器// TR0=0;// 确定光标在时间分钟位置write_com(0x80+0x04);光标开始闪烁// write_com(0x0f);}for (;s2num>0;s2num --){fen++;if (fen==60)fen=0;write_sfm(3,fen); // 将修改后的时分钟写到指定位置不让指针后移// write_com(0x80+0x04);}}// if (s3==0) 是否被按下S3判断{delay(5); 延迟再测判断是否真被按下//if (s3==0){s3num++;while(!s3);if (s3num>0){TR0=0;write_com(0x80+0x07); write_com(0x0f);for (;s3num>0;s3num --) {miao++;if (miao==60)miao=0;write_sfm(6,miao); write_com(0x80+0x07);//关定时器//确定光标在时间秒钟位置//光标开始闪烁}// 将修改后的时间写到指定位置//不让指针后移//修改闹钟1if (s4num%4==1){if (s1==0) //判断s1 是否被按下{delay(5); // 延迟再测判断是否真被按下if (s1==0){s1num++;while(!s1);}if (s1num>0){TR0=0;write_com(0x80+0x0A); write_com(0x0f);//关定时器// 确定光标在闹钟时钟位置//光标开始闪烁}for (;s1num>0;s1num --) {nshi1++;if (nshi1==24)nshi1=0;write_sfn(9,nshi1);write_com(0x80+0x0A);//将修改后的闹钟时钟写到指定位置//不让指针后移}if (s2==0) {delay(5); if (s2==0) {//判断s2 是否被按下//延迟再测判断是否真被按下s2num++;while(!s2);{nfen1++;if (nfen1==60) nfen1=0;write_sfn(0x0C,nfen1);write_com(0x80+0x0D);//将修改后的闹钟分钟写到指定位置 // 不让指针后移 } }//修改闹钟 2if (s4num%4==2){if (s1==0) //判断 s1 是否被按下{delay(5);//延迟再测判断是否真被按下if (s1==0){ s1num++;while(!s1);}if (s1num>0){关定时器 // TR0=0;//确定光标在闹钟时钟位置write_com(0x80+0x41); 光标开始闪烁 // write_com(0x0f);if (s2num>0){关定时器 ////确定光标在闹钟分钟位置光标开始闪烁 //} TR0=0; write_com(0x80+0x0D); write_com(0x0f);for (;s2num>0;s2num --)}}}for (;s1num>0;s1num --){nshi2++;nshi2=0;write_sfn1(0,nshi2);write_com(0x80+0x41); }if (s2==0)//判断 s2 是否被按下{ delay(5);//延迟再测判断是否真被按下 if (s2==0){s2num++;while(!s2);}if (s2num>0){关定时器 // TR0=0;// 确定光标在闹钟分钟位置 write_com(0x80+0x44);光标开始闪烁 // write_com(0x0f);}for (;s2num>0;s2num --){nfen2++;if (nfen2==60)nfen2=0;write_sfn1(0x03,nfen2);//将修改后的闹钟分钟写到指定位置write_com(0x80+0x44); // 不让指针后移if (nshi2==24)//将修改后的闹钟时钟写到指定位置 //不让指针后移}修改闹钟//if (s4num%4==3){if (s1==0) //判断s1 是否被按下{delay(5); // 延迟再测判断是否真被按下if (s1==0){s1num++;while(!s1);}if (s1num>0){关定时器// TR0=0;// 确定光标在闹钟时钟位置write_com(0x80+0x4A); 光标开始闪烁// write_com(0x0f);}for (;s1num>0;s1num --){nshi3++;if (nshi3==24)nshi3=0;write_sfn1(9,nshi3); // 将修改后的闹钟时钟写到指定位置不让指针后移//write_com(0x80+0x4A);}}是否被按下判断// if (s2==0) s2{delay(5); 延迟再测判断是否真被按下//if (s2==0){s2num++;while(!s2);if (s2num>0)}}}}//关定时器 // 确定光标在闹钟分钟位置//光标开始闪烁 } for (;s2num>0;s2num --) {nfen3++;if (nfen3==60)nfen3=0;将修改后的闹钟分钟写到指定位置 write_sfn1(0x0C,nfen3); //write_com(0x80+0x4D); 不让指针后移 //}void keyscan1() 按键子函数 // {if (s5==0){ delay(100);if (s5==0){while(!s5);TR0=~TR0;if(clock_count1==1)clock_count1=2;else if(clock_count2==1) clock_count2=2;else if(clock_count3==1)clock_count3=2;TR0=0;write_com(0x80+0x4D); write_com(0x0f);void main()//主函数{ init(); //初始化 LCD 函数init1();//串口初始化 while(1){ keyscan(); 控制按键 //}}void timer0() interrupt 1keyscan1(); // 中断子函数 {// 重装初值 TL0=(65536 -50000)%6; count++;{ send('F');send('F');send((shi)/10+0x30);send((shi)_x0010_+0x30);send((fen)/10+0x30); send((fen)_x0010_+0x30); send((miao)/10+0x30); send((miao)_x0010_+0x30); }// 判断中断时间是否为一秒if (count==20)miao++;if (miao==60){miao=0; fen++;if (fen==60) { fen=0;shi++;if (shi==24)TH0=(65536 -50000)/256;// 用以计时的变量 if (count%2==0&&RI==0){ count=0; 清零重新计时为一秒, //countshi=0;}}write_sfm(6,miao);}write_sfm(3,fen);write_sfm(0,shi);//检测闹钟一if (shi==nshi1&&fen==nfen1) {if(clock_count1==0){clock_count1=1;}clock_int1++;}if(clock_count1==1){if(cl=='1'){if(clock_int1%4==0) beep=~beep;}else if(cl=='0') {if(clock_int1%8==0) beep=~beep;}elseif(clock_int1%4==0) beep=~beep; } if(clock_int1>1200) { clock_count1=2;clock_int1=0;}}if(clock_count1==2){beep=1;if(shi==nshi1&&fen==nfen1) clock_count1=2;elseclock_count1=0;}检测闹钟二//if (shi==nshi2&&fen==nfen2){if(clock_count2==0){clock_count2=1;}clock_int2++;}if(clock_count2==1){if(cl=='1'){if(clock_int2%4==0)beep=~beep;}else if(cl=='0'){if(clock_int2%8==0)beep=~beep;}else{if(clock_int2%4==0)beep=~beep;}if(clock_int2>1200){clock_count2=2;clock_int2=0;}}if(clock_count2==2){beep=1;if(shi==nshi2&&fen==nfen2)clock_count2=2;elseclock_count2=0;}// 检测闹钟三if (shi==nshi3&&fen==nfen3){if(clock_count3==0){clock_count3=1;}clock_int3++;if(clock_count3==1){if(cl=='1'){if(clock_int3%4==0) beep=~beep; }else if(cl=='0') {if(clock_int3%8==0) beep=~beep;}else{if(clock_int3%4==0) beep=~beep; } if(clock_int3>1200) { clock_count1=2;clock_int3=0;}}if(clock_count3==2){beep=1;if(shi==nshi3&&fen==nfen3) clock_count3=2;elseclock_count3=0;}void ser() interrupt 4EA=0;if (RI==1){RI=0;xs[i++]=SBUF;if (i==8&&xs[0]=='0'&&xs[1]=='0') {i=0;shi=(xs[2] -'0')*10+xs[3] -'0'; fen=(xs[4] -'0')*10+xs[5] -'0'; miao=(xs[6] -'0')*10+xs[7] -'0'; write_sfm(0,shi);write_sfm(3,fen);write_sfm(6,miao);}if (i==15&&xs[0]=='0'&&xs[1]=='1'){i=0;cl=xs[14];nshi1=(xs[2] -'0')*10+xs[3] -'0'; nfen1=(xs[4] -'0')*10+xs[5] -'0'; nshi2=(xs[6] -'0')*10+xs[7] -'0'; nfen2=(xs[8] -'0')*10+xs[9] -'0';nshi3=(xs[10] -'0')*10+xs[11] -'0';nfen3=(xs[12] -'0')*10+xs[13] -'0';write_sfn(0x0c,nfen1); write_sfn1(3,nfen2); write_sfn1(0x0c,nfen3);}}EA=1;write_sfn(9,nshi1);write_sfn1(0,nshi2);write_sfn1(9,nshi3);。