基于单片机AT89S51控制的数字时钟课程方案设计书报告.docx
《基于单片机AT89S51控制的数字时钟课程方案设计书报告.docx》由会员分享,可在线阅读,更多相关《基于单片机AT89S51控制的数字时钟课程方案设计书报告.docx(27页珍藏版)》请在冰豆网上搜索。
![基于单片机AT89S51控制的数字时钟课程方案设计书报告.docx](https://file1.bdocx.com/fileroot1/2022-12/16/fa91231e-535f-43ca-beaa-d632b4655504/fa91231e-535f-43ca-beaa-d632b46555041.gif)
基于单片机AT89S51控制的数字时钟课程方案设计书报告
课程设计报告
论文题目基于AT89S51控制的数字时钟
专业班级
学生姓名___
学号___
指导教师______________
宁波技师学院电气技术系
二零一三年九月
摘要
本系统采用MSC-51系列单片机以AT89S51为中心器件来设计多功能数字时钟。
文中详细介绍了51单片机应用中的数据转换显示,数码管显示原理,动态扫描显示原理,单片机的定时中断原理。
该时钟系统能实现时钟日历的功能:
能进行时、分、秒的显示。
也具有日历计算、显示和时钟,日历的校准、定时时间的设定,实现秒表,整点报时等功能
关键词:
AT89S51;74LS245;原理;时钟;单片机
1引言
近年来随着科技的飞速发展,单片机的应用正在不断地走向深入,同时带动传统控制检测日新月异更新.在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,加以完善.
本文通过用对一个能实现定时,日历显示功能的时间系统的设计学习,详细介绍了51单片机应用中的数据转换显示,数码管显示原理,动态扫描显示原理,单片机的定时中断原理、从而达到学习,了解单片机相关指令在各方面的应用。
2总体设计方案
系统AT89S51、LED数码管、按键、电容,电阻,晶震等部分构成,能实现的功能有:
时间显示、日期显示、定时。
左键:
切换更改工程,按一下选择更改时钟秒位,再按为分位、小时位。
小时位置在按则跳出编辑时间功能。
中键:
给当前项进行加1的控制,使当前项在个位加1。
右键:
给当前项进行减1的控制,使当前项在个位减1。
2.1系统总体结构框图
针对于设计思想,做系统的结构框图如下图2-1所示:
图2-1总体方案方框图
3硬件设计
本数字时钟系统的硬件电路主要包括晶振电路、数码显示电路及其它外围电路等。
3.1复位电路【2】[9]
复位电路的基本功能是:
系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。
为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分-合过程中引起的抖动而影响复位。
下图所示的RC复位电路可以实现上述基本功能,Sm为手动复位开关。
图3-0复位电路图
3.2晶振电路[1]
AT89S51中有一个构成内部震荡器的高增益反向放大器,引脚XTAL1和XTAL2分别是放大器的输入端和输出端,这个放大器与作为反馈元件的石英晶体构成自激震荡电路。
外接石英晶体及电容C1,C2接在放大器的反馈回路中构成并联震荡电路。
图3-1晶体震荡电路
3.3数码管原理图[4][8][10]
。
图3-2数码管管脚图
3.3.1AT89S51的管脚说明[2]
图3-3AT89S51管脚图
VCC电源电压.
GND接地.
RST复位输入.当RST变为高电平并保持2个机器周期时,将使单片机复位.WDT溢出将使该引脚输出高电平,设置SFRAUXR的DISRTO位(地址8EH)可打开或关闭该功能.DISKRTO位缺省为RESET输出高电平打开状态.
XTAL1反向振荡放大器的输入及内部时钟工作电路的输入.
XTAL2来自反向振荡放大器的输出.
P0口一组8位漏极开路型双向I/O口.也即地址/数据总线复用口.作为输出口用时,每位能驱动8个TTL逻辑门电路,对端口写"1"可作为高阻抗输入端用.在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻.在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻.
P1口一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路.对端口写"1",通过内部的上拉电阻把端口拉到高电平,此时可作输入口.作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL).Flash编程和程序校验期间,P1接收低8位地址.
P2口一个带内部上拉电阻的8位双向I/O口.P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路.对端口写"1",通过内部的上拉电阻把端口拉到高电平,此时可作输入口.作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL).在访问外部程序存储器或16位地址的外部数据存储器时,P2口送出高8位地址数据.在访问8位地址的外部数据存储器时,P2口线上的内容在整个访问期间不改变.Flash编程和程序校验期间,P2亦接收低8位地址.
P3口一个带内部上拉电阻的8位双向I/O口.P3的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路.对P3口写"1"时,它们被内部的上拉电阻把拉到高电并可作输入端口.作输入端口使用时,被外部拉低的P3口将用上拉电阻输出电流(IIL).P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,如下图所示.P3口还接收一些用于Flash闪速存储器编程和程序校验期间的控制信号.
PSEN/程序储存允许输出是外部程序存储器的读先通信号,当AT89S51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN/有效,即输出两个脉冲.当访问外部数据存储器,没有两次有效的PSEN/信号.
EA/VPP外部访问允许.欲使CPU仅访问外部程序存储器,EA端必须保持低电平,需注意的是:
如果加密位LB1被编程,复位时内部会锁存EA端状态.Flash存储器编程时,该引脚加上+12V的编程电压VPP.
4软件设计
4.1主程序流程图
5制作和调试中的一些问题和解决办法
数字时钟设计刚完成时,我经过检查,发现了一些问题[1][4][7]:
1.刚弄好电路板并烧写程序进去后发现数码管不能正确显示时间,每个数码管中显示的数字几乎一样。
经过询问老师,自己查阅资料,终于找出问题的原因:
由于我在电路中采用的是动态数码管显示,需准确地调整延时子程序DEL1MS。
我在程序中采取的延时时间为1毫秒。
2.复位电路中的开关不能使电路复位到初始状态即12:
00:
00,经过认真检查电路后我发现我是开关的管脚没接对。
测试后重新接下开关的管脚就可以了。
6结论
经过调试之后,我发现我做的基于AT89S51设计的数字时钟,经过调试,一天的时间里面,差不多在1秒,计时是相对准确。
而且该设计的成本不高,硬件电路简单,可以用在对时间精度要求不高的场合.由于时钟电路的重要性,时钟电路在很多应用系统中必不可少,用软件方法可以实现,但误差很大。
在对时间精度要求很高的情况下,通常采用时钟芯片来实现。
典型的时钟芯片有:
DS1302,DS12887,X1203等都可以满足精度要求。
致谢辞
在论文完成之际,谨向关心我、支持我的师长、朋友和亲人表示最衷心的感谢。
首先要感谢我尊敬的指导老师陈弢和唐幼君,本论文的工作得到了陈老师悉心的指导和启发,从论文的选题和具体实现都给予极大的帮助。
唐老师平易近人,我非常感两位老师。
本设计的完成,当然也少不了同学的帮助,感谢他们对我的帮助,没有他们的帮助,设计的任务是不可能这么快顺利完成的。
同时,也要感谢我的爸爸妈妈,感谢他们这么多年来默默地支持着我的学业,我会再接再厉,以更加饱满的热情投入到今后的学习和工作中去。
参考文献:
[1]曹巧媛单片机原理与应用[M].京:
电子工业出版社,2002
[2]何立民MCS-51系列单片机应用系统设计.北京航空航天大学出版社,2000
[3]丁元杰单片微机原理及应用第2版[M].北京机械工业出版社,2001
[4]郁凯平MCS-51单片机串口一口两用在LED显示屏的一例应用《电子与电脑》2008年第1期
[5]陈忠平P89LPC935驱动数码管显示时钟的设计《湖南工业职业技术学院学报》2007年第02期
[6]林成武等MCS-51单片机PO口扩展技术研究.《电子元器件应用》2007年第4期
[7]谢自美《电子线路设计、实验、测试》.华中理工大学出版社,2000
[8]李正浩等51单片机在LED数码管显示中的应用.《实验科学与技术》2006年第z1期
[9]包国宾、张建民单片机复位电路的设计与分析.《光电技术应用》2005年第03期
[10]唐光明基于中断技术的开关软件消抖算法《现代机械》2006年第03期
[11]N.Ambramson,Editor,MultipleAcessCommunication-FoundationofEmergingTecnologies,IEEEPress,1992
附录1C语言程序
附录
ORG0000H
LJMPMAIN。
跳到主程序
ORG0003H
LJMPINT0。
跳到外部中断0
ORG000BH
LJMPT0。
跳到定时器0
ORG0013H
LJMPINT1。
跳到外部中断1
ORG001BH
LJMPT1。
跳到定时器1
ORG0100H
MAIN:
。
主函数
CLRP3.0。
关蜂鸣器
ACALLINITIAL。
调用初始化函数
DONE:
JNB00H,DONE1。
是否显示时间
MOVR0,#73H。
显示时间
ACALLCONVERT。
把时间存储器转化到显示存储器
AJMPTEST。
是否处于调整状态
DONE1:
JNB01H,DONE2。
是否显示日期
MOVR0,#70H。
显示日期
ACALLCONVERT。
转化
AJMPTEST。
是否处于调整状态
DONE2:
JNB02H,DONE3。
是否显示定时时间
MOVR0,#63H。
显示定时时间
ACALLCONVERT。
转化
AJMPTEST。
DONE3:
MOVR0,#60H。
显示秒表
ACALLCONVERT。
转化
LJMPDISP。
跳到显示函数
TEST:
。
判断是否处于调整状态
JNB18H,TEST10。
是否按键已经按下
JNBP3.5,TEST7。
按键是否已经释放
AJMPTEST11
TEST10:
JB16H,TEST8。
判断是否有按键按下
JBP3.5,TEST7
SETB16H
AJMPTEST7
TEST8:
JBP3.5,TEST9
SETB18H
AJMPTEST7
TEST11:
CLR18H
CPL17H
MOVC,17H
MOVP0.0,C
CLR16H
CLR12H。
定时结束
CLRTR1。
关定时器1
CLRP3.0。
关蜂鸣器
CLR13H。
MOV59H,#00H。
MOV58H,#01H
AJMPTEST7
TEST9:
CLR16H
TEST7:
JNB12H,TEST6
JBP3.4,TEST6
CLR12H。
定时结束
CLRTR1。
关定时器1
CLRP3.0。
关蜂鸣器
CLR13H。
MOV59H,#00H。
MOV58H,#01H。
TEST6:
JNB01H,TEST5。
是否处于日期状态
JBP3.4,TEST4。
案键3是否按下
MOV20H,#01H。
返回时间状态
MOV21H,#00H
LJMPDISP
TEST5:
JNB02H,TEST4。
是否处于定时时间状态
JBP3.4,TEST4。
按键3是否按下
MOV20H,#01H。
返回时间状态
MOV21H,#00H
LJMPDISP
TEST4:
JNB15H,DO。
闪烁标志是否有效
LJMPDISP。
无效则进入显示函数
DO:
MOVA,21H。
CJNEA,#00H,TEST2。
是否在调整状态
LJMPDISP。
不处于调整状态则进入显示函数
TEST2:
JBP3.4,TEST3
MOV20H,#01H
MOV21H,#00H
LJMPDISP
TEST3:
JNB08H,DONE4。
是否秒位置处于调整状态
MOV78H,#11。
不显示
MOV79H,#11。
不显示
LJMPDISP。
进入显示函数
DONE4:
JNB09H,DONE5。
是否分位置处于调整状态
MOV7BH,#11。
不显示
MOV7CH,#11。
不显示
LJMPDISP。
进入显示函数
DONE5:
MOV7EH,#11。
时位置不显示
MOV7FH,#11。
时位置不显示
LJMPDISP。
进入主函数
CONVERT:
。
转化成数码管显示所对应的存储器
MOVA,@R0。
把R0存储的地址所对应的存储器的内容转化到秒位置的存储器
MOVB,#10。
DIVAB。
MOV79H,A。
高位存储?
MOV78H,B。
地位存储
INCR0。
地址加一
MOVA,@R0。
取数据
MOVB,#10。
DIVAB。
MOV7CH,A。
高位存储
MOV7BH,B。
低位存储
INCR0。
地址加一
MOVA,@R0。
取数据
MOVB,#10。
DIVAB。
MOV7FH,A。
高位存储
MOV7EH,B。
低位存储
RET
INITIAL:
MOV7FH,#1。
数码管显示12:
00:
00
MOV7EH,#2
MOV7DH,#10
MOV7CH,#0
MOV7BH,#0
MOV7AH,#10
MOV79H,#0
MOV78H,#0
MOV75H,#12。
初始化时间12:
00:
00
MOV74H,#0
MOV73H,#0
MOV72H,#08。
初始化日期08.3.20
MOV71H,#3
MOV70H,#20
MOV65H,#12。
初始化定时时间12:
00:
20
MOV64H,#0
MOV63H,#20
MOV62H,#00。
初始化秒表00:
00.00
MOV61H,#00
MOV60H,#00
MOV50H,#100。
1s定时100*10ms
MOV51H,#20。
200ms闪烁计时
MOV52H,#10。
秒表计数器
MOV53H,#5。
每放一个音时延时5ms
MOV58H,#1。
存放音乐表的指针
MOVTH0,#0D8H。
T0定义为10ms中断
MOVTL0,#0F0H
MOVTMOD,#11H。
定时器工作在方式1
MOVIP,#2。
定时器0高优先级
MOVIE,#8FH。
开中断
SETBIT0。
外部中断为边缘触发
SETBIT1。
外部中断为边缘触发
SETBTR0。
开定时器0
MOV20H,#0。
SETB00H。
设置成处在时间显示状态00H为时间显示标志,01h为日期显示标志,02h为定时时间显示标志,03h秒表显示标志。
08h为秒位置选择标志,09h为分位置选者标志,0ah为时位置选择标志。
10h为秒表开始或暂停标志,11h为,12h为是否正在放音乐标志,13h为是否延时标志,15h为闪烁标志,16h,17h为判断定时按键标志
MOV21H,#0。
位存储器初始化
MOV22H,#0。
SETB17H。
开定时器
SETBP0.0。
开定时器指示灯
RET
DISP:
。
显示函数
MOVR0,#78H。
显示第一个位置
MOVDPTR,#TAB。
MOVR7,#0FEH。
第一位有效
NEXT:
MOVA,@R0。
MOVCA,@A+DPTR。
把十进制数转化成数码管对应的数据
MOVP1,A。
数据送出端口
MOVP2,R7。
地址送出端口
ACALLDEL1MS。
延时一毫秒
MOVA,R7。
RLA。
地址位左移到下一位
MOVR7,A。
INCR0。
数据地址加1
CJNER0,#80H,NEXT。
是否已经显示完
LJMPDONE
TAB:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H,00H
。
0123456789-空
DEL1MS:
。
延时1毫秒函数
MOVR6,#2
DEL1:
MOVR5,#250
DJNZR5,$
DJNZR6,DEL1
RET
T0:
。
定时器0函数
PUSHDPH
PUSHDPL
PUSHPSW
PUSHACC
MOVTH0,#0D8H。
定时时间设置为10毫秒
MOVTL0,#0F0H
DJNZ50H,MIAO1。
是否已经延时1秒
AJMPNEXT5。
MIAO1:
LJMPMIAOBIAO。
一秒还没到,进入秒表
NEXT5:
MOV50H,#100。
重新循环100次,即一秒
INC73H。
秒加一
MOVA,73H。
CJNEA,#60,MIAO2。
是否已经加到60
AJMPNEXT6。
MIAO2:
LJMPMIAOBIAO。
没到60,进入秒表
NEXT6:
MOV73H,#0。
已经加到60,秒清0
INC74H。
分加一
MOVA,74H。
CJNEA,#60,MIAO3。
分是否已经加到60
AJMPNEXT7。
MIAO3:
LJMPMIAOBIAO。
没到60,进入秒表
NEXT7:
MOV74H,#0。
已经到60,分清0
INC75H。
时加1
MOVA,75H。
CJNEA,#24,MIAO4。
是否已加到24
AJMPNEXT8。
MIAO4:
LJMPMIAOBIAO。
没到24则进入秒表
NEXT8:
MOV75H,#0。
时清0
INC70H。
日加1
MOVA,70H。
CJNEA,#29,MONTH。
是否是29
MOVA,71H。
CJNEA,#2,MIAO5。
是否是2月
AJMPNEXT9。
MIAO5:
LJMPMIAOBIAO。
不是2月,进入秒表
NEXT9:
MOV71H,#3。
月份为3
MOV70H,#1。
日为1
LJMPMIAOBIAO。
MONTH:
MOVA,70H。
CJNEA,#31,MONTH1。
是否是日是31
MOVA,71H。
CJNEA,#4,MONTH6。
是否是4月
MOV71H,#5。
。
月份为5
MOV70H,#1。
日为1
AJMPMIAOBIAO。
MONTH6:
MOVA,71H。
CJNEA,#6,MONTH9。
是否是6月
MOV71H,#7。
月份为7
MOV70H,#1。
日为1
AJMPMIAOBIAO。
MONTH9:
MOVA,71H。
CJNEA,#9,MONTH11。
是否是9月
MOV71H,#10。
月分为10
MOV70H,#1。
。
日为1
AJMPMIAOBIAO。
。
MONTH11:
MOVA,71H。
CJNEA,#11,MIAOBIAO。
是否是11月
MOV71H,#12。
月份为12
MOV70H,#1。
日为1
AJMPMIAOBIAO。
MONTH1:
MOVA,70H。
CJNEA,#32,MIAOBIAO。
是否日是32
MOVA,71H。
CJNEA,#12,MONTH0。
是否是12月
INC73H。
年加1
MOV70H,#1。
月为1
MOV71H,#1。
日为1
AJMPMIAOBIAO。
MONTH0:
INC71H。
不是12月,月加1
MOV70H,#1。
日为
AJMPMIAOBIAO。
MIAOBIAO:
。
秒表函数
JNB03H,DINGSHI。
是否进入计时
JNB10H,DINGSHI。
是否开始计时
DJNZ52H,DINGSHI。
是否100毫秒已到
MOV52H,#10。
JNBP3.4,CLEAR。
按键按下时清0
INC60H。
0.1秒位加1
MOVA,60H。
CJNEA,#10,DINGSHI。
是否已加到10
MOV60H,#0。
0.1秒位清0
INC61H。
秒位加1
MOVA,61H。
CJNEA,#60,DINGSHI。
秒是否已经加到60
MOV61H,#0。
秒位清0
INC62H。
分加1
MOVA,62H。
CJNEA,#60,DINGSHI。
是否是60分
MOV62H,#0。
分为清0
AJMPDINGSHI。
CLEAR:
MOV60H,#0。
清0
MOV61H,#0。
MOV62H,#0。
CLR10H。
停止计数
AJMPDINGSHI。
DINGSHI:
。
定时函数
JB17H,YSTART。
定时器有效
LJMPBAOSHI。
定时器无效
YSTART:
JB12H,START。
是否已经在放音乐
MOVA,63H。
CJNEA,73H,BAO1。
是否时已到
AJMPNEXT10。
BAO1:
LJMPBAOSHI。
NEXT10:
MOVA,64H。
CJNEA,74H,BAO2。
是否分已到
AJMPNEXT11。
BAO2:
LJMPBAOSHI。
NEXT11:
MOVA,65H。
CJNEA,75H,BAO3。
是否秒已到
AJMPNEXT12。
BAO3:
LJMPBAOSHI。
NEXT12:
SETB12H。
设置定时已到
MOV55H,#10H。
第一个节拍
MOV57H,#0FBH。
第一个音调高位
MOV56H,#8BH。
第一个音调低位
SETBTR1。
启动定时器1
START:
DJNZ55H,BAO4。
节拍是否已结束
AJMPNEXT13。
BAO4:
LJMPBAOSHI。
NEXT13:
CPL13H。
JB13H,DELAY50MS。
进入延时50毫秒
MOVA,58H。
INCA。
表地址加1
MOV58H,A。
GETNEXT:
MOVDPTR,#DAT。
MOVCA,@A+DPTR。
取音调
CJNEA,#00H,DSQ1。
是否已经结束
CLR12H。
定时结束
CLRTR1。
关定时器1
CLRP3.0。
关蜂鸣器
CLR13H。
MOV59H,#00H。
MOV58H,#01H。
AJMPBAOSHI