ds1302
中文DS1302充电

DS1302充电选择一个二极管和一个电阻(2K) 充电电流约 2.2mA选择一个二极管和一个电阻(4K) 充电电流约 1.1mA选择一个二极管和一个电阻(8K) 充电电流约0.5mADS1302属于涓流充电,所以充电电流小,一个3.6V/80mA的充电电池使用2.2mA充满约36个小时涓流充电控制器2-3位: DS=01 为一个二极管DS=10 为二个二极管DS=00 无二极管,不能充电DS=11 无二极管,不能充电0-1位: RS=00 无电阻,不能充电RS=01 2KRS=10 4KRS=11 8K4-7位: TCS=1010 能充电其它组合都不能充电10100101 一个二极管电阻2K10100110 一个二极管电阻4K10100111 一个二极管电阻8K10101001 两个二极管电阻2K10101010 两个二极管电阻4K10101011 两个二极管电阻8K01011100 初始化电源图1给出了典型的涓流充电器电路,规定涓流充电器寄存器的高四位用于使能涓流充电器,低四位用于选择二极管压差和限流电阻。
下图中,可以在充电通路插入二极管,也可以不使用二极管,可选择的电阻值为250Ω、2kΩ或4kΩ。
有些器件提供了不同的二极管和电阻配置。
电容连接在V BACKUP与地之间(图2)。
用户根据所需要的最大充电电流选择二极管和电阻。
计算充电电流最大充电电流可按以下方法计算:假设3.3V的系统电源加在VCC上,涓流充电器已经使能,没有使用二极管、选择了2kΩ电阻。
当电容电压为零时可以计算出最大充电电流:IMAX = (VCC - 二极管压差)/R2= (3.3V-0V)/R2≈ (3.3V-0V)/2kΩ≈ 1.65mA随着VBACKUP电压的升高,充电电流逐渐减小。
计算备份时间下面,我们需要计算所需要的电容值。
给定所要求的备份时间,我们还需要了解其他几个参数:电容的起始电压和最终电压、从电容吸取的电流以及电容值。
ds1302数字时钟芯片

《DS1302数字时钟芯片》1. 内置电池备份功能,确保时间信息在断电情况下依然准确无误;2. 精度高,每月误差不超过±30秒;3. 支持秒、分、时、日、月、周、年的计时,满足日常生活和工作需求;4. 通过串行通信接口与单片机或其他设备进行数据交换,操作简单;5. 超低功耗设计,节能环保。
下面,让我们详细了解DS1302数字时钟芯片的内部结构、工作原理及实际应用。
《DS1302数字时钟芯片》二、内部结构与关键特性1. 时钟模块:包含了时钟振荡器、分频器以及时钟计数器。
振荡器采用32.768kHz的晶振,保证了时间的精确度。
分频器将振荡器输出的频率分频至1Hz,供时钟计数器使用。
2. RAM存储器:DS1302内置31字节静态RAM,可用于存储临时数据或用户自定义信息,方便在不干扰时钟运行的情况下进行数据保存。
3. 电源管理模块:DS1302具备掉电保护功能,当外部电源断电时,内置的锂电池可以自动为芯片供电,确保时钟正常运行。
4. 串行接口:采用三线接口(时钟线、数据线、复位线),简化了与外部设备的连接,便于实现数据的同步传输。
三、工作原理1. 初始化:通过复位线将DS1302复位,使其进入待命状态,准备接收命令。
2. 命令发送:单片机或其他控制器通过串行接口向DS1302发送命令,包括读/写时钟数据、RAM数据等。
3. 数据交换:在命令发送后,DS1302根据命令类型进行数据读出或写入操作。
数据传输过程中,时钟线控制数据同步,数据线传输数据位。
4. 数据处理:单片机接收到DS1302的数据后,可进行时间显示、闹钟设置等操作。
四、实际应用1. 智能家居:作为时间基准,用于家庭安防、照明、温控等系统的定时控制。
2. 儿童手表:为孩子提供准确的时间显示,便于家长监控和管理孩子的作息。
3. 工业自动化:在生产线控制、设备维护等领域,实现精确的时间记录和任务调度。
4. 环境监测:结合其他传感器,实现对环境数据的实时采集和记录,为环境保护提供数据支持。
ds1302是什么接口,DS1302时钟芯片接口分析详解

