基于单片机的自动报时系统.docx
《基于单片机的自动报时系统.docx》由会员分享,可在线阅读,更多相关《基于单片机的自动报时系统.docx(30页珍藏版)》请在冰豆网上搜索。
基于单片机的自动报时系统
摘 要
随着电子技术的迅速发展,特别是随大规模集成电路出现,给人类生活带来了根本性的改变。
由其是单片机技术的应用产品已经走进了千家万户。
电子万年历的出现给人们的生活带来的诸多方便。
我所设计的是一个自动报时系统,自动报时系统用到的单片机芯片是AT89C51芯片,除此之外还包括:
DS1302芯片、晶振电路和复位电路构成单片机最小应用系统,还有独立式按键电路,动态显示电路等等。
它不仅能实现数字电子时钟的各种功能,如具有较时、调时、定时、闹钟等功能,而且还能实现定点报时的功能。
实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。
本设计还附加了定点报时的功能,从而进一步完成了自动报时系统的设计。
关键词:
单片机,闹铃时钟,位码,段码,显示
目 录
1总体方案设计
1.1系统框图
我所设计的是一个自动报时系统,它不仅具有数字电子时钟的各种功能,如具有较时、调时、定时、闹钟等功能,而且还具有驱动电铃,定点报时等功能。
总体设计框图如图1.1所示:
图1.1系统框图
1.2设计方案介绍
1.2.1硬件的选择方案
由于我设计的是一个自动报时系统,它需要准确的走时、较时、调时、定时、定点报时等,因此我选用的是AT89C51单片机芯片,再配以DS1302、按键电路、晶振电路、复位电路以及LED动态显示器,就可以实现。
采用AT89C51的P0接口外接8路反相三态缓冲器74LS240作LED动态扫描的段码控制驱动信号,用P2接口的P2.0-P2.5外接一片集电极开路反相门电路7406做为6位LED的位选信号驱动口,6个数码管的8根段选线分别接74LS240的输出,LED共阴极端与74LS07的输出端相连;按键接口,由P1.7、P1.6、P1.5、P1.4来完成,四个按键的作用分别是:
一个为功能键K1;一个为数字调整键K2;一个为取消设置键K3,用来设置时间;一个为K4键,用来设置定时时间。
DS1302实时时钟由P1.0、P1.1、P1.2来控制。
DAS1302的X1、X2接口用来接蜂鸣器。
1.2.2软件的设计方案
由于我考虑到用单片机的汇编语言来做《自动报时系统》的设计比较简单。
对于程序我的设计思路是:
1.要有主程序,主程序一般是显示和中断的初始化。
2.要有显示子程序,当键入一个时间值时显示程序要把这个键入的时间值给显示出来。
2.要有中断服务程序,功能,走时,判断是否到定时时间等等。
3.要有按键程序,进入按键程序,判断是否有键按下,没有,则调用延时重新判断,如果到了,调用延时去抖程序,再次判断有键按下否,没有则返回延时程序,如果有按键,则判断键号,堆栈,判断键是否释放,没有,继续判断,释放了,则输入键号送往累加器。
2硬件设计
2.1单片机的选型
我的设计里用到的单片机芯片是AT89C51芯片,除此之外还包括:
DS1302芯片、晶振电路和复位电路构成单片机最小应用系统。
2.2AT89C51的特点
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能、CMOS、8位单片机。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
AT89C51的管脚图如图2.1所示:
图2.1AT89C51管脚图
主要特性:
1、与MCS-51兼容
2、4K字节可编程闪烁存储器
3、寿命:
1000写/擦循环
4、数据保留时间:
10年
5、全静态工作:
0Hz-24Hz
6、三级程序存储器锁定
7、128*8位内部RAM
8、32可编程I/O线
9、两个16位定时器/计数器
10、5个中断源
11、可编程串行通道
12、片内振荡器和时钟电路
2.3AT89C51单片机复位方式
单片机在开机时或在工作中因干扰而使程序失控,或工作中程序处于某种死循环状态,在这种情况下都需要复位。
复位的作用是使中央处理器CPU以及其他功能部件都恢复到一个确定的初始状态,并从这个状态重新开始工作。
AT89C51单片机的复位靠外部电路实现,信号由RESET(RST)引脚输入,高电平有效,在振荡器工作时,只要保持RST引脚高电平两个机器周期,单片机即复位。
复位后,PC程序计数器的内容为0000H,片内RAM中内容不变。
复位电路一般有上电复位、手动开关复位和自动复位电路3种,如图2.2所示。
而本设计采用的是手动复位方式,如B图所示:
a上电复位电路b手动复位电路c自动复位电路
图2.2单片机复位电路
2.4DS1302的简介
2.4.1简介
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。
实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。
工作电压宽达2.5~5.5V。
采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。
DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。
DS1302串行时钟芯片主要是由移位寄存器、控制逻辑、振荡器、实时时钟、RAM以及电源组成,它的电路工作原理图如下图2.3所示:
图2.3DS1302的内部结构
在本设计中,它的I/O引脚、串行时钟SCLK引脚、CE引脚分别与AT89C51的I/O接口的P1.1口、P1.2口、P1.0口相接,X1、X2接口接蜂鸣器。
2.4.2DS1302的特点
DS1302时钟芯片包括:
(1)实时时钟/日历:
实时时钟/日历提供秒、分、时、日、星期、月、年等信息,每月天数以及闰年能自动调整,时钟可以采用24h或AM/PM的12h格式。
(2)31字节的静态RAM:
用于存放数据。
(3)带慢速充电控制备份电源的充电特性。
(4)简单的三线串行接口:
该芯片使用同步串行通信。
与时钟/RAM通信共需3根线:
RST(复位)、I/O(数据线)、SCLK(串行时钟)。
数据可以以每次1个字节或多个字节的形式传送到时钟/RAM或从其读出。
2.4.3各管脚描述
管脚描述如下
X1X232.768KHz晶振管脚
GND地
RST复位脚
I/O数据输入/输出引脚
SCLK串行时钟
Vcc1,Vcc2电源供电管脚
订单信息
部分#描述
DS1302串行时钟芯片8脚DIP
DS1302S串行时钟芯片8脚SOIC200mil
DS1302Z串行时钟芯片8脚SOIC150mil
2.DS1302内部寄存器
CH:
时钟停止位寄存器2的第7位12/24小时标志
CH=0振荡器工作允许bit7=1,12小时模式
CH=1振荡器停止bit7=0,24小时模式
WP:
写保护位寄存器2的第5位:
AM/PM定义
WP=0寄存器数据能够写入AP=1下午模式
WP=1寄存器数据不能写入AP=0上午模式
TCS:
涓流充电选择DS:
二极管选择位
TCS=1010使能涓流充电DS=01选择一个二极管
TCS=其它禁止涓流充电DS=10选择两个二极管
DS=00或11,即使TCS=1010,充电功能也被禁止
RS位电阻典型位
00没有没有
01R12K
10R24K
11R38K
2.4.4DS1302读写时序说明
DS1302是SPI总线驱动方式。
它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。
要想与DS1302通信,首先要先了解DS1302的控制字。
DS1302的控制字如表2.1所示:
表2.1控制字(即地址及命令字节)
控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。
位6:
如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;
位5至位1(A4~A0):
指示操作单元的地址;
位0(最低有效位):
如为0,表示要进行写操作,为1表示进行读操作。
图2.4数据读写时序
控制字总是从最低位开始输出。
在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。
同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。
数据读写时序如图2.4。
2.5键盘方案
本设计的自动报时系统是一个具有电子时钟、闹钟、定点报时功能的系统,系统工作时应具备随时对当前时间进行调整,因此它只需要独立式键盘的四个按键即可完成操作。
独立式键盘的接口电路:
在单片机应用系统中,有时只需要几个简单的按键向系统输入信息。
这时,可将每个按键直接接在一根I/O接口线上,这种连接方式的键盘称为独立式键盘。
如图2.5所示,每个独立按键单独占有一根I/O接口线,每根I/O接口线的工作状态不会影响到其他I/O接口线。
这种按键接口电路配置灵活,硬件结构简单,但每个按键必须占用一根I/O线,I/O接口线浪费较大。
故只在按键数量不多时采用这种按键电路。
在此电路中,按键输入都采用低电平有效。
上拉电阻保证了按键断开时,I/O接口线有确定的高电平。
当I/O接口内部有上拉电阻时,外电路可以不配置上拉电阻。
本设计中个按键的功能为:
一个为功能键K1;一个为数字调整键K2;一个为取消设置键K3,用来设置时间;一个为K4键,用来设置定时时间。
图2.5独立式键盘电路
2.5.1键盘接口工作原理
在单片机应用系统中,常用键盘作为输入设备,通过它将数据、内存地址、命令及指令等输入到系统中,来实现简单的人机通信。
2.5.2按键开关的去除抖动功能
目前,AT89C51单片机应用系统上的按键常采用机械触点式按键,它在断开、闭合时输入电压波形如图2.6所示.可以看出机械触点在闭合及断开瞬间均有抖动过程,时间长短与开关的机械特性有关,一般为5~10ms。
由于抖动,会造成被查询的开关状态无法准确读出。
例如,一次按键产生的正确开关状态,由于键的抖动,CPU多次采集到底电平信号,会被误认为按键被多次按下,就会多次进行键输入操作,这是不允许的。
为了保证CPU对键的一次闭合仅在按键稳定时作一次键输入处理,必须消除产生的前沿(后沿)抖动影响。
在本次设计中采用的是软件去抖。
图2.6按键过程
2.6七段LED显示工作原理
2.6.1显示的种类
1静态显示概念
静态显示是指数码管显示某一字符时,相应的发光二极管恒定导通或恒定截止。
这种显示方式的各位数码管相互独立,公共端恒定接地(共阴极)或接正电源(共阳极)。
每个数码管的8个字段分别与一个8位I/O口地址相连,I/O口只要有段码输出,相应字符即显示出来,并保持不变,直到I/O口输出新的段码。
采用静态显示方式的优点:
较小的电流即可获得较高的亮度,且占用CPU时间少,编程简单,显示便于监测和控制,但其占用的接口线多,硬件电路复杂,成本高,只适合于显示位数较少的场合。
2动态显示概念
动态显示是一位一位地轮流点亮各位数码管,这种逐位点亮显示器的方式称为位扫描。
通常,各位数码管的段选线相应并联在一起,由一个8位的I/O口控制;各位的位选线(公共阴极或阳极)由另外的I/O口线控制。
动态方式显示时,各数码管分时轮流选通,要使其稳定显示,必须采用扫描方式,即在某一时刻只选通一位数码管,并送出相应的段码,在另一时刻选通另一位数码管,并送出相应的段码。
依此规律循环,即可使各位数码管显示将要显示的字符。
虽然这些字符是在不同的时刻分别显示,但由于人眼存在视觉暂留效应,只要每位显示间隔足够短就可以给人以同时显示的感觉。
采用动态显示方式比较节省I/O口,硬件电路也较静态显示方式简单,但其亮度不如静态显示方式,而且在显示位数较多时,CPU要依次扫描,占用CPU较多的时间。
此次设计中我们采用定时器来完成动态扫描显示。
用定时器T0定2ms的时间间隔,每次定时时间到时就输出一个LED信号,即显示1位。
定时器每中断6次后循环到第一位LED显示。
这样动态显示占用CPU的时间只有输出断码和输出位码的有限时间,提高了CPU的工作效率。
在本次设计中所使用的是动态显示,其显示电路图形如图2.7所示:
图2.7LED动态显示电路
2.6.2数码管简介
1数码管结构
数码管由8个发光二极管(以下简称字段)构成,通过不同的组合可用来显示数字09、字符AF及小数点“·”。
数码管的外形结构如图2.8(a)所示。
数码管又分为共阴极和共阳极两种结构,分别如图2.8(b)和图2.8(c)所示:
(a)外型结构;(b)共阴极;(c)共阳极
图2.8数码管结构图
2数码管工作原理
由于我们采用的是共阴极数码管,所以介绍共阴极数码管的工作原理如下:
共阴极数码管的8个发光二极管的阴极(二极管负端)连接在一起。
通常,公共阴极接低电平(一般接地),其它管脚接段驱动电路输出端。
当某段驱动电路的输出端为高电平时,则该端所连接的字段导通并点亮。
根据发光字段的不同组合可显示出各种数字或字符。
此时,要求段驱动电路能吸收额定的段导通电流,还需根据外接电源及额定段导通电流来确定相应的限流电阻。
共阳极数码管的工作原理与共阴极的正好相反。
3数码管字形编码
要使数码管显示出相应的数字或字符,必须使段数据口输出相应的字形编码。
LED显示字型码表见表2.2:
表2.2LED显示字型码表
显示字符
共阴极
共阳极
显示字符
共阴极
共阳极
0
3FH
C0H
9
6FH
90H
1
06H
F9H
A
77H
88H
2
5BH
A4H
B
7CH
83H
3
4FH
B0H
C
39H
C6H
4
66H
99H
D
5EH
A1H
5
6DH
92H
E
79H
86H
6
7DH
82H
F
71H
8EH
7
07H
F8H
8
7FH
80H
2.7自动报时系统的工作原理及原理图
自动报时系统电路的核心是AT89C51单片机,其内部带有4KB的FlashROM,无须扩展程序存储器;电子时钟没有大量的运算和暂存数据,现有的128B片内RAM已能满足要求,也不必扩展片外RAM。
系统配备6位LED显示和4个单接口键盘,采用P0接口外接8路反相三态缓冲器74LS240作LED动态扫描的段码控制驱动信号,用P2接口的P2.0-P2.5外接一片集电极开路反相门电路7406做为6位LED的位选信号驱动口,6个数码管的8根段选线分别接74LS240的输出,LED共阴极端与74LS07的输出端相连;按键接口,由P1.7、P1.6、P1.5、P1.4来完成;DS1302实时时钟由P1.0、P1.1、P1.2来控制。
DS1302的X1、X2接口外接蜂鸣器。
电路原理图见附录A
3软件设计
3.1设计思路
由于我做的是自动报时系统,它需要具有较时、调时、定时、闹钟等功能,而且还具有驱动电铃,定点报时等功能。
另外当时钟走到24点时则自动清零。
所以我们考虑到用单片机的汇编语言来做我们的设计比较简单。
对于程序我们的设计思路是:
1.要有主程序,主程序一般是显示和中断的初始化。
2.要有显示子程序,当键入一个时间值时显示程序要把这个键入的时间值给显示出来。
2.要有中断服务程序,功能,走时,判断是否到定时时间等等。
3.要有按键程序,进入按键程序,判断是否有键按下,没有,则调用延时重新判断,如果到了,调用延时去抖程序,再次判断有键按下否,没有则返回延时程序,如果有按键,则判断键号,堆栈,判断键是否释放,没有,继续判断,释放了,则输入键号送往累加器。
3.2系统工作流程
1.时钟显示:
6位LED从左到右一次显示时、分、秒,采用24小时计时。
2.按键控制功能:
采用4个独立键盘,其中一个为功能键;一个为数字调整键;一个为取消设置键,用来设置时间;一个为ALM键,用来设置定时时间。
3.时间显示:
通电后,系统自动进入时钟设置,从00:
00:
00开始计时,此时可以设定当前时间。
4.时间调整:
按下功能键,系统停止计时显示,进入时间设定状态,系统只显示小时的内容,其余4位LED处于全暗状态,等待按键设置。
此时按动数字调整键后小时将会加1,按动取消键后又重新回到原来的时间显示状态;若再按动功能键则用来调整分钟,此时小时和秒的4位LED指示全暗,按数字调整键后可以对分钟增1调整,按动取消键后又重新回到原来的时间显示状态;再按动功能键则用来调整秒,此时小时和分钟的4位LED指示全暗,秒显示当前的秒数,暗数字调整键可以对秒进行增1调整,按动取消键后又重新回到原来的时间显示状态,按动功能键后系统将自动由设定后的时间开始计时显示。
5.闹钟设置/启闹:
按下K4键,系统继续计时,但显示为00:
00:
00,此时再按动功能键后进入闹钟设置状态,设置过程和时间调整相同,但是最后按功能键确定后显示定时时间30S后自动启动定时闹钟功能,并恢复时间显示。
定时时间到,蜂鸣器鸣叫1min后自动停闹,每次设置时只能定一次,下次需重新设置。
3.3主程序流程
首先,设置初始常数,设置定时器常数,它主要是显示和中断的初始化。
3.3.1主程序流程图如图3.1所示:
主程序的内容一般包括:
主程序的起始地址,中断服务程序的起始地址,有关内存单元及相关部件的初始化和一些子程序调用等。
图3.1主程序流程图
3.3.2主程序如下:
START:
MOV R0,#70H ;清70H-7AH共11个内存单元
MOV R7,#0BH ;
CLEARDISP:
MOV @R0,#00H ;
INC R0 ;
DJNZ R7,CLEARDISP ;
MOV 20H,#00H ;清20H(标志用)
MOV 7AH,#0AH ;放入"熄灭符"数据
MOVTMOD,#11H ;设T0、T1为16位定时器
MOV TL0,#0B0H ;50MS定时初值(T0计时用)
MOV TH0,#3CH ;50MS定时初值
MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用)
MOV TH1,#3CH ;50MS定时初值
SETB EA ;总中断开放
SETB ET0 ;允许T0中断
SETB TR0 ;开启T0定时器
MOV R4,#14H ;1秒定时用初值(50MS×20)
START1:
LCALLDISPLAY ;调用显示子程序
JNBP3.2,SETMM1 ;P3.7口为0时转时间调整程序
SJMP START1 ;P3.7口为1时跳回START1
SETMM1:
LJMPSETMM ;转到时间调整程序SETMM
3.4按键程序模块
该系统的按键功能如下:
按下功能键,系统停止计时显示,进入时间设定状态,系统只显示小时的内容,其余4位LED处于全暗状态,等待按键设置。
此时按动数字调整键后小时将会加1,按动取消键后又重新回到原来的时间显示状态;若再按动功能键则用来调整分钟,此时小时和秒的4位LED指示全暗,按数字调整键后可以对分钟增1调整,按动取消键后又重新回到原来的时间显示状态;再按动功能键则用来调整秒,此时小时和分钟的4位LED指示全暗,秒显示当前的秒数,暗数字调整键可以对秒进行增1调整,按动取消键后又重新回到原来的时间显示状态,按动功能键后系统将自动由设定后的时间开始计时显示。
进入按键程序,判断有键按下吗?
没有,则调用延时重新判断,如果到了,调用延时去抖程序,再次判断有键按下否,没有则返回延时程序,如果有按键,则判断键号,堆栈,判断键是否释放,没有,继续判断,释放了,则输入键号送往累加器,然后返回主程序。
图3.2按键程序流程图
按键程序如下:
当调时按键按下时进入此程序
SETMM:
cLR ET0 ;关定时器T0中断
CLR TR0 ;关闭定时器T0
LCALL DL1S ;调用1秒延时程序
JB P3.2,CLOSEDIS ;键按下时间小于1秒,关闭显示(省电)
MOV R2,#06H ;进入调时状态,赋闪烁定时初值
SETB ET1 ;允许T1中断
SETB TR1 ;开启定时器T1
SET2:
JNB P3.2,SET1 ;P3.7口为0(键未释放),等待
SETB 00H ;键释放,分调整闪烁标志置1
SET4:
JB P3.2,SET3 ;等待键按下
LCALL DL05S ;有键按下,延时0.5秒
JNB P3.2,SETHH ;按下时间大于0.5秒转调小时状态
MOV R0,#77H ;按下时间小于0.5秒加1分钟操作
LCALLADD1 ;调用加1子程序
MOV A,R3 ;取调整单元数据
CLR C ;清进位标志
CJNE A,#60H,HHH ;调整单元数据与60比较
HHH:
JC SET4 ;调整单元数据小于60转SET4循环
LCALL CLR0 ;调整单元数据大于或等于60时清0
CLR C ;清进位标志
AJMP SET4 ;跳转到SET4循环
CLOSEDIS:
SETB ET0 ;省电(LED不显示)状态。
开T0中断
SETB TR0 ;开启T0定时器(开时钟)
CLOSE:
JB P3.2,CLOSE ;无按键按下,等待
LCALL DISPLAY ;有键按下,调显示子程序延时削抖
JB P3.2,CLOSE ;是干扰返回CLOSE等待
WAITH:
JNB P3.2,WAITH ;等待键释放
LJMP START1 ;返回主程序(LED数据显示亮)
SETHH:
CLR 00H ;分闪烁标志清除(进入调小时状态)
SETHH1:
JNB P3.2,SET5 ;等待键释放
SETB 01H ;小时调整标志置1
SET6:
JBP3.2,SET7 ;等待按键按下
LCALL DL05S ;有键按下延时0.5秒
JNB P3.2,SETOUT ;按下时间大于0.5秒退出时间调整
MOV R0,#79H