[键入文字][键入文字][键入文字]1/25单片机应用课程设计——电子时钟一、设计任务及要求【电子时钟】利用实验板上4个LED数码管,设计带有闹铃功能的数字时钟,要求:1、在4位数码管上显示当前时间。显示格式“时时分分”;”2、由LED闪动做秒显示;3、利用按键可对时间及闹玲进行设置,并可显示闹玲时间。当闹玲时间到蜂鸣器发出声响,按停止键使可使闹玲声停止。拓展设计:1.用数码管的小数点闪动替代二极管显示秒,使之成为一个“完整的时钟”;[键入文字][键入文字][键入文字]2/252、使数字时钟的闹钟铃声为音乐。二、设计思路【工作原理及设计思路】计时功能利用单片机的定时器来完成,由于定时器定时的时长有限,所以要利用中断程序才能定时1秒,若中断程序每隔5ms中断一次并当作一个计数,则每中断一次计数加1,当计数200次时,则表示1s到了,秒变量加1,同理再判断1min是否到了,再判断1h是否到了。为了将时间在LED数码管上显示,可采用静态显示法和动态显示法,由于静态显示法需要数据锁存器等较多硬件,可采用动态显示法实现LED显示。闹铃声由交流蜂鸣器产生,所以当闹铃时间和当前时间相等时,可以对蜂鸣器输入方波信号,蜂鸣器就会发出声音。三、设计分析【系统的主要功能】本实验实际是设计一个电子表,可以显示时和分,并且用一个二极管显示秒。另外,还可以对它进行时间调整,还要有闹铃功能。【所作题目的意义】时钟电路在各个系统中都起着十分重要的作用,是保证系统正常工作的基础。同时时钟电路整体的设计及其工作原理涉及到了单片机基础课程中各章节的内容,是对单片机理论基础课程的一个综合实践,通过本课题不仅让我对电子时钟这一课题有更深入的了解,更加深了自己对单片机课程整体知识的把握,将理论所学用于实践,将知识综合,达到融会贯通的高度。【硬件电路设计及描述】实验用JD51开发板完成,本实验的硬件包括显示部分、闹铃部分、开关部分。·显示部分JD51上用于显示部分的电路如下图:[键入文字][键入文字][键入文字]3/25JD51上有四位共阳LED数码管,其标号分别为LED1—LED4,低电平选通,且任何时候仅有一位输出低电平,显示时对各显示器进行动态扫描,显示器分时轮流工作。虽然每次只有一个显示器显示,但是由于人的视觉暂留现象我们仍会感觉所有的显示器都在同时显示。P0口作为输出口控制8个发光二极管的亮灭,控制数码管的显示。·闹铃部分蜂鸣器与P2.4口相连。[键入文字][键入文字][键入文字]4/25·开关部分本实验中的开关是实验仪上的四个逻辑开关,它们分别与P3.2、P3.3、P3.4、P3.5相连。其总P3.2用于调整时钟或闹钟的时,P3.3用于调整时钟或闹钟的分,P3.5用于控制显示时钟还是显示闹钟,并且同时控制调整时钟还是调整闹钟,按任意键(SW1、SW2、SW4)时停止闹钟。【软件设计流程及描述】·显示部分显示部分分为时钟显示、闹钟显示和秒显示三部分,主要由时钟显示子程序和闹钟显示子程序构成,闹钟显示与时钟显示编程流程大致相同。流程图如下:[键入文字][键入文字][键入文字]5/25·闹铃部分设计思路及原理:音节由不同频率的方波产生,音节与频率的关系如下表所示。要产生音频方波,设计利用延时来建立音符表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频率(HZ)262294330349392440494音1234567[键入文字][键入文字][键入文字]6/25符(中)频率(HZ)523587659698784880988音符(高)^1^2^3^4^5^6^7频率(HZ)1046117513181397156817601967闹钟铃声选取情景比较合适的《猪之歌》,其曲谱如下图:其相应的音符和节拍表NOTE和METRE如下:NOTE:DB7FH,7FH,7FH,60H,65H,72H,72H,72H,7FH,72HDB60H,72H,60H,72H,60H,72H,7FH,72H,7FH,98H,72H,7FHDB7FH,7FH,7FH,60H,65H,72H,72H,72H,7FH,72HDB60H,72H,60H,72H,60H,72H,7FH,72H,7FH,72H,4CH,55H,00HMETRE:DB80H,20H,20H,20H,20H,20H,20H,20H,20H,80HDB20H,20H,20H,20H,40H,20H,20H,20H,20H,20H,20H,80HDB80H,20H,20H,20H,20H,20H,20H,20H,20H,80HDB20H,20H,20H,20H,40H,20H,20H,20H,20H,20H,20H,40H·开关扫描及处理部分本实验用到了三个开关,其中涉及开关的扫描及处理。开关4控制数码管当前显示的是时钟还是闹钟,显示时钟时,可通过开关1和开关2调整时钟的时和分;显示闹钟时,也可以通过开关1和开关2调整时和分。开关4控制闹铃的开和关。按键调整闹钟与按键调整时钟编程流程基本一致,按键扫描及处理流程图如图:[键入文字][键入文字][键入文字]7/25·T0中断服务程序:采用定时器T0计时,中断程序每隔50ms中断一次计数加1,当计数20次时,则表示1s到了,秒变量加1,同理再判断是否1分钟到了,再判断是否1小时到了,再判断是否24小时到了。程序流程图如下:[键入文字][键入文字][键入文字]8/25保护现场设置计数初值1s到否是数码管小数点亮,延时,再灭秒加1秒等于60吗是秒清零,分加1分等于60吗是分清零,时加1时等于24吗时清零是恢复现场返回否否否否否三、源程序代码及注释;****************************************************;/******电子时钟程序******/;程序主要包括MAIN函数,T0、T1中断程序,时间、闹钟显示程序,按键扫描、处理程序;****************************************************ORG0000HAJMPMAIN;跳转到主程序MAIN执行ORG000BHAJMPINTT0;跳到INTT0执行ORG001BHLJMPINTT1;跳到INTT1执行ORG0300H;/******主函数******/预置T0\T1工作方式,置初值,预置时钟、闹钟,置位数码管MAIN:MOVSP,#80HMOVTMOD,#11H;设置定时器T0、T1工作于方式1MOVTH0,#3CH;装入时钟定时初值(50ms)MOVTL0,#0B0HMOVTH1,#0D8H;装入闹铃定时初值(10ms)MOVTL1,#0F0HMOVR1,#00H;确保首次默认闹铃工作[键入文字][键入文字][键入文字]9/25MOV20H,#00HMOV21H,#00HMOV22H,#00H;预置时钟分分MOV23H,#00H;预置时钟时时MOV30H,#30H;预置闹铃分分MOV31H,#08H;预置闹铃时时SETBP2.0;数码管接P2口,置位数码管,使其全灭SETBP2.1SETBP2.2SETBP2.3CLRP1.7;发光二极管LED7\LED8用于显示秒,清P1.7,发光二极管LED8亮SETBP1.6;置位P1.6,发光二极管LED7灭SETBEA;开放总中断SETBET0;允许T0中断SETBTR0;开启定时器T0LOOP:LCALLDISPT;调用时间显示子程序LCALLRING;调用闹铃处理子程序LCALLKEY;调用按键扫描子程序JZLOOP;无键按下则循环LCALLCASE;有键按下则转按键处理子程序执行SJMPLOOP;循环;/******T0一秒定时中断程序INTT0******/正常时钟计时INTT0:PUSHPSW;状态字入栈保护PUSHACC;累加器入栈保护MOVTL0,#0B0H;装入计数初值,12MHZ晶振,形成1S中断MOVTH0,#3CHINC20HMOVA,20HCJNEA,#20,RETURNCPLP1.7;一秒到发光二极管轮流亮,用于显示秒CPLP1.6MOV20H,#00H;一秒到清20HMOVA,21HADDA,#01HDAAMOV21H,ACJNEA,#60H,RETURNMOV21H,#00H;一分到,21H单元清零[键入文字][键入文字][键入文字]10/25MOVA,22HADDA,#01HDAAMOV22H,ACJNEA,#60H,RETURNMOV22H,#00H;一小时到,22H单元清零MOVA,23HADDA,#01HDAAMOV23H,ACJNEA,#24H,RETURNMOV23H,#00H;满24,23H单元清零RETURN:POPACCPOPPSWRETI;/******时间显示子程序******/DISPT:MOVA,22HANLA,#0FHMOV2AH,A;时钟分的低位MOVA,22HANLA,#0F0HSWAPAMOV2BH,A;时钟分的高位MOVA,23HANLA,#0FHMOV2CH,A;时钟时的低位MOVA,23HANLA,#0F0HSWAPAMOV2DH,A;时钟时的高位LED1:SETBP2.3MOVA,2DHMOVDPTR,#TABMOVCA,@A+DPTRCLRP2.0;选通数码管1MOVP0,A;显示时钟时的十位部分LCALLDELAYLED2:SETBP2.0MOVA,2CHMOVDPTR,#TAB[键入文字][键入文字][键入文字]11/25MOVCA,@A+DPTRCLRP2.1;选通数码管2MOVP0,A;显示时钟时的个位部分LCALLDELAYLED3:SETBP2.1MOVA,2BHMOVDPTR,#TABMOVCA,@A+DPTRCLRP2.2;选通数码管3MOVP0,A;显示时钟分的十位部分LCALLDELAYLED4:SETBP2.2MOVA,2AHJBP1.7,TA2TA1:ADDA,#10;用于利用数码管的小数点来表示秒TA2:MOVDPTR,#TABMOVCA,@A+DPTRCLRP2.3;选通数码管4MOVP0,A;显示时钟分的个位部分LCALLDELAYRETTAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;共阳数码管的不带小数点的时间显示码DB40H,79H,24H,30H,19H,12H,02H,78H,00H,10H;共阳数码管的带小数点的时间显示码;/******按键扫描程序******/开关接P3口,判断按键情况KEY:MOVP3,#0FFHMOVA,P3CPLAANLA,#2CHJZRETK;无键按下则返回LCALLDELAY;延时消抖MOVA,P3CPLAANLA,#2CHJZRETK;键盘去抖动MOVR6,A;将键值存入R6LOOP1:LCALLDISPT;MOVA,P3CPLAANLA,#2CH[键入文字][键入文字][键入文字]12/25JNZLOOP1;等待键释放MOVA,R6RETK:RET;/******按键处理子程序******/根据按键情况进行处理CASE:MOVA,R6CLRP1.0;发光二极管LED1亮JBACC.2,SETH;转调整时JBACC.3,SETM;转调整分JBACC.5,SETR;转闹铃设置WAITCASE:LCALLDISPT;无键按下时等待LCALLKEYJZWAITCASE;/******时间调整程序******/按键调整时间SETT:LCALLDISPTLCALLKEYJZSETTMOVA,R6JBACC.2,SETHJBACC.3,SETMJBACC.5,KEYGO;第二次按为确认离开