单片机课程设计数字电子钟设计
单片机技术课程设计说明书
数 字 电 子 钟
系 、 部: 电气与信息工程系
学生姓名: 游天乐
指导教师: 王韧 职称 副教授
专 业: 电子信息工程
班 级: 自本0902
完成时间: 2012-01-02
摘 要
电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们
的欢迎。所以设计一个简易数字电子钟很有必要。本电子钟采用ATMEL公司的AT89S52
单片机为核心,使用12MHz 晶振与单片机AT89S52 相连接,通过软件编程的方法实
现以24小时为一个周期,同时8位8段LED数码管(两个四位一体数码管)显示小时、
分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂
鸣报时。该电子钟设有四个按键S1、S2、S3和S4键,进行相应的操作就可实现校时、
定时、复位功能。具有时间显示、整点报时、校正等功能。走时准确、显示直观、
运行稳定等优点。具有极高的推广应用价值。
关键词 电子钟;AT89S52;硬件设计;软件设计
ABSTRACT
Clock 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 ATMEL’s 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 8-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 设计课题任务、功能要求说明及方案介绍………………………………………1
1.1 设计课题任务 ………………………………………………………………1
1.2 功能要求说明 ………………………………………………………………1
1.3 设计总体方案介绍及原理说明 ……………………………………………1
2 设计课题硬件系统的设计 ………………………………………………………2
2.1 设计课题硬件系统各模块功能简要介绍 …………………………………2
2.2 设计课题电路原理图、PCB图、元器件布局图…………………………2
2.3 设计课题元器件清单 ………………………………………………………3
3 设计课题软件系统的设计…………………………………………………………4
3.1 设计课题使用单片机资源的情况 …………………………………………4
3.2 设计课题软件系统各模块功能简要介绍 …………………………………4
3.3 设计课题软件系统程序流程框图 …………………………………………5
3.4 设计课题软件系统程序清单 ………………………………………………8
4 设计结论、仿真结果、误差分析、教学建议 …………………………………19
4.1 设计课题的设计结论及使用说明…………………………………………19
4.2 设计课题的仿真结果………………………………………………………19
4.3 设计课题的误差分析………………………………………………………20
4.4 设计体会……………………………………………………………………20
4.5 教学建议……………………………………………………………………20
结 束 语 ……………………………………………………………………………21
致 谢 ……………………………………………………………………………22
参考文献 ……………………………………………………………………………23
附 录A …………………………………………………………………………24
附 录B …………………………………………………………………………25
附 录C …………………………………………………………………………27
1 设计课题任务、功能要求说明及方案介绍
1.1 设计课题任务
设计一个具有特定功能的电子钟。具有时间显示、报时等功能。并有时间设定,时间调整功能。
1.2 功能要求说明
设计一个具有特定功能的电子钟。该电子钟上电或按键复位后能自动显示系统提示符“P.”, 进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从0时0分0秒开始运行,进入时钟运行状结束后可按启动/调整键再次进入时钟运行状态。 态;再次按电子钟启动/调整键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整
1.3 设计课题总体方案介绍及工作原理说明
本电子钟主要由单片机、独立键盘、显示接口电路和复位电路构成,设计课题的总体方案如图1所示:
图1 总体设计方案图
本电子钟的所有的软件、参数均存放在AT89S52的Flash ROM和内部RAM中,减少了芯片的使用数量简化了整体电路也降低了整机的工作电流。键盘采用动态扫描方式。利用单片机定时器及计同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。 数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据,
2 设计课题硬件系统的设计
2.1 设计课题硬件系统各模块功能简要介绍
本设计的硬件系统主要采用以下基本模块来实现,单片机最小系统模块,输入模块、输出模块、电源模块。
(1)单片机最小系统模块:包括低功耗、高性能CMOS8位微控制器AT89S52;复位电路;晶振电路。本本模块AT89S52系统控制核心,单片机系统复位由复位电路完成,单片机内部有一个高芯片外并接石英晶体振荡器和两只电容。这样就构成一个稳定的自激振荡器。 增益、反相放大器,其输入端为芯片引脚XTAL1,其输出端位位引脚XTAL2。通过这两个引脚在
(2)输入模块:本模块共用到了5个按键,1个电源开关,1个复位键,单片机运行期间,利用按键完成复位操作。3个按键独立式键盘,S1键控制电子钟的启动\调整状态,S2键为加1键,独立实现相应的电子钟功能。
可以节约成本又能简化电路。数码管用8个PNP三极管驱动。
计的成本及节省设计时间,没有另外设计编程器,而直接购买了市场上的USB供电及下载器。 S3键为减1键。且S1、S2、S3任一键都独自连一个I/O(P1.0、P1.1、P1.2)口线,说明它们可以(3)输出模块:本次设计显示为8位,采用两个四位一体数码管(共阳极)作为显示窗口,既(4)电源模块:现在市面上销售的编程器有很多都是由PC机的USB口直接供电为了降低本设
2.1设计课题电路原理图、PCB图、元器件布局图
电路原理图见附录A,PCB附录B,元器件布局图见附录C
2.2 设计课题元器件清单
设计课题元器件清单如表1所示。
表1 设计所用元器件清单
3 设计课题软件系统的设计
3.1 设计课题使用单片机资源的情况
设计课题使用单片机资源的情况如下:
P0口输出数码管段选信号,P3口输出数码管位选信号;晶振12MHz;调整选择键SET_KEY:P1.0;通过选择键选择调整位,选中位闪烁;增加键ADD_KEY:P1.1;按一次使选中位加1;减少键DEC_KEY:
50H 用于控制秒基准时钟源的产生;51H 清零秒寄存器;
52H 清零分寄存器;53H 清零时寄存器;
5FH 用于秒个位;5EH 用于秒十位;
5DH 用于分个位;5CH 用于分十位;
5BH 用于时个位;5AH 用于时十位;
54H 用于控制调时闪烁;堆栈栈底:70H。 P1.2;按一次使选中位减1;P2.1为蜂鸣器发声报时;50H-5FH;16个寄存器单元作为显示单元;
3.2 设计课题软件系统个模块功能简要介绍
数码管及其驱动模块和延时模块。
制。
中断服务程序:主要是用于电子钟的准确运行、数据输入过程中的闪烁。
键盘输入程序模块:主要是用于确定按键并得到特定的键码值。
数码管及其驱动模块:主要是用于驱动数码管及利用数码管显示时间。
延时模块:程序中有两种延时子程序,一种是短延时用于判键按下等,一种是长延时。 本设计的软件系统主要采用以下基本模块来实现,主程序、中断服务程序、键盘输入程序模块、主程序:主要是用于对输入信号的处理、输出信号的控制和对各个功能程序模块的运用及其控
3.3 设计课题软件系统程序流程框图
系统软件采用汇编语言按模块化方式进行设计,然后通过Keil软件开发平台将程
序转变成十六进制程序语言,接着使用Proteus 进行仿真,读出显示数据。
主程序流程框图如图1所示;加1子程序如图2所示;
中断服务程序程序如图3所示;
键盘扫描子程序框图如图4所示;
显示子程序框图如图5所示;
图2 主程序流程框图
图3 加1子程序流程框图
图4 中断子程序流程框图
图5 键盘扫描子程序流程框图
图6 显示子程序流程框图
3.4设计课题软件系统程序清单
;*********************************************************************** ;项目名称:电子钟的设计 ;设计者:游天乐
;设计日期:2011年12月24日
;*********************************************************************** ;堆栈栈底7FH;
;*********************************************************************** ;LED数码管显示器设定;
;P0.7---P0.0段控线,接LED的显示段dp,g,f,e,d,c,b,a
;P2.7---P2.0位控线,从左至右(LED7,LED6,LED5,LED4,LED3,LED2,LED1,LED0) ;显示缓冲区设定从左至右依次为
7FH,7EH,7DH,7CH,7BH,7AH,79H,78H(LED7,LED6,LED5,LED4,LED3,LED2,LED1,LED0) ;*********************************************************************** ;独立式键盘设定;
;8个按键S2至S9分别依次接在P1.0至P1.7口线;
;*********************************************************************** ;子程序;
;DISP(数码管显示子程序)
;DL(1毫秒延时子程序,晶振频率12MHz)
;*********************************************************************** ;常数表格;
;TAB(共阳数码管字型代码表)
;DISBH(系统提示符P.字型代码序号表)
;*********************************************************************** ;中断服务程序;
;*********************************************************************** ;键功能程序;
;*********************************************************************** ;数据存储器变量及常量单元定义;
;*********************************************************************** ;伪指令定义区
;*********************************************************************** ;系统起始程序区
ORG 0000H
START: LJMP MAIN
;*********************************************************************** ;系统监控程序区
ORG 000BH LJMP PIT0 ORG 0100H;
MAIN: MOV SP, #7FH ;确立堆栈区 MOV R0, #78H ;显示缓冲区首址 MOV R7, #08H ;显示位数
ML1: MOV @R0, #00H ;时钟显示缓冲单元清0 INC R0; DJNZ R7, ML1
MOV 7AH, #12H
MOV 7DH, #12H
MOV TMOD, #01H ;设置T/C0工作方式1 MOV TL0, #0DCH ;装载计数初值 MOV TH0, #0BH; SETB EA;
SETB ET0 CLR TR0;
MOV 30H, #14H ;计数溢出次数,即循环次数
ML0: LCALL GEXING
LCALL DISP ;调显示子程序 LCALL KEY ;调键扫描子程序
ML3: LCALL ANJIANG; ML2: JNB TR0, PARK LCALL DISP FFT: SJMP ML0
;*********************************************************************** ;独立式键盘设定;
ANJIANG:JB 20H.0, KEYAA ;是KEYA键,转KEYAA执行
JB 20H.1, KEYBB ;是KEYB键,转KEYBB执行
JB 20H.2, KEYCC;
JB 20H.3, KEYDD
RET
;********************************************************************** ;键功能程序;
KEYAA: MOV R0, #75H ;给加一子程序赋初值 LCALL DADD1 ;时加一
MOV 25H, 75H ;时的十位送位单元 MOV 26H, 74H ;时的个位送位单元 JB 25H.1, LOOP7 ;判断十位是否加到2
LJMP ML2 ;
KEYBB: MOV R0, #73H ;给加一子程序赋初值 LCALL DADD1 ;分加一
MOV 24H, 73H ;分的十位送位单元
JB 24H.2, LOOP5 ;判断是否为6
LJMP ML2
KEYCC: SETB TR0 ;开始按键
LJMP ML2 ;
KEYDD: CLR TR0 ;停止按键 LJMP ML2 ;
PARK : MOV P2, #0FEH ;显示P. MOV P0, #0CH ;
分清零
LJMP ML2 ;
LOOP6: MOV 73H, #00H ;分清零 MOV 72H , #00H;
LJMP ML2
LCALL KEY
AJMP ML3
LOOP5: JB 24H.1, LOOP6 ;判断是否为6 ,分到达60,转LOOP6
LOOP7 : JB 26H.2, LOOP8 ;判断个位是否加到4 ,时到达24
转LOOP8,让时清零
LJMP ML2 ;
LOOP8: MOV 75H, #00H ;时清零 MOV 74H, #00H;
;********************************************************************** ;键盘扫描子程序
KEY: LCALL KEYCHULI ;调P1口数据处理子程序 JZ EXIT ;没有键按下,转返回
LCALL DISP ;调显示子程序去抖动
LCALL DISP
LCALL KEYCHULI ;调P1口数据处理子程序 JZ EXIT ;没有键按下,转返回
LJMP ML2 ;
MOV B, 20H ;保存取反后的键值
KEYSF: LCALL KEYCHULI ;调P1口数据处理子程序 JZ KEY1 ;键释放,转恢复键值 LCALL DISP ;调显示子程序延时 LJMP KEYSF ;等待键释放 KEY1: MOV 20H, B ;键值送20H保存 EXIT: RET
KEYCHULI: PUSH PSW ;保护现场
MOV P1 ,#0FFH ;先向P1口写1 MOV A, P1 ;读P1口数据 CPL A ;P1口数据取反
ANL A, #0FFH; MOV 20H , A
POP PSW ;恢复现场 RET ;子程序返回
;*********************************************************************** ;常数表格区
;系统初始化后提示符“P.”字符代码表
DISBH:DB 10H,10H,10H,10H,10H,10H,10H,11H ;提示符“P.”字符序号 ;显示字符段选码表(共阳极代码)
TAB:DB 0C0H, 0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H ;0-8
DB 90H, 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,0BFH ;9,A,B,C,D,E,F,灭, ;*********************************************************************** ;中断服务程序;
PIT0: PUSH PSW ;现场保护
PUSH ACC; MOV A, #40H;
MOV TL0, #0DCH ;装载计数初值
MOV TH0, #0BH
SETB PSW.3 ;选第1组通用寄存器
MOV A, 30H ;循环次数减1 DEC A; MOV 30H, A;
JNZ RET0 ;不满20次,转RET0返回
MOV 30H, #14H ;满20次,开始计时操作
MOV R0, #71H ;秒十位显示缓冲单元地址 ACALL DADD1 ;秒加1
MOV A, R2 ;加1后秒值在R2中 XRL A, #60H ;判是否到60秒 JNZ RET0 ;不到,转RET0返回
ACALL CLR0 ;到60秒,秒显示缓冲单元清0 MOV R0, #73H ;分十位显示缓冲单元地址 ACALL DADD1 ;分加1
MOV A, R2 ;加1后分值在R2中 XRL A, #60H ;判是否到60分 JNZ RET0 ;不到,转RET0返回
ACALL CLR0 ;到60分,分显示缓冲单元清0 MOV R0, #75H ;时十位显示缓冲单元地址 ACALL DADD1 ;时加1
MOV A, R2 ;加1后时值在R2中 XRL A, #24H ;判是否到24小时 JNZ RET0 ;不到,转RET0返回 ACALL CLR0;
RET0: POP ACC ;现场恢复 POP PSW;
RETI
;*********************************************************************** ;子程序区;
;数码管显示子程序DISP
7FH,7EH,7DH,7CH,7BH,7AH,79H,78H(LED7,LED6,LED5,LED4,LED3,LED2,LED1,LED0)
DISP: PUSH PUSH PUSH
PUSH
CLR RS1 ; SETB RS0
MOV R1, #78H ; MOV R2, #0FEH ;
MOV R5, #08H ; DISP1: MOV A, @R1 MOV MOVC A, @A+DPTR
MOV
MOV LCALL MOV RL
MOV R2, A
INC
DJNZ R5, DISP2: POP POP POP POP
RET
;延时1ms子程序(晶振频率12MHz)DL
DL: MOV DPH DPL ACC PSW
DPTR, #TAB
P0, A
P2, R2 ;DL ;A, R2 ;A
R1
DISP1
PSW ;ACC DPL DPH
R7, #02H
改变当前寄存器组为组1 显示缓冲存储单元首地址 从右至左显示 循环次数,即驱动数码管的位数;送段控
送位控 延时1毫秒 位控码送A ;获得新的位控码 ;保存新的位控码 ;获得新的显示缓冲单元地址 ;循环没有结束则继续
恢复当前寄存器组的组号
DL1: DL2:
MOV DJNZ DJNZ RET ;
R6, #0FFH R6, DL2 R7, DL1
;*********************************************************************** ;更新缓冲区内容子程序
GEXING:MOV 78H, 70H
MOV 79H, 71H MOV 7BH, 72H
MOV 7CH, 73H MOV 7EH, 74H MOV 7FH, 75H RET
;*********************************************************************** ;加一子程序
DADD1: MOV A, @R0 ;十位数送A DEC R0
SWAP A ;十位数占高4位 ORL A, @R0 ;个位数占低4位 ADD A, #01H ;加1 DA A ;十进制调整 MOV R2, A ;全值暂存R2中 ANL A, #0FH ;屏蔽十位数,取出个位数 MOV @R0, A ;个位值送显示缓冲单元 MOV A, R2; INC R0;
ANL A, #0F0H ;屏蔽个位数,取出十位数 SWAP A ;使十位数占低4位
MOV @R0, A ;十位值送显示缓冲单元 RET ;子程序返回
;***********************************************************************
CLR0: CLR A
MOV @R0, A ;十位数缓冲单元清0 DEC R0
MOV @R0, A ; RET
END
个位数缓冲单元清0
4 设计结论、仿真结果、误差分析、教学建议
4.1 设计课题的设计结论及使用说明
本设计为基于单片机的电子钟的设计。刚开始,我们很多地方理不清头绪,无从下手,但通过
认真研究设计课题,找书上网查资料买元件,确定基本设计方案,对所用芯片功能进行查找、调试,本设计用2个四位一体的共阳数码管做为显示器,它显示时间值;设计中有三个按键,其中S1为启动/选择调整位置,S2为加控制键 S3为减控制键,当整点时间到时,蜂鸣器报警。这样的结果与设计要求完全相符,本设计成功。完成了设计任务。
然后画电路图制PCB板、打孔、溶铜、焊接等,真的经历了许多困难,却积累了很多宝贵的经验,
4.2 设计课题的仿真结果
在Proteus ISIS的Debug菜单中选择Execute,运行程序,系统仿真结果如图4.1与4.2所示。实现功能:
可调整运行的电子钟具有三种工作状态:“P.”状态、运行状态、调整状态。 (1)、“P.”状态,依靠上电或按复位键进入,在此状态下,按S2、S3键均无效,
按S1键有效,进入运行状态; 行状态,进入调整状态;
(3)、调整状态,按S1键进入时、分、秒的闪烁,在此状态下,按S2(+1键)、
S3(-1键)键均有效;调整结束后必须按S1键,即可退出调整状态,进入 运行状态。在调整状态时长按S2、S3时可以连加及连减。 时间显示格式为:时-分-秒;
(2)、运行状态,在此状态下,按S2、S3键均无效,只有按S1键有效,按下S1键后,退出运
图7 “P.”运行状态仿真
图8 时钟运行状态仿真
4.3 设计课题的误差分析
该电子钟在运行中存在一定的误差,误差产生有三种可能,首先是采用的计时方案是软件计时
的,计时优势利用中断来实现。而当电子钟运行时间1秒时,又得去执行中断程序,这个过程是需影响。第三,设计用到11.0592MHz的晶振,计算是满20次为一秒钟,但实际会慢很多。
要时间的,所以就产生了一定的误差,当然这个误差是避免不了的,其次还有硬件系统也有一定的
4.4 设计体会
本次课程设计,让我受益匪浅,认识到了自己的许多缺点和不足,使我深深的感受到了理论联
系实际的必要性及其重要性。在我们以往的学习过程中,我们刻意地去加强理论的基础,对于一个
程序我们只求它在运行时没有出错,我们便以为我们的计划成功了岂不知它能否在硬件结构中得以好的程序也只是一堆废字符。
实现则是另外一回事,这就要求我们的动手能力,如果无法使软件与硬件实现有机的结合,那么再
4.5 教学建议
经过一个学期王韧老师教导的的单片机学习,我掌握了很多单片机学习的宝贵经验,尤其在编
程的思路和PCB实物的制作上面。编程思路是整个程序的灵魂,没有编程思路,程序就不会编出来,畅,程序的质量才会提高。
就失去了编程的意义。在开始编程之前,想好编程的思路,编程能力才会提高,编程的过程才会顺
在王韧老师的教学过程中,幽默轻松的教学方式常常让课堂气氛很活跃,幽默诙谐,授课内容
条理清晰,经常运用各种实例,娓娓道来,给人印象深刻。王老师在课堂上也十分注重和同学们的分做到了理论与实际的结合,既形象生动,又丰富有趣。
结合自己课堂的学习和单片机学习效果总结几点教学建议希望老师接纳: 每一位学生都要合格,但不必是相同的规格; (2)、不能错过学生的“过错”;
(3)、学生不会说的,您鼓励他说;学生说不准的,您引导他说。
互动,经常会用一些亲身实践的经验为例,让同学们在基于事实的基础上更好的理解相关理论,充
(1)、每一位学生都要发展,但不必求一样的发展;每一位学生都要提高,但不必是同步的提高;
参考文献
[1] 李广弟.单片机基础[M],北京航空航天大学出版社,2006.7.
Li Guangdi. Microcontroller based on [M], Beijing Aerospace University Press, 2006.7.
致 谢
通过不断努力,终于完成了此次单片机的课程设计。在此,首先感谢王韧老师,正是他在万忙
之中还抽出宝贵的时间对我们进行精心的指导,才使我顺利完成了此次单片机课程设计。同时也感地感谢你们!
谢各位同学和老师对我提供的帮助。使我在此次设计中学到了许多宝贵的知识和经验。在此,衷心
附 录 A
电路原理图
附 录 B
图9 PCB顶层图
图10
图10 PCB底层图
附 录 C
图11 元器件布局图