资源描述
. . .
基于AT89S51单片机的扩展时钟系统设计
摘 要:随着人类科技文明的发展,人们对于时钟的要求在不断地提高,时钟已不仅仅被看成一种来显示时间的工具。在很多实际应用中它还需要能够实现更多其他的功能。时钟的数字化、多功能化已经成为现代时钟生产研究的主导设计方向。本文正式基于这种方向,以AT89S51单片机为核心,结合新型时钟芯片DS12887,并利用液晶LCD1602显示数字时钟。
关键字:AT89S51单片机;时钟芯片DS12887;液晶LCD1602
Abstract:With the development of the technological society,requirements for clock is constantly improving,the clock has not only been seen as a time to show tools.It also needs to be able to achieve more in many practical applications.Digital clock, multi-functional modern clock production has become the dominant design direction.In this paper, formally based on this direction,AT89S51 microcontroller as the core,Combined with the new clock chip DS12887,And LCD1602 LCD display digital clock。
Key words:AT89S51 microcontroller;Time clock DS12887;LCD1602
1 引言
数字时钟已经成为人们日常生活中必不可少的必需品,广泛应用于个人家庭以与办公室公共场所,给人们的生活、学习、工作、娱乐带来了极方便。由于数字集成电路技术的发展和采用了新进的石英技术,是数字钟具有走时准确、性能稳定、携带方便等优点。它还用于计时、自动报时等各个领域。尽管目前市场上已有现成的数字集成电路芯片出售,价格便宜,使用也方便,但鉴于单片机的定时器功能也可以完成数字中电路的设计,因此进行数字钟的设计是必要的。在这里我将以学过的比较零散的电路知识有机的、系统的结合起来用于实际,来培养我们的综合分析和设计电路,写程序、调试电路的能力。
文中详细论述了以89S51单片机位核心,应用新型时钟芯片DS12887的数字时钟设计原理以与使用的各种芯片的介绍,阐明了本实例所使用的设计方案、详细的电路图以与程序代码。
2 总体设计
本次设计的题目是单片机控制时钟芯片DS12887的时分秒定时系统设计,可以正常的显示年、月、日、时、分、秒。程序第一次运行后,初始化时间显示为00:00:00,即6位数码管显示为00.00.00。通过键盘[MON]设定小时为00,通过键盘[LAST]设定分钟为34,通过键盘[NEXT]设定秒为52,为00:34:52.两分钟后即在00..52时关掉电源,等待2分钟后再打开电源,这时时间应为00.36.52,
本设计总体大致分为两部分:硬件部分、软件部分。硬件部分包括:89S51单片机、DS12887时钟芯片、1602LCD液晶显示器。主要由89S51单片机、实时时钟芯片电路、液晶显示输出电路、键盘输入电路组成等几大部分组成。软件部分包括了主程序模块,DS12C887模块,LCD1602模块,按键控制模块。
本设计是以89S51单片机为核心,结合新型实时时钟芯片DS12887,并利用液晶LCD1602显示的数字时钟。在液晶上显示、时、分、秒等信息。因为DS12887本身的特点,本设计还具有掉电后继续计时的功能。另外,它的计时周期为24小时,采用24小时制的计时方式,显示满刻度为23时59分59秒,这也是DS12887的计时围。本设计的数字时钟,可以通过按键来设置时间,也可以通过按键来设置闹钟的时间,不过与设置正常时间相比,仅限于设置时、分、秒。每按一次按键,蜂鸣器就会发出很短的滴声,当达到设定的时间时,数字时钟会也发出声音,来提醒使用者时间到了。以上是本设计的大致功能和简介。总设计如图1所示
图1 接线图
3 系统硬件组成
3.1 芯片的选择
经多种单片机性能的分析与现有实验设备的限制,在本设计中单片机芯片采用了AT89S51单片机芯片。AT89S51是美国ATMEL公司生产的低功耗,高性能CMOS8位单片机片含4K bytes的可系统编程的Flash只读程序储存器。器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准80C51指令系统与引脚。它集Flash程序存储器既可在线编程也可用传统方法进行编程既通用8位微处理器于单片机芯片中,ATMEL公司的功能强大,低价位AT89S51单片机可提供许多高性价比的应用场合, 可灵活应用于各种控制领域。
3.2 AT89S51单片机的硬件组成
AT89S51是一个低功耗,高性能CMOS8位单片机,片含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统与89S51引脚结构,芯片集成了通用8位中央处理器和ISP Flash存储单元,AT89S51在众多嵌入式控制应用系统中得到广泛应用。如图2所示
(1)8位微处理器(CPU);
(2)数据存储器(128B RAM);
(3)程序存储器(4KB Flash ROM);
(4)4个8位可编程并行I/O口;
(5)1个全双工的异步串行口;
(6)2个可编程的16位定时器/计数器;
(7)1个看门狗定时器;
(8)中断系统具有5个中断源、5个中断向量;
(9)特殊功能寄存器(SFR)26个。
图2 AT89S51引脚图
AT89S51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。AT89S51是一种带K字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89S51是一种高效微控制器,AT89S1是它的一种精简版本。AT89S51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
3.3 电源与时钟引脚
3.3.1 电源引脚
(1)VCC(40脚):+5V电源。
(2)VSS(20脚):数字地。
3.3.2 时钟引脚
(1)XTAL1(19脚):片振荡器反相放大器和时钟发生器电路输入端。用片振荡器时,该脚接外部石英晶体和微调电容。外接时钟源时,该脚接外部时钟振荡器的信号。
(2) XTAL2(18脚):片振荡器反相放大器的输出端。当使用片振荡器,该脚连接外部石英晶体和微调电容。当使用外部时钟源时,本脚悬空。
3.3.3并行I/O口
(1)P0口:8位,漏极开路的双向I/O口
当外扩存储器与I/O接口芯片时,P0口作为低8位地址总线与数据总线的分时复用端口。
P0口也可用作通用的I/O口,需加上拉电阻,这时为准双向口。作为通用I/O输入,应先向端口写入1。可驱动8个LS型TTL负载。
(2)P1口:8位,准双向I/O口,具有部上拉电阻。
准双向I/O口,作为通用I/O输入时,应先向端口锁存器写1。
P1口可驱动4个LS型TTL负载。
P1.5/MOSI、P1.6/MISO和P1.7/SCK
可用于对片Flash存储器串行编程和校验,它们分别是串行数据输入、输出和移位脉冲引脚。
(3)P2口:8位,准双向I/O口,具有部上拉电阻。
当AT89S51扩展外部存储器与I/O口时,P2口作为高8位地址总线用,输出高8位地址。P2口也可作为普通的I/O口使用。当作为通用I/O输入时,应先向端口输出锁存器写1。P2口可驱动4个LS型TTL负载。
(4) P3口:8位,准双向I/O口,具有部上拉电阻。可作为通用的I/O口使用。作为通用I/O输入,应先向端口输出锁存器写入1。可驱动4个LS型TTL负载。P3口还可提供第二功能。第二功能定义见图3-3,应熟记。
综上所述,P0口可作为总线口,为双向口。作为通用的I/O口使用时,为准双向口,这时需加上拉电阻。P1口、P2口、P3口均为准双向口。P3口如图3,
图3 P3口引脚图
3.4 时钟芯片DS12887
DS12887是美国DALLAS半导体公司最新推出的8位串行接口并自带RAM的实时日历时钟芯片,部有14个时钟控制寄存器,包括10个时标寄存器,4个状态寄存器和114 bit作掉电保护用的低功耗RAM。CPU通过读DS12887的部时标寄存器得到当前的时间和日历,也可通过选择二进制或BCD码初始化芯片的10个时标寄存器,其4个状态寄存器用来控制和指出DS12887的当前工作状态,114 bit非易失性静态RAM可在掉电时保存一些重要数据。 DS12887功能强大,应用广泛。DS12887引脚分布图和存储器分布图:
图4 引脚分布图和存储器分布
通过对寄存器A、B、C、D的编程可以控制 DS12887的工作方式:
寄存器A
当 UIP 位为0时指示更新在244μS不会发生;当DV2DV1DV0其为010时,打开晶振,并允许时钟开始计时;RS3 RS2 RS1 RS0用于选择周期中断或输出方波的频率,当其分别为0111、1000、1001、1011、1100、1101、当其分别为0111、1000、1001、1011、1100、1101、1110、1111时,对应频率为512Hz、256Hz、128Hz、64Hz、32Hz、16Hz、8Hz、4Hz、2Hz。
SET位为0时,每秒计数一次,置1后,更新转换被禁止;当PIE、AIE、UIE位为1时,分别允许周期中断、报警中断和时钟数据更新结束中断,为0时,禁止中断产生;SQWE位为1时,按以寄存器A中由RS3 RS2 RS1 RS0选定的频率从SQW引脚输出方波,为0时,SQW为低电平;当DM为1时选用二进制数据格式,反之为BCD数据格式;12/24位为1时,指定24小时时间格式,否则为12小时时间格式;DSE为1时允许夏时制发生。
寄存器 C的容是周期中断标志位PF、报警中断标志位AF、更新结束中断标志位UF和中断请求标志位IRQF,它们之间的关系为IRQF=PF*PIE+AF*AIE+UF*UIE,只要IRQF为1,/IRQ引脚输出就保持低电平,读寄存器C将清除所有标志器 C的容是周期中断标志位PF、报警中断标志位AF、更新结束中断标志位UF和中断请求标志位IRQF,它们之间的关系为IRQF=PF*PIE+AF*AIE+UF*UIE,只要IRQF为1,/IRQ引脚输出就保持低电平,读寄存器C将清除所有标志。
寄存器 D中仅D7有定义,读时应若寄存器 D中仅D7有定义,读时应总为1,若为0则说明部锂电池已耗尽。 为防止锂电池在芯片装入系统前被耗尽,DS12887在出厂时先关掉了其部的晶振,编程时必须首先给寄存器A的DV2DV1DV0位写入010以打开晶振,然后,读寄存器D以检查部锂电池是否有效;接着根据需要对寄存器A、B进行设置。当需要修改日历时钟时,必须先使SET位置1,当需要读日历时钟数据时,必须先查询寄存器A中的UIP位,只有当其为0时,才能进行读取数据。
CPU通过读DS12887的部时标寄存器得到当前的时间和日历,也可通过选择二进制码或BCD码初始化芯片的10个时标寄存器。其114bit非易失性静态RAM可供用户使用,对于没有RAM的单片机应用系统,可在主机掉电时来保存一些重要的数据。DS12887的4个状态寄存器用来控制和指出DS12887模块的当前工作状态,除数据更新周期外,程序可随时读写这4个寄存器。
3.5 液晶LCD1602
1602液晶显示模块,是点阵字符型液晶显示模块,可以用来显示字母,符号,数字以与简单的汉字和图案等信息。“1602”的含义是这类液晶显示模块每行能够显示16个字符,一共可以显示两行。该液晶显示模块,分为带背光和不带背光两类,两者在应用过程中功能基本类似,只是带背光的模块更厚一些,通常的背光颜色以黄绿色和蓝色为主。
4 软件系统设计
4.1 程序流程图
在这个设计中,89S51主要功能是存储程序、根据程序的容对各个端口进行判断并做出相应的处理;DS12887主要的功能是控制时、分、秒的显示LCD1602主要的功能是将所要显示的显示出来。主程序主要实现了从DS12887各时间单元中读出数据并送到LCD1602中显示的功能,同时检测有没有按键按下,如果有键被按下,则执行按键处理子程序。首先进行DS12887时钟芯片和LCD1602的初始化函数,然后进行按键扫描,不断地检测按键是否按下,读取DS12887时钟芯片的数据,并且送到液晶显示器显示;当数据发生变化时候,重新进行扫描写入。流程图如图5所示,
图5 程序流程图
5 调试结果(如图6-1和6-2)
图6-1
程序第一次运行后,初始化时间显示为00:00:00,即6位数码管显示为00.00.00。通过键盘[MON]设定小时为00,通过键盘[LAST]设定分钟为34,通过键盘[NEXT]设定秒为52,为00:36:52两分钟后即在00..52时关掉电源,等待2分钟后再打开电源,这时时间应为00.36.52,
图6-2
6 小结
通过这次课程设计,我对单片机的应用有了更深的认识。同时,也初步掌握了通过芯片资料所给出的各种信息,应用该芯片的能力。我在设计过程中,学会了总线的应用以与标号规则。这是一个很大收获,可以在以后的应用中简化电路,在以后的实际工作和学习中带来很大的便利。通过这次设计,我对LCD1602有了进一步的了解和认识,对它的应用更加熟练。虽然在这次设计中没有用到该功能。
在这次设计中我要感我的指导老师牟琳,是在牟琳老师的帮助下我才能顺利的完成该设计。对此我表示深深的诚挚的意和崇高的敬意。
参考文献:
[1] 何立民.单片机应用技术选编[M]. :航空航天大学,1993.
[2] 毅刚. 单片机原理与应用[M]. :高等教育,2004.
[3] 郭天祥.新概念51单片机C语言教程[M]:入门、提高、开发、拓展全攻略.电子工业,2009.
[4] 莫树.培夏.基于DS12887的时钟设计[M].科技创新导报,2011.
[5] 佳玲.基于单片机的多功能数字时钟系统设计[M].工程技术师学院学报,2009.
[6] 大有.单片机应用与设计[M].电子工业大学,1998年.
[7] 钟睿.MCS-51 单片机原理与应用开发技术[M].:中国铁道,2006.
[8]王幸之.AT89系列单片机原理与接口技术[M].:航空航天大学,2004.
附件
程序代码
;按“NEXT”键,调整秒位;按“LAST”键,调整分位;按"MON"键,调整时位;
OUTBIT equ 0e101h ; 位控制口
CLK164 equ 0e102h ; 段控制口(接164时钟位)
DAT164 equ 0e102h ; 段控制口(接164数据位)
IN equ 0e103h ; 键盘读入口
LEDBuf equ 60h ; 显示缓冲
ljmp Start
LEDMAP: ; 八段管显示码
db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h
db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h
db 00H
Delay: ; 延时子程序
mov r7, #00
DelayLoop:
djnz r7, DelayLoop
djnz r6, Delay
ret
DisplayLED:
mov r0, #LEDBuf
mov r1, #6 ; 共6个八段管
mov r2, #00000001b ; 从左边开始显示
Loop:
mov dptr, #OUTBIT
mov a, #0
movx dptr, a ; 关所有八段管
mov a, r0
mov B, #8 ; 送164
DLP:
rlc a
mov r3, a
mov acc.0, c
mov dptr, #DAT164
anl a,#0fdh
movx dptr, a
mov dptr, #CLK164
orl a,#02h
movx dptr, a
anl a,#0fdh
movx dptr, a
mov a, r3
djnz B, DLP
mov dptr, #OUTBIT
mov a, r2
movx dptr, a ; 显示一位八段管
mov r6, #1
call Delay
mov a, r2 ; 显示下一位
rl a
mov r2, a
inc r0
djnz r1, Loop
ret
TestKey:
mov dptr, #OUTBIT
mov a, #0
movx dptr, a ; 输出线置为0
mov dptr, #IN
movx a, dptr ; 读入键状态
cpl a
anl a, #0fh ; 高四位不用
ret
KeyTable: ; 数字键码定义
db 00h, 01h, 04h, 07h
db 0fh, 02h, 05h, 08h
db 0eh, 03h, 06h, 09h
db 0dh, 0ch, 0bh, 0ah
db 10H,11H,12H,13H,14H
db 15H,16H,10H,10H,10H
GetKey:
mov dptr, #OUTBIT
mov P2, dph
mov r0, #Low(IN)
mov r1, #00100000b
mov r2, #6
KLoop:
mov a, r1 ; 找出键所在列
cpl a
movx dptr, a
cpl a
rr a
mov r1, a ; 下一列
movx a, r0
cpl a
anl a, #0fh
jnz Goon1 ; 该列有键入
djnz r2, KLoop
mov r2, #0ffh ; 没有键按下, 返回 0ffh
sjmp Exit
Goon1:
mov r1, a ; 键值 = 列 X 4 + 行
mov a, r2
dec a
rl a
rl a
mov r2, a ; r2 = (r2-1)*4
mov a, r1 ; r1中为读入的行值
mov r1, #4
LoopC:
rrc a ; 移位找出所在行
jc Exit
inc r2 ; r2 = r2+ 行值
djnz r1, LoopC
Exit:
mov a, r2 ; 取出键码
mov dptr, #KeyTable
movc a, a+dptr
mov r2, a
WaitRelease:
mov dptr, #OUTBIT ; 等键释放
clr a
movx dptr, a
mov r6, #10
call Delay
call TestKey
jnz WaitRelease
mov a, r2
ret
Start:
mov r6,#02h
call delay
mov 20h,#00h
mov 21h,#00h
mov 22h,#00h
mov sp, #40h
mov dptr,#0e100h
mov a,#03h
movx dptr,a
Start1:mov dptr,#0fe0ah
movx a,dptr
anl a,#70h
cjne a,#20h,start2 ;判断晶振打开否?
sjmp start3
start2:
mov dptr,#0fe0bh ;设置SET=0,芯片正常工作.24/12=1,选24小时制.
mov a,#82h
movx dptr,a
mov r0,#06h
mov dptr,#0fe00h ;;时分秒清零
mov a,#00h
retun0:movx dptr,a
inc dptr
djnz r0,retun0
mov dptr,#0fe0ah
mov a,#27h
movx dptr,a ;打开晶振,SQW输出512HZ方波。
inc dptr
mov a,#5ah
movx dptr,a
start3:
mov dptr,#0fe0ah
movx a,dptr
jnb acc.7,loop12
mov r5,#4dh
djnz r5,$
loop12:mov dptr,#0fe0bh
mov a,#5ah
movx dptr,a
loop13:mov dptr,#0fe00h ;读秒,分,时
mov r1,#60h
mov r0,#03h
loop11:movx a,dptr
lcall Ptreg ;读取的值,进行拆字后送显示缓冲器60H-65H
inc dptr
inc dptr
djnz r0,loop11
mov dptr,#0fe0bh
call DisplayLED ; 调用显示子程序
call TestKey ; 有键入?
jz loop12 ; 无键入, 继续显示
call GetKey ; 有键入,读入键码
cjne a,#14h,keep0
sjmp keep1 ;是NEXT键,调整秒位
keep0: cjne a,#15h,keep2
sjmp keep3 ;是LAST键,调整分位
keep2: cjne a,#16h,start1
sjmp keep5 ;是MON键,调整时位
keep1: mov dptr,#0fe0bh
mov a,#0dah
movx dptr,a
mov a,20h
lcall Hbcd
cjne a,#60h,loop20 ;秒位不能超过60秒
mov 20h,#00h
sjmp loop13
loop20:mov dptr,#0fe00h
movx dptr,a
inc 20h
sjmp loop13
keep3: mov dptr,#0fe0bh
mov a,#0dah
movx dptr,a
mov a,21h
lcall Hbcd
cjne a,#60h,loop21 ;分位不能超过60分
mov 21h,#00h
sjmp loop13
loop21:mov dptr,#0fe02h
movx dptr,a
inc 21h
sjmp loop13
keep5: mov dptr,#0fe0bh
mov a,#0dah
movx dptr,a
mov a,22h
lcall Hbcd
cjne a,#24h,loop22 ;时位不能超过24小时
mov 22h,#00h
sjmp loop13
loop22:mov dptr,#0fe04h
movx dptr,a
inc 22h
sjmp loop13
Ptreg: push dph ;拆字子程序
push dpl
push acc
push b
mov b,a
anl a,#0fh
mov dptr,#LEDMAP
movc a,a+dptr
orl a,#80h
mov r1,a
inc r1
mov a,b
swap a
anl a,#0fh
mov dptr,#LEDMAP
movc a,a+dptr
mov r1,a
inc r1
pop b
pop acc
pop dpl
pop dph
ret
Hbcd: mov b,#100 ;单字节十六进制整数转换成单字节BCD码子程序
div ab
mov r3,a
mov a,b
mov b,#10
div ab
swap a
orl a,b
ret
END
22 / 22
展开阅读全文