ds1302 是什么接口,DS1302 时钟芯片接口分析详解
DS1302 是达拉斯公司出品的一款实时时钟芯片。
主要是针对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。
这篇文章
主要就是说DS1302 的到底是属于什幺接口的,同时分析详解DS1302 时钟芯片的三种接口。
ds1302 是什幺接口
现在来说说DS1302 的SPI 接口(其实比标准的SPI 接口少了一根线),它包含RST 线、SCLK 线、IO 线(双向传送数据用,标准的SPI 则将其分成两根MISO 与MOSI)3 条接线。
上面这张图片就是其时序图,单字节读取和单字节写。
相比1 条线的单总线、2 条线的IIC,这个SPI 貌似是最简单的。
每次传送时,需要先发送。
ds1302晶振频率多少合适,时钟芯片DS1302可靠起振的方法

ds1302 晶振频率多少合适,时钟芯片DS1302 可靠起振的方法DS1302 是时钟,它的频率就是它的计时频率,32.768k 是2 的15 次方,是秒的标准脉冲,按照DS1302 的折算可以转换成精确的时间,进行秒分时日月年的计时,而瓷片电容的作用是在其有误差时进行调整误差,对一般使用者是用不到的,所以不接也行。
时钟芯片DS1302 可靠起振的方法在实际使用中,我们发现DS1302 的工作情况不够稳定,主要表现在实时时间的传送有时会出现误差,有时甚至整个芯片停止工作。
我们对DS1302 的工作电路进行了分析,其与单片机系统的连接如图2 所示。
从图中可以看出,DS1302 的外部电路十分简单,惟一外接的元件是32768Hz 的晶振。
通过实验我们发现:当外接晶振电路振荡时,DS1302 计时正确;当外接晶振电路停振时,DS1302 计时停止。
因此,我们认为32768Hz晶振是造成DS1302 工作不稳定的主要原因。
DS1302 时钟的产生基于外接的晶体振荡器,振荡器的频率为32768Hz。
该晶振通过引脚X1、X2 直接连接至DS1302,即DS1302 是依靠外部晶振与其内部的电容配合来产生时钟脉冲的。
由于DS1302 在芯片本身已经集成了6pF 的电容,所以,为了获得稳定可靠的时钟,必须选用具有6pF 负载电容的晶振。
然而,许多人在选用晶振时仅仅注意了晶振的额定频率值,而忽视了晶振的负载电容大小,甚至连许多经销商也不能提供所售晶振的负载电容。
所以即使在使用中选用了符合32768Hz 的晶振,但如果该晶振的负载电容与DS1302 提供的6pF 不一致时,就会影响晶振的起振或导致振荡频率的偏移,出现上述在应用中的问题。
当所选的晶振负载电容不是6pF 时,可以采用增加辅助电容的方法提高或降低DS1302 振荡器的电容性负载,使之与晶体所需的电容值匹配。
如果已知晶体的负载电容为CI,若CI《6pF,则可以增加一个并联电容CS以产生所需的总负载电容CI,即CI=6pF+CS;若CI》6pF,则可以在晶体的一端增加一个串联电容CS,以产生所需的负载电容CI,即1/CI=1/6pF+1/CS,通过计算即可得出应增加的辅助电容大小。
ds1302芯片

