实时时钟的设计Word下载.docx
《实时时钟的设计Word下载.docx》由会员分享,可在线阅读,更多相关《实时时钟的设计Word下载.docx(37页珍藏版)》请在冰豆网上搜索。
![实时时钟的设计Word下载.docx](https://file1.bdocx.com/fileroot1/2022-12/7/26c46595-1803-42aa-9afe-6df0f9580da1/26c46595-1803-42aa-9afe-6df0f9580da11.gif)
2.总体方案
2.1模块方案选择:
2.1.1单片机模块
方案一:
使用AT89C51单片机模块。
AT89C51是一种带4K字节FLASH存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)以及128BYTES随机数据存储器的低电压、高性能CMOS8位微处理器。
内置功能强大微型计算机的AT89C51提供了高性价比的解决方案。
方案二:
使用MSP430单片机模块。
MSP430系列单片机是美国德州仪器1996年开始推向市场的一种16位超低功耗、具有精简指令集(RISC)的混合信号处理器(MixedSignalProcessor)。
其具有处理能力强、运算速度快、超低功耗、片内资源丰富等特点,因而在许多单片机领域都得到广泛应用。
AT89C51相对于MSP430虽然存储容量小,功能较为逊色。
但是出于我对AT89C51单片机较为熟悉,而且AT89C51足以满足此次设计任务,因此我选择AT89C51模块。
2.1.2时钟模块
基本门电路搭建。
用基本门电路来实现时钟发生器,电路结构复杂,故障西数大,不易测试
专用时钟芯片。
目前市场上有许多实时时钟芯片。
如DS1302、DS12887、DS1307、X1227等,芯片内都集成了时钟/日历功能,给时钟系统设计带来了很多方便。
DS1302在功耗方面表现非常出色(2.5V~5.5V电源,在2.5V时耗电量小于300Na),且性能稳定,购买方便,因此在时钟模块我决定采用DS1302作为实时时钟芯片。
2.1.3键盘模块
根据设计要求,本次用电脑键盘设定时钟对时钟进行调整。
2.1.4显示模块
采用液晶显示器。
液晶相对于传统的显示器相比,最大的优点在于耗电量和体积,一般的液晶显示器的分辨率可达到720dpi以上。
而且,当要显示的信息量较多时,LCD液晶显示器的优点就会凸显出来。
而且,LCD界面显示相对友好。
采用数码管显示电路。
LED数码管能在低电压,小电流条件下驱动发光管发光,能与CMOS、ITL电路兼容。
具有发光响应时间极短,高频特性好、单色性好,亮度高等优点。
由于此次设计显示信息量较多,而且为了追求更加友好的界面,决定采用LCD液晶显示器。
2.2方案设计
综上,基于界面最友好的原则,此次设计采用51系列的AT89C51作为主控芯片,DS1302作为实时时钟芯片,时钟调整由电脑键盘输入,由LCD液晶显示屏显示时钟信息,系统总体框图如下:
图2.1系统结构图
各组成部分功能、特色如下:
1 DS1302为系统提供精准的秒、分、时、日、月、周、年等信息,单片机能够对其进行写入和读出,计时准确,使用方便。
2 LCD点阵显示屏用来显示时间信息。
3 需要改写的时间信息有电脑键盘输入,改写格式为:
Year-Week-Month-Day-Hour-Minute-Second
每一部分均由两位数构成,如“周五”应输入“05”,7个部分输入完按回车键确定。
4 MCU控制整个系统的运行:
对DS1302进行读来获取时间、将电脑键盘输入的信息写入DS1302内以改写时间、将从DS1302获取的时间信息显示在LCD液晶显示器上。
3.硬件设计
3.1关键器件简介
3.1.1AT89C51简介
AT89C51提供以下标准功能:
4k
字节Flash
闪速存储器,128字节内部RAM,32个I/O口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。
空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。
掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
实物图及引脚排列如下:
图3.1AT89C51实物图
图3.2AT89C51引脚图
3.1.2DS1302实时时钟芯片简介
DS1302时钟内含有一个实时时钟/日历和31字节静态RAM,通过简单
的串行接口与单片机进行通信,实时时钟/日历电路提供年、月、日、星期、
时、分、秒的信息,每月的天数和闰年的天数可自动调整,时钟操作可通过
AM/PM只是决定采用24或12小时格式。
DS1302与单片机之间能简单的采用同步串行的方式进行通信,仅需用到三个口线:
(1)RES(复位、也称为使能位)
(2)I/O(3)SCLK(串行时钟),时钟RAM的读写数据以一个或多达31个字节的字符组方式通信。
RST输入时复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
RST输入由两种功能:
首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;
其次,RST提供终止单字节或多字节数据的传送手段。
当RST为高电平时,则会终止此次数据传送,I/O引脚变为高阻态。
上电运
行时,在Vcc超过2.5V之前,RST必须保持低电平。
只有在SCLK为低电
平时,才能将RST置为高电平。
I/O为串行数据输入输出端,SCLK始终是
输入端。
实物及引脚排列如下:
图3.3DS1302实物图
图3.4DS1302引脚图
3.1.3LCD1602液晶显示器简介
1602液晶是一种工业字符型液晶,能够同时显示16×
02即32个字符(16列2行)。
它是一种专门用来显示字母、数字、符号等的点阵型液晶模块,它有若干个5×
7或者5×
11等点阵字符位组成,每个点阵字符位都可以显示一个字符。
1602正常工作状态下接+5V电压,且其对比度可调;
内部含有复位电路;
提供各种控制功能命令,如:
清屏、字符闪烁、光标闪烁、显示移位等多种功能;
内含80字节显示数据存储器DDRAM;
内建有192个5×
7点阵的字型的字符发生器CGROM;
8个可由用户自定义的5×
7的字符发生器CGRAM;
有微功耗、体积小、显示内容丰富、超薄轻巧,常用在袖珍式仪表和低功耗应用系统中。
实物图和引脚图如下:
图3.5LCD1602实物图
图3.6LCD1602引脚图
3.2系统电路原理仿真图
图3.7系统电路原理仿真图
3.3器件主要参数介绍
3.3.1DS1302模块
1 查询手册,知DS1302引脚2/3之间的晶振为32.768KHZ。
2 可以设定规定载荷电容为6pF。
3 DS1302工作电压为2.0~5.5V,VCC2为主电源、VCC1为备用电源。
当主电源关闭时,也能保持时钟的连续运行。
由于DS1302兼容TTL电路,故我们均采用5V供电。
足以提供大于最小驱动电流(320纳安,2.0V时)的电流。
3.3.2LCD1602模块
1 查询手册,知1602芯片工作电压在4.5~5.5V。
模块最佳工作电压在5.0V,故我们采用5V电压给LCD1602供电,此时的工作电流为2.0mA,足以驱动1602工作。
2 显示容量:
16×
2个字符
3 字符尺寸:
2.95×
4.35mm
4 12号引脚为液晶显示偏压信号,通过改变此引脚上电压,可以改变1602的显示对比度。
5 1602数据引脚接在最小系统的P0口,由于P0口是准双向口(不存在高阻抗状态),需要在片外接上拉电阻。
3.3.3键盘输入模块
1 Proteus仿真环境下采用虚拟终端作为串口通信的通道,传输波特率设置为9600bit/s。
2 实际运行过程中,用串口调试助手软件对DS1302实现写的操作,同样波特率设置为9600bit/s。
3.3.4最小系统模块:
1 整个系统采用5V供电。
2 AT89C51静态工作频率为0~24MHZ,为了满足串口传输数据,我们采用11.0592MHZ的晶振为系统提供振荡频率。
3 振荡电路电容容量规定在20~40pF之间,我们采用典型值30pF。
4 复位电路实现复位时通过在RST引脚上施加2个机器周期的高电平,即可实现复位。
为了使电容的充电、放电时间满足要求,我们取C的容量为10μF。
4.软件设计
4.1流程图
4.1.1系统设计总流程图
系统设计总流程图如图4.1所示,接通电源之后,系统就处在取数据--显示数据的循环之中。
图4.1系统总流程图
4.1.2从DS1302取时间流程图
图4.2从DS1302取时间流程图
4.1.3串口数据接收、处理流程图
每当接收一次串口送来的数据,就进一次串口服务中断子程序。
在串口服务中断子程序中,对接收的数据进行处理:
判断接收的若干个数据是否符合输入要求。
如果符合,就将数据存入接收缓冲单元中,并进行转换(将接收到的数据由字符→BCD码),然后将转换过后的数据写入到DS1302中。
如果接收到的数据不符合输入要求,则将这次接收的数据舍弃。
流程图如下:
图4.3串口数据接收、处理流程图
4.1.4LCD1602显示时间流程图
在每次写操作执行前,都需要对1602检查其是否处于“忙”的状态,如果其处于“忙”状态,那么就等其处于空闲状态之后再对其进行写操作。
图4.4串口数据接收、处理流程图
4.2模块工作过程介绍
4.2.1DS1302模块
1 工作过程:
在DS1302进行数据传输时,RST引脚必须被置为高电平,在每个SCLK上升沿时数据被输入,下降沿时数据被输出,一次只能读写一位,通过8个脉冲便可读取一个字节或写入一个字节从而实现串行输入与输出。
时序图如下:
图4.5DS1302单字节读时序图
经过8个时钟周期的控制读指令串行输入后,一个字节的数据将在接下来8个时钟周期的下降沿被输出。
代码如下:
ucharGet_A_Byte_FROM_DS1302()
{
uchari,b=0x00;
for(i=0;
i<
8;
i++)
{
b|=_crol_((uchar)IO,i);
SCLK=1;
SCLK=0;
}
returnb/16*10+b%16;
}
图4.6DS1302单字节写时序图
经过8个时钟周期的控制字节的写入,一个字节数据将在接下来8个时钟周期的上升沿完成,数据的传输从字节最低位开始。
voidWrite_A_Byte_TO_DS1302(ucharx)
uchari;
IO=x&
0x01;
SCLK=1;
x>
>
=1;
2 控制指令:
图4.7DS1302控制指令图
Bit7位必须为1,如果是0写入将被禁止。
Bit6位为0是指定对时钟/日历寄存器控制读写操作,为1则为对RAM区数据的控制读写操作,最低位Bit0指定是写操作(0)还是读操作
(1)。
3 时钟/日历寄存器
图4.8DS1302时钟日历寄存器
“秒”寄存器中Bit7位为时钟停止标志位,若CH=1,时钟晶振停止起振,DS1302进入低功耗待命模式,若CH=0,晶振开始起振。
WP位为写保护位,为1有效。
在任何写操作执行前,WP位都应该置0,使写保护位无效,即允许写。
注意:
写入时钟日历寄存器内的内容应为BCD码,必须将串口接收到的数据转化为BCD码然后再存放在DS1302中,转换代码如下:
voidDateChange(void)//将10进制数转换为BCD码存放在
//RECEIVE_BUFFER2数组中
inti;
7;
{RECEIVE_BUFFER2[i]=RECEIVE_BUFFER1[i*3]*10+RECEIVE_BUFFER1[i*3+1];
RECEIVE_BUFFER2[i]=RECEIVE_BUFFER2[i]/10*16+RECEIVE_BUFFER2[i]%10;
4.2.2LCD1602模块
1 LCD1602读操作:
LCD1602作为一个显示设备,其读操作一般很少用到,只有在向1602写数据,需要判断其是否“忙”时,才会用到读操作。
读操作时序图如下:
图4.9LCD1602读时序图
首先将RS拉低,RW置高,表示读数据,再将使能端置高,P0口上的数据输入,即可将数据读入。
ucharRead_LCD_State()
ucharstate;
RS=0;
RW=1;
EN=1;
DelayMS
(1);
state=P0;
EN=0;
returnstate;
2 LCD1602写操作:
相较于读操作,写操作用的很多。
写操作时序图如下:
图4.10LCD1602写时序图
需要注意的是,在每次写操作执行前,都需要对1602检查其是否处于“忙”的状态,如果其处于“忙”状态,那么就等其处于空闲状态之后再对其进行写操作。
判忙代码如下:
voidLCD_Busy_Wait()
while((Read_LCD_State()&
0x80)==0x80);
DelayMS(5);
写数据代码如下:
voidWrite_LCD_Data(uchardat)
LCD_Busy_Wait();
RS=1;
RW=0;
EN=0;
P0=dat;
写指令代码如下:
voidWrite_LCD_Command(ucharcmd)
P0=cmd;
3 LCD1602初始化操作:
1602初始化操作是对1602显示的方式、功能作一些设置,达到预期的显示效果。
通过将指令写入1602中即可实现初始化操作。
指令说明如下:
显示模式设置:
图4.11LCD1602显示模式设置
显示开/关及光标设置:
图4.12LCD1602显示开/关及光标设置
初始化代码如下:
voidInit_LCD()
Write_LCD_Command(0x38);
//16×
2显示,5×
7点阵,8位数据接口
DelayMS
(1);
Write_LCD_Command(0x01);
//清屏
Write_LCD_Command(0x06);
//增量方式,不移位
Write_LCD_Command(0x0c);
/开显示,光标关,字符不闪烁
4.2.3串口接收模块
用电脑键盘,将要输入的时间通过串口发送给MCU。
串口采用方式1,波特率设置为9600Bit/s。
发送及接收时序图如图所示:
图4.13串口工作方式1的时序图
串口接收代码如下:
voidUART_ISR()interrupt4//串口中断:
由串口输入
ucharTemp;
if(RI)
RI=0;
Temp=SBUF;
if(Temp!
=0x0d)
{
RECEIVE_BUFFER1[rec_i]=Temp-'
0'
;
//获取字符对应的
rec_i++;
}
if(Temp==0x0d)
{DateChange();
if(Date_Check()==1)
DS1302Init();
//向DS1302写入
else
{
ES=0;
SBUF='
E'
while(TI==0);
TI=0;
r'
o'
SBUF=0x0D;
ES=1;
}
rec_i=0;
}
if(TI)
TI=0;
5.系统调试与仿真
5.1采用Proteus硬件仿真调试
创建调试过程如图:
1 在Debug模式下选择ProteusVSMMonitor-51Driver硬件驱动。
然后点击确定即可。
如图5.1所示。
图5.1调试设置
2 点击工具栏上
按钮,即可开始keil与proteus联调过程,如图5.2所示:
图5.2联调过程
5.2调试过程
调试过程中,我遇到了一些问题,后来都通过调试解决了。
1 我的本次设计有一项功能:
若操作者没有按照规定格式输入,则虚拟中断(串口调试助手)会显示一个字符串“Error”。
如图:
图5.3运行过程
而我在最初阶段并没有实现此功能。
后来通过调试,我发现了问题所在:
输出此段字符应采用查询方式输出,而我采用了中断方式。
在执行此操作时,就处在串口中断服务子程序内,系统不会再响应串口中断。
将此中断方式输出改为查询方式输出就解决了这个问题。
2 在我通过虚拟终端向系统输入日期时,DS1302不能接收我输入的数据。
调试过程中,我发现是时序出了问题。
向DS1302写入数据时,RST为高的情况下,SCLK上升沿时IO口数据被写入DS1302,而我程序内则写成了下降沿时数据被写入。
5.3运行效果
Proteus运行按钮按下,LCD1602显示的时间与当前系统的时间同步,且虚拟中断输出一段字符串,用来提示输入格式。
如图所示:
图5.4运行过程
接下来,按照提示的格式输入时间,如:
15-07-12-31-23-59-50,如图所示:
图5.5运行过程
然后再按下回车键,则1602上即显示输入格式的时间,如图所示:
图5.6运行过程
若重新按照格式输入,则时间会再一次改变,如图:
图5.7运行过程
如若输入的格式不正确,则虚拟终端会输出一个字符串“Error”来提醒操作者输入格式错误,如图所示:
图5.8运行过程
同时,此系统还有检测输入日期是否实际的功能,如输入:
16-08-12-31-23-59-50(周-08肯定是错误的),虚拟中断也会输出字符串“Error”来提示操作者,如图所示:
图5.9运行过程
所有功能运行效果介绍完毕。
5.4仿真的局限性
软件仿真与实际验证有很大的不同。
软件仿真是将元器件、导线等理想化了,不会出错,而实际电路的走线布线、元器件、工作环境(如温度、湿度等)对电路的运行都是有影响的,只是影响大小不同而已,甚至期间因为受到影响而直接损坏,这些都是在软件仿真时不可能遇到的。
除此之外,同一型号的元器件,不同厂家,甚至是同一厂家不同批次生产出来的元器件都多少有些差异,而这些差异都有可能使硬件运行失败。
最直观的例子就是:
我在调试的过程中,在Proteus上完美运行的程序,烧写进实验板之后现实的效果就没有了。
根本看不见时间。
最后经过很长时间的调试,期间对1602工作的时序作了一些调整,我才解决了这个问题,让实验板与仿真实现同样的效果。
由此看来,仿真的局限性很大,只有在硬件上实现才能算是真正的完成了设计。
5.5方案改进
虽然此设计已经满足了基本要求,但在满足用户方面还存在一些欠缺。
比如:
用户如果输入一个不存在的时间,如2012年2月29日。
系统应该能识别2010年不是闰年,并不存在此时间。
此时,系统应提示输入错误。
此外,LCD1602显示界面还可以做一些调整,如增加温度显示,湿度显示等。
6.设计总结
虽然本次课程设计只持续了不到一周,但我学到的东西很多很多。
从接到这个题目到现在设计的完成,每一步我都有深刻的体会。
作为一名工科生,我更喜欢有条理地总结这次设计的收获:
1 首先,本次设计我收获最大的就是我懂得了:
学习单片机这门课不单单是学会画图、写代码就OK了。
而是应该培养自己的“工程师”能力。
从分析设计要求到选择方案再