《51单片机构建电子时钟:实现更精准的时间计量》

基于51单片机的电子时钟设计

目录

基于51单片机的电子时钟设计

一、需求分析

1.1 前言

1.2研究价值及意义

1.3 任务目标

一、总体设计

2.1 设计思路

2.2 总体框架

2.3 主要元件说明

2.3.1 AT89C51单片机

2.3.2 LCD1602液晶显示器

2.3.3 24C02C存储芯片

2.3.4 DS1302时钟芯片

三、详细设计

3.1 液晶显示模块设计

3.1.1 硬件设计

3.2 时间产生模块设计

3.2.1 硬件设计

3.2.2 软件设计

3.3 数据存储模块设计

3.3.1 硬件设计

3.3.2 软件设计

3.4 按键处理模块设计

3.4.1 硬件设计

3.4.2 软件设计

四、程序运行结果测试与分析

4.1 LCD1602功能测试

4.2 DS1302功能测试

4.3 24C02C功能测试

4.4 调整时间功能测试


一、需求分析

1.1 前言

单品微型计算机简称单片机,是典型的嵌入式微控制器(Microcontroller Unit),常用英文字母的缩写MCU表示单片机,单片机又称单片微控制器,它不是完成某个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O 设备。

单片机作为应用最广泛的控制系统之一,具有体积小,易于控制,价格便宜,安全可靠等等优良的性能而被广泛的关注。无论是小到儿童玩具,到工业控制系统,大到航天航空系统的设计与操作之中,随处可见单片机的踪影。

由于单片机在工业控制领域的广泛应用,单片机由芯片内仅有CPU的专用处理器发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。

1.2研究价值及意义

电子钟亦称数显钟(数字显示钟),是一种用数字电路技术实现时、分、秒计时的装置,与机械时钟相比,直观性为其主要显着特点,且因非机械驱动,具有更长的使用寿命,相较石英钟的石英机芯驱动,更具准确性。电子钟已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及车站、码头、剧院、办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大地方便。相对于其他时钟类型,它的特点可归结为“两强一弱”: 比机械钟强在观时显着,比石英钟强在走时准确,但是它的弱点为显时较为单调。

 

1.3 任务目标

使用DS1302芯片作为计时设备,用6个7段LED数码管或者LCD162作为显示设备,实现时钟功能;

功能要求:

(1)可以分别设定小时、分钟和秒,复位后时间为00:00:00;

(2)秒钟复位功能,秒复位键按下后,秒回到00。

(3)用EEPROM芯片存储数据

 

一、总体设计

2.1 设计思路

(1)定义一个表示时间的数组,声明为外部变量,可以在各个模块中进行访问,以此来建立它们之间的关联。

(2)电子时钟的时间数据由DS1302实时时钟芯片来产生并显示在LCD1602上显示;通过定时器扫描按键的方式得到按键按下的键值,在主程序中根据得到的键值调用不同的按键处理函数(调时、保存数据、读取数据等),当要对时间数据进行操作时,可以先对数组中的数进行操作,操作完成后再把数组中的各个元素写入DS1302芯片。

(3)把各种模块需要实现的功能都封装成函数并在头文件中声明。例如LCD1602除了需要显示时间这个数字类型外,还需要显示字符、字符串等,所以可以定义多个函数来实现显示各种数据类型。

2.2 总体框架

本项目主要包含这么四个模块,分别是DS1302时钟模块、LCD1602显示模块、按键处理模块以及EEPROM存储模块。总体框架如图2-1所示,每一个模块的详细设计说明会在下一章进行介绍。

图2-1 总体框架图

系统的总体流程图如图2-2所示。

      

图2-2 总体流程图

 

2.3 主要元件说明

2.3.1 AT89C51单片机

ATC89C51是采用8051 核的ISP (In SystemProgramming)在系统可编程芯片,最高工作时钟频率为80MHz,片内含8K Bytes的可反复擦写1000 次的Flash只读程序存储器,器件兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储 单元,具有在系统可编程(ISP)特性,配合PC端的控制程序即可将用户的程序代码下载进单片机内部,省去了购买通用编程器,而且速度更快。ATC89C51是本系统的核心元件,控制着整个系统的运行。

 

2.3.2 LCD1602液晶显示器

LCD1602可以显示2行16个字符,有8位数据总线DO-D7,和RS、R/W、EN三个控制端口,工作电压为5V,并且带有字符对比度调节和背光。LCD1602引脚说明如表2.1所示。LCD1602时序图如图2-3所示。

表2.1 LCD1602引脚说明表

编号

符号

引脚说明

编号

符号

引脚说明

1

VSS

电源地

9

D2

数据

2

VDD

电源正极

10

D3

数据

3

VL

液晶显示偏压

11

D4

数据

4

RS

数据/命令选择

12

D5

数据

5

R/W

使能信号

13

D6

数据

6

E

数据

14

D7

数据

7

D0

数据

15

BLA

背光源正极

8

D1

数据

16

BLK

背光源正极

第1引脚:GND为电源地。

第2引脚: VCC接5V电源正极。

第3引脚: V0为液晶显示器对比度调整端,接正电源时对比魔最弱。接地电源时对比度最离(对比厦过离时会产生"鬼影”.使用时可以通过一个10K的电位器调整对比度)。

第4引脚RS为箭存器选择,离电平1时选择微据寄存器低电竿0时选择指令寄存器.

第5引脚RW为读写情号线,离电平(1)时进行读操作,以51为例的简草原理图低电平(0)时进行写操作。

第6引脚: E(或EN)端为使能(enable)端,离电子(1)时读取信息,负眺变时执行指令.

第7-14引脚DO- D7为8位双向擞据端。第15-16脚空脚或青灯电源.第15引脚背光正极.

第16引脚背光负极。

图2-3 LCD1602时序图

2.3.3 24C02C存储芯片

(1)引脚功能介绍及相关知识

24c02是低工作电压的2k位丰行电可擦除只读存储器,内部组织为256个字节,每个字节8位,工作电压为1.8v-5.5v, 输入\输出引脚兼窖为5v,该芯片被广泛应用于低电压及低功耗的工商业领城。24c02引脚定义如表2.2所示。

表2.2 24c02引脚定义图

引脚名称

引脚功能

A0-A2

器件地址输入

SDA

串行数据输入输出

SCL

串行时钟输入

WP

写保护

VCC

电源

GND

(2)I2C总线协议

只有总线非忙时才被允许进行数据传送,在传送时,当时钟线为高电平,数据线必须为固定状态,不允许有跳变。时钟线为高电平时数据线的任何电平变化将被当作总线的启动或停止条件。

(3)起始条件

起始调教必须在所有操作命令之前发送。时钟线保持高电平期间,数据线电平从高到低跳变作为I2c 总线的启动信号。CAT24Cxxx一直监视SDA和SCL电平信号,直到条件满足时才响应。

(4)停止条件

时钟线保持高电平期间,数据线电平从低到高跳变作为I'C 总线的停止信号。

(5)器件地址约定

主器件在发送启动命令后开始传送数据,主器件发送相应的从器件地址,8位从器件地址的高四位固定为1010, 接下来的3位用来定义存储器的地址,对于CAT24C021/022,这三位无意义,对于CAT24C41/042,接下来的2位无意义,第三位是地址高位,CAT24C081/082中,第一位无意义,后两位表示地址高位。最后一位为读写控制位,“1” 表示对从器件进行读写操作,“0” 表示写操作。在主器件发送启动命令和一字节从器件地址后,如果与从器件地址吻合,CAT24C02将发送一个应答信号,然后再根据读/写控制为进行读或写操作。

(6)应答信号

每次数据传送成功后,接收器件将发送一个应答信号。当第九个时钟信号产生时,产生应答型号的器件将SDA下拉为低,通知已经接受到8位数据,接收到起始条件和从器件地址后,CAT24C02 发送一个应答信号,如果为写操作,每接收到一个字节数据,CAT24C02 发送一一个应答信号。如果为读操作,CAT24C02发送一个字节数据后释放总线等待应答信号,一旦接收到应答信号,它将继续发发送数据,如果接收到主器件发送非应答信号,将结束数据传送等待停止条件。

(7)写操作

在写字节模式下,助器件发送起始命令和从器件地址信息给从器件,在从器件响应应答信号后,主器件将要写入的数据地址发送到CAT24C02的地址指针,主器件收到从器件的应答信号后再送数据到相应的数据存储区地址,.CAT24C02再响应一个应答信号,主器件产生一个停止信号,然后CAT24C02启动内部写周期,在内部写周期期间,CAT24C02不再响应主器件任何请求。写操作时序读如图2-4所示:

图2-4 写时序图

(8)读操作

CAT24C02读操作的初始化方式和写操作一样, 仅把R/w位置1,读操作有三种方式:立即地址读、选择地址读、连续读。选择地址读操作时序图如图2-5所示:

图2-5 读时序图

2.3.4 DS1302时钟芯片

DS1302是一个实时时钟芯片,可以提供秒、分、小时、日期、月、年等信息,并且还有软年自动调整的能力,可以通过配置AM/PM来决定采用24小时格式还是12小时格式,它的引脚及功能如下表所示。

单字节写入时序如下图所示。

由图可见,先拉高使能端,进行使能选择,然后在时钟上升沿写入一个字节。DS1302在进行读写操作时最少读写两个字节,第一个是控制字节,就是一个命令,说明是读还是写操作,第二个时需要读写的数据。对于单字节写,只有在SCLK为低电平时才能将 CE 置高电平,所以刚开始将SCLK 置低,CE置高,然后把需要写入的字节送入 IO口,然后跳变SCLK,在SCLK下降沿时,写入数据。

3.1 液晶显示模块设计三、详细设计

在液晶显示模块需要实现的功能有:显示字符串、显示字符、显示十进制数字。字符串用来表示提示信息,字符用来表示“:”、“-”等特殊符号,时间数据用十进制表示。

3.1.1 硬件设计

液晶显示模块的硬件连接图如下图所示,LCD1602的VSS与地相连、VDD与电源相连、RS与单片机的P2_6口相连、RW与P2_5口相连、E与P2_7口相连、D0-D7通过上拉电阻连接到单片机的P0口(VEE用于调节对比度,此处没必要连接)。所以给LCD1602送入数据也就是给单片机P0口送数据,再通过单片机的P2_5(RW)、P2_6(RS)、P2_7(E)控制LCD的时序使其正常工作于各个过程。

图3-1  LCD1602硬件接线图

考虑到代码的可读性,首先在程序开头对一些需要使用到的位变量和数据端口进行了定义,代码如下。

sbit LCD1602_RS=P2^6;

sbit LCD1602_RW=P2^5;

sbit LCD1602_E=P2^7;

#define  LCD1602_DATA  P0

在使用LCD1602时,我们通过写入指令来控制待显示数据在液晶显示器上的位置以及设置LCD1602的参数;通过写入数据来表示具体要显示的内容。接下来,依次对LCD1602模块中的各个函数进行介绍。

(1)写指令函数。函数的参数即为待写入的指令。通过改变RS、RW和E这三个引脚的电平变化来对写指令的时序进行模拟,代码如下。

void LCD1602_WriteCmd(unsigned char cmd)
{
	LCD1602_RS=0;
	LCD1602_RW=0;
	LCD1602_DATA=cmd;
	LCD1602_E=1;
	LCD_Delay();
	LCD1602_E=0;
	LCD_Delay();
}

(2)写数据函数。函数的参数即为待写入的数据。写入数据和写入指令唯一的区别是RS 引脚的电平状态不同,RS为低电平期间写入的是指令,为高电平期间写入的是数据,具体代码如下。

void LCD1602_WriteDat(unsigned char dat)
{
	LCD1602_RS=1;
	LCD1602_RW=0;
	LCD1602_DATA=dat;
	LCD1602_E=1;
	LCD_Delay();
	LCD1602_E=0;
	LCD_Delay();
}

(3)初始化函数。LCD1602在使用之前需要对它的工作方式进行配置,具体的代码和注释如下。

void LCD1602_Init()
{
	LCD1602_WriteCmd(0x38);//显示模式设置
	LCD1602_WriteCmd(0x0c);//显示开
	LCD1602_WriteCmd(0x06);//显示光标
	LCD1602_WriteCmd(0x01);//显示清屏
	LCD1602_WriteCmd(0x80);//显示位置第1行1列
}

(4)其他函数。上面介绍的都是最基本的函数,为了在其他模块中调用方便,我们在这些基本函数的基础上加以简单的逻辑设计还编写了另外三个函数。当需要用到液晶显示器的时候只需要调用这三个函数即可,下面只对他们的使用进行声明,代码较多就不全部列出了。

/*在LCD的第x行第y列上显示十进制数字num,显示长度为z*/
 void LCD1602_ShowNum(unsigned char x,y,z,num );	//显示十进制数字
/*在LCD的第x行第y列上显示首地址为dat的字符串*/
void LCD1602_ShowString(unsigned char x,y,char *dat); //显示字符串
/*在LCD的第x行第y列上显示字符dat*/
 void LCD1602_ShowChar(unsigned char x,y,dat);//显示单个字符

3.2 时间产生模块设计

时间产生模块需要实现的功能有:通过DS1302实时时钟芯片产生时间信息,能够把时间信息写入DS1302并且读取出来。

3.2.1 硬件设计

DS1302与单片机的硬件接线如下图所示。在DS1302的X1、X2管教处外接了一个频率为32.768KHZ的晶振,为时钟运行提供一个稳定的时钟频率。RST非、SCLK、I/O分别与单片机的P3_5、P3_6、P3_4连接,串行数据通过I/O引脚在单片机和DS1302之间进行传输。

 

图3-2  DS1302硬件接线图

3.2.2 软件设计

在程序的最开始首先对需要用到的位变量进行定义和DS1302中特殊意义的常量进行宏定义,此外还定义了一个储存时间的全局变量,具体代码及注释如下。

#define	 DS1302_SECOND		0x80//秒
#define  DS1302_MINUTE			0x82//分
#define	 DS1302_HOUR			0x84//小时
#define	 DS1302_DATE			0x86//日
#define  DS1302_MONTH			0x88//月
#define	 DS1302_DAY			0x8A//星期
#define  DS1302_YEAR			0x8C//年
#define  DS1302_WP				0x8E//写保护
sbit DS1302_RST=P3^5;
sbit DS1302_SCLK=P3^6;
sbit DS1302_IO=P3^4;														   
char DS1302_Time[]={20,1,1,0,0,0,3};	//保存时间信息 年 月 日 时 分 秒 星期
//所以在单片机上电之后DS1302默认的时间就是2020-1-1 00:00:00 星期三

在此模块中最重要也是最基本的两个函数是写入一个字节的函数(即设置时间)和读取一个字节的函数,下面分别对其进行介绍。

(1)单字节写函数。函数的第二个参数表示待写入的数据,第一个参数表示操作指令。两个8位数据从高位开始一次一位一位的通过I/O管脚写入DS1302。具体代码如下。

void DS1302_WriteByte(unsigned char cmd,dat)
{
	unsigned char i;
	DS1302_RST=1;
	for(i=0;i<8;i++)
	{
		DS1302_IO=cmd&(0x01<<i);
		DS1302_SCLK=1;
		DS1302_SCLK=0;
	}
	for(i=0;i<8;i++)
	{
		DS1302_IO=dat&(0x01<<i);
		DS1302_SCLK=1;
		DS1302_SCLK=0;
	}
	DS1302_RST=0;
	DS1302_SCLK=0;
}

(2)单字节读函数。函数的参数是操作指令,返回值为读取到的数据。这里的指令跟单字节写函数的指令有所不同,它要求指令的最后一位必须为1,而单字节写要求为0。所以在代码中对参数cmd进行了处理,确保末位为1,具体代码如下。

unsigned char DS1302_ReadByte  (unsigned char cmd)
{
	unsigned char i,DATA=0x00;
	cmd|=0x01;//确保末位为1
	DS1302_RST=1;
	for(i=0;i<8;i++)
	{
		DS1302_IO=cmd&(0x01<<i);
		DS1302_SCLK=1;
		DS1302_SCLK=0;
	}
	for(i=0;i<8;i++)
	{
		if(DS1302_IO)DATA=DATA|(0x01<<i);
		DS1302_SCLK=1;
		DS1302_SCLK=0;
	}
	DS1302_RST=0;
	return DATA;
}

(3)设置时间函数。在实际调用上面两个函数时,指令实参一般是开头定义的宏,数据实参一般是数据组中的元素。为了在其他模块中更好的使用这个模块,我们另外定义了两个函数分别用于读取时间和设置时间,这样避免了过于繁琐的调用单字节写和读函数,不容易出错,只需要对数组进行操作。具体代码如下。

void setTime  ()
{
    DS1302_WriteByte(DS1302_WP,0x00);
    DS1302_WriteByte(DS1302_YEAR,DS1302_Time[0]/10*16+DS1302_Time[0]%10);
    DS1302_WriteByte(DS1302_MONTH,DS1302_Time[1]/10*16+DS1302_Time[1]%10);
    DS1302_WriteByte(DS1302_DATE,DS1302_Time[2]/10*16+DS1302_Time[2]%10);
    DS1302_WriteByte(DS1302_HOUR,DS1302_Time[3]/10*16+DS1302_Time[3]%10);
    DS1302_WriteByte(DS1302_MINUTE,DS1302_Time[4]/10*16+DS1302_Time[4]%10);
    DS1302_WriteByte(DS1302_SECOND,DS1302_Time[5]/10*16+DS1302_Time[5]%10);
    DS1302_WriteByte(DS1302_DAY,DS1302_Time[6]/10*16+DS1302_Time[6]%10);
    DS1302_WriteByte(DS1302_WP,0x80);
} 

说明:由于时间在DS1302芯片中是以BCD码的形式进行存储的,而数组中的元素是十进制,所以我们要把十进制转化成BCD码再写入DS1302;读取时间则反过来把BCD码转化成十进制。 

 

3.3 数据存储模块设计

本模块使用基于I2C协议的存储芯片24C02C来保存时间数据,需要实现的功能包括写入数据和读取数据。

3.3.1 硬件设计

24C02C与单片机的链接图如下图所示,时钟线SCK由单片机P2_1口控制,数据线SDA由P2_0口控制,写保护管脚WP和表示地址的A0-A2均接地。因此,24C02C的写保护处于失能状态,也就是说24C02C始终可读可写,且地址码为1010000X。下面的I2C Debug模块在仿真中用于验证存储的信息是否准确无误。

图3-3 24C02C硬件接线图

3.3.2 软件设计

首先对一些需要使用到的位变量进行定义,具体的代码如下。

sbit I2C_SDA=P2^0;

sbit I2C_SCL=P2^1;

24C02C是一种遵循I2C总线协议的存储芯片,它的数据帧由I2C模块的函数拼凑而成。I2C模块的函数声明如表3.1所示。

表3.1 I2C模块函数声明表

函数原型声明

意义

void I2C_Start()

起始信号

void I2C_Stop()

终止信号

I2C_SendByte(unsigned char Byte)

发生一个字节

unsigned char I2C_ReceiveByte()

接收一个字节

void I2C_SendAck(unsigned char AckBit)

发送应答信号

unsigned char I2C_ReceiveAck(void)

接收应答信号

接下来正式介绍24C02的发送和接收数据函数。

(1)发送数据函数。函数的第一个参数表示的是要发送的地址,第二个参数为待发送的数据,ADDRESS表示器件的地址码,由硬件接线确定,此处为0xA0。具体的代码如下。

void _24C02_WriteByte(unsigned char WordAddress,Data)
{
	I2C_Start();
	I2C_SendByte(ADDRESS);//0xA0
	I2C_ReceiveAck();
	I2C_SendByte(WordAddress);
	I2C_ReceiveAck();
	I2C_SendByte(Data);
	I2C_ReceiveAck();
	I2C_Stop();
}

(2)接收数据函数。参数为需要接收数据的地址,返回值为该地址中的数据。在接收数据的过程中要求ADDRESS的末位为1。函数的具体代码如下。

unsigned char _24C02_ReadByte(unsigned char WordAddress)
{
	unsigned char Data;
	I2C_Start();
	I2C_SendByte(ADDRESS);
	I2C_ReceiveAck();
	I2C_SendByte(WordAddress);
	I2C_ReceiveAck();
	I2C_Start();
	I2C_SendByte(ADDRESS|0x01);
	I2C_ReceiveAck();
	Data=I2C_ReceiveByte();
	I2C_SendAck(1);
	I2C_Stop();
	return Data;
}

3.4 按键处理模块设计

按键模块的电路最为简单,但他需要实现的逻辑功能确实最为复杂。本模块需要实现的功能包括按键扫描和按键处理。通过定时器扫描按键的方式对按下的按键进行检测,根据得到的键值调用不同的方法。

3.4.1 硬件设计

按键的硬件连接如下图所示。7个按键一端接单片机I/O口,另一端接地,当有按键按下时对应的I/O口就为低电平。

图3-4 按键接线图

3.4.2 软件设计

由于按键的器件特性,在实际使用过程中无论是在按下按键还是松开按键的瞬间都会存在抖动,我们必须要消抖才能正常使用。按键消抖的方式有两种:硬件消抖和软件消抖,这里采用的是软件消抖的方式。抖动的时间一般不会超过20ms,我们可以利用单片机的定时器中断函数,每隔20ms对按键进行一次扫描,按键扫描程序流程图如下所示。

 

图3-5  按键扫描流程图

按键扫描的主要代码如下。

void  key_scan()
{
	static unsigned char oldState,newState;//当前的按键状态和之前的按键状态 
	oldState=newState;
	newState=getKeyNum();
	if(newState==0&&oldState==1) KeyVal=1;
	if(newState==0&&oldState==2) KeyVal=2;
	if(newState==0&&oldState==3) KeyVal=3;
	if(newState==0&&oldState==4) KeyVal=4;
	if(newState==0&&oldState==5) KeyVal=5;
	if(newState==0&&oldState==6) KeyVal=6;
	if(newState==0&&oldState==7) KeyVal=7;
}

在通过按键扫描程序得到键值后,由主程序根据不同的键值调用不同的功能模块。例如,按下第一个键(k1=0)进入时间设置模式、按下第二个键(k2=0)使秒钟复位等等。按键处理的流程图如下图所示。

图3-6  按键处理流程图

按键处理的主要代码如下所示。

 if(keyNum==1){
		 	if(MODE==0)MODE=1; //选择设置时间或者显示时间
			else if(MODE==1){MODE=0;setTime();}
//设置模式切换至显示模式后重新设置时间
			}
		
		if(keyNum==6){
			 unsigned char i;
			for(i=0;i<6;i++){
				_24C02_WriteByte(i,DS1302_Time[i]);	
//从第0号地址开始依次写入时间数据
				Delay(5);
			}
	 	}
		 if(keyNum==7){
	 		unsigned char i;
			 for(i=0;i<6;i++){
				DS1302_Time[i]=_24C02_ReadByte(i);	
//依次读取数据到表示时间的数组中
				setTime();	//重新设置时间
			}
	 }	
		 switch(MODE)
		 {
		 	case 0:	LCD_ShowTime();break;
			case 1: LCD_TimeSet();break;
		 }

在设置时间功能模块需要对每一次设置的时间的合法性进行判断,判断的流程图如下所示。

图3-7 设置时间模块流程图

四、程序运行结果测试与分析

系统的总体原理图如下所示,接下来分别对各个模块进行测试。

图4-1 总体原理图

4.1 LCD1602功能测试

(1)显示字符串。在第一行第一列开始显示“zhou shuaige”,在第二行第一列开始显示“yi choubi”。测试结果如下所示。

图4-2  LCD1602显示字符串测试

(2)显示数字。在第一行第一列显示数字5,显示长度2;在第二行第一列显示数字2,显示长度3。测试结果如下所示。

图4-3  LCD1602显示数字测试

(3)显示字符。在第一行第二列显示‘a’,第二行第二列显示‘b’,测试结果如下所示。

图4-4  LCD1602显示字符测试

4.2 DS1302功能测试

(1)设置时间。在程序中给DS1302设置一个的时间“20年01月01日00点00时00分00秒,星期三”,测试结果如下。

图4-5  DS1302设置时间测试

(2)读取时间。把DS1302中的数据读取出来显示在LCD1602上。测试结果如下。

图4-6  DS1302读取时间测试

4.3 24C02C功能测试

(1)写入数据。把时钟芯片中目前的时间写入24C02C,暂停仿真后打开I2C Debug模块,测试结果如下。

图4-7  24C02C写入数据测试

说明:DS1302的时间是“20年01月01号00是01分16秒,星期3”,所有的信息都储存在24C02C芯片以0号地址开始的7个单元中(以十六进制存储)。

(2)读取数据。把上一步存储的信息读出来显示在LCD1602上,测试结果如下。

图4-8  24C02C读取数据测试

4.4 调整时间功能测试

通过按键把时间设置成08:08:08,测试结果如下。

图4-9  按键调整时间测试

物联沃分享整理
物联沃-IOTWORD物联网 » 《51单片机构建电子时钟:实现更精准的时间计量》

发表评论