单片机课程设计数字电子钟.doc
单片机技术课程设计说明书 数 字 电 子 钟 系 、 部: 电气与信息工程系 学生姓名: 刘亚龙 指导教师: 吴乐 职称 讲师 专 业: 电气工程及其自动化 班 级: 电气本1004 完成时间: 2013-1-2 摘 要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。所以设计一个简易数字电子钟很有必要。本电子钟采用ATMEL公司的AT89S52单片机为核心,使用12MHz 晶振与单片机AT89S52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求。该电子钟设有四个按键S1、S2、S3和S4键,进行相应的操作就可实现校时、复位功能。具有时间显示、校正等功能。走时准确、显示直观、运行稳定等优点。具有极高的推广应用价值。关键词 电子钟;AT89S52;硬件设计;软件设计ABSTRACTClock is widely used in life, and a simple digital clock is more welcomed by people. So to design a simple digital electronic clock is necessary.The system use a single chip AT89S52 of ATMELs as its core to control The crystal oscillator clock,using of E-12MHZ is connected with the microcontroller AT89S52, through the software programming method to achieve a 24-hour cycle, and eight 7-segment LED digital tube (two four in one digital tube) displays hours, minutes and seconds requirements, and in the time course of a timing function, when the time arrived ahead of scheduled time to buzz a good timekeeping. The clock has four buttons S1, S2, S3 and S4 key, and make the appropriate action can be achieved when the school, timing, reset. With a time display, alarm clock settings, timer function, corrective action. Accurate travel time, display and intuitive, precision, stability, and so on. With a high application value.显示对应的拉丁字符的拼音 字典 - 查看字典详细内容 Key words Electronic clock;;AT89S52;Hardware Design;Software Design目 录1 设计课题任务、功能要求说明及方案介绍11.1 设计课题任务11.2 功能要求说明11.3 设计总体方案介绍及原理说明12 设计课题硬件系统的设计22.1 设计课题硬件系统各模块功能简要介绍22.2 设计课题电路原理图、PCB图、仿真电路图22.3 设计课题元器件清单33 设计课题软件系统的设计53.1 设计课题使用单片机资源的情况53.2 设计课题软件系统各模块功能简要介绍53.3 设计课题软件系统程序流程框图53.4 设计课题软件系统程序清单104 设计结论、仿真结果、误差分析、教学建议254.1 设计课题的设计结论及使用说明254.2 设计课题的仿真结果254.3 设计课题的误差分析264.4 设计体会264.5 教学建议26参考文献 27致 谢 28附 录 291 设计课题任务、功能要求说明及方案介绍1.1 设计课题任务设计一个具有特定功能的电子钟。具有时间显示,时间设定,时间调整功能。1.2 功能要求说明设计一个具有特定功能的电子钟。该电子钟上电或按键复位后能自动显示系统提示符“P.”, 进入时钟准备状态;第一次按电子钟启动/暂停键,电子钟从0时0分0秒开始运行,进入时钟运行状态;再次按电子钟调整键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按启动/暂停键再次进入时钟运行状态。退出手动调时系统后,计时系统在调整后的状态下运行。当计时达到24小时后,系统自动清0,重新进入计时系统。1.3 设计课题总体方案介绍及工作原理说明本电子钟主要由单片机、4*1独立键盘、显示接口电路和复位电路构成,设计课题的总体方案如图1.1所示: 图1.1 总体设计方案图本电子钟的所有的软件、参数均存放在AT89S52的Flash ROM和内部RAM中,减少了芯片的使用数量简化了整体电路也降低了整机的工作电流。键盘采用动态扫描方式。利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据,同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。2 设计课题硬件系统的设计2.1 设计课题硬件系统各模块功能简要介绍本设计的硬件系统主要采用以下基本模块来实现,单片机最小系统模块,输入模块、输出模块、电源模块。(1)时钟电路:系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。AT89单片机内部有一个用于构成振荡器的高增益反相放大器。引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。外接晶体谐振器以及电容C1和C2构成并联谐振电路,接在放大器的反馈回路中。对外接电容的值虽然没有严格的要求,但电容的大小会影响震荡器频率的高低、震荡器的稳定性、起振的快速性和温度的稳定性。因此,此系统电路的晶体振荡器的值为12MHz,电容应尽可能的选择陶瓷电容,电容值约为22F。在焊接刷电路板时,晶体振荡器和电容应尽可能安装得与单片机芯片靠近,以减少寄生电容,更好地保证震荡器稳定和可靠地工作。(2)复位电路:复位是由外部的复位电路来实现的。片内复位电路是复位引脚RST通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,它的输出在每个机器周期的S5P2,由复位电路采样一次。复位电路通常采用上电自动复位和按钮复位两种方式,此电路系统采用的是上电与按钮复位电路,如图所示。当时钟频率选用6MHz时,C取22F,Rs约为200,Rk约为1K。(3)键盘电路:当非编码键盘的按键较少时,采用独立式键盘比较方便,可以随意拿硬件作为预处理,各键盘之间不影响,编程相对矩阵式键盘简单,但占用的I/O口线较多。(4)显示电路:显示器普遍地用于直观地显示数字系统的运行状态和工作数据,按照材料及生产工艺,单片机应用系统中常用的显示器有:发光二极管LED显示器、液晶LCD显示器、CRT显示器等。LED显示器是现在最常用的显示器之一。LED显示器的显示控制方式按驱动方式可分成静态显示方式和动态显示方式两种。对于多位LED显示器,通常都是采用动态扫描的方法进行显示,其硬件连接方式如系统原理图。在动态方式中,逐个地循环地点亮各位显示器。这样虽然在任一时刻只有一位显示器被点亮,但是由于人眼具有视觉残留效应,看起来与全部显示器持续点亮效果完全一样。(5)电源电路:现在市面上销售的编程器有很多都是由PC机的USB口直接供电,为了降低本设计的成本及节省设计时间,没有另外设计编程器。2.2 设计课题电路原理图、PCB图、元器件布局图 图2.1 电路原理图 图2.2 PCB图图2.3 仿真电路2.3 设计课题元器件清单设计课题元器件清单如表2.1所示。表2.1 设计所用元器件清单名称数量参数电阻3个1K数码管2个4位一体电阻1个200下载口1个普通插座1个40PIN电阻16个470按键4个三极管9个PNPUSB供电线1根晶振1个12MHz电容2个30pF极性电容1个22F芯片1块AT89S52发光二极管1个六角开关1个3 设计课题软件系统的设计3.1 设计课题使用单片机资源的情况设计课题使用单片机资源的情况如下:P0口输出数码管段选信号,P3口输出数码管位选信号;晶振12MHz;开始/暂停键S1;按一次开始计时,再按时间暂停在当前状态:调整键S2;通过选择键选择调整位,选中位闪烁;增加键S3;按一次使选中位加1;减少键S3;按一次使选中位减1;; P3.1口接蜂鸣器; 78H 用于秒个位; 79H 用于秒十位;7BH 用于分个位; 7CH 用于分十位;7EH 用于时个位; 7FH 用于时十位;54H 用于控制调时闪烁;堆栈栈底:70H。3.2 设计课题软件系统个模块功能简要介绍 本设计的软件系统主要采用以下基本模块来实现,主程序、中断服务程序、键盘输入程序模块、数码管及其驱动模块和延时模块。主程序:主要是用于对输入信号的处理、输出信号的控制和对各个功能程序模块的运用及其控制。中断服务程序:主要是用于电子钟的准确运行、数据输入过程中的闪烁。键盘输入程序模块:主要是用于确定按键并得到特定的键码值。数码管及其驱动模块:主要是用于驱动数码管及利用数码管显示时间。延时模块:程序中有两种延时子程序,一种是短延时用于判键按下等,一种是长延时。3.3 设计课题软件系统程序流程框图系统软件采用汇编语言按模块化方式进行设计,然后通过Keil软件开发平台将程序转变成十六进制程序语言,接着使用Proteous 进行仿真,读出显示数据。主程序流程框图如3.1所示;加1子程序如3.2所示;中断服务程序程序如3.3所示;键盘扫描子程序框图如3.4所示;显示子程序框图如3.5所示; 图3.1 主程序流程框图图3.2 加1子程序流程框图图3.3 中断子程序图3.4 键盘扫描子程序 图3.5 显示子程序3.4设计课题软件系统程序清单;-;本电子钟实现24小时制,8位数码管显示时分秒,可整点报时;显示格式:00-00-00(设置小时十位为0时,不显示);通过3只按键来调整时间;调整键SET_KEY:P1.1;通过选择键选择调整位,选中位闪烁;增加键ADD_KEY:P1.2;按一次使选中位加1;减少键DEC_KEY:P1.3;按一次使选中位减1;P0口输出数码管段选信号,P2口输出数码管位选信号;晶振12MHz;P3.1为蜂鸣器发声报时;编程人:刘亚龙 编写日期:2012年12月28日 修改日期(最终):2013年1月2日;-;-;程序入口;- ORG0000H START:LJMPMAINORG001BH ;定时器1的中断入口地址LJMPTT;*;系统监控程序区ORG0030HMAIN:MOVSP,#60H ;确立堆栈区MOVPSW,#00H ;初始化PSW,通用寄存器组为第0组MOVR0,#20H ;RAM区首地址MOVR5,#96 ;RAM区单元个数QL:MOVR0,#00HINCR0DJNZR5,QLSETBEA ;中断初始化SETBET1MOVTMOD,#10H ;TMOD初始化MOVTH1,#3CH ;计数初值初始化MOVTL1,#0B0H XP0:MOVDPTR,#BG0 ;提示符“P.”字符代码表首地址MOVR0,#78HMOVR2,#08HXP:CLRAMOVCA,A+DPTR MOVR0,AINCR0INCDPTRDJNZR2,XPLCALLDIR ;调显示子程序显示提示符“P.”LCALLKEY ;调键盘扫描子程序JB20H.0,K0LJMPXP0;*;键功能程序;电子钟进入启动/调整状态K0:MOVDPTR,#BG1 ;显示0时0分0秒字符代码表首地址MOVR0,#78HMOVR1,#08HXK:CLRAMOVCA,A+DPTRMOVR0,AINCR0INCDPTRDJNZR1,XKMOVR2,#14H KA:SETBTR1 ;开启定时器,电子钟进入启动状态KA0:LCALLDIRLCALLKEYJB20H.0,K00LJMPKA0 K00:CLRTR1 ;关闭定时器电子钟进入准备调整状态LCALLDIRLCALLKEYJB20H.0,T01 ;重新进入时钟运行状态JB20H.1,K1 ;选择调整时钟的秒针数LJMPK00;*;选择调整时钟的秒针数K1:MOVR5,7EHMOVR6,7FHMF3:MOVR0,78HMOVR1,79H;保存缓冲区78H,79H中的内容SM:MOV7EH,R5MOV7FH,R6MOV78H,#0AHMOV79H,#0AH;给78H,79H中送提示符“灭”字符代码MOVR2,#16HCL1:LCALLDIRLCALLKEYJB20H.0,MF0;重新进入时钟运行状态JB20H.1,K10;选择调整时钟的分针数JB20H.2,K20;对时钟的秒针数进行加一操作JB20H.3,T30DJNZR2,CL1MOV78H,R0MOV79H,R1;将78H,79H中原有的内容送回其中MOVR2,#16HCL2:LCALLDIRLCALLKEYJB20H.0,T01;重新进入时钟运行状态JB20H.1,K10;选择调整时钟的分针数JB20H.2,K20;对时钟的秒针数进行加一操作JB20H.3,T30DJNZR2,CL2LJMPSMT30:LJMPK30;对时钟的秒针数进行减一操作MF0:MOV78H,R0MOV79H,R1T01:LJMPKA;*;选择调整时钟的分针数K10:MOVR3,7BHMOVR4,7CH;保存缓冲区7BH,7CH中的内容SF:MOV78H,R0MOV79H,R1MOV7BH,#0AHMOV7CH,#0AH;给7BH,7CH中送提示符“灭”字符代码MOVR2,#16HCL3:LCALLDIRLCALLKEYJB20H.0,MF1;重新进入时钟运行状态JB20H.1,T11JB20H.2,T21JB20H.3,T31DJNZR2,CL3MOV7BH,R3MOV7CH,R4;将7BH,7CH中原有的内容送回其中MOVR2,#16HCL4:LCALLDIRLCALLKEY JB20H.0,T01;重新进入时钟运行状态JB20H.1,T11JB20H.2,T21JB20H.3,T31DJNZR2,CL4LJMPSFT11:LJMPK11;选择调整时钟的时针数T21:LJMPK21;对时钟的分针数进行加一操作T31:LJMPK31;对时钟的分针数进行减一操作;*;对时钟的秒针数进行加一操作K20:MOV78H,R0MOV79H,R1K200:CJNER0,#09H,IMGMOV78H,#00HINC79HMOVR1,79HCJNER1,#06H,IMG0MOV79H,#00HLJMPIMG0IMG:INC78HIMG0:MOVR0,78HMOVR1,79HCL70:MOVR2,#26HCL7:LCALLDIRLCALLKEYJB20H.0,T02 ;重新进入时钟运行状态JB20H.1,K10 ;选择调整时钟的分针数JB20H.2,K200 ;对时钟的秒针数进行加一操作 JB20H.3,K30 ;对时钟的秒针数进行减一操作DJNZR2,CL7LJMPCL70MF1:MOV7BH,R3MOV7CH,R4LJMPKA;*;对时钟的秒针数进行减一操作K30:MOV78H,R0MOV79H,R1K300:CJNER0,#00H,DMGMOV78H,#09HCJNER1,#00H,DMG1LJMPDMG2DMG1:DEC79HLJMPDMG0DMG2:MOV79H,#05HLJMPDMG0DMG:DEC78HDMG0:MOVR0,78HMOVR1,79HCD70:MOVR2,#26HCD7:LCALLDIRLCALLKEYJB20H.0,T02JB20H.1,T10JB20H.2,K20;对时钟的秒针数进行加一操作 JB20H.3,K300;对时钟的秒针数进行减一操作DJNZR2,CD7LJMPCD70T10:LJMPK10;选择调整时钟的分针数T02:LJMPKA ;重新进入时钟运行状态;*;选择调整时钟的时针数K11:MOVR5,7EHMOVR6,7FH;保存缓冲区7EH,7FH中的内容SS:MOV7BH,R3MOV7CH,R4MOV7EH,#0AHMOV7FH,#0AH;给7EH,7FH中送提示符“灭”字符代码MOVR2,#16HCL5:LCALLDIRLCALLKEYJB20H.0,MF2;重新进入时钟运行状态JB20H.1,Y1;选择调整时钟的秒针数JB20H.2,T22 JB20H.3,T32DJNZR2,CL5MOV7EH,R5MOV7FH,R6;将7EH,7FH中原有的内容送回其中MOVR2,#16HCL6:LCALLDIRLCALLKEYJB20H.0,T02;重新进入时钟运行状态JB20H.1,Y1;选择调整时钟的秒针数JB20H.2,T22 JB20H.3,T32DJNZR2,CL6LJMPSST22:LJMPK22;对时钟的时针数进行加一操作T32:LJMPK32;对时钟的时针数进行减一操作MF2:MOV7EH,R5MOV7FH,R6LJMPKA;*;对时钟的分针数进行加一操作K21:MOV7BH,R3MOV7CH,R4K210:CJNER3,#09H,IFGMOV7BH,#00HINC7CHMOVR4,7CHCJNER4,#06H,IFG0MOV7CH,#00HLJMPIFG0IFG:INC7BHIFG0:MOVR3,7BHMOVR4,7CHCL80:MOVR2,#26HCL8:LCALLDIRLCALLKEYJB20H.0,T02;重新进入时钟运行状态JB20H.1,K11;选择调整时钟的时针数JB20H.2,K210;对时钟的分针数进行加一操作JB20H.3,K31;对时钟的分针数进行减一操作DJNZR2,CL8LJMPCL80Y1:LJMPMF3;*;对时钟的分针数进行减一操作K31:MOV7BH,R3MOV7CH,R4K310:CJNER3,#00H,DFGMOV7BH,#09HCJNER4,#00H,DFG1LJMPDFG2DFG1:DEC7CHLJMPDFG0DFG2:MOV7CH,#05HLJMPDFG0DFG:DEC7BHDFG0:MOVR3,7BHMOVR4,7CHCD80:MOVR2,#26HCD8:LCALLDIRLCALLKEYJB20H.0,T03 ;重新进入时钟运行状态JB20H.1,Y11 ;选择调整时钟的时针数JB20H.2,K21 ;对时钟的分针数进行加一操作JB20H.3,K310 ;对时钟的分针数进行减一操作DJNZR2,CD8LJMPCD80Y11:LJMPK11 ;选择调整时钟的时针数;*;对时钟的时针数进行加一操作K22:MOV7EH,R5MOV7FH,R6K220:MOV21H,7FHJB21H.1,I1CJNER5,#09H,ISGMOV7EH,#00HINC7FHMOVR6,7FHCJNER6,#03H,ISG0MOV7FH,#00HLJMPISG0I1:CJNER5,#03H,ISGMOV7EH,#00HMOV7FH,#00HLJMPISG0ISG:INC7EHISG0:MOVR5,7EHMOVR6,7FHCL90:MOVR2,#26HCL9:LCALLDIRLCALLKEYJB20H.0,T03JB20H.1,Y1;选择调整时钟的秒针数JB20H.2,K220;对时钟的时针数进行加一操作JB20H.3,K32;对时钟的时针数进行减一操作DJNZR2,CL9LJMPCL90T03:LJMPKA ;重新进入时钟运行状态;*;对时钟的时针数进行减一操作K32:MOV7EH,R5MOV7FH,R6K320:MOVA,7FHJZD1CJNER5,#00H,DSGMOV7EH,#09HCJNER6,#00H,DSG1LJMPDSG2D1:CJNER5,#00H,DSGDSG2:MOV7EH,#03HMOV7FH,#02HLJMPDSG0DSG1:DEC7FHLJMPDSG0DSG:DEC7EHDSG0:MOVR5,7EHMOVR6,7FHCD90:MOVR2,#26HCD9:LCALLDIRLCALLKEYJB20H.0,T03;重新进入时钟运行状态JB20H.1,Y2;选择调整时钟的秒针数JB20H.2,Y22;对时钟的时针数进行加一操作JB20H.3,K320;对时钟的时针数进行减一操作DJNZR2,CD9LJMPCD90Y2:LJMPMF3Y22:LJMPK22;*;中断服务程序:TT:MOVTH1,#3CH;重赋计数初值MOVTL1,#0B0HDJNZR2,QUIT;中断次数没满20次则跳出中断MOVR2,#14HSETBP3.1;关蜂鸣器INC78H;秒个位加一MOVA,#0AHXRLA,78HJNZQUIT;秒个位不等于10则跳出中断MOV78H,#00H;秒个位重赋0INC79H;秒十位加一MOVA,#06HXRLA,79HJNZQUIT;秒十位不等于6则跳出中断MOV79H,#00H;秒十位重赋0INC7BH;分个位加一MOVA,#0AHXRLA,7BHJNZQUIT;分个位不等于10则跳出中断MOV7BH,#00H;分个位重赋0INC7CH;分十位加一MOVA,#06HXRLA,7CHJNZQUIT;分十位不等于6则跳出中断MOV7CH,#00H;分十位重赋0CLRP3.1;蜂鸣器整点报时MOV21H,7FH JB21H.1,X1;查时十位状态INC7EHMOVA,#0AHXRLA,7EHJNZQUIT;时个位不等于10则跳出中断MOV7EH,#00HLJMPX2X1:INC7EHMOVA,#04HXRLA,7EHJNZQUIT;时个位不等于4则跳出中断MOV7EH,#00HX2:INC7FHMOVA,#03HXRLA,7FHJNZQUIT;时十位不等于3则跳出中断MOV7FH,#00HQUIT:RETI;中断返回;*;键盘扫描子程序:键值在内部RAM 20H单元中KEY:PUSHACCLCALLKEYCL ;调P1口数据处理子程序JZFH;判断键是否按下LCALLDIR;调显示子程序去抖动LCALLDIRJZFH;确认键是否真的按下MOVB,20H;保存取反后的键值KEYSF:LCALLKEYCL;调P1口数据处理子程序JZHF;判断键是否释放LCALLDIR;调显示子程序延时LJMPKEYSF;等待键释放HF:MOV20H,B;键值送20H保存FH:POPACCRET;*;P1口数据处理子程序KEYCL:MOVA,P1;读P1口数据CPLA;P1口数据取反MOV20H,A;保存取反后的键值RET;*;数码管显示子程序入口:7FH,7EH,7DH,7CH,7BH,7AH,79H,78H(LED7,LED6,LED5,LED4,LED3,LED2,LED1,LED0)DIR:PUSHDPH ;保护现场PUSHDPLPUSHACCPUSHPSWSETBRS0;改变当前寄存器组为组01组CLRRS1;显示缓冲存储单元首地址MOVR0,#78H;从右至左显示MOVR1,#0FEHMOVA,R1LED0:MOVP2,A ;送位控MOVDPTR,#BG;共阳数码管字型代码表首地址MOV