资源描述
毕业设计(论文)
题 目:
基于单片机AT89C52实时日历时钟系统设计
学生姓名:
学 号:
所在学院:
机械和电子工程学院
专业班级:
届 别:
指导老师:
皖西学院本科毕业设计(论文)创作诚信承诺书
1.本人郑重承诺:所提交毕业设计(论文),题目《基于单片机AT89C52实时日历时钟系统设计》是本人在指导老师指导下独立完成,没有弄虚作假,没有剽窃、剽窃她人内容;
2.毕业设计(论文)所使用相关资料、数据、见解等均真实可靠,文中全部引用她人见解、材料、数据、图表均已标注说明起源;
3. 毕业设计(论文)中无剽窃、剽窃或不正当引用她人学术见解、思想和学术结果,伪造、篡改数据情况;
4.本人已被通知并清楚:学校对毕业设计(论文)中剽窃、剽窃、弄虚作假等违反学术规范行为将严厉处理,并可能造成毕业设计(论文)成绩不合格,无法正常毕业、取消学士学位资格或注销并追回已发放毕业证书、学士学位证书等严重后果;
5.若在省教育厅、学校组织毕业设计(论文)检验、评选中,被发觉有剽窃、剽窃、弄虚作假等违反学术规范行为,本人愿意接收学校按相关要求给处理,并负担对应责任。
学生(署名):
日期: 年 月 日
目 录
1 绪论 2
2 设计思绪 2
2.1 硬件设计思绪 2
2.2 软件设计思绪 3
3 硬件电路设计 3
3.1 系统结构框图 3
3.2单片机AT89C52介绍 3
3.3 时钟芯片DS1302接口设计和性能分析 4
3.5 按键模块设计 7
3.6 复位电路模块设计 7
4 软件设计 8
4.1 主程序运行步骤图及说明 8
4.2 时钟芯片DS1302软件设计及步骤图 9
4.3 按键控制及步骤图 11
4.4 1602LCD操作说明及步骤图 12
5 系统仿真和结果分析 14
5.1 用Proteus仿真及结果 14
5.2 实物制作 15
5.3 误差分析 16
总结 17
参考文件: 18
致 谢 19
基于单片机AT89C52实时日历时钟系统设计
学生: (指导老师: )
(皖西学院机械和电子工程学院)
摘 要:日历时钟是一个常见用具,它渗透到我们生产、生活、学习中每一个角落,一个性能正确、功效齐全、外表美观日历时钟对我们工作、学习生活起着很关键作用。本文设计一个实时日历时钟系统,它以单片机AT89C52为主控制器,以DS1302日历时钟芯片,以1602LCD数码管为显示器件,再配以合适外围电路,含有显示正确、调整方便、高可靠性、高性价比、低电压、低功耗等优点。
关键词:AT89C52单片机;DS1302;1602LCD数码管显示;时钟
Design of real time calendar clock system based on single chip microcomputer AT89C52
Student:WangXiang(Guidance teacher:ZhouTongxu)
(College of mechanical and electronic engineering of West Anhui University)
Abstract:In the 51 single chip microcomputer application system, it is often needed to record real-time information and long-term preservation. For example, at the time of data acquisition, for some important information requires not only record the content, also need the exact time of the records the event; single chip microcomputer for the high reliability, high price, low voltage, low power consumption, and a series of advantages, in recent years get rapid development and promotion of a wide range, is widely used in industrial control systems, communications equipment, daily consumption class products and toys . This design uses the AT89C52 single chip microcomputer as well as the DS1302 calendar clock chip to realize the design of the calendar clock.The design results show that the design of real time clock based on DS1302 through the1602LCD digital tube display system can meet the design requirement.
Key Words: 52 Microcontroller;DS1302;1602LCD digital tube display;clock
1 绪论
时间和人类生活紧密相连,是一个关键参数。这个参数不管什么时候全部是很关键,少了时间这个参数,社会进步也会随之变得缓慢,足以可见对时间研究是很有必需。
此次设计功效是在51系列单片机系统中设置、获取、统计实时日历时钟信息并经过数码管显示,要求能够进行长时间统计,而且在断电情况下,还能继续保对时间回去和统计。
实时显示能够经过软件编程实现,但这种方法需要编制程序复杂,代码多且单片机软件开销大,时间信息也不宜长久保留。而采取专用实时时钟芯片能够避免这些问题,而且能够非易失地长久保留时间信息,所以,在设计中选择使用专用芯片来实现日历时钟显示系统。
依据功效模块划分,本系统包含3个部分:
1) 51单片机模式块:其作用是和外围时钟芯片通信,并控制数据传输过程,采集时间信息并给予处理;
2) 日历时钟模块:此模块由专用实时时钟芯片组成,它是本设计关键模块,由它提供实时日历时钟信息;
3) 数码管显示模块:此模块用于实时日历时钟信息显示;
程序部分包含单片机和时钟芯片接口程序(实现单片机和时钟芯片之间数据传输过程)和数码管显示程序。
2 设计思绪
2.1 硬件设计思绪
因为系统要实现功效比较简单,关键是采集实时日历时间及闹钟设置,所以,硬件设计思绪很清楚。采取AT89C52芯片作为硬件关键,含有在线编程可擦除技术,当在对电路进行调试时,因为程序错误修改或对程序新增功效需要烧入程序时,不需要对芯片数次拔插,所以不会对芯片造成损坏。
采取DS1302时钟芯片实现时钟,DS1302芯片是一个高性能时钟芯片,可自动对秒、分、时、星期、日、周、月、年和闰年赔偿年进行计数,而且精度高位RAM作为数据暂存区,工作电压2.5V~5.5V范围内,2.5V时耗电小于300nA.故采取DS1302作为时钟芯片。
当然,其它外接电路中显示器及按键等硬件设计全部很简单了。本设计采取是1602LCD液晶显示器。它是一个专门用来显示字母、数字、符号等点阵型液晶模块,能很好地显示出本设计要求结果(对实时日历时钟显示)。
2.2 软件设计思绪
整个单片机应用系统是一个整体。在应用系统整体设计时,软件和硬件要统一考虑进来。其中软件设计要依据系统要达成功效要求,将其分为若干个独立模块,画出程序步骤图。依据系统特点和考虑实际情况选择编程语言。通常选择汇编语言和C语言。汇编语言对硬件操作方便,程序代码短;C语言功效较多,表示能力好,使用方便,在应用方面也很广,程序效率高,移植性韧度好,现在很多单片机全部是用C语言作为编程语言。
软件系统设计时,要分配好系统资源。一个单片机系统资源关键是片内和片外资源,前者是指单片机内部中央处理器、程序储存器、书数据储存器、定时/计数器、串行口、并行口等。所以,在设计时候要分出各个独立模块设计软件。本设计应该把单片机分为单片机AT89C52主程序、时钟芯片DS1302软件设计、1602LCD设计和其它外接电路模块。这么,对此次设计又有一定程度简化。
3 硬件电路设计
本设计硬件电路设计关键是围绕日历时钟芯片DS1302使用进行。
3.1 系统结构框图
本设计硬件电路包含单片机电路、日历时钟芯片电路和数码管显示输出电路,其结构框图图1所表示。
图1系统硬件结构框图
3.2单片机AT89C52介绍
单片机选择美国ATMEL企业生产AT89C52单片机。AT89C52是美国ATMEL企业生产低电压,高性能CMOS8位单片机,片内含8k bytes可反复擦写只读程序存放器(PEROM)和256 bytes随机存取数据存放器(RAM),器件采取ATMEL企业高密度、非易失性存放技术生产,和标准MCS-51指令系统及8052产品引脚兼容,片内置通用8位中央处理器(CPU)和Flash存放单元,功效强大AT89C52单片机适合于很多较为复杂控制应用场所。AT89C52单片机引脚分布图2所表示。
图2 AT89C52单片机引脚分布图
3.3 时钟芯片DS1302接口设计和性能分析
DS1302是Dallas企业生产一个实时时钟芯片。它和单片机连起来,向单片机传送年、月、日、时、分、秒功效。它还拥有用于主电源和备份电源双电源引脚,在没有主电源情况下,也能保持时钟连续运行。另外,它还能提供31字节用于高速数据暂存RAM。
表1 DS1302引脚功效
X1,X2
32.768kHz晶振引脚
GND
地线
RST
复位端
I/O
数据输入/输出端口
SCLK
串行时钟端口
VCC1
慢速充电引脚
VCC2
电源引脚
图3 内部链接
DS1302时钟芯片内关键包含移位寄存器、控制逻辑电路、振荡器。DS1302和单片机系统数据传送依靠RST,I/O,SCLK三根端线即可完成。其工作过程可概括为:首先系统RST引脚驱动至高电平,然后在SCLK时钟脉冲作用下,经过I/O引脚向DS1302输入地址/命令字节,随即再在SCLK时钟脉冲配合下,从I/O引脚写入或读出对应数据字节。DS1302引脚排列如表1及内部结构图图3所表示。
3.4 DS1302接口电路设计
1、时钟芯片DS1302接口电路及工作原理:
图4 DS1302时钟模块
图4为DS1302接口电路,其中Vcc1为后备电源,Vcc2为主电源。VCC1为提供低功率电池备份。VCC2在双电源系统中提供主电源,在这种利用方法中VCC1连接到备份电源,方便在没有主电源情况下能保留时间信息和数据。
另外,DS1302由VCC1或VCC2 二者中较大者供。
DS1302在每次进行读、写程序前全部必需初始化,先把SCLK端置 “0”,接着把RST端置“1”,最终才给SCLK脉冲;读/写时序以下图5所表示。表-1为DS1302控制字,此控制字位7必需置1,若为0则不能对DS1302进行读写数据。对于位6,若对时间进行读/写时,CK=0,对程序进行读/写时RAM=1。位1至位5指操作单元地址。位0是读/写操作位,进行读操作时,该位为1;进行写操作时,该位为0。控制字节总是从最低位开始输入/输出。表-2为DS1302日历、时间寄存器内容:“CH”是时钟暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位为0时,时钟开始运行。“WP”是写保护位,在任何对时钟和RAM写操作之前,“WP”必需为0。当“WP”为1时,写保护位预防对任一寄存器写操作。
2、DS1302控制字
DS1302控制字如表2所表示。控制字节高有效位(位7)必需是逻辑1,假如它为0,则不能把数据写入DS1302中,位6假如0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元地址;最低有效位(位0)如为1表示进行读操作,为0表示进行写操作。[5]控制字节总是从最低位开始输出。
表2 DS1302控制字格式
1
RAM/CK
A4
A3
A2
A1
A0
RD/WR
3、数据输入输出(I/O)
在控制指令字输入后下一个SCLK时钟上升沿时,数据被写入DS1302,数据输入从低位即位0开始。一样,在紧跟8位控制指令字后下一个SCLK脉冲下降沿读出DS1302数据,读出数据时从低位0位到高位7。图5所表示:
图5 DS1302读/写时序图
4、DS1302寄存器
DS1302有12个寄存器,其中有7个寄存器和日历、时钟相关,存放数据位为BCD码形式,其日历、时间寄存器及其控制字见表3。
表3 DS1302日历、时间寄存器
写寄存器
读寄存器
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
80H
81H
CH
10秒
秒
82H
83H
10分
分
84H
85H
12/24
0
10
时
时
AM/PM
86H
87H
0
0
10
日
日
8A
8B
0
0
0
0
0
星期
8C
8D
年
8EH
8FH
WP
0
0
0
0
0
0
0
另外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及和RAM相关寄存器等。时钟突发寄存器可一次性次序读写除充电寄存器外全部寄存器内容。 DS1302和RAM相关寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方法下RAM寄存器,此方法下可一次性读写全部RAM31个字节,命令控制字为FEH(写)、FFH(读)。
3.5 按键模块设计
本系统采取了5个按键,其中4个采取独立按键,因为这种方法查询方便,程序简单,可节省CPU资源,按键电路图6所表示,4个独立按键分别和AT89C52P3.3、P3.4、P3.5、P3.6接口相
图6 按键电路
对图6中各个按键做一下说明:
set键:按下SET键进入时间校准状态,按一下显示时间调整,按两下显示年月日调整;
up键:当按下set键后,up进行set选定项(如:分钟)加操作;
down键:当按下set键后,down进行set选定项(如:分钟)减操作;
chose键:当按下set键后,chose就会对年月日,时分秒某一位进行正确调整;
3.6 复位电路模块设计
当AT89C52单片机复位引脚RST出现2个机器周期以上高电平时,单片机就实施了复位操作。若ST连续为高电平,单片机就处于循环复位,从而无法实施程序。而本系统选择是12MHz晶振,所以一个机器周期为1μs,那么复位脉冲宽度最小应为2μs。在实际应用系统中,考虑到电源稳定时间,参数漂移,晶振稳定时间和复位可靠性等原因,必需有足够余量。图7位晶振电路所表示:
本设计采取上电且开关复位电路,图8所表示上电后,因为电容充电,使RST连续一段高电平时间。当单片机已在运行之中时,按下复位键也能使RST连续一段时间高电平,从而实现上电且开关复位操作。通常选择C=10~30μF,本设计采取电容值为20μF电容和电阻为100欧电阻。
图7 晶振电路
图8 复位电路
4 软件设计
4.1 主程序运行步骤图及说明
在进行微机控制系统设计时,除了系统硬件设计外,大量工作就是怎样依据每个生产对象实际需要设计应用程序。所以,软件设计在微机控制系统设计中占关键地位。
在单片机控制系统中,大致上可分为数据处理、过程控制两个基础类型。数据处理包含:数据采集、数字滤波等。过程控制程序关键是使单片机按一定方法进行计算,然后再输出,方便控制实现想要结果。
为了实现此次设计任务,在进行软件设计时,通常把整个过程分成若干个部分,每一部分叫做一个模块。所谓“模块”,实质上就是所完成一定功效,相对独立程序段,这种程序设计方法叫模块程序设计法。
模块程序设计法对本设计完成好处是:单个模块比起一个完整程序易编写及调试;模块能够共存,一个模块能够被多个任务在不一样条件下调用;模块程序分割任务和利用已经有程序,来简化完成设计要求。本系统软件采取模块化结构,关键由主程序﹑DS1302子程序及键盘控制子程序组成。图9为主程序步骤图所表示:
开始
系统初始化
调整时分秒
欢迎界面
显示主界面
按键调整
按键调整
调整年月日
是否调整
显示时间
是
否
是
是
否
否
图9 主程序步骤图
4.2 时钟芯片DS1302软件设计及步骤图
本系统时间显示起源于DS1302对单片机实施,二者连接需要3根线,CLK(7)、I/O(6)、RST(5),具体连接图见系统硬件设计原理图图10所表示:
图10 单片机和DS1302连接
进入主程序后,DS1302优异行初始化设置,若串行口有数据,最终则调用函数从日历时钟芯片获取日历时钟信息,调用显示函数显示日历时钟信息显示出来,反复进行。这部分包含对DS1302某个单元写、读DS1302某个单元内容和对DS1302设定时间。
在DS1302时钟日历或RAM进行数据传送时,DS1302必需首先发送命令字节。若进行单字节传送,8位命令字节传送结束以后,在下2个SCLK周期上升沿输入数据字节,或在下8个SCLK周期下降沿输出数据字节。
读、写DS1302数据步骤图图11所表示 :
开始
变量初始化
使DS1302不含有写保护
复位端产生一个高电平
写1302地址
延时一段时间
地址数据写出
地址增加
写完地址?
复位端产生一个高电平
读1302地址
延时一段时间
将该地址数据读出
地址增加
显示数据
数据读完?
否
是
是
否
图11读写DS1302数据步骤图
其中DS1302读写程序见附录1。
4.3 按键控制及步骤图
当set键按下时,秒位置闪烁。每次按下set键按下时,分别在秒、分、时、日、月、年处闪烁。当set键再次按下时,加一或减一键有效并在对应位置加一或减一。比如选定分位,按下增大键,调整显示分位增加,当秒增加至满60后,自动清零,同时调整一
次送至下一位显示,显示位置重新回到调整处;当按下减小键时,调整显示位秒减小,当秒减至0后,自动跳转为59,同时调整一次送至下一位显示,显示位置重新回到调整处;年月日时分调整只需要按chose键进行选择调整位置,调整方法一样。键盘加一减一步骤图图12所表示
开始
光标定位分单元
Fen =59
=
Fen =0
=
Fen =-1?
=
Fen=60?
=
Fen -1
=
Fen+1
=
减小键按down
增大键按下up
Y
功效键set按下?
写入分
图12 键盘加一减一操作步骤图
4.4 1602LCD操作说明及步骤图
显示关键是经过从芯片中读入程序,分别对秒、分、时、星期、日、月、年和闹钟
进行显示,而且经过键盘操作,对时间进行加减操作,使时间更新显示。
进入主函数后,实施完1602LCD初始化函数,然后用write_com(0x80)指令,命令先将数据指针定位在第一行第一个字处,然后写入第一行要显示数据,在每个字之间简短延时;在第二行重新定位数据指针write_com(0x80+0x40),将数据指针定位在第二行,然后再将第二行所要显示数据写入,继而显示。
1602LCD写命令操作和写数据操作分别用两个独立函数来完成,函数内部唯一区分就是液晶数据命令选择端电平。
写命令函数解释以下:
void write_com(uchar com) //向液晶写入命令
{
rs=0; //选择写命令模式
lcden=0; //使能端置零
P0=com; //将要写命令送到数据总线上
delay(3); //延时,以待数据稳定
lcden=1; //给使能端一个高脉冲
delay(3); //延时
lcden=0; //将使能端置零,以完成高脉冲
}
写数据函数操作以下:
void write_date(uchar date) //向液晶写入数据
{
rs=1; //选择写数据模式
lcden=0; //使能端置零
P0=date; //将要写数据送到数据总线上
delay(3); //延时,以待数据稳定
lcden=1; //给使能端一个高脉冲
delay(3); //延时
lcden=0; //将使能端置零,以完成高脉冲
}
1602LCD初始化以下:
write_com(0x38); //1602液晶初始化
write_com(0x0c); //开光标闪烁:0x0f,关光标闪烁:0x0c
write_com(0x06); //写一个字符后,地址指针自动加1
write_com(0x01); //显示清0,数据指针清0
1602LCD步骤图图13所表示。
开始
1602初始化
读取数据 第一行显示
读取数据 第二行显示
结束
图13 1602LCD步骤图
5 系统仿真和结果分析
5.1 用Proteus仿真及结果
Proteus是是英国Lab Center Electronics企业出版一个能很好仿真单片机软件。所以,仿真软件选择就是Proteus。
因为在元件库版本比较低,没有1602LCD这个元件,所以,采取共阳极和共阴极断码器7SEG-MPX-CA和7SEG-MPX-CC替换1602LCD来仿真。所以,此时总程序见附录2。
当按下set键时,系统进入另一模式,系统最优异入是时分秒调整,按下chose进入具体某一位(时或分或秒)调整。继续按set键,进入年月日调整,按下chose,进
入某一位(年或月或日)调整。图14所表示为Proteus仿真显示
图14 用Proteus仿真结果显示时间和日期
仿真开始时输入是电脑时间,图15所表示:
图15 仿真开始时输入电脑时间
按下set键,调整时间仿真图16所表示:
图16 仿真调整时间
5.2 实物制作
因为在制作实物过程中用断码器7SEG-MPX-CA和7SEG-MPX-CC引脚比较多,而且显示为闪动,可能实物和仿真对比误差较大,所以,实物制作还是采取1602LCD作为显示器。图17为制作好日历时钟。
图17 制作好日历时钟电路板
5.3 误差分析
在实际制作中有很大影响原因,比如电容损坏、电源稳定性、晶振稳定时间或复位可靠性等各方面原因,全部可能造成制作实物和用Proteus仿真出来结果会有一定差距。而且仿真图就是一个模拟用,和实际效果是有点差异,仿真中没有晶振电路和复位电路全部是能够工作,焊接是根据原理图来而不是仿真.所以,在实际制作过程中要留部分余量。
总结
本设计硬件电路较简单,所用器件较少,电路中使用AT89C52单片机、DS1302时钟显示芯片等关键器件,实现计时、校时功效。
在整个设计过程中,硬件方面关键设计了AT89C52单片机最小系统、DS1302接口电路;软件方面借助各个渠道资料。系统调试关键是经过一块AT89C52开发板,再借助于Proteus和少许自己搭建外围电路实现;再此过程中,分步调试时显示出了日期、时间及闹钟,集中调试时没有达成预期效果。此次设计万日历时钟含有读显示直观、电路简练、成本低廉等很多优点,符合电子仪器仪表发展趋势,含有宽广市场前景。
在对芯片管脚功效和使用方法有充足了解后,依据设计要求设计硬件电路,包含单片机控制电路、时钟电路、显示电路、供电电路、键盘电路、复位电路。然后经过软件编程,实现了对年、月、日、时、分、秒及闹钟自动调整,用按键进行控制,用液晶模块进行显示。
在整个设计过程中学到了很多处理事情方法,在电路焊接时即使没什么大问题,不过从焊接过程中也知道了焊接在整个作品中关键性,电路模块比较多,焊接比较复杂,不能心急,慢慢来不能急于求成。反而达成事半功倍效果。在编写程序代码时候,因为思绪开始比较模糊,碰到过很多问题,经过静下心来思索,理清了思绪,问题就迎刃而解。在此次设计中,知道了做事要有持之以恒决心和一步一个脚印耐心,这么才能做好一件事情。实时日历时钟能够正常显示时间并进行时间调整,基础完成了预期要实现目标。
参考文件:
[1]陈明荧. 8051单片机课程设计实训教程[M].北京:清华大学出版社,:11-13.
[2]苏平.单片机原理和接口技术[M].北京:电子工业出版社,:1-113.
[3]王忠民.微型计算机原理[M].西安:西安科技大学出版社,:15-55.
[4]何立民.单片机高级教程[M].北京:北京航空航天大学出版社,:25-125.
[5]纪宗南.单片机外围器件使用手册[M].北京:北京航空航天大学出版社,:622-655.
[6]周雪.模拟电子技术[M]西安: 西安电子科技大学出版社,:81-95.
[7]左金生.电子和模拟电子技术[M].北京:电子工业出版社,:105-131.
[8]马忠梅,籍顺心等.单片机C语言应用程序设计[M].北京航空航天大学出版社, :123-189.
[9]新编单片机原理和应用(第二版).西安电子科技大学出版社,:126-239.
[10]张萌.单片机应用系统开发综合实例[M].北京:清华大学出版社,:127-298.
[11]王越明.电子万年历设计[J].黑龙江科技信息,:166-135.
致 谢
首先,在这里感谢学校给我们安排这次课程设计,使我有一个能够自己动手学习机会。经过动手实践,我学习到了很多书本以外知识,体会到了自己亲自动手做出结果喜悦。
其次,在这要感谢我们可敬可爱老师,即使老师工作繁忙,但还是会时常关注学生课设进展,并给出很多宝贵点拨,帮助我们处理了很多技术上难题。老实说,没有老师悉心指导,就不会有我今天作品。
最终,我还要感谢这次设计中给我帮助同学,是你们帮助,我才能顺利完成毕业设计任务。谢谢你们帮助!
附录1
#ifndef _DS1302_H_
#define _DS1302_H_
/******************
ds1302 内部RAM RAM0 1100 000R/W 1读 0写
RAM1 1100 001R/W
.......
RAM30 1111 110R/W
********************/
sbit clk = P1^3; //ds1302时钟线定义
sbit io = P1^4; //数据线
sbit rst = P1^5; //复位线
//秒 分 时 日 月 年
uchar code write_add[]={0x80,0x82,0x84,0x86,0x88,0x8c,0x8a}; //写地址
uchar code read_add[] ={0x81,0x83,0x85,0x87,0x89,0x8d,0x8b}; //读地址
uchar code init_ds[] ={0x58,0x00,0x00,0x01,0x01,0x13,0x1};
uchar miao,fen,shi,ri,yue,week,nian;
uchar i;
uchar open1;
/*************写一个数据到对应地址里***************/
void write_ds1302(uchar add,uchar dat)
{
rst = 1; //把复位线拿高
for(i=0;i<8;i++)
{ //低位在前
clk = 0; //时钟线拿低开始写数据
io = add & 0x01;
add >>= 1; //把地址右移一位
clk = 1; //时钟线拿高
}
for(i=0;i<8;i++)
{
clk = 0; //时钟线拿低开始写数据
io = dat & 0x01;
/*************把要时间 年月日 全部读出来***************/
void read_time()
{
miao = read_ds1302(read_add[0]); //读秒
fen = read_ds1302(read_add[1]); //读分
shi = read_ds1302(read_add[2]); //读时
ri = read_ds1302(read_add[3]); //读日
yue = read_ds1302(read_add[4]); //读月
nian = read_ds1302(read_add[5]); //读年
// n_nian = year_moon ;
// n_yue = month_moon ;
// n_ri = day_moon ;
}
/*************把要写时间 年月日 全部写入ds1302里***************/
void write_time() //把时间写进去
{
write_ds1302(0x8e,0x00); //打开写保护
write_ds1302(write_add[0],miao); //写秒
write_ds1302(write_add[1],fen); //写分
write_ds1302(write_add[2],shi); //写时
write_ds1302(write_add[3],ri); //写日
write_ds1302(write_add[4],yue); //写月
write_ds1302(write_add[6],week); //写年
write_ds1302(0x8e,0x80); //关闭写保护
}
/*************把数据保留到ds1302 RAM中**0-31*************/
void write_ds1302ram(uchar add,uchar dat)
{
add <<= 1; //地址是从第二位开始
add &= 0xfe; //把最低位清零 是写命令
add |= 0xc0; //地址最高两位为 1
write_ds1302(0x8e,0x00);
write_ds1302(add,dat);
write_ds1302(0x8e,0x80);
}
/*************把数据从ds1302 RAM读出来**0-31*************/
uchar read_ds1302ram(uchar add)
{
add <<= 1; //地址是从第二位开始
add |= 0x01; //把最高位置1是读命令
add |= 0xc0; //地址最高两位为 1
return(read_ds1302(add));
}
/*************初始化ds1302时间***************/
void init_ds1302()
{
uchar i;
rst = 0; //第一次读写数据时要把IO品拿低
clk = 0;
io = 0;
i = read_ds1302ram(30);
fen1 = read_ds1302ram(1);
shi1 = read_ds1302ram(2);
open1 = read_ds1302ram(3);
read_time(); //读时间
if(miao >= 0x60)
{
write_ds1302(0x8e,0x00); //打开写保护
write_ds1302(write_add[0],init_ds[0]);//许可ds1302工作
write_ds1302(0x8e,0x80); //关写保护
}
}
/**********************设置ds1302时间函数**********************/
void set_ds1302time(uchar num,uchar *shi,uchar dat) //调时
{
if(num == 1)
{
*shi+=0x01;
if((*shi & 0x0f) >= 0x0a)
*shi = (*shi & 0xf0) + 0x10;
if(*shi >= dat)
*shi = 0;
}
else
展开阅读全文