资源描述
电子钟设计报告
64
资料内容仅供参考,如有不当或者侵权,请联系本人改正或者删除。
嵌入式系统设计导论
电子钟设计报告
学号:
姓名: 李刚
摘要
回看历史长河, 从以前的沙漏到现在的电子钟, 人们计时的工具伴随着社会的进步和科技的日新月异而更新着, 我们不得不感叹人类的智慧! 的确, 电子钟是一种利用数字电路来实现时间的显示, 与传统的机械钟相比, 它具有走时准确、 显示直观、 无机械传动等优点, 因而得到广泛使用。随着人们生活环境的不断改进和美化, 我们能够在很多场合看到电子钟。数字钟已成为人们日常生活中必不可少的必须品, 广泛用于个人家庭以及车站、 码头、 剧场、 办公室等公共场所, 给人们的生活、 学习、 工作、 娱乐带来极大的方便。由于数字集成电路技术的发展和采用了先进的石英技术, 使数字钟具有走时准确、 性能稳定、 携带方便等优点, 它还用于计时、 自动报时及自动控制等各个领域。电子钟的唯一缺点是具有辐射, 不过电子产品都是有辐射的, 电子钟的辐射很小不会造成什么危害。
别人设计的电子有可能不符合自己的风格, 因此如果能自己亲自动手设计一个符合自己的风格的电子钟将会很有意义。这次的课程设计给了我一个机会。本设计是基于单片机进行的电子万年历设计, 能够显示年月日时分秒及周信息, 具有可调整日期和时间功能。在设计的同时对单片机的理论基础和外围扩展知识进行了比较全面准备。在硬件与软件设计时, 没有良好的基础知识和实践经验会受到很大限制, 每项功能实现时需要那种硬件, 程序该如何编写, 算法如何实现等, 没有一定的基础就不可能很好的实现。
具体实现功能:
能够准确显示年、 月、 日、 时、 分、 秒;
能够对时间进行设置;
目录
嵌入式系统设计导论 1
电子钟设计报告 1
摘要 2
1 方案选择 1
1.1 单片机芯片的选择方案 1
1.2 显示模块选择方案 1
1.3 时钟芯片的选择方案 1
1.4 电路设计最终方案决定 2
2 系统的硬件设计与实现 3
2.1 电路设计框图 3
2.2 系统硬件概述 3
2.3 主要单元电路的设计及器件介绍 3
3 系统的软件设计 7
3.1 程序流程框图 7
3.2 程序设计( 见附录一) 7
4 Proteus仿真 8
4.1 Keil C51的使用介绍 8
4.2 Proteus 的使用介绍 8
4.3 Proteus仿真结果 9
5 课程设计总结与体会 12
6 参考文献 13
7 附录一 14
7.1 Common.h头文件 14
7.2 Main.c文件 15
7.3 DS1302.c文件 19
7.4 Lcd.c文件 22
1 方案选择
1.1 单片机芯片的选择方案
方案一:
采用AT89C51芯片作为硬件核心, 采用Flash ROM, 内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,可是运用于电路设计中时由于不具备ISP在线编程技术, 当在对电路进行调试时, 由于程序的错误修改或对程序的新增功能需要烧入程序时, 对芯片的多次拔插会对芯片造成一定的损坏。
方案二:
采用AT89C52, AT89C52是一个低电压, 高性能CMOS 8位单片机, 片内含8k bytes的可重复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器( RAM) , 器件采用ATMEL公司的高密度、 非易失性存储技术生产, 兼容标准MCS-51指令系统, 片内置通用8位中央处理器和Flash存储单元, 功能强大的AT89C52单片机可为我们提供许多较复杂系统控制应用场合。硬件实体电路一般会采用功能和优点更为突出的AT89C52单片机。
1.2 显示模块选择方案
方案一:
采用LED数码管动态扫描,LED数码管价格适中,但要显示比较多的数字时数码管的使用必然会增多, 连线方面会很麻烦, 编程上也会相应的复杂。考虑到效率的因素不采用数码管显示。
方案二:
采用点阵式数码管显示, 点阵式数码管是由八行八列的发光二极管组成, 在很多场合能够看到这种显示方式, 可是在电子钟显示时间这一块不适合, 一来点阵显示文字上有优势, 但显示数字存在一定的劣势, 一来不够直观, 二来显得有点浪费。综合考虑各种因素排除这种方案。
方案三:
采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见。与数码管显示相比, 在直观程度和亮度清晰度上都存在很多优势, 而且现在液晶显示已经成为主流, 被人们普遍接受, 符合大众的口味。虽然没学过液晶显示这一块, 但查看相关资料应该能够把硬件电路图接好。
1.3 时钟芯片的选择方案
方案一:
直接采用单片机定时计数器提供秒信号, 使用程序实现年、 月、 日、 星期、 时、 分、 秒计数。采用此种方案虽然减少芯片的使用, 节约成本, 可是, 实现的时间误差较大,因此不采用此方案。
方案二:
采用DS1302时钟芯片实现时钟, DS1302芯片是一种高性能的时钟芯片, 实时时钟可提供秒、 分、 时、 日、 星期、 月和年, 一个月小于31天时能够自动调整, 且具有闰年补偿功能。计时更加准确, 使用起来更加方便, 与成本相比起来利大于弊, 物超所值。
1.4 电路设计最终方案决定
综上各方案所述,对此次作品的方案选定: 采用AT89C52作为主控制系统; DS1302提供时钟;LCD液晶显示屏作为显示。
2 系统的硬件设计与实现
2.1 电路设计框图
电路设计框图如图2-1所示:
DS1302时钟模块
LCD液晶显示屏显示模块
按键模块
AT89C52主控制模 块
图 21
2.2 系统硬件概述
本电路是由AT89C52单片机为控制核心, 驱动DS1302时钟提供年、 月、 日、 时、 分、 秒, 时间精确; 显示模块采用LCD12864显示, 直观、 清晰、 非常人性化; 按键模块包含时间设置按钮, 按键的操作符合人们的思维习惯, 很容易进行设置。总的来说, 硬件考虑的比较周全, 尽量做到最好。
2.3 主要单元电路的设计及器件介绍
单片机主控制模块
一、 模块介绍
单片机控制模块的核心是AT89C52, 另外还包括它的供电电路、 复位电路、 时钟电路, 它的模块图如图2-2所示
图 22
二 AT89C52的介绍
AT89C52有40个引脚, 32个外部双向输入/输出( I/O) 端口, 同时内含2个外中断口, 3个16位可编程定时计数器,2个全双工串行通信口, 2个读写口线, AT89C52能够按照常规方法进行编程,但不能够在线编程(S系列的才支持在线编程)。其将通用的微处理器和Flash存储器结合在一起, 特别是可重复擦写的Flash存储器可有效地降低开发成本。
时钟电路模块
一、 模块介绍
时钟电路模块的核心是DS1302, DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时, Vcc2给DS1302供电。当Vcc2小于Vcc1时, DS1302由Vcc1供电。X1和X2是振荡源, 外接32.768KHz晶振。RST是复位/片选线, 经过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能: 首先, RST接通控制逻辑, 允许地址/命令序列送入移位寄存器; 其次, RST提供终止单字节或多字节数据的传送手段。当RST为高电平时, 所有的数据传送被初始化, 允许对DS1302进行操作。如果在传送过程中RSTS置为低电平, 则会终止此次数据传送, I/O引脚变为高阻态。上电动行时, 在Vcc大于等于2.5V之前, RST必须保持低电平。中有在SCLK 为低电平时, 才能将RST置为高电平, I/O为串行数据输入端( 双向) 。SCLK始终是输入端。
图 23 DS1302的时钟电路 图 24 DS1302的管脚图
二、 DS1302的介绍
(1) 时钟芯片DS1302的工作原理:
DS1302在每次进行读、 写程序前都必须初始化, 先把SCLK端置 ”0”, 接着把RST端置”1”, 最后才给予SCLK脉冲; 读/写时序如下图4所示。DS1302的控制字的位7必须置1, 若为0则不能把对DS1302进行读写数据。对于位6, 若对程序进行读/写时RAM=1, 对时间进行读/写时, CK=0, 位1至位5指操作单元的地址。位0是读/写操作位, 进行读操作时, 该位为1; 该位为0则表示进行的是写操作。控制字节总是从最低位开始输入/输出的。表.2为DS1302的日历、 时间寄存器内容: ”CH”是时钟暂停标志位, 当该位为1时, 时钟振荡器停止, DS1302处于低功耗状态; 当该位为0时, 时钟开始运行。”WP”是写保护位, 在任何的对时钟和RAM的写操作之前, WP必须为0。当”WP”为1时, 写保护位防止对任一寄存器的写操作。
(2) DS1302的控制字节:
DS1302控制字节的高有效位( 位7) 必须是逻辑1, 如果它为0, 则不能把数据写入DS1302中, 位6如果0, 则表示存取日历时钟数据, 为1表示存取RAM数据; 位5至位1指示操作单元的地址; 最低有效位( 位0) 如为0表示要进行写操作, 为1表示进行读操作, 控制字节总是从最低位开始输出
(3) 数据输入输出( I/O)
在控制指令字输入后的下一个SCLK时钟的上升沿时, 数据被写入DS1302, 数据输入从低位即位0开始。同样, 在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据, 读出数据时从低位0位到高位7。
(4) DS1302的寄存器
DS1302有12个寄存器, 其中有7个寄存器与日历、 时钟相关, 存放的数据位为BCD码形式。
另外, DS1302 还有年份寄存器、 控制寄存器、 充电寄存器、 时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302与RAM相关的寄存器分为两类: 一类是单个RAM单元, 共31个, 每个单元组态为一个8位的字节, 其命令控制字为C0H~FDH, 其中奇数为读操作, 偶数为写操作; 另一类为突发方式下的RAM寄存器, 此方式下可一次性读写所有的RAM的31个字节, 命令控制字为FEH(写)、 FFH(读)。
显示模块
一、 模块介绍
图2-5为LCD显示模块, 液晶显示的连线需熟悉它的工作原理。
图 25显示模块
二、 LCD12864的介绍
LCD12864分为带字库和不带字库两种, 带字库的在显示文本时更方便, 不带字库的在显示图像时更有优势。LCD12864采用标准的20脚接口, 各引脚接口说明如表所示:
编号 符号 引脚说明 编号 符号 引脚说明
1 VSS 电源地 11 D4 数据
2 VDD 电源正极 12 D5 数据
3 V0 对比度亮度调整 13 D6 数据
4 RS 数据/命令选择 14 D7 数据
5 R/W 读/写选择 15 CS1 选择右半屏
6 E 使能信号 16 CS2 选择左半屏
7 D0 数据 17 RET 复位
8 D1 数据 18 VOUT LCD驱动负电压
9 D2 数据 19 LED+ 背光电源正极
10 D3 数据 20 LED- 背光电源地
按键模块
按键模块由3个按键组成, 每个按键都有自己的功能。
图 26按键模块
3 系统的软件设计
3.1 程序流程框图
开始
初始化
读日期、 时间
显示日期、 时间
判断是否有按键按下
执行按键程序
是
修改时间
否
图 31
3.2 程序设计( 见附录一)
4 Proteus仿真
4.1 Keil C51的使用介绍
由于程序的编写语言是C语言, 因此只能在Keil C51软件上编写与编译, 因此我们必须熟悉Keil C51.
Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统, 与汇编相比, C语言在功能上、 结构性、 可读性、 可维护性上有明显的优势, 因而易学易用。Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具, 全windows界面。
Keil C51的使用步骤如下:
( 1) 驱动软件
( 2) 新建工程
( 3) 选择CPU
( 4) 添加源程序文件
( 5) 编写程序
( 6) 设置开发环境参数
( 7) 编译源程序, 烧录文件
编译成功后会生成HEX文件, 该文件能够被载入并最终烧录到具体芯片中。
本次设计用的是C语言, 用C51编程有很多优点:
( 1) C51可管理内部寄存器和存储器, 编程时, 无须考虑不同存储器的寻址和数据类型等细节问题;
( 2) 程序由若干函数组成, 具有良好的模块化结构;
( 3) 有丰富的子程序库可直接引用, 从而大大减少用户编程的工作量。
4.2 Proteus 的使用介绍
Proteus ISIS是英国Labcenter公司开发的电路分析与实物仿真软件。它运行于Windows操作系统上, 能够仿真、 分析(SPICE)各种模拟器件和集成电路。
该软件的特点是:
( 1) 全部满足我们提出的单片机软件仿真系统的标准, 并在同类产品中具有明显的优势。
( 2) 具有模拟电路仿真、 数字电路仿真、 单片机及其外围电路组成的系统的仿真、 RS-232动态仿真、 I2 C调试器、 SPI调试器、 键盘和LCD系统仿真的功能; 有各种虚拟仪器, 如示波器、 逻辑分析仪、 信号发生器等。
( 3) 当前支持的单片机类型有: ARM7系列、 68000系列、 8051系列、 AVR系列、 PIC12系列、 PIC16系列、 PIC18系列、 Z80系列、 HC11系列以及各种外 围芯片。
( 4) 支持大量的存储器和外围芯片。
总之, 该软件是一款集单片机和SPICE分析于一身的仿真软件, 功能极其强大 , 可仿真ARM、 51、 AVR、 PIC。
Proteus启动画面: 如图4-1所示
图 41Proteus启动画面
4.3 Proteus仿真结果
图4-2为调节秒钟:
图 42
图4-3为调节分钟:
图 43
图4-4为调整时钟:
图 44
图4-5为调节年:
图 45
图4-6为调节月:
图 46
图4-7调节日期:
图 47
图4-8修改成功界面:
图 48
图4-9修改成功后显示界面:
图 49
5 课程设计总结与体会
课程设计考验我们掌握的知识, 包括单片机的基本知识、 C语言或者汇编语言的程序编写、 Keil C51的使用和Proteus的使用。另一方面也考验我们的动手能力和意志。课设过程中由于各种因素的影响我们不可能一帆风顺, 我们需要一颗坚定的心再加上细心, 这样才能克服种种困难, 完成老师布置的任务。
在设计过程中, 我遇到问题首先想到的是从书本或者网上解决问题, 一般的问题也总能解决。在遇到很难解决的问题时又会想到老师如果在身边多好啊, 可是我知道老师也很忙, 不能照顾到每个同学。后来我有难题就会去请教张辉其同学, 在此感谢她。同时感谢陈老师平时的悉心教导, 感谢学校和学院给我们这么一次课设的机会锻炼我们。
6 参考文献
[1]侯玉宝编《基于Proteus的51系列单片机设计与仿真》电子工业出版社
[2]秦实宏、 徐春辉主编《MCS-51单片机原理及应用》华中科技大学出版社
[3]陈正振 编 电子电路设计与制作 广西交通职业技术学院信息工程系
[4]Proteus 仿真论坛
7 附录一
7.1 Common.h头文件
#ifndef _COMMON_INCLUDED_
#define _COMMON_INCLUDED_
#define uchar unsigned char
#define uint unsigned int
#include <AT89X52.h>
//lcd12864函数
extern void Delay_LCD(uint t); //5ms
extern void Delay_ms(uint t);
extern void LCD_Read_busy();
extern void LCD_Write_com(uchar com);
extern void LCD_Write_date(uchar date);
extern void LCD_Reset();
extern void LCD_ON();
extern void LCD_OFF();
extern void INIT_LCD();
extern void LCD_Write_byte(uchar xpos,uchar ypos,uchar byte);
extern void LCD_Clear();
extern void LCD_Write_char(uchar xpos,uchar ypos,uchar *byte);
extern void LCD_Write_char_16x16(uchar hz_xpos,uchar hz_ypos,uchar *hz_source_addr);
extern void LCD_Write_char_8x16(uchar hz_xpos,uchar hz_ypos,uchar *hz_source_addr);
extern void LCD_Write_char_8x8( uchar xpos , uchar ypos , uchar *hz_source_addr);
extern void LCD_Write_str_8x16(uchar x, uchar y, uchar num, uchar *str);
extern void LCD_Write_num(uchar x, uchar y, uchar str);
extern void LCD_Write_hanzi_str(uchar x, uchar y, uchar num, uchar *str);
extern void LCD_Write_jiemian();
extern void LCD_Write_Ds1302_shuju();
extern void LCD_Write_qingsuru(void);
extern void LCD_Write_riqi(uchar i);
extern void LCD_Write_xiugaichenggong(void);
//DS1302函数
//读数据定义
#define YEAR_R 0x8D//读年数据;
#define DAY_R 0x8B//读星期数据;
#define MONTH_R 0x89//读月数据;
#define DATE_R 0x87//读日数据;
#define HR_R 0x85//读小时数据;
#define MIN_R 0x83//读分数据;
#define SEC_R 0x81//读秒数据;
#define CONTROL_R 0x8F//读制数据;
#define TRICKLE_CHARGER_R 0x91//读充电 制数据;
#define CLOCK_BURST_R 0xBF//读时充多字节数据;
#define RAM_BURST_R 0xFF//读RAM字符组数据;
extern void Write_DS1302(uchar Command,uchar Value);
extern uchar Read_DS1302(uchar Command);
extern void Write_1302_time(uchar *time);
extern void Read_1302_time(uchar time[]);
extern void Init_DS1302(void);
#endif
7.2 Main.c文件
#include "common.h"
sbit up=P3^0;
sbit down=P3^1;
sbit key_q=P3^2;
void keyjpress();
uchar Times_buffer[6]={0};
void keyjpress();
void KEY_up_down(uchar count);
void main()
{
INIT_LCD();
LCD_Clear();
Init_DS1302();
LCD_Write_jiemian();
while(1)
{
LCD_Write_Ds1302_shuju();
keyjpress();
}
}
void keyjpress() //按键处理
{
if(key_q == 0)
{
Delay_ms(10);
if(key_q == 0)
{
uchar i = 6;
while(key_q==0);//设定时间界面
for(i=6;i!=255;i--)
{
uchar high = 0, low = 0;
if(i !=5)
{
LCD_Clear();
Times_buffer[i]=1;
while(!key_q);
while(key_q)
{
LCD_Write_qingsuru();//显示请输入
switch(i)
{
case 6:LCD_Write_riqi(5);break;//年
case 4:LCD_Write_riqi(4);break;//月
case 3:LCD_Write_riqi(3);break;//日
case 2:LCD_Write_riqi(2);break;//时
case 1:LCD_Write_riqi(1);break;//分
case 0:LCD_Write_riqi(0);break;//秒
default:break;
}
high = Times_buffer[i]/10;
low = Times_buffer[i]%10;
LCD_Write_num(9,0,high);//显示值
LCD_Write_num(10,0,low);
KEY_up_down(i);
}
}
}
Write_1302_time(Times_buffer);//使时间生效
LCD_Write_xiugaichenggong();
Delay_ms(500);
LCD_Clear();
LCD_Write_jiemian();
}
}
}
void KEY_up_down(uchar count) //加减键处理
{
if(up==0)
{
Delay_ms(10);
if(up==0)
{
while(!up);
switch(count)
{
case 0://秒
Times_buffer[0]+=1;
if(Times_buffer[0]>59)
Times_buffer[0]=0;
break;
case 1://分
Times_buffer[1]+=1;
if(Times_buffer[1]>59)
Times_buffer[1]=0;
break;
case 2://时
Times_buffer[2]+=1;
if(Times_buffer[2]>23)
Times_buffer[2]=0;
break;
case 3://日
Times_buffer[3]+=1;
if(Times_buffer[3]>31)
Times_buffer[3]=1;
break;
case 4://月
Times_buffer[4]+=1;
if(Times_buffer[4]>12)
Times_buffer[4]=1;
break;
case 6://年
Times_buffer[6]+=1;
if(Times_buffer[6]>99)
Times_buffer[6]=0;
break;
}
}
}
if(down==0) //减键处理
{
Delay_ms(10);
if(down==0)
{
while(!down);
switch(count)
{
case 0:
Times_buffer[0]-=1;
if(Times_buffer[0]==255)
Times_buffer[0]=59;
break;
case 1:
Times_buffer[1]-=1;
if(Times_buffer[1]==255)
Times_buffer[1]=59;
break;
case 2:
Times_buffer[2]-=1;
if(Times_buffer[2]==255)
Times_buffer[2]=23;
break;
case 3:
Times_buffer[3]-=1;
if(Times_buffer[3]<1)
Times_buffer[3]=31;
break;
case 4:
Times_buffer[4]-=1;
if(Times_buffer[4]<1)
Times_buffer[4]=12;
break;
case 6:
Times_buffer[6]-=1;
if(Times_buffer[6]==255)
Times_buffer[6]=99;
break;
}
}
}
}
7.3 DS1302.c文件
#ifndef DS1302_H
#define DS1302_H
#include "common.h"
//管脚定义
sbit DS_IO = P2^6;
sbit DS_CLK = P2^5;
sbit DS_RST = P2^7;
//设置时间,time[0]-time[6]数据存放顺序为:秒,分,时,日,月,星期,年
unsigned char Times[7]={00,58,15,15,5,1,11};
/***************************************************************
函数名: void Write_DS1302(uchar Command,uchar Value)
参数: Command=0写命令, Command=1写数据 , Value要写入的值
功能: 向DS1302中写命令或数据
返回: 无
***************************************************************/
void Write_DS1302(uchar Command,uchar Value)
{
uchar i = 0;
DS_RST = 0;
DS_CLK = 0;
DS_RST = 1;
for(i = 0; i < 8; i++)
{
DS_IO = Command & 0x01;
DS_CLK = 0;
DS_CLK = 1;
Command >>= 1;
}
for(i = 0; i < 8; i++)
{
DS_IO = Value & 0x01;
DS_CLK = 0;
DS_CLK = 1;
Value >>= 1;
}
}
/***************************************************************
函数名: uchar Read_DS1302(uchar Command)
功能: 读DS1302 中的数据或状态
返回: 读到的数据或状态值
***************************************************************/
uchar Read_DS1302(uchar Command)
{
uchar i = 0;
uchar Value = 0;
DS_RST = 0;
DS_CLK = 0;
DS_RST = 1;
for(i = 0; i < 8;i ++)
{
DS_IO = Command & 0x01;
DS_CLK = 0;
DS_CLK = 1;
Command >>= 1;
}
for(i = 0; i < 8;i ++)
{
DS_CLK = 1;
DS_CLK = 0;
if(DS_IO)
{
Value |= 0x01 << i;
}
}
DS_RST = 0;
Value = (Value /16 * 10) + Value %16;
return Value;
}
/***************************************************************
函数名: void Write_1302_time(uchar *time)
参数: time存储要设定时间的值
功能: 向Ds1302中写入设定时间值
返回: 无
***************************************************************/
void Write_1302_time(uchar *time)
{
uchar add=0x80; //地址add初值(秒),偶数地址为只写
uchar i;
uchar timeBCD[7]; //用以存放time数据的BCD码值
uchar l,h; //单位变量,分别存放时间数据(8421BCD码)的低4位和高4位
for(i=0;i<7;i++) //将时间数据转为BCD码放入timeBCD中
{
l=time[i]%10;
h=time[i]/10;
timeBCD[i]=h*16+l;
}
Write_DS1302(0x8e,0x00); //打开寄存器写入
for(i=0;i<7;i++)
{
Write_DS1302(add,timeBCD[i]); //将时间数据写入1302对应的寄存器
add+=2; //地址移动,确保地址为偶数
}
Write_DS1302(0x8e,0x80); //关闭写
}
/****************************************************************
函数名: void Read_1302_time(uchar time[])
参数: time存储要设定时间的值
功能: 读取当前时间,存储到Time[]中
返回: 无
****************************************************************/
void Read_1302_time(uchar time[])
{
uchar i;
uchar add=0x81; //设置地址add初值(秒),奇数为只读
uchar l,h; //单位变量,分别存放时间数据(8421BCD码)的低4位和高4位,用以进行十进制转换
for(i=0;i<7;i++)
{
time[i]=Read_DS1302(add); //将时间数据(8421BCD码)从1302对应的寄存器中读出
l=time[i]&0x0f; //l存放time的低4位,即个位
h=(time[i]>>4)&0x0f; //h存放time的高4位,即十位
time[i]=h*10+l; //时间数据以十进制形式放进time[i]中
add+=2; //地址移动,确保地址为奇数
}
}
/***************************************************************
函数名: Init_DS1302(void)
参数: 无
功能: 初始化Ds1302
返回: 无
***********************************
展开阅读全文