ds1302芯片DS1302芯片是一种实时时钟(RTC)芯片,由Maxim集成电路公司生产。
它是一款非常强大和广泛应用的芯片,具有可靠的性能和低功耗。
本文将对DS1302芯片进行详细介绍。
首先,DS1302芯片主要用于系统中对时间进行实时监控和记录。
它可以精确地记录年、月、日、小时、分钟和秒,并且可以显示星期几。
可以使用8位的数据总线进行通信,方便地与其他设备进行连接。
其次,DS1302芯片具有非常低的功耗。
在正常工作模式下,它只需要2.0V至5.5V的供电电压,并且可以使用电池备份供电,以防止停电时数据丢失。
在备份供电模式下,芯片的功耗非常低,仅为0.2μA。
此外,DS1302芯片具有时钟校正功能。
它可以通过外部的32.768kHz晶体振荡器来校准内部时钟,以确保精准的时间记录。
这样可以减少时间误差,使得芯片的性能更加可靠。
同时,DS1302芯片还具有多种功能。
它支持两种不同的数据格式:BCD(二进制编码十进制)和二进制。
可以根据系统的需求选择不同的格式。
此外,芯片还具有写保护功能,可以防止未经授权的数据修改。
此外,DS1302芯片还具有温度传感器。
它可以测量环境温度,并将结果以数字形式传回主控制器。
这对于需要监控环境温度的应用非常有用。
最后,DS1302芯片可广泛应用于各种电子设备中。
例如,它可以用于电子钟、计时器、温控系统、数据记录器等。
其性能可靠,并具有广泛的兼容性。
总之,DS1302芯片是一款非常强大和广泛应用的实时时钟芯片。
它具有高度精确的时间记录功能、低功耗、时钟校正功能、多种数据格式支持、写保护功能和温度传感器等特点。
通过DS1302芯片,可以为各种电子设备提供准确、可靠的时间显示和记录功能。
DS1302中文手册

I特性★ 实时时钟计算年、月、日、时、分、秒、星期,直到2100年,并有闰年调节功能★ 31 x 8位 通用暂存RAM ★ 串行输入输出使管脚数最少 ★ 2.0V 至 5.5V 宽电压范围操作 ★ 在2.0V 时工作电流小于300nA★ 读写时钟或RAM 数据时有单字节或 多字节(脉冲串模式)数据传送方式 ★ 8管脚 DIP 封装或可选的8管脚 表面安装SO 封装 ★ 简单的3线接口★ 与TTL 兼容 (VCC = 5V)★ 可选的工业温度范围:-40°C to +85°C ★ 与DS1202兼容★ 美国保险商试验室(UL®)认证 订货信息型号 温度范围 管脚封装 顶端标志+表示无铅/符合RoHS 标准的封装.*顶端标识上的N 表示工业温度范围器件,A 表示无铅器件.UL 是美国保险商试验室的注册商标.详细描述DS1302涓流充电计时芯片包含一个实时时钟/日历和31字节的静态RAM.通过简单的串行接口与微处理器通讯.这个实时时钟/日历提供年月日,时分秒信息.对于少于31天的月份月末会自动调整,还有闰年校正.由于有一个AM/PM 指示器,时钟可以工作在12小时制或者24小时制。
使用同步串行通讯简化了DS1302与微处理器的接口。
与时钟/RAM 通讯只需要三根线: CE, I/O (数据线), and SCLK (串行时钟). 数据输出输入时钟/RAM 一次1字节或者在脉冲串中多管脚定义 D S 1302涓流充电计时芯片达31字节. DS1302被设计工作在非常低的电能下,在低于1μW 时还能保持数据和时钟信息. DS1302是DS1202的后继者. 除了DS1202的基本计时功能以外, DS1302有额外特点比如,双管脚主电源和备用电源,可编程涓流充电器V CC1,还附加7字节的暂存器.操作图1显示了串行计时器的主要元素:移位寄存器,控制逻辑,振荡器,实时时钟,还有RAM.典型工作电路图1 框图:典型工作性能(V C C = 3.3V , T A = +25°C ,除非另外声明.)电源控制输入 移位 寄存器命令控制逻辑实时时钟管脚描述管脚 名称 功能1V CC2双供电配置中的主电源供应管脚,V CC1连接到备用电源,在主电源失效时保持时间和日期数据.D S1302工作于V CC1和V CC2中较大者.当V CC2比V CC1高0.2V时,V CC2 给 D S1302供电.当V CC1比V CC2高时, V CC1给D S1302供电.2X1 3X2与标准的32.768k H z石英晶体相连.内部振荡器被设计与指定的6p F 装载电容的晶体一起工作.更多关于晶体选择和布局注意事项的信息请参考应用笔记58页:D a l l a s实时时钟晶振注意事项.D S1302也可以被外部的32.768k H z振荡器驱动.这种配置下,X1与外部震荡信号连接,X2悬浮.4G N D电源地5C E输入.C E信号在读写时必须保持高电平.此管脚内部有一个40kΩ(典型值)的下拉电阻连接到地.注意:先前的数据手册修正把C E当作R S T.管脚的功能没有改变.6I/O输入/推挽输出.I/O管脚是三线接口的双向数据管脚.此管脚内部有一个40kΩ(典型值)的下拉电阻连接到地.7S C L K输入.S C L K用来同步串行接口上的数据动作.此管脚内部有一个40kΩ(典型值)的下拉电阻连接到地.8V CC1低功率工作在单电源和电池工作系统和低功率备用电池.在使用涓流充电的系统中,这个管脚连接到可再充能量源.U L认证在使用锂电池时确保避免反向充电电流.详见w w w.m a x i m i c.c o m/T e c h S u p p o r t/Q A/n t r l.h t m.振荡电路D S1302使用一个外部32.768k H z晶体.振荡电路工作时不需要任何外接的电阻或者电容表1 详细指明了几个外部晶体的参数.图1 显示了震荡电路的功能简图.如果使用指定规格的晶体,启动时间通常少于1秒钟.时钟精确度时钟的精确度取决于晶振的精确度,以及振荡电路容性负载与晶振校正的容性负载之间匹配的精确度。
DS1302资料
控制字的最高有效位(位7)必须是逻辑 ,如果它为 ,则不能把数据写入到 控制字的最高有效位( )必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。 中 表示存取RAM数据; 数据; 位6:如果为 ,则表示存取日历时钟数据,为1表示存取 :如果为0,则表示存取日历时钟数据, 表示存取 数据 至位1( ~ ):指示操作单元的地址; ):指示操作单元的地址 位5至位 (A4~A0):指示操作单元的地址; 至位 ):如为 表示进行读操作。 位0(最低有效位):如为 ,表示要进行写操作,为1表示进行读操作。 (最低有效位):如为0,表示要进行写操作, 表示进行读操作 读数据: 读数据: 读数据时在紧跟8位的控制字指令后的下一个 位的控制字指令后的下一个SCLK脉冲的下降沿,读出 脉冲的下降沿, 的数据, 读数据时在紧跟 位的控制字指令后的下一个 脉冲的下降沿 读出DS1302的数据, 的数据 读出的数据是从最低位到最高位。 读出的数据是从最低位到最高位。 写数据: 写数据: 控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时, 时钟的上升沿时, 控制字总是从最低位开始输出。在控制字指令输入后的下一个 时钟的上升沿时 数据被写入DS1302,数据输入也是从最低位(0位)开始。 数据被写入 ,数据输入也是从最低位( 位 开始。
void Write1302(unsigned char dat) { unsigned char i; SCLK=0; //拉低 拉低SCLK,为脉冲上升沿写入数据做好准备 拉低 , delaynus(2); //稍微等待,使硬件做好准备 稍微等待, 稍微等待 for(i=0;i<8;i++) //连续写 个二进制位数据 连续写8个二进制位数据 连续写 { DATA=dat&0x01; //取出 的第 位数据写入 取出dat的第 位数据写入1302 低位在前,高位在后 低位在前, 取出 的第0位数据写入 delaynus(2); //稍微等待,使硬件做好准备 稍微等待, 稍微等待 SCLK=1; //上升沿写入数据 上升沿写入数据 delaynus(2); //稍微等待,使硬件做好准备 稍微等待, 稍微等待 SCLK=0; //重新拉低 重新拉低SCLK,形成脉冲 重新拉低 , dat>>=1; //将dat的各数据位右移 位,准备写入下一个数据位 的各数据位右移1位 将 的各数据位右移 } }
实时时钟电路DS1302芯片的原理及应用
实时时钟电路DS1302芯片的原理及应用DS1302芯片是一种低功耗的实时时钟(RTC)电路。
它包含了一个真正的时钟/日历芯片和31个静态RAM存储单元,用于存储时钟和日期信息。
DS1302芯片的工作电压范围为2.0V至5.5V,并且具有极低的功耗,非常适合于移动电子设备和电池供电的应用。
DS1302芯片的原理如下:1.时钟发生器:DS1302芯片内部具有一个实时时钟发生器,它通过晶振和电容电路生成稳定的振荡信号,用于计时。
2.时钟/计时电路:DS1302芯片内部的时钟/计时电路可以精确地计算并保持当前的时间和日期。
它具有秒、分钟、小时、日期、月份、星期和年份等不同的计时单元。
3.RAM存储单元:DS1302芯片包含31个静态RAM存储单元,用于存储时钟和日期信息。
这些存储单元可以通过SPI接口进行读写操作,并且在断电情况下也能够保持数据。
4.控制接口:DS1302芯片通过3线接口与微控制器通信,包括一个时钟线、一个数据线和一个使能线。
这种接口使得与微控制器的通信非常简单,并且能够高效地读写时钟和日期信息以及控制芯片的其他功能。
DS1302芯片的应用如下:1.实时时钟:DS1302芯片可以用作电子设备中的实时时钟。
例如,它可以用于计算机、嵌入式系统、电子游戏等设备中,以提供准确的时间和日期信息。
2.定时器:DS1302芯片的计时功能可以用于设计各种定时器应用。
例如,它可以用于计时器、倒计时器、定时开关等应用中,以实现定时功能。
3.时钟显示:DS1302芯片可以与显示模块结合使用,用于显示当前的时间和日期。
例如,它可以用于数字钟、计时器、时钟频率计等应用中。
4.能量管理:由于DS1302芯片具有低功耗特性,因此它可以用于电池供电的设备中,以实现节能的能量管理策略。
例如,它可以用于手持设备、无线传感器网络等应用中,以延长电池寿命。
综上所述,DS1302芯片是一种低功耗的实时时钟电路,具有精确计时、可靠存储和简单接口等优点,适用于计时、显示和能量管理等各种应用中。
ds1302数字时钟芯片
《DS1302数字时钟芯片》1. 内置电池备份系统,确保时间信息在断电情况下依然准确无误;2. 采用串行通信接口,简化了与微处理器的连接;3. 超低功耗设计,延长电池使用寿命;4. 宽工作电压范围,适应不同电压环境;5. 小巧的封装尺寸,便于电路板布局。
《DS1302数字时钟芯片》灵活的时钟调整DS1302芯片允许用户通过简单的指令对时钟进行校准,无论是调整小时、分钟、秒,还是日期、月份、年份,都能轻松实现。
这种灵活性使得DS1302能够适应不同地区的时区变化,甚至可以应对夏令时的调整。
完善的日历功能除了基本的时钟功能,DS1302还内置了日历功能。
它能够自动处理月份的天数,包括闰年的特殊情况,大大减轻了开发者处理日期计算的负担。
这一特性使得DS1302在需要记录事件发生日期的应用中显得尤为宝贵。
数据保护与隐私DS1302具备128字节随机存取的静态RAM,可用于存储用户数据。
这些数据在芯片内部得到保护,避免了外部干扰导致的数据丢失。
DS1302还提供了写保护功能,确保数据在特定情况下的安全性。
易于集成与维护DS1302的串行接口设计使其与微控制器的连接变得异常简单。
只需几根线就能完成通信,大大降低了硬件设计的复杂度。
同时,由于接口的标准化,未来若需升级或更换芯片,也能快速完成。
实际应用指南1. 电源连接:将VCC1接至主电源,VCC2接至备用电池,GND接地。
2. 串行接口:将SCLK(时钟线)、I/O(数据线)和RST(复位线)分别连接至微控制器的对应引脚。
3. RAM数据存储:通过编写简单的程序,将需要存储的数据写入RAM中,实现数据的持久化。
通过这些步骤,DS1302数字时钟芯片便能顺利地融入各种电子设备,为它们提供精准的时间管理和数据存储服务。
无论是在智能家居、工业自动化还是个人穿戴设备中,DS1302都能展现出其稳定可靠的性能。
《DS1302数字时钟芯片》节能环保的设计理念DS1302数字时钟芯片在设计之初就充分考虑了节能环保的重要性。
ds1302
DS1302时钟芯片简介DS1302是DALLAS公司推出的涓流充电时钟芯片,内含一个实时时钟/日历和31字节静态RAM,可以通过串行接口与单片机进行通信。
实时时钟/日历电路提供秒、分、时、日、星期、月、年的信息,每个月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM标志位决定采用24或12小时时间格式。
DS1 302与单片机之间能简单地采用同步串行的方式进行通信,仅需三根I/O线:复位(RST)、I/O数据线、串行时钟(SCLK)。
时钟/RAM的读/写数据以一字节或多达31字节的字符组方式通信。
DS1302工作时功耗很低,保持数据和时钟信息时,功耗小于1mW。
DS1302的内部结构如图4所示,主要组成部分为:移位寄存器、控制逻辑、振荡器、实时时钟以及RAM。
虽然数据分成两种,但是对单片机的程序而言,其实是一样的,就是对特定的地址进行读写操作。
DS1302含充电电路,可以对作为后备电源的可充电电池充电,并可选择充电使能和串入的二极管数目,以调节电池充电电压。
不过对我们目前而言,最需要熟悉的是和时钟相关部分的功能,DS1302的工作原理DS1302工作时为了对任何数据传送进行初始化,需要将复位脚(RST)置为高电平且将8位地址和命令信息装入移位寄存器。
数据在时钟(SCLK)的上升沿串行输入,前8位指定访问地址,命令字装入移位寄存器后,在之后的时钟周期,读操作时输出数据,写操作时输出数据。
时钟脉冲的个数在单字节方式下为8+8(8位地址+8位数据),在多字节方式下为8加最多可达248的数据。
DS1302的寄存器和控制命令对DS1302的操作就是对其内部寄存器的操作,DS1302内部共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。
此外,DS 1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。
时钟突发寄存器可一次性顺序读写除充电寄存器以外的寄存器。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//本文件只是ds1302的头文件,基于SPI接口
#include
#include
sbit SCK=P3^0;
sbit SDA=P3^1;
sbit RST=P3^2;
/*复位脚*/
#define RST_CLR RST=0/*电平置低*/
#define RST_SET RST=1/*电平置高*/
/*双向数据*/
#define IO_CLR SDA=0/*电平置低*/
#define IO_SET SDA=1/*电平置高*/
#define IO_R SDA/*电平读取*/
/*时钟信号*/
#define SCK_CLR SCK=0/*时钟信号*/
#define SCK_SET SCK=1/*电平置高*/
#define ds1302_sec_add 0x80 //秒数据地址
#define ds1302_min_add 0x82 //分数据地址
#define ds1302_hr_add 0x84 //时数据地址
#define ds1302_date_add 0x86 //日数据地址
#define ds1302_month_add 0x88 //月数据地址
#define ds1302_day_add 0x8a //星期数据地址
#define ds1302_year_add 0x8c //年数据地址
#define ds1302_control_add 0x8e //控制数据地址
#define ds1302_charger_add 0x90
#define ds1302_clkburst_add 0xbe
unsigned char time_buf1[8] = {20,11,3,31,14,17,00,6};//空年月日时分秒周
unsigned char time_buf[8] ; //空年月日时分秒周
/*向DS1302写入一字节数据*/
void ds1302_write_byte(unsigned char addr, unsigned char d)
{
unsigned char i;
RST_SET; /*启动DS1302总线*/
addr = addr & 0xFE; /*写入目标地址:addr*/
for (i = 0; i < 8; i ++) /*最低位置零*/
{
if (addr & 0x01)
{
IO_SET;
}
else {
IO_CLR;
}
SCK_SET;
SCK_CLR;
addr = addr >> 1;
}
/*写入数据:d*/
for (i = 0; i < 8; i ++) {
if (d & 0x01)
{
IO_SET;
}
Else
{
IO_CLR;
}
SCK_SET;
SCK_CLR;
d = d >> 1;
}
RST_CLR; /*停止DS1302总线*/
}
/*从DS1302读出一字节数据*/
unsigned char ds1302_read_byte(unsigned char addr) {
unsigned char i;
unsigned char temp;
RST_SET; /*启动DS1302总线*/ /*写入目标地址:addr*/
addr = addr | 0x01; /*最低位置高*/
for (i = 0; i < 8; i ++)
{
if (addr & 0x01)
{
IO_SET;
}
else
{
IO_CLR;
}
SCK_SET;
SCK_CLR;
addr = addr >> 1;
}
/*输出数据:temp*/
for (i = 0; i < 8; i ++) {
temp = temp >> 1;
if (IO_R)
{
temp |= 0x80;
}
Else
{
temp &= 0x7F;
}
SCK_SET;
SCK_CLR;
}
RST_CLR; /*停止DS1302总线*/
return temp;
}
/*向DS302写入时钟数据*/
void ds1302_write_time(void)
{
unsigned char i,tmp;
for(i=0;i<8;i++)//BCD处理
{
tmp=time_buf1[i]/10;
time_buf[i]=time_buf1[i]%10;
time_buf[i]=time_buf[i]+tmp*16;
}
ds1302_write_byte(ds1302_control_add,0x00); //关闭写保护
ds1302_write_byte(ds1302_sec_add,0x80); //暂停
ds1302_write_byte(ds1302_charger_add,0xa9); //涓流充电
ds1302_write_byte(ds1302_year_add,time_buf[1]); //年
ds1302_write_byte(ds1302_month_add,time_buf[2]); //月
ds1302_write_byte(ds1302_date_add,time_buf[3]); //日
ds1302_write_byte(ds1302_day_add,time_buf[7]); //周
ds1302_write_byte(ds1302_hr_add,time_buf[4]); //时
ds1302_write_byte(ds1302_min_add,time_buf[5]); //分
ds1302_write_byte(ds1302_sec_add,time_buf[6]); //秒
ds1302_write_byte(ds1302_day_add,time_buf[7]); //周
ds1302_write_byte(ds1302_control_add,0x80); //打开写保护
}
/*从DS302读出时钟数据*/
void ds1302_read_time(void)
{
unsigned char i,tmp;
time_buf[1]=ds1302_read_byte(ds1302_year_add); //年
time_buf[2]=ds1302_read_byte(ds1302_month_add); //月
time_buf[3]=ds1302_read_byte(ds1302_date_add); //日
time_buf[4]=ds1302_read_byte(ds1302_hr_add); //时
time_buf[5]=ds1302_read_byte(ds1302_min_add); //分
time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7F; //秒
time_buf[7]=ds1302_read_byte(ds1302_day_add); //周
for(i=0;i<8;i++){ //BCD处理
tmp=time_buf[i]/16;
time_buf1[i]=time_buf[i]%16;
time_buf1[i]=time_buf1[i]+tmp*10;
}
}
/*DS302初始化函数*/
void ds1302_init(void)
{
RST_CLR; /*RST脚置低*/
SCK_CLR; /*SCK脚置低*/
}