1、单片机课设-电子时钟1 / 29单片机应用课程设计电子时钟姓名:邢昊学号:12211016班级:通信 1201指导老师:周永华单片机课设-电子时钟2 / 29目录一、实验目的 3二、设计任务及要求 .3三、软件设计思路 3四、设计分析 4五、源程序代码及注释 .10六、课程设计体会 28一、实验目的通过电子时钟综合设计,使学生学会利用 8051 定时器时间计时处理功能,了单片机课设-电子时钟3 / 29解按键 扫描及控制 LED 数码管显示原理,掌握单片机和按键以及 LED 数码管硬件电路设计及控制 程序的设计方法。思考按键消除抖动、LED 动态显示与静态显示的特点,从而提高学生解 决实际问题
2、的能力。二、设计任务及要求利用实验板上4 个LED 数码管,设计带有闹铃功能的数字时钟,要求:1、在4位数码管上显示当前时间。显示格式 “时时分分”;”2、由LED 闪动做秒显示;3、利用按键可对时间及闹玲进行设置,并可显示闹玲时间。当闹玲时间到蜂鸣器发出声响,按停止键使可使闹玲声停止。4、使数字时钟的闹钟铃声为音乐。三、软件设计思路计时功能利用单片机的定时器来完成,由于定时器定时的时长有限,所以要利用中断程序才能定时 1 秒,若中断程序每隔 5ms 中断一次并当作一个计数,则每中断一次计数加 1,当计数 200 次时,则表示 1s 到了,秒变量加 1,同理再判断 1min 是否到了,再判断
3、1h 是否到了。为了将时间在 LED 数码管上显示,可采用静态显示法和动态显示法,由于静态显示法需要数据锁存器等较多硬件,可采用动态显示法实现 LED 显示。闹铃声由交流蜂鸣器产生,所以当闹铃时间和当前时间相等时,可以对蜂鸣器输入方波信号,蜂鸣器就会发出声音。单片机课设-电子时钟4 / 29四、设计分析本实验实际是设计一个电子表,可以显示时和分,并且用一个二极管显示秒。另外,还可以对它进行时间调整,还要有闹铃功能。时钟电路在各个系统中都起着十分重要的作用,是保证系统正常工作的基础。同时时钟电路整体的设计及其工作原理涉及到了单片机基础课程中各章节的内容,是对单片机理论基础课程的一个综合实践,通过
4、本课题不仅让我对电子时钟这一课题有更深入的了解,更加深了自己对单片机课程整体知识的把握,将理论所学用于实践,将知识综合,达到融会贯通的高度。实验用 JD51 开发板完成,本实验的硬件包括显示部分、闹铃部分、开关部分。原理图JD51 上用于显示部分的电路如下图:单片机课设-电子时钟5 / 29JD51 上有四位共阳 LED 数码管,其标号分别为 LED1LED4,低电平选通,且任何时候仅有一位输出低电平,显示时对各显示器进行动态扫描,显示器分时轮流工作。虽然每次只有一个显示器显示,但是由于人的视觉暂留现象我们仍会感觉所有的显示器都在同时显示。P0 口作为输出口控制 8 个发光二极管的亮灭,控制数
5、码管的显示。蜂鸣器蜂鸣器与 P2.4 口相连。开关本实验中的开关是实验仪上的四个逻辑开关,它们分别与单片机课设-电子时钟6 / 29P3.2、P3.3、P3.4、P3.5 相连。其总 P3.2 用于调整时钟或闹钟的时,P3.3 用于调整时钟或闹钟的分,P3.5 用于控制显示时钟还是显示闹钟,并且同时控制调整时钟还是调整闹钟,按任意键(SW1、SW2、SW4)时停止闹钟。【软件设计流程及描述】显示部分显示部分分为时钟显示、闹钟显示和秒显示三部分,主要由时钟显示子程序和闹钟显示子程序构成,闹钟显示与时钟显示编程流程大致相同。流程图如下:单片机课设-电子时钟7 / 29闹铃部分设计思路及原理:音节由
6、不同频率的方波产生,音节与频率的关系如下表所示。要产生音频方波,设计利用延时来建立音符表NOTE ,表格中的数存R3*20us,其倒数1/(R3*2*10us)对应相应音符的频率。另外,音乐的节拍是由延时实现的,如果1拍为0.4秒,1/4拍是0.1秒。只要设定延时时间,就可求得节拍的时间。延时作为基本延时时间,节拍值只能是它的整数倍。设计利用T1中断产生10ms 延时,取 1/4拍为10H*10ms,相应产生所需延时。 音符(低 ) .1 .2 .3 .4 .5 .6 .7单片机课设-电子时钟8 / 29频率(HZ)262 294 330 349 392 440 494音符(中)1 2 3 4
7、 5 6 7频率(HZ)523 587 659 698 784 880 988音符(高)1 2 3 4 5 6 7频率(HZ)1046 1175 1318 1397 1568 1760 1967闹钟铃声相应的音符和节拍表 NOTE 和 METRE 如下:NOTE: DB 7FH,7FH,7FH,60H,65H,72H,72H,72H,7FH,72HDB 60H,72H,60H,72H,60H,72H,7FH,72H,7FH,98H,72H,7FHDB 7FH,7FH,7FH,60H,65H,72H,72H,72H,7FH,72HDB 60H,72H,60H,72H,60H,72H,7FH,72
8、H,7FH,72H,4CH,55H,00HMETRE: DB 80H,20H,20H,20H,20H,20H,20H,20H,20H,80HDB 20H,20H,20H,20H,40H,20H,20H,20H,20H,20H,20H,80HDB 80H,20H,20H,20H,20H,20H,20H,20H,20H,80HDB 20H,20H,20H,20H,40H,20H,20H,20H,20H,20H,20H,40H开关扫描及处理部分本实验用到了三个开关,其中涉及开关的扫描及处理。单片机课设-电子时钟9 / 29开关 4 控制数码管当前显示的是时钟还是闹钟;显示时钟时,可通过开关 1 和开
9、关 2 调整时钟的时和分;显示闹钟时,也可以通过开关 1 和开关 2 调整时和分。开关 4 控制闹铃的开和关。按键调整闹钟与按键调整时钟编程流程基本一致,按键扫描及处理流程图如图:T0 中断服务程序:采用定时器 T0 计时,中断程序每隔 50ms 中断一次计数加 1,当计数 20次时,则表示 1s 到了,秒变量加 1,同理再判断是否 1 分钟到了,再判断是否1 小时到了,再判断是否 24 小时到了。程序流程图如下:单片机课设-电子时钟10 / 29保 护 现 场设 置 计 数 初 值1s到 否 是数 码 管 小 数 点 亮 , 延 时 , 再 灭秒 加 1秒 等 于 60吗是秒 清 零 , 分
10、 加 1分 等 于 60吗 是分 清 零 , 时 加 1时 等 于 24吗时 清 零 是恢 复 现 场返 回否否 否否否五、源程序代码及注释;*;/*电子时钟程序*/ ;程序主要包括 MAIN 函数,T0、T1 中断程序,时间、闹钟显示程序 ,按键扫描、处理程序;* ORG 0000HAJMP MAIN ;跳转到主程序 MAIN 执行ORG 000BHAJMP INTT0 ;跳到 INTT0 执行ORG 001BH单片机课设-电子时钟11 / 29LJMP INTT1 ;跳到 INTT1 执行ORG 0300H;/*主函数*/ 预置 T0T1 工作方式,置初值,预置时钟、闹钟,置位数码管MAI
11、N:MOV SP,#80HMOV TMOD,#11H ;设置定时器 T0、T1 工作于方式 1MOV TH0,#3CH ;装入时钟定时初值(50ms)MOV TL0,#0B0H MOV TH1,#0D8H ;装入闹铃定时初值(10ms)MOV TL1,#0F0HMOV R1,#00H ;确保首次默认闹铃工作MOV 20H,#00H MOV 21H,#00H MOV 22H,#00H ;预置时钟分分MOV 23H,#00H ;预置时钟时时MOV 30H,#30H ;预置闹铃分分MOV 31H,#08H ;预置闹铃时时SETB P2.0 ;数码管接 P2 口,置位数码管,使其全灭SETB P2.1
12、单片机课设-电子时钟12 / 29SETB P2.2SETB P2.3CLR P1.7 ;发光二极管 LED7LED8 用于显示秒,清P1.7,发光二极管 LED8 亮SETB P1.6 ;置位 P1.6,发光二极管 LED7 灭SETB EA ;开放总中断SETB ET0 ;允许 T0 中断SETB TR0 ;开启定时器 T0LOOP:LCALL DISPT ;调用时间显示子程序LCALL RING ;调用闹铃处理子程序LCALL KEY ;调用按键扫描子程序JZ LOOP ;无键按下则循环LCALL CASE ;有键按下则转按键处理子程序执行SJMP LOOP ;循环;/*T0 一秒定时中
13、断程序 INTT0*/正常时钟计时INTT0:PUSH PSW ;状态字入栈保护PUSH ACC ;累加器入栈保护MOV TL0,#0B0H ;装入计数初值,12MHZ 晶振,形成 1S 中断MOV TH0,#3CHINC 20H单片机课设-电子时钟13 / 29MOV A,20HCJNE A,#20,RETURNCPL P1.7 ;一秒到发光二极管轮流亮,用于显示秒CPL P1.6MOV 20H,#00H ;一秒到清 20HMOV A,21HADD A,#01HDA AMOV 21H,ACJNE A,#60H,RETURNMOV 21H,#00H ;一分到,21H 单元清零MOV A,22H
14、ADD A,#01HDA AMOV 22H,ACJNE A,#60H,RETURNMOV 22H,#00H ;一小时到,22H 单元清零MOV A,23HADD A,#01H单片机课设-电子时钟14 / 29DA AMOV 23H,ACJNE A,#24H,RETURNMOV 23H,#00H ;满 24,23H 单元清零RETURN: POP ACCPOP PSWRETI;/*时间显示子程序*/DISPT: MOV A,22HANL A,#0FHMOV 2AH,A ;时钟分的低位MOV A,22HANL A,#0F0HSWAP AMOV 2BH,A ;时钟分的高位MOV A,23HANL A
15、,#0FHMOV 2CH,A ;时钟时的低位MOV A,23HANL A,#0F0H单片机课设-电子时钟15 / 29SWAP AMOV 2DH,A ;时钟时的高位LED1: SETB P2.3MOV A,2DHMOV DPTR,#TABMOVC A,A+DPTR CLR P2.0 ;选通数码管 1MOV P0,A ;显示时钟时的十位部分LCALL DELAYLED2: SETB P2.0MOV A,2CHMOV DPTR,#TABMOVC A,A+DPTR CLR P2.1 ;选通数码管 2MOV P0,A ;显示时钟时的个位部分LCALL DELAY LED3: SETB P2.1MOV
16、A,2BHMOV DPTR,#TABMOVC A,A+DPTR CLR P2.2 ;选通数码管 3单片机课设-电子时钟16 / 29MOV P0,A ;显示时钟分的十位部分LCALL DELAYLED4: SETB P2.2MOV A,2AHJB P1.7,TA2TA1: ADD A,#10 ;用于利用数码管的小数点来表示秒TA2: MOV DPTR,#TABMOVC A,A+DPTRCLR P2.3 ;选通数码管 4MOV P0,A ;显示时钟分的个位部分LCALL DELAYRETTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;共阳
17、数码管的不带小数点的时间显示码DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H;共阳数码管的带小数点的时间显示码;/*按键扫描程序*/ 开关接 P3 口,判断按键情况KEY: MOV P3,#0FFH MOV A,P3CPL A单片机课设-电子时钟17 / 29ANL A,#2CHJZ RETK ;无键按下则返回LCALL DELAY ;延时消抖MOV A,P3CPL AANL A,#2CHJZ RETK ;键盘去抖动MOV R6,A ;将键值存入 R6LOOP1: LCALL DISPT;MOV A,P3CPL AANL A,#2CHJNZ LOOP1 ;
18、等待键释放MOV A,R6RETK: RET;/*按键处理子程序*/根据按键情况进行处理CASE: MOV A,R6CLR P1.0 ;发光二极管 LED1 亮JB ACC.2,SETH ;转调整时JB ACC.3,SETM ;转调整分JB ACC.5,SETR ;转闹铃设置单片机课设-电子时钟18 / 29WAITCASE:LCALL DISPT ;无键按下时等待LCALL KEYJZ WAITCASE;/*时间调整程序*/ 按键调整时间SETT: LCALL DISPTLCALL KEYJZ SETTMOV A,R6JB ACC.2,SETHJB ACC.3,SETMJB ACC.5,KE
19、YGO ;第二次按为确认离开KEYGO: SETB P1.0 ;发光二极管 LED1、LED2 灭SETB P1.1RETSETH: MOV A,23H ;调整时钟时,时加 1ADD A,#01HDA A ;十进制调整MOV 23H,ACJNE A,#24H,HD ;判断是否到 24,不到继续MOV 23H,#00H ;到 24 时清零单片机课设-电子时钟19 / 29HD:LJMP SETTSETM: MOV A,22H ;分加 1ADD A,#01HDA A ;十进制调整 MOV 22H,ACJNE A,#60H,MD ;判断是否到 1 小时,不到继续MOV 22H,#00H ;到 1 小
20、时则清零MD: LJMP SETT;/*闹铃时间调整按键扫描及处理子程序*/KEYR: MOV P3,#0FFH MOV A,P3CPL AANL A,#2CHJZ RETK ;无键按下则返回LCALL DISPR ;延时消抖MOV A,P3CPL AANL A,#2CHJZ RETK ;键盘去抖动MOV R6,A ;将键值存入 R6LJMP LOOPR单片机课设-电子时钟20 / 29LOOPR: LCALL DISPRMOV A,P3CPL AANL A,#2CHJNZ LOOPR ;等待键释放MOV A,R6AJMP RETK;/*设置闹铃时间*/SETR: SETB P1.0 ;发光二
21、极管 LED1 灭CLR P1.1 ;发光二极管 LED2 亮,改显示状态LCALL DISPRMOV R1,#00H ;设置闹钟时重设 R1,用于检测闹铃播放与否MOV 53H,#03H ;重设闹铃次数LCALL KEYR ;闹铃时间调整按键检测JZ SETRMOV A,R6JB ACC.2,SETRHJB ACC.3,SETRMJB ACC.5,KEYGO ;第二次按为确认离开单片机课设-电子时钟21 / 29SETRH: MOV A,31H ;闹钟时加 1ADD A,#01HDA A ;十进制调整MOV 31H,ACJNE A,#24H,RHD ;判断是否到 24,不到继续MOV 31H
22、,#00H ;到 24 时则清零RHD: LJMP SETRSETRM: MOV A,30H ;闹钟分加 1ADD A,#01HDA A ;十进制调整MOV 30H,ACJNE A,#60H,RMD ;判断是否到 1 小时,不到继续MOV 30H,#00H ;到 1 小时则清零RMD: LJMP SETR;/*闹钟设置显示子程序*/DISPR: MOV A,30HANL A,#0FH ;屏蔽高四位MOV 3AH,A ;保留低位送 3AHMOV A,30HANL A,#0F0H ;屏蔽低四位 SWAP A ;高四位与第四位交换单片机课设-电子时钟22 / 29MOV 3BH,A ;将保留的高 4
23、 位送 3BHMOV A,31HANL A,#0FHMOV 3CH,A ;低位MOV A,31HANL A,#0F0HSWAP AMOV 3DH,A ;高位LEDR1: SETB P2.3MOV A,3DHMOV DPTR,#TABMOVC A,A+DPTR CLR P2.0MOV P0,ALCALL DELAYLEDR2: SETB P2.0MOV A,3CHMOV DPTR,#TABMOVC A,A+DPTR CLR P2.1单片机课设-电子时钟23 / 29MOV P0,ALCALL DELAYLEDR3: SETB P2.1MOV A,3BHMOV DPTR,#TABMOVC A,A+
24、DPTR CLR P2.2MOV P0,ALCALL DELAYLEDR4: SETB P2.2MOV A,3AHMOV DPTR,#TABMOVC A,A+DPTR CLR P2.3MOV P0,ALCALL DELAYRET;/*延时子程序*/DELAY: MOV R5,#2 D1: MOV R4,#250D2: DJNZ R4,D2DJNZ R5,D1单片机课设-电子时钟24 / 29RET;/*闹铃检测程序*/RING: MOV A,23H ;比较时CJNE A,31H,RETRMOV A,22H ;比较分CJNE A,30H,RETR LCALL SINGRETR: RET;/*定时
25、器 T1 中断子程序*/INTT1: PUSH PSW ;状态字入栈保护PUSH ACC ;累加器入栈保护INC 50H ;中断服务程序 ,中断计数器加 1MOV TH1,#0D8H ;装入计数初值,12M 晶振,形成10MS 中断MOV TL1,#0F0H POP ACCPOP PSWRETI ;/*响铃子程序*/SING: CJNE R1,#01H,SING1 ;判断是否已经闹铃过一次LJMP RETS单片机课设-电子时钟25 / 29SING1: SETB ET1MOV 50H,#00H ;中断计数器清 0MOV 51H,#00H ;音符指针MOV 52H,#00H ;节拍码指针MOV
26、53H,#03H ;设置闹钟不退出响铃次数GETNOT: MOV A,51HMOV DPTR,#NOTE ;表头地址送 DPTRMOVC A,A+DPTR ;查表取音符码JZ ENDP ;是 00H,则结束MOV R6,A ;存 R6 INC 51HCJNE A,#0FFH,GETMET ;不为 0FFH,转取节拍码LJMP PAUSE ;转休止播放LJMP GETNOT ;取音符码GETMET: MOV A,52HMOV DPTR,#METRE ;取节拍码首地址MOVC A,A+DPTR ;取节拍代码送 R7MOV R7,AINC 52H单片机课设-电子时钟26 / 29PLAY: SETB
27、 TR1 ;启动计数CPL P2.4LCALL KEYJNZ RETSMOV A,R6 MOV R3,A ;音符码存 R3LCALL DELAY1MOV A,R7 ;取节拍码放 A 与中断计数比较CJNE A,50H,PLAY ;断计数器 (50H)=R7 否,不等继续循环MOV 50H,#00H ;等于,则取下一代码LCALL DISPTLCALL DISPTLCALL DISPTLCALL DISPTCLR TR1LJMP GETNOTRETS: SETB P2.4 ;置位蜂鸣器,否则可能产生啸叫MOV R1,#01H ;表明播放过一次CLR A ;清除 A,防止进入按键处理子程序单片机课
28、设-电子时钟27 / 29LJMP RETRPAUSE: CLR TR1 ;休止 100 毫秒MOV R2,#0DHDELAY2: MOV R3,#0FFHLCALL DELAY1DJNZ R2,DELAY2RETENDP: SETB P2.4MOV R2,#0C7H ;歌曲结束 ,延时 1 秒后继续END1M: MOV R3,#00HLCALL DELAY1DJNZ R2,END1MDJNZ 53H,SINGRETDELAY1: NOP ;R3 为 01H 时,DELAY 延时为20uSDELAY3: MOV R4,#02H DELAY4: DJNZ R4,DELAY4单片机课设-电子时钟2
29、8 / 29DJNZ R3,DELAY3RETNOTE: DB 7FH,7FH,7FH,60H,65H,72H,72H,72H,7FH,72HDB 60H,72H,60H,72H,60H,72H,7FH,72H,7FH,98H,72H,7FHDB 7FH,7FH,7FH,60H,65H,72H,72H,72H,7FH,72HDB 60H,72H,60H,72H,60H,72H,7FH,72H,7FH,72H,4CH,55H,00HMETRE: DB 80H,20H,20H,20H,20H,20H,20H,20H,20H,80HDB 20H,20H,20H,20H,40H,20H,20H,20H
30、,20H,20H,20H,80HDB 80H,20H,20H,20H,20H,20H,20H,20H,20H,80HDB 20H,20H,20H,20H,40H,20H,20H,20H,20H,20H,20H,40HEND六、课程设计体会由于大创实验的火热,学校让我们在大二就开始学习单片机,这对于我们来说既有好处也有难处。我们可以更早的接触单片机,便于后续的学习开展,同时,也在繁忙的课业中加了点难度。初次接触单片机,我觉得还是有点难以上手的。通过之前的理论课,我觉得突然实操的难度很大。我借助网络资源,和同学讨论,逐步完成的板子以及程序。刚开始的编程没有思路,无从下手。通过从网上查阅资料,仿照着才能单片机课设-电子时钟29 / 29慢慢走下来。同时借助老师发的课程资料和 ppt 也解决了我不少问题。整个课程设计过程学到了不少通过理论学习没法学到的东西,真正增加了自己的一种能力。借助这次机会,我觉得我更进一步的了解了单片机,也对它产生了更浓厚的兴趣。