1、单片机课设-电子时钟3 / 29单片机应用课程设计电子时钟姓名:邢昊学号:12211016班级:通信1201指导老师:周永华目录一、实验目的3二、设计任务及要求 3三、软件设计思路 3四、设计分析4五、源程序代码及注释 10六、课程设计体会28一、实验目的通过电子时钟综合设计,使学生学会利用 8051定时器时间计时处理功能,了 解按键扫描及控制LED数码管显示原理,掌握单片机和按键以及 LED数码 管硬件电路设计及控制 程序的设计方法。思考按键消除抖动、LED动态显示与 静态显示的特点,从而提高学生解决实际问题的能力。二、设计任务及要求利用实验板上4个LED数码管,设计带有闹铃功能的数字时钟,
2、要求:1、在4位数码管上显示当前时间。显示格式“时时分分;”2、由LED闪动做秒显示;3、利用按键可对时间及闹玲进行设置,并可显示闹玲时间。当闹玲时间到蜂鸣 器发出声响,按停止键使可使闹玲声停止。4、使数字时钟的闹钟铃声为音乐。三、软件设计思路计时功能利用单片机的定时器来完成,由于定时器定时的时长有限,所以要 利用中断程序才能定时1秒,若中断程序每隔5ms中断一次并当作一个计数, 则每中断一次计数加1,当计数200次时,则表示1s到了,秒变量加1,同理 再判断1min是否到了,再判断1h是否到了。为了将时间在LED数码管上显示,可采用静态显示法和动态显示法,由于 静态显示法需要数据锁存器等较多
3、硬件,可采用动态显示法实现LED显示。单片机课设-电子时钟闹铃声由交流蜂鸣器产生,所以当闹铃时间和当前时间相等时, 可以对蜂鸣器输入方波信号,蜂鸣器就会发出声音。四、设计分析本实验实际是设计一个电子表,可以显示时和分,并且用一个二极管显示秒。另外,还可以对它进行时间调整,还要有闹铃功能。时钟电路在各个系统中都起着十分重要的作用,是保证系统正常工作的基础。同时时钟电路整体的设计及其工作原理涉及到了单片机基础课程中各章节的 内容,是对单片机理论基础课程的一个综合实践, 通过本课题不仅让我对电子时 钟这一课题有更深入的了解,更加深了自己对单片机课程整体知识的把握, 将理 论所学用于实践,将知识综合,
4、达到融会贯通的高度。实验用JD51开发板完成,本实验的硬件包括显示部分、闹铃部分、开关部分。原理图JD51上用于显示部分的电路如下图:PIOIPll2Pl 23Pl 34P145Pl 56Pl 67Pl 78RST9RXD_P30P3010TXD.P31P3111P32J P13 gP3414 CSW4P3515LCD KXP3616.DS1SB23p?717 XIISX219GNDU1RS2PIOvccPllPOOP12POlP13P02P14P03P15PC4P16P05ATS5S52 *Pl P06RESETP07RXDETXTPTXDIKTDPSTTrrnP27TOP215TlP25W
5、RP24KD?23TAI24 / 29 :一XIAL1P21GNDP20MCS-5139POOLCD_D03SPOlLCD DI37P02LCD_D236P03LCD D335P04LCD_D434P05LCD D533P06LCD Dfi32PO?LCD D?31VC 匚 5V30io AD 2SXFLLCD_E27P2fiLCD_RS26P25CS 57J好P24BUZZER24P23LEDSEG413P22LEDSEG3P21LEDSEG221P20LEDSHG1VCC5V91CK*S4567单片机课设-电子时钟DLDrODE IN-1148一 一号_ilJD51上有四位共阳LED数码管
6、其标号分别为LED1 LED4 ,低电平选29 / 29显示器通,且任何时候仅有一位输出低电平,显示时对各显示器进行动态扫描, 分时轮流工作。虽然每次只有一个显示器显示,但是由于人的视觉暂留现象我们仍会感觉所有的显示器都在同时显示。P0口作为输出口控制8个发光二极管的亮灭,控制数码管的显示。蜂鸣器蜂鸣器与P2.4 口相连。开关本实验中的开关是实验仪上的四个逻辑开关,它们分别与P3.2、P3.3、P3.4、P3.5相连。其总P3.2用于调整时钟或闹钟的时,P3.3用于调整时钟或闹钟的分,P3.5用于控制显示时钟还是显示闹钟,并且同时控制调整时钟还是调整闹钟,按任意键(SW1、SW25SW4)时
7、停止闹钟。10K【软件设计流程及描述】显示部分显示部分分为时钟显示、闹钟显示和秒显示三部分,主要由时钟显示子程序和闹钟显示子程序构成,闹钟显示与时钟显示编程流程大致相同。流程图如下:闹铃部分设计思路及原理:音节由不同频率的方波产生,音节与频率的关系如下表所 示。要产生音频方波,设计利用延时来建立音符表NOTE ,表格中的数存R3*20us ,其倒数1/ (R3*2*10us )对应相应音符的频率。另外,音乐的节拍是由延时实现的,如果1拍为0.4秒,1/4拍是0.1秒。只要 设定延时时间,就可求得节拍的时间。延时作为基本延时时间,节拍值只能是它 的整数倍。设计利用T1中断产生10ms延时,取1/
8、4拍为10H*10ms,相应产生所需 延时。音符(低).1.2.3.4.5.6.7频率(HZ)262294330349392440494音符(中)1234567频率(HZ)523587659698784880988音符(高)A1A2A3A4A5A6A7频率(HZ)1046117513181397156817601967闹钟铃声相应的音符和节拍表 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,
9、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,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开关扫描及处理部分本实验用到了三个开关,其中涉及开关的扫描
10、及处理。开关4控制数码管当前显示的是时钟还是闹钟;显示时钟时,可通过开关1和开关2调整时钟的时和分;显示闹钟时,也可以通过开关1和开关2调整时和分。开关4控制闹铃的开和关。按键调整闹钟与按键调整时钟编程流程基本一致,按键扫描及处理流程图如图:显示时钟,判断闹铃显示时钟,分加1显示时钟,时加1显示闹钟时间 判断是否闹铃T0中断服务程序:采用定时器T0计时,中断程序每隔50ms中断一次计数加1,当计数20次时,则表示1s到了,秒变量加1,同理再判断是否1分钟到了,再判断是否1小时到了,再判断是否24小时到了。程序流程图如下:五、源程序代码及注释.*;/*电子时钟程序*/;程序主要包括MAIN函数,
11、T0、T1中断程序,时间、闹钟显示程序 ,按键扫描、处理程序.*ORG 0000HAJMP MAINORG 000BH;跳转到主程序MAIN执行;跳到INTT0执行AJMP INTT0ORG 001BHLJMP INTT1;跳至U INTT1 执行ORG 0300H;/*主函数*/预置T0T1工作方式,置初值,预置时钟、闹钟,置位数码MAIN:MOV SP,#80HMOV TMOD,#11HMOV TH0,#3CHMOV TL0,#0B0HMOV TH1,#0D8HMOV TL1,#0F0HMOV R1,#00H;设置定时器T0、T1工作于方式1;装入时钟定时初值(50ms);装入闹铃定时初值
12、10ms);确保首次默认闹铃工作MOV 20H,#00HMOV 21H,#00HMOV 22H,#00H;预置时钟分分MOV 23H,#00H;预置时钟时时MOV 30H,#30H;预置闹铃分分MOV 31H,#08H;预置闹铃时时SETB P2.0;数码管接P2 口,置位数码管,使其全灭SETB P2.1SETB 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 D
13、ISPT;调用时间显示子程序LCALL RING;调用闹铃处理子程序LCALL KEY;调用按键扫描子程序JZ LOOP;无键按下则循环LCALL CASE;有键按下则转按键处理子程序执行SJMP LOOP;循环;/*T0 一秒定时中断程序INTT0*/正常时钟计时INTT0:PUSH PSWPUSH ACCMOV TL0,#0B0HMOV TH0,#3CH;状态字入栈保护;累加器入栈保护;装入计数初值,12MHZ晶振,形成1S中断INC 20HMOV A,20HCJNE A,#20,RETURNCPL P1.7;一秒到发光二极管轮流亮,用于显示秒CPL P1.6MOV 20H,#00H;一秒
14、到满20HMOV A,21HADD A,#01HDA AMOV 21H,ACJNE A,#60H,RETURNMOV 21H,#00H;一分到,21H单元清零MOV A,22HADD A,#01HDA AMOV 22H,ACJNE A,#60H,RETURNMOV 22H,#00H;一小时到,22H单元清零MOV A,23HADD A,#01HDA AMOV 23H,ACJNE A,#24H,RETURNMOV 23H,#00H刑24,23H单元清零RETURN: POP ACCPOP PSWRETI;/*时间显示子程序*/DISPT: MOV A,22HANL A,#0FHMOV 2AH,A
15、时钟分的低位MOV A,22HANL A,#0F0HSWAP AMOV 2BH,A;时钟分的高位MOV A,23HANL A,#0FHMOV 2CH,A;时钟时的低位MOV A,23HANL A,#0F0HSWAP AMOV 2DH,A;时钟时的高位LED1: SETB P2.3MOV A,2DHMOV DPTR,#TABMOVC A,A+DPTRCLR P2.0;选通数码管1MOV P0,A;显示时钟时的十位部分LCALL DELAYLED2: SETB P2.0MOV A,2CHMOV DPTR,#TABMOVC A,A+DPTRCLR P2.1;选通数码管2MOV P0,A;显示时钟时
16、的个位部分LCALL DELAYLED3: SETB P2.1MOV A,2BHMOV DPTR,#TABMOVC A,A+DPTRCLR P2.2;选通数码管3MOV P0,ALCALL DELAYLED4: SETB P2.2;显示时钟分的十位部分MOV A,2AHJB P1.7,TA2;用于利用数码管的小数点来表示秒;选通数码管4;显示时钟分的个位部分TA1:ADD A,#10TA2:MOV DPTR,#TABMOVC A,A+DPTRCLR P2.3MOV P0,ALCALL DELAYRETTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80
17、H,90H;共阳数码管的不带小数点的时间显示码DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H;共阳数码管的带小数点的时间显示码;/*按键扫描程序*/开关接P3 口,判断按键情况KEY: MOV P3,#0FFHMOV A,P3CPL A;键盘去抖动;将键值存入R6ANL A,#2CHJZ RETKLCALL DELAYMOV A,P3CPL AANL A,#2CHJZ RETKMOV R6,A;无键按下则返回;延时消抖LOOP1:LCALL DISPT;MOV A,P3CPL AANL A,#2CHJNZ LOOP1;等待键释放MOV A,R6RETK:
18、RET;/*按键处理子程序*/根据按键情况进行处理CASE: MOV A,R6CLR P1.0JB ACC.2,SETHJB ACC.3,SETMJB ACC.5,SETR;发光二极管LED1亮;转调整时;转调整分;转闹铃设置WAITCASE:LCALL DISPT;无键按下时等待LCALL KEYJZ WAITCASE;/*时间调整程序*/按键调整时间SETT: LCALL DISPTLCALL KEYJZ SETTMOV A,R6JB ACC.2,SETHJB ACC.3,SETMJB ACC.5,KEYGO;第二次按为确认离开KEYGO: SETB P1.0;发光二极管LED1、LED2
19、灭SETB P1.1RETSETH: MOV A,23H;调整时钟时,时加1DA AADD A,#01H;十进制调整MOV 23H,ACJNE A,#24H,HD;判断是否到24,不到继续MOV 23H,#00H;到24时清零HD: LJMP SETTSETM: MOV A,22HADD A,#01HDA AMOV 22H,ACJNE A,#60H,MDMOV 22H,#00HMD:LJMP SETT;分加1;十进制调整;判断是否到1小时,不到继续;到1小时则清零;无键按下则返回;延时消抖;键盘去抖动;将键值存入R6;/*闹铃时间调整按键扫描及处理子程序*/KEYR:MOV P3,#0FFHM
20、OV A,P3CPL AANL A,#2CHJZ RETKLCALL DISPRMOV A,P3CPL AANL A,#2CHJZ RETKMOV R6,ALJMP LOOPRLOOPR:LCALL DISPRMOV A,P3CPL AANL A,#2CHJNZ LOOPR;等待键释放MOV A,R6AJMP RETK;/*设置闹铃时间*/SETR: SETB P1.0CLR P1.1LCALL DISPRMOV R1,#00H与否MOV 53H,#03HLCALL KEYR;发光二极管LED1灭;发光二极管LED2亮,改显示状态;设置闹钟时重设 R1 ,用于检测闹铃播放;重设闹铃次数;闹铃时
21、间调整按键检测JZ SETRMOV A,R6JB ACC.2,SETRHJB ACC.3,SETRM;第二次按为确认离开JB ACC.5,KEYGOSETRH:MOV A,31HADD A,#01HDA AMOV 31H,ACJNE A,#24H,RHDMOV 31H,#00HRHD: LJMP SETRSETRM:MOV A,30HADD A,#01HDA AMOV 30H,ACJNE A,#60H,RMDMOV 30H,#00HRMD: LJMP SETR;/*闹钟设置显示子程序*/DISPR: MOV A,30HANL A,#0FHMOV 3AH,AMOV A,30HANL A,#0F0
22、HSWAP A;闹钟时加1;十进制调整;判断是否到24,不到继续;到24时则清零;闹钟分加1;十进制调整;判断是否到1小时,不到继续;到1小时则清零;屏蔽高四位;保留低位送3AH;屏蔽低四位;高四位与第四位交换MOV 3BH,A;将保留的高4位送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+DPTRCLR P2.0MOV P0,ALCALL DELAYLEDR2:SETB P2.0MOV A,3CHMOV DP
23、TR,#TABMOVC A,A+DPTRCLR P2.1MOV P0,ALCALL DELAYLEDR3:SETB P2.1MOV A,3BHMOV DPTR,#TABMOVC A,A+DPTRCLR P2.2MOV P0,ALCALL DELAYLEDR4:SETB P2.2MOV A,3AHMOV DPTR,#TABMOVC A,A+DPTRCLR P2.3MOV P0,ALCALL DELAYRET;/*延时子程序*/DELAY:MOV R5,#2D1: MOV R4,#250D2: DJNZ R4,D2DJNZ R5,D1RET;/*闹铃检测程序*RING: MOV A,23HCJNE
24、 A,31H,RETRMOV A,22HCJNE A,30H,RETRLCALL SINGRETR: RET;/*定时器ti中断子程序*/INTT1: PUSH PSWPUSH ACCINC 50H;比较时;比较分;状态字入栈保护;累加器入栈保护;中断服务程序,中断计数器加1MOV TH1,#0D8H10MS中断MOV TL1,#0F0HPOP ACCPOP PSW;装入计数初值,12M晶振,形成RETI;/*响铃子程序*/SING: CJNE R1,#01H,SING1;判断是否已经闹铃过一次LJMP RETSSING1: SETB ET1MOV 50H,#00HMOV 51H,#00HMO
25、V 52H,#00HMOV 53H,#03HGETNOT: MOV A,51HMOV DPTR,#NOTEMOVC A,A+DPTRJZ ENDPMOV R6,AINC 51HCJNE A,#0FFH,GETMETLJMP PAUSELJMP GETNOTGETMET: MOV A,52HMOV DPTR,#METREMOVC A,A+DPTRMOV R7,A;中断计数器清0;音符指针;节拍码指针;设置闹钟不退出响铃次数;表头地址送DPTR;查表取音符码;是00H,则结束存R6;不为0FFH,转取节拍码;转休止播放;取音符码;取节拍码首地址;取节拍彳t码送R7INC 52HPLAY: SETB
26、 TR1CPL P2.4LCALL KEYJNZ RETSMOV A,R6MOV R3,ALCALL DELAY1MOV A,R7CJNE A,50H,PLAY续循环MOV 50H,#00HLCALL DISPTLCALL DISPTLCALL DISPTLCALL DISPTCLR TR1LJMP GETNOT;启动计数;音符码存R3;取节拍码放A与中断计数比较;断计数器(50H)=R7否,不等继;等于,则取下一代码RETS: SETB P2.4MOV R1,#01HCLR A;置位蜂鸣器,否则可能产生啸叫;表明播放过一次彳青除A,防止进入按键处理子程序LJMP RETRPAUSE:CLR
27、TR1MOV R2,#0DHDELAY2: MOV R3,#0FFHLCALL DELAY1DJNZ R2,DELAY2RET;休止100毫秒ENDP: SETB P2.4MOV R2,#0C7HEND1M: MOV R3,#00HLCALL DELAY1DJNZ R2,END1MDJNZ 53H,SINGRET;歌曲结束,延时1秒后继续DELAY1: NOPDELAY3: MOV R4,#02 HDELAY4: DJNZ R4,DELAY4;R3 为 01H 时,DELAY 延时为 20uSDJNZ R3,DELAY3RETNOTE: DB 7FH,7FH,7FH,60H,65H,72H,7
28、2H,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,20H,20H,20H,80HDB 80H,20H,20H,20H,20H,20H,20H,20H,20H,80H
29、DB 20H,20H,20H,20H,40H,20H,20H,20H,20H,20H,20H,40HEND六、课程设计体会由于大创实验的火热,学校让我们在大二就开始学习单片机,这对于我们来 说既有好处也有难处。我们可以更早的接触单片机,便于后续的学习开展,同时, 也在繁忙的课业中加了点难度。初次接触单片机,我觉得还是有点难以上手的。通过之前的理论课,我觉得突然实操的难度很大。我借助网络资源,和同学讨论,逐步完成的板子以及程序。 刚开始的编程没有思路,无从下手。通过从网上查阅资料,仿照着才能慢慢走下 来。同时借助老师发的课程资料和 ppt也解决了我不少问题。整个课程设计过程学到了不少通过理论学习没法学到的东西,真正增加了自己的一种能力。借助这次机会,我觉得我更进一步的了解了单片机,也对它产生了更浓厚的兴趣0