DS1302时钟芯片读写详解
ds1302时钟芯片汇编控制程序
OUTBIT1:MOV C,T_IO
RRC A
SETB T_CLK
CLR T_CLK
DJNZ R4,OUTBIT1
RET
;---------- ----------END DS0302--------------------------------
SETB T_CLK
CLR T_RST
mov R0,#SECOND
MOV R7,#3 ;秒/时/分;-----R7
MOV R1,#80H ;秒写地址;-----R1
S1302:
CLR T_RST
CLR T_CLK
SETB T_RST
MOV B,R1 ;写秒/时/分地址;---R1
LCALL WRITEBYTE
ds1302时钟芯片ds1302时钟电路ds1302时钟不走ds1302芯片功能ds1302ds1302lcd1602时钟ds1302芯片ds1302中文资料ds1302工作原理ds1302程序
DS1302初始化及读写操作汇编程序
;************ DS1302初始化子程序************************************
MOV R0,#SECOND ;------R0
MOV R7,#03H ;-----R7
MOV R2,#81H ;-----R2
G13021:CLR T_RST
CLR T_CLK
SETB T_RST
MOV B,R2
LCALL WRITEBYTE ;写操作时,将一字节的内容由B写至DS1302中
LCALL READBYTE ;读操作时,将一字节的内容读至A中
INBIT1:MOV A,B
Ds1302读写详解
Ds1302读写详解void Write1302(unsigned char dat){unsigned char i;SCLK=0; //拉低SCLK,为写数据做准备delaynus(2); //延时,使硬件做好准备for(i=0;i<8;i++) //写8位二进制位数据{DATA=dat&0x01; //取出dat的第0位数据写入1302delaynus(2); /延时,使硬件做好准备SCLK=1; //上升沿写入数据delaynus(2); //延时,使硬件做好准备SCLK=0; //拉低SCLK,形成脉冲dat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位}}void WriteSet1302(unsigned char Cmd,unsigned char dat){RST=0; //禁止数据传递SCLK=0; //写数据前拉低SCLKRST=1; //启动数据传输delaynus(2); //延时,使硬件做好准备Write1302(Cmd); //写入命令字Write1302(dat); //写数据SCLK=1; //将时钟电平置于已知状态RST=0; //禁止数据传递}unsigned char Read1302(void){unsigned char i,dat;delaynus(2); //延时,使硬件做好准备for(i=0;i<8;i++) //读8个二进制位数据{dat>>=1; //将dat的各数据位右移1位,因为先读出的是字节的最低位if(DATA==1) //如果读出的数据是1dat|=0x80; //将1取出,写在dat的最高位SCLK=1; //将SCLK置于高电平,为下降沿读出delaynus(2); //延时SCLK=0; //拉低SCLK,形成脉冲下降沿delaynus(2); //延时}return dat; //将读出的数据返回}unsigned char ReadSet1302(unsigned char Cmd) {unsigned char dat;RST=0; //拉低RSTSCLK=0; //确保写数据前SCLK被拉低RST=1; //启动数据传输Write1302(Cmd); //写入命令字dat=Read1302(); //读出数据SCLK=1; //将时钟电平置于已知状态RST=0; //禁止数据传递return dat; //将读出的数据返回}。
DS1302菜鸟级讲解
12.4 DS1302 的 RAM DS1302 真的很厚道,还设立了 31 个字节的 RAM 空间,RAM 空间的开始地址字节是 0x94。RAM 空间可以让使用着任意发挥,你可以把它当做外存储器,但是前提 DS1302 必须一直供电。要访问任意空间也很简单,如下表:
再重申一次,读一个字节和写一个字节是不一样,在 写一个字节 的时候,AVR 的 IO 口一 直保持输出状态,相反的在 读一个字节的时候 AVR 的 IO 口先是输出状态,然后是输入状 态,且必须改变时钟信号的顺序。(补充一点题外话,我在编辑时序的时候,由于疏忽了一 点“小错误”,后果却是很严重。)
12.3 DS1302 时钟|日期|控制|爆发寄存器 在介绍 DS1302 的时序图中不都是,先地址字节,然后数据字节码?那么地址字 节和数据字节又有什么关系呢?(看看下面的图)
我们一个一个寄存器来看吧:
第一:秒钟寄存器 地址字节;0x80 其实呀,我很佩服该芯片的设计人员,将芯片设计得很贴心,为什么呢?因为秒钟寄存 器,除了记 录秒钟以外,还控制了 DS1302 的时钟开关(晶振开始工作,或者晶振禁止 工作)。该位第 7 位 CH,当写入逻辑 1 时 DS1302 停止工作,时间的计时保持最后一次 的状态,如果写入逻辑 0 DS1302 则开始工作,时间从最后一次状态中继续计时。
慧净小店: 开发板超市:/hlmcu
慧争电子免费共享资料、欢迎复制共享、没有版权。 HJ-2G 多功能 AVR/51 二合一开发板学习笔记
上面的图说明了每个寄存器的定义和地址字节,而每个地址字节的 LSB 可以是 0 或者 1,逻辑 0 代 表写,逻辑 1 代表读。如果忽略每个地址字节的 LSB,十六进制则是 0x80+i,而 i 每一次累加 2。
DS1302时钟芯片简单操作及BCD相关注意事项
DS1302 时钟芯片简单操作及BCD 相关注意事项
ds1302 是具有时钟功能的芯片,一旦启动,可以自动计时,内部含有年月日时分秒寄存器等。
先说下我这几天遇到的问题,其实归结起来满简单的一个问题,针对
ds1302 芯片的读写字节操作满简单的,见附表的datasheet,但这里要强调的是往ds1302 芯片写数据或者是读数据,在程序执行上一般会分别调用先后调用往ds1302 写一个字节或者读一个字节的方法(当然这两个方法得自己写)。
不过记得在调用这两个方法的过程中要保持CE(即芯片的置位端)持续为高电平,切不可写完一个字节就将置位端拉低,接着要写下一个字节又把置位端
拉高。
现在看看下面的代码:
sbit clk = P3;//时钟
sbit io = P3; //数据
sbit reset = P3 ;// DS1302 复位
/写一字节到ds1302
void write_byte(uchar dat)
{。
ds1302是什么接口,DS1302时钟芯片接口分析详解
ds1302 是什么接口,DS1302 时钟芯片接口分析详解
DS1302 是达拉斯公司出品的一款实时时钟芯片。
主要是针对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。
这篇文章
主要就是说DS1302 的到底是属于什幺接口的,同时分析详解DS1302 时钟芯片的三种接口。
ds1302 是什幺接口
现在来说说DS1302 的SPI 接口(其实比标准的SPI 接口少了一根线),它包含RST 线、SCLK 线、IO 线(双向传送数据用,标准的SPI 则将其分成两根MISO 与MOSI)3 条接线。
上面这张图片就是其时序图,单字节读取和单字节写。
相比1 条线的单总线、2 条线的IIC,这个SPI 貌似是最简单的。
每次传送时,需要先发送。
51单片机实战指南-使用DS1302设计数字时钟
YEAR
WP
0
0
0 0000
本章内容:
1
DS1302芯片介绍
22 封装的编程思想和结构体类型
3 2
DS1302读写操作的编程实现
4
DS1302读写实战
12.2.1 封装的编程思想
➢ 封装是面向对象编程三大特性(封装、继承、多态)之一 ➢ 核心思想就是尽可能地隐藏内部的细节,只保留一些对外接
口使之与外部发生联系 ➢ 就C语言而言,封装的体现就是函数的编写(小封装)和模
} DS1302_CE = 0;
//传送数据结束
return dat;
}
12.3.2 读写函数的封装-DS1302WriteByte
/* 发送一个字节到DS1302通信总线上 */
void DS1302WriteByte(unsigned char dat)
{
unsigned char i;
for (i=0; i<8; i++)
bit 5
bit 4
bit 3
bit 2
bit 1
bit 0
1
RAM/CK A4
A3
A2
A1
A0
R/W
寄存器名
秒寄存器 分钟寄存器 小时寄存器 日期寄存器 月份寄存器 星期寄存器 年份寄存器 控制寄存器
命令字
写操作 读操作
80H
81H
82H
83H
84H
85H
86H
87H
88H
89H
8AH 8BH
8CH 8DH
12.4 DS1302读写实战-ds1302.c
void mai时间后会刷新显示
DS1302基本读写
{
TMOD |= 0x01; Fra bibliotek/设置定时器0的模式为16位
TH0 = ( 65536-46000 ) / 256;
TL0 = (65536-46000) % 256;
if( EA != 1 )
EA = 1;
ET0 = 1; //打开定时器0的中断
/*****************************************************************
*********** Name: DS1302
***********Date: 2014/12/25
***********Com: FairSun
*********** LOL
/*void Timer0_server( void ) interrupt 1
{
TH0 = (65536-46000) / 256;
TL0 = (65536-46000) % 256;
} */
/************************************************************************
const unsigned char smg_dp_yin[ 16 ] = {0xbf, 0x86, 0xdb, 0xcf, 0xe6, 0xed, 0xfd, 0x87, 0xff, 0xef,
0xf7, 0xfc, 0xb9, 0xde, 0xfb, 0xf1};//0. 1. 2. 3......f.
unsigned char month;
unsigned char date; //一月的几日
};
DS1302时钟芯片
第十四讲时钟芯片DS1302DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一种实时时钟/日历和31 字节静态RAM ,通过简朴的串行接口与单片机进行通信。
实时时钟/日历电路提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可自动调节。
时钟操作可通过AM/PM 批示决定采用24 或12 小时格式。
DS1302 与单片机之间能简朴地采用同时串行的方式进行通信,仅需用到三个口线:(1)RES 复位(2)I/O数据线(3)SCLK串行时钟。
时钟/RAM 的读/写数据以一种字节或多达31个字节的字符组方式通信。
DS1302 工作时功耗很低保持数据和时钟信息时功率不大于1mW。
DS1302由DS1202改善而来增加了下列的特性:双电源管脚用于主电源和备份电源供应,Vcc1为可编程涓流充电电源,附加七个字节存储器。
它广泛应用于电话、传真、便携式仪器以及电池供电的仪器仪表等产品领域下面。
将重要的性能指标作一综合:★ 实时时钟含有能计算2100 年之前的秒、分、时、日、星期、月、年的能力,尚有闰年调节的能力★ 31 8位暂存数据存储RAM★ 串行I/O口方式使得管脚数量最少★ 宽范畴工作电压2.0 5.5V★ 工作电流2.0V时,不大于300nA★ 读/写时钟或RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式★ 8 脚DIP封装或可选的8脚SOIC封装根据表面装配★ 简朴3线接口★ 与TTL兼容Vcc=5V★ 可选工业级温度范畴-40---+85★ 双电源管用于主电源和备份电源供应以上是DS1302的某些全方面的预览,下列为DS1302管脚图:1)VCC2:主用电源引脚2)X1、X2:DS1302外部晶振引脚3)GND:地4)RST:复位引脚5)I/O:串行数据引脚,数据输出或者输入都从这个引脚6)SCLK:串行时钟引脚7)VCC1:备用电源1)VCC 为主电源接5V,CX10 为滤波电容2)2、外接32.768K 的晶振3)3、 5、6、7 脚分别与控制器相联,注意外部4.7K 上拉电阻4)4、备用电源脚,注意是3.3V,DS1302 规定备用电源电压稍微低于主用电源下面讲讲DS1302 的具体操作。
模拟SPI数据传输的读写程序(时钟芯片DS1302为例)
模拟SPI数据传输的读写程序(时钟芯片DS1302为例)
本文是以时钟芯片DS1302为例子来分析时序图并写出代码。
DS1302是采用SPI三线接口与单片机进行同步通信。
重点分析单字节读时序,单字节写时序,寄存器读时序,寄存器写时序,并完成4个函数。
完整代码以及仿真图下载地址:
上图为寄存器读时序,为什么先贴出这个图呢,因为读寄存器包含了单字节的写以及单字节的读。
从图上可以看出,读DS1302的寄存器是先写入一个地址,然后再去读一个字节。
那么就可以根据这个图来完成单字节的读写时序分析以及代码的编写。
单字节写时序图1可以告诉我们,在时钟的上升沿是写入数据,是从低位开始写入。
还有一个需要注意的地方是写字节和读字节连接处,从图中可以看出,当最后一个位写入后,接下来的一个下降沿就开始读数据了,在代码编写时要注意这一点,不然读数据就会出错。
先看看下面的代码:
void dsWriteByte(u8 dat) //写入字节
{
u8 i;
for(i = 0;i 8;i++)
{
if(dat 0x01) ds1302IOStatu(1);
else ds1302IOStatu(0); //低位先写入,根据要写入的数据确定IO的电平
ds1302CLKStatu(0);
ds1302CLKStatu(1); //产生上升沿写入数据
dat = 1; //移位,准备下一位
}
} //写一个字节后,此时时钟脚是高电平。
ds1302时钟程序详解,ds1302程序流程图
ds1302时钟程序详解,ds1302程序流程图(C程序)ds1302时钟程序详解DS1302 的控制字如图2所示。
控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。
数据输入输出(I/O)在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。
同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。
DS1302的寄存器DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表1。
此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。
时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。
DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
ds1302程序流程图DS1302实时时间流程图4示出DS1302的实时时间流程。
根据此流程框图,不难采集实时时间。
下面结合流程图对DS1302的基本操作进行编程:根据本人在调试中遇到的问题,特作如下说明:DS1302 与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令字节最高位MSB(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;D6=0,指定时钟数据,D6=1,指定RAM数据;D5~D1指定输入或输出的特定寄存器;最低位L SB(D0)为逻辑0,指定写操作(输入), D0=1,指定读操作(输出)。
DS1302读写程序
//读 DS1302RAM 字节 unsigned char TimeRamByteRead(unsigned char address) { TimeSpiOpen();//打开 DS1302 TimeSpiReadWrite((address << 1) | 0xc1);//写入 DS1302 命令 address = TimeSpiReadWrite(0xff);//读入 DS1302 数据 TimeSpdress;//返回数据 }
val = TimeByteRead(timereadseg);//读秒数据 val &= 0x7f;//打开晶振 TimeWrieDisbale();//开放 DS1302 写保护 TimeByteWrite(timewriteseg, val);//打开晶振 TimeByteWrite(tricklewrite, 0xa5);//打开充电二极管 TimeWriteEnable();//使能 DS1302 写保护 }
//打开 DS1302 void TimeSpiOpen(void) { TIMECLK = 0; TIMERST = 0;//禁止 DS1302 TIMEIO } //关闭 DS1302 void TimeSpiClose(void) { TIMERST = 0;//禁止 DS1302 TIMEIO } //读写 DS1302 unsigned char TimeSpiReadWrite(unsigned char val) { unsigned char i; ACC = val;//取 8 位数据 for (i = 8;i > 0; i--) { TIMECLK = 0;//时钟下降沿输入数据(DS1302 读) _nop_();//延时 CY = TIMEIO;//接收串行数据到 CY _rrca_();//右移一位数据到 CY(先存后取) TIMEIO = CY;//发送串行数据 TIMECLK = 1;//时钟上升沿打入数据(DS1302 写) TIMEIO } val = ACC; return val; } //读 DS1302 字节 unsigned char TimeByteRead(unsigned char address) { TimeSpiOpen();//打开 DS1302 TimeSpiReadWrite(address);//写入 DS1302 命令 address = TimeSpiReadWrite(0xff);//读入 DS1302 数据 TimeSpiClose();//关闭 DS1302 return address;//返回数据 } = 1;//释放数据总线 = 1;//释放数据总线 TIMECLK = 1; = 1;//释放数据总线 TIMERST = 1;//使能 DS1302
DS1302原理及程序说明
DS1302原理及程序说明DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31字节静态RAM ,通过简单的串行接口与单片机进行通信。
实时时钟/日历电路提供秒、分、时、日、日期、月、年的信息,每月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM 指示决定采用24 或12 小时格式。
DS1302 与单片机之间能简单地采用同步串行的方式进行,DS1302的引脚命名如图1-1所示。
通信仅需用到三根信号线:(1)CE 片选,(2)I/O 数据线,(3)SCLK 串行时钟,DS1302与CPU 的连接如图1-2所示。
时钟/RAM 的读/写数据以一个字节或多字节的字符组方式通信,DS1302工作时功耗很低,保持数据和时钟信息时功率小于1mW 。
DS1302具有双电源管脚,用于主电源和备份电源供应Vcc1,为可编程涓流充电电源附加七个字节存储器,它广泛应用于电话传真便携式仪器以及电池供电的仪器仪表等产品领域。
DS1302主要的性能指标如下:实时时钟具有能计算2100 年之前的秒、分、时、日、日期、星期、月、年的能力,还有闰年调整的能力31× 8 位暂存数据存储RAM 串行I/O 口方式,使得管脚数量最少宽范围工作电压2.0~ 5.5V工作电流2.0V 时,小于300nA读/写时钟或RAM 数据时有两种传送方式:单字节传送和多字节传送字符组方式8 脚DIP 封装或可选的8 脚SOIC 封装根据表面装配简单3 线接口与TTL 兼容Vcc=5V 。
DS1302的读写模式工作时序如图1-3和图1-4所示。
图1-3 单字节读模式图1-4 单字节写模式注:在多字节模式下,SCLK 发出同步脉冲,CS 须持续保持高电平直到多字节操作结束,图1-1 DS1302引脚图1-2 DS1302与CPU 接口DS1302内部寄存器的地址定义如表1-1所示。
表1-1 寄存器的地址及定义实验说明1. DS1302与51单片机的连接IO ——P2.7:串行数据输入/输出引脚SCLK ——P2.6:串行时钟引脚CE ——P2.4:片选CE2. LCD 与单片机连接;************************************************************************* ; LCD Module LMB1602 与单片机连接:;************************************************************************* ; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ;Vss Vdd V o RS R/W E D0 D1 D2 D3 D4 D5 D6 D7 BLA BLK ; 0V +5V 0V P32 P33 P34 ---------------- P1[0..7] ---------------- +5V 0V;*************************************************************************3. LCD 显示功能说明LCD1602显示格式如图1-5所示。
时钟芯片DS1302中文资料
时钟芯片DS1302中文资料概述DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31 字节静态RAM,通过简单的串行接口与单片机进行通信实时时钟/日历电路.提供秒分时日日期.月年的信息,每月的天数和闰年的天数可自动调整时钟操作可通过AM/PM 指示决定采用24 或12 小时格式.DS1302 与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线:1 RES 复位,2 I/O 数据线,3 SCLK 串行时钟.时钟/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式通信.DS1302 工作时功耗很低,保持数据和时钟信息时功率小于1mW.DS1302 是由DS1202 改进而来,增加了以下的特性.双电源管脚用于主电源和备份电源供应Vcc1,为可编程涓流充电电源附加七个字节存储器.它广泛应用于电话传真便携式仪器以及电池供电的仪器仪表等产品领域.下面将主要的性能指标作一综合:实时时钟具有能计算2100 年之前的秒分时日日期星期月年的能力还有闰年调整的能力;31 8 位暂存数据存储RAM;串行I/O 口方式使得管脚数量最少;宽范围工作电压2.0 5.5V;工作电流2.0V 时,小于300nA;读/写时钟或RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式;8 脚DIP 封装或可选的8 脚SOIC 封装根据表面装配;简单3 线接口;与TTL 兼容Vcc=5V;可选工业级温度范围-40 +85;与DS1202 兼容;在DS1202 基础上增加的特性;对Vcc1 有可选的涓流充电能力;双电源管用于主电源和备份电源供应;备份电源管脚可由电池或大容量电容输入;附加的7 字节暂存存储器;1 DS1302 的基本组成和工作原理DS1302 的引脚功能排列及描述如下图所示.管脚描述:X1 X2 32.768KHz 晶振管脚GND 地RST 复位脚I/O 数据输入/输出引脚SCLK 串行时钟Vcc1,Vcc2 电源供电管脚2. DS1302 内部寄存器CH: 时钟停止位存器2 的第7 位12/24 小时标志CH=0 振荡器工作允许 bit7=1,12 小时模式CH=1 振荡器停止 bit7=0,24 小时模式WP: 写保护位寄存器2 的第5 位:AM/PM 定义WP=0 寄存器数据能够写入 AP=1 下午模式WP=1 寄存器数据不能写入 AP=0 上午模式TCS: 涓流充电选择 DS: 二极管选择位TCS=1010 使能涓流充电 DS=01 选择一个二极管TCS=其它禁止涓流充电 DS=10 选择两个二极管DS=00 或11, 即使TCS=1010, 充电功能也被禁止时钟:DS1302 与微控制器的接口软件及功能应用举例下面首先给出基本的接口软件然后举例说明各种功能的应用1 写保护寄存器操作当写保护寄存器的最高位为0 时允许数据写入寄存器写保护寄存器可以通过命令字节8E,8F 来规定禁止写入/读出写保护位不能在多字节传送模式下写入Write_Enable:MOV Command,#8Eh ;命令字节为8EMOV ByteCnt,#1 ;单字节传送模式MOV R0,#XmtDat 数据地址覆给R0MOV XmtDat,#00h 数据内容为0 写入允许ACALL Send_Byte 用写入数据子程序RET 返回调用本子程序处当写保护寄存器的最高位为1 时禁止数据写入寄存器Write_Disable:MOV Command,#8Eh ;命令字节为8EMOV ByteCnt,#1 ;单字节传送模式MOV R0,#XmtDat 数据地址覆给R0MOV XmtDat,#80h 数据内容为80h 禁止写入ACALL Send_Byte 调用写入数据子程序RET 返回调用本子程序处以上程序调用了基本数据发送(Send_Byte)模块及一些内存单元定义, 其源程序清单在附录中给出下面的程序亦使用了这个模块2 时钟停止位操作当把秒寄存器的第7 位时钟停止位设置为0 时起动时钟开始Osc_Enable:MOV Command,#80h ; 命令字节为80MOV ByteCnt,#1 ; 单字节传送模式MOV 0,#XmtDat 数据地址覆给R0MOV XmtDat,#00h 数据内容为0 振荡器工作允许ACALL Send_Byte 调用写入数据子程序RET 返回调用本子程序处当把秒寄存器的第7 位时钟停止位设置为1 时时钟振荡器停止HT1380 进入低功耗方式Osc_Disable:MOV Command,#80h ;命令字节为80MOV ByteCnt,#1 ;单字节传送模式MOV R0,#XmtDat 数据地址覆给R0MOV XmtDat,#80h 数据内容为80h 振荡器停止ACALL Send_Byte 调用写入数据子程序RET 返回调用本子程序处3. 多字节传送方式当命令字节为BE 或BF 时DS1302 工作在多字节传送模式8 个时钟/日历寄存器从寄存器0 地址开始连续读写从0 位开始的数据当命令字节为FE 或FF 时DS1302 工作在多字节RAM 传送模式31 个RAM 寄存器从0 地址开始连续读写从0 位开始的数据例如写入00 年6 月21 日星期三13 时59 分59 秒程序设置如下Write_Multiplebyte:MOV Command,#0BEh ;命令字节为BEhMOV ByteCnt,#8 ;多字节写入模式此模块为8 个MOV R0,#XmtDat 数据地址覆给R0MOV XmtDat,#59h 秒单元内容为59hMOV XmtDat+1,#59h 分单元内容为59hMOV XmtDat+2,#13h 时单元内容为13hMOV XmtDat+3,#21h 日期单元内容为21hMOV XmtDat+4,#06h 月单元内容为06hMOV XmtDat+5,#03h 星期单元内容为03hMOV XmtDat+6,#0 年单元内容为00hMOV XmtDat+7,#0 写保护单元内容为00hACALL Send_Byte 调用写入数据子程序RET 返回调用本子程序处读出寄存器0-7 的内容程序设置如下Read_Multiplebyte:MOV Command,#0BFh 命令字节为BFhMOV ByteCnt,#8 ; 多字节读出模式此模块为8 个MOV R1,#RcvDat 数据地址覆给R1ACALL Receive_Byte 调用读出数据子程序RET 返回调用本子程序处以上程序调用了基本数据接收(Receive_Byte)模块及一些内存单元定义, 其源程序清单在附录中给出下面的程序亦使用了这个模块4. 单字节传送方式例如写入8 时12 小时模式程序设置如下Write_Singlebyte:MOV Command,#84h ; 命令字节为84hMOV ByteCnt,#1 ; 单字节传送模式MOV R0,#XmtDat 数据地址覆给R0MOV XmtDat,#88h 数据内容为88hACALL Send_Byte 调用写入数据子程序RET 返回调用本子程序处上面所列出的程序模块Write_Enable Write_Disable Osc_Enable Osc_Disable 与单字节写入模块Write_Singlebyte 的程序架构完全相同仅只是几个入口参数不同本文是为了强调功能使用的不同才将其分为不同模块另外,与涓流充电相关的设定也是单字节操作方式,这里就不再单独列出,用户在使用中可灵活简略.下面模块举例说明如何单字节读出小时单元的内容.Read_Singlebyte:MOV Command,#85h ; 命令字节为85hMOV ByteCnt,#1 ; 单字节传送模式MOV R1,#RcvDat 数据地址覆给R1ACALL Receive_Byte 调用读出数据子程序RET 返回调用本子程序处DS1302 应用电路原理图P87LPC764 单片机选取内部振荡及内部复位电路附录数据发送与接收模块源程序清单; CPU 工作频率最大不超过20MHz;; P87LPC762/4 主控器发送接受数据程序; 说明本程序是利用Philips 公司的P87LPC764 单片机任何具有51 内核或其它合适的单片机都可在此作为主控器的普通I/O 口(如P1.2/P1.3/P1.4)实现总线的功能对总线上的器件本程序采用DS1302进行读写操作命令字节在Command 传送字节数在ByteCnt 中所发送的数据在XmtDat 中所接收的数据在RcvDat 中;;P87LPC762/4 主控器总线发送接受数据程序头文件;内存数据定义BitCnt data 30h ; 数据位计数器ByteCnt data 31h ; 数据字节计数器Command data 32h ; 命令字节地址RcvDat DATA 40H ; 接收数据缓冲区XmtDat DATA 50H ; 发送数据缓冲区;端口位定义IO_DATA bit P1.3 ; 数据传送总线SCLK bit P1.4 ; 时钟控制总线RST bit P1.2 ; 复位总线;;发送数据程序;名称:Send_Byte;描述:发送ByteCnt 个字节给被控器DS1302;命令字节地址在Command 中;所发送数据的字节数在ByteCnt 中发送的数据在XmtDat 缓冲区中Send_Byte:CLR RST ;复位引脚为低电平所有数据传送终止NOPCLR SCLK 清时钟总线NOPSETB RST ;复位引脚为高电平逻辑控制有效NOPMOV A,Command 准备发送命令字节MOV BitCnt,#08h 传送位数为8S_Byte0:RRC A 将最低位传送给进位位CMOV IO_DATA,C 位传送至数据总线NOPSETB SCLK 时钟上升沿发送数据有效NOPCLR SCLK 清时钟总线DJNZ BitCnt,S_Byte0 位传送未完毕则继续NOPS_Byte1: 准备发送数据MOV A,@R0 传送数据过程与传送命令相同MOV BitCnt,#08hS_Byte2:RRC AMOV IO_DATA,CNOPSETB SCLKNOPCLR SCLKDJNZ BitCnt,S_Byte2INC R0 发送数据的内存地址加1DJNZ ByteCnt,S_Byte1 字节传送未完毕则继续NOPCLR RST 逻辑操作完毕清RSTRET;接收数据程序;;名称:Receive_Byte;描述:从被控器DS1302 接收ByteCnt 个字节数据;命令字节地址在Command 中;所接收数据的字节数在ByteCnt 中接收的数据在RcvDat 缓冲区中Receive_Byte:CLR RST ;复位引脚为低电平所有数据传送终止NOPCLR SCLK 清时钟总线NOPSETB RST ;复位引脚为高电平逻辑控制有效MOV A,Command 准备发送命令字节MOV BitCnt,#08h 传送位数为8R_Byte0:RRC A 将最低位传送给进位位CMOV IO_DATA,C 位传送至数据总线NOPSETB SCLK 时钟上升沿发送数据有效NOPCLR SCLK 清时钟总线DJNZ BitCnt,R_Byte0 位传送未完毕则继续NOPR_Byte1: 准备接收数据CLR A 清类加器CLR C 清进位位CMOV BitCnt,#08h 接收位数为8R_Byte2:NOPMOV C,IO_DATA 数据总线上的数据传送给CRRC A 从最低位接收数据SETB SCLK 时钟总线置高NOPCLR SCLK 时钟下降沿接收数据有效DJNZ BitCnt,R_Byte2 位接收未完毕则继续MOV @R1,A 接收到的完整数据字节放入接收内存缓冲区INC R1 接收数据的内存地址加1DJNZ ByteCnt,R_Byte1 字节接收未完毕则继续NOPCLR RST 逻辑操作完毕清RSTRETEND直流参数表:主要电参数表:交流参数表:电容配置表:。
ds1302操作说明
一、 电路原理图说明
说明:1. 晶振为32.768KHz晶振,晶振参数如下表所示:
二、 寄存器说明
注:1. 上表为:日历时钟寄存器地址和数据位功能说明;
1、单字节读写时序
注:在单字节或多字节读操作时,读出的第一个bit位,必须是在命令发送完后第一个下降沿处取得的,否则,读出的数据会出错。
(如上图所示)
2、多字节读写程序
对于多字节写,需要特别注意的是,在发送0xbe命令并连续完成7字节的时钟数据写入后,必须在rst信号有效的情况下,再追加一个字节的写保护使能字节0x80;否则,无法完成写入操作。
当然,在多字节写之前,也必须先发一条写保护使能关闭命令。
(如上图的N,应该为8,而第8个字节写入的应该是0x80这个值)
四、 程序说明。
单片机入门培训专题(二十二)-DS1302时钟芯片详解①
单片机入门培训专题(二十二)-DS1302时钟芯片详解①单片机入门培训专题已接近尾声,预计在五期之内结束,如果你希望看到其他方面的电子DIY相关专题,欢迎通过平台回复给我们,我们将尽力满足大家的需求。
对于很多单片机系统的设计,会涉及到绝对时间的应用,比较常用的一款时钟芯片莫过于DS1302,今天我们来重点了解一下DS1302时钟芯片的电气连接相关内容22.1DS1302芯片概述DS1302是DALLAS(达拉斯)公司出的一款涓流充电时钟芯片,2001年DALLAS被MAXIM(美信)收购,因此我们看到的DS1302的数据手册既有DALLAS的标志,又有MAXIM的标志,大家了解即可。
DS1302实时时钟芯片广泛应用于电话、传真、便携式仪器等产品领域,他的主要性能指标如下1、DS1302是一个实时时钟芯片,可以提供秒、分、小时、日期、月、年等信息,并且还有软件自动调整的能力,可以通过配置AM/PM来决定采用24小时格式还是12小时格式。
2、拥有31字节数据存储RAM。
3、串行I/O通信方式,相对并行来说比较节省IO口的使用。
4、DS1302的工作电压比较宽,大概是2.0V~5.5V都可以正常工作。
5、DS1302这种时钟芯片功耗一般都很低,它在工作电压2.0V的时候,工作电流小于300nA。
6、DS1302共有8个引脚,有两种封装形式,一种是DIP-8封装,芯片宽度(不含引脚)是300mil,一种是SOP-8封装,有两种宽度,一种是150mil,一种是208mil。
7、当供电电压是5V的时候,兼容标准的TTL电平标准,这里的意思是,可以完美的和单片机进行通信。
8、由于DS1302是DS1202的升级版本,所以所有的功能都兼容DS1202。
此外DS1302有两个电源输入,一个是主电源,另外一个是备用电源,比如可以用电池或者大电容,这样是为了保证系统掉电的情况下,我们的时钟还会继续走。
如果使用的是充电电池,还可以在正常工作时,设置充电功能,给我们的备用电池进行充电。
DS1302时钟C语言编程完整实例
1 DS1302 简介:DS1302是美国D ALLAS 公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态R AM,采用S PI 三线接口与C PU 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和R AM数据。
实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。
工作电压宽达2.5~5.5V。
采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。
DS1302的外部引脚分配如图1所示及内部结构如图2所示。
DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。
图1 DS1302的外部引脚分配图2 DS1302的内部结构各引脚的功能为:V cc1:主电源;Vcc2:备份电源。
当V cc2>Vcc1+0.2V 时,由Vcc2向D S1302供电,当V cc2< Vcc1时,由V cc1向D S1302供电。
SCLK:串行时钟,输入,控制数据的输入与输出;I/O:三线接口时的双向数据线;CE:输入信号,在读、写数据期间,必须为高。
该引脚有两个功能:第一,CE 开始控制字访问移位寄存器的控制逻辑;其次,CE 提供结束单字节或多字节数据传输的方法。
DS1302有下列几组寄存器:① D S1302有关日历、时间的寄存器共有12个,其中有7个寄存器 (读时81h ~8Dh ,写时80h ~8Ch ),存放的数据格式为 BCD 码形式, 如图3所示。
图 3 DS1302有关日历、时间的寄存器 小时寄存器(85h 、84h )的位7用于定义 D S1302是运行于12小时 模式还是24小时模式。
当为高时,选择12小时模式。
在12小时模式时,位5是 ,当为1时,表示 PM 。
在24小时模式时,位5是第二个10小时 位。
秒寄存器(81h 、80h )的位7定义为时钟暂停标志(CH )。
DS1302时钟芯片读写详解
DS1302时钟芯片读写详解DS1302时钟芯片读写详解2008-09-26 13:07/*DS1302读写程序(C51)*/sbit DS13CLK =P1^5; /*DS1302的SCLK脚脉冲*/ sbit DS13IO =P1^6; /*DS1302的IO脚数据*/ sbit DS13CS =P1^7; /*DS1302的RST脚片选*/ /*向DS1302写一个字节*/void _wds13byte(uchar _code){uchar i;DS13CLK =0;DS13CLK =0;for(i=0;i<8;i++){if(_code&0x01) DS13IO =1;else DS13IO =0;DS13CLK =1;DS13CLK =1;DS13CLK =0;DS13CLK =0;_code =_code >> 1;}}/*从DS1302读一个字节*/uchar _rds13byte(void){uchar i,_code;_code=0;DS13CLK =0;DS13CLK =0;DS13IO =1;for(i=0;i<8;i++){_code =_code >>1;if(DS13IO) _code =_code|0x80;DS13CLK =1;DS13CLK =1;DS13CLK =0;DS13CLK =0;}return _code;}/*读功能 _code读功能命令 */uchar readds1302(uchar _code){DS13CS =0; /*关闭DS1302*/DS13CLK =0;DS13CLK =0;DS13CS =1; /*使能DS1302*/_wds13byte(_code); /*读代码*/_code=_rds13byte(); /*返回读取数字*/ DS13CLK =1;DS13CS =0; /*关闭DS1302*/ return _code;}/*写功能 fp写的地址,_code写的内容*/ void writeds1302(uchar fp,uchar _code) {DS13CS =0; /*关闭DS1302*/DS13CLK =0;DS13CLK =0;DS13CS =1; /*使能DS1302*/_wds13byte(fp); /*写控制命令*/_wds13byte(_code); /*写入数据*/DS13CLK=1;DS13CS =0; /*关闭DS1302*/}/*******DS1302设置快速充电***************/void ds13_charg(void){writeds1302(0x8e,0x00); /*解除写保护*/writeds1302(0x90,0xa5); /*单二极管2K电阻充电*/writeds1302(0x8e,0x80); /*置位写保护*/};;;DS1302读写程序(汇编);;;;************************************************************** *******/T_CLK Bit P1.5 ;实时时钟时钟线引脚T_IO Bit P1.6 ;实时时钟数据线引脚T_RST Bit P1.7 ;实时时钟复位线引脚;**********************************************************;子程序名:Set1302;功能:设置DS1302 初始时间,并启动计时。
DS1302内码及10进制二进制十六进制之间的转换
DS1302的时钟程序读写时都是BCD码,高4位是实际的十位数,低位是实际的个位数。
对于一些像我这样的初学者,BCD码和ds1302内码以及十六进制之间的转换是一个难点.bcd码也叫8421码就是将十进制的数以8421的形式展开成二进制,大家知道十进制是0~9十个数组成,着十个数每个数都有自己的8421码:0=00001=00012=00103=00114=01005=01016=01107=01118=10009=1001举个例子:321的8421码就是3 2 10011 0010 0001就是这样了:)如十进制数45,按BCD码规则,应为4和5但是4的BCD码为多少呢?--------01005的BCD码为多少呢?--------0101那么如何把45按bcd的0100 0101放到ds1302中呢?公式:公式:45/10=4 45%10=5则4*16+5=69(十进制69)69的BCD码正好为0100 0101这就是45的bcd码注:有些资料和视频泛泛而谈,说什么16进制xxx,其实这个转换里除了16当系数之外根本不涉及十六进制!//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////在从1302往外读数时,将相应的二进制bcd码直接转为16进制输出即可例如十进制45Bcd码0100 0101 (这个bcd码对应十进制69),(这个bcd码对应十六进制为45)公式:Temp=time_date/16;Time_date=time_date%16Num_10jinzhi=temp*10+time_date;例如:bcd码0100 0101Temp=0100 0101/16=4Time_date=0111 0101%16=5Num_10jinzhi=4*10+5。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DS1302时钟芯片读写详解
2008-09-26 13:07
/*DS1302读写程序(C51)*/
sbit DS13CLK =P1^5; /*DS1302的SCLK脚脉冲*/ sbit DS13IO =P1^6; /*DS1302的IO脚数据*/ sbit DS13CS =P1^7; /*DS1302的RST脚片选*/ /*向DS1302写一个字节*/
void _wds13byte(uchar _code)
{
uchar i;
DS13CLK =0;
DS13CLK =0;
for(i=0;i<8;i++)
{
if(_code&0x01) DS13IO =1;
else DS13IO =0;
DS13CLK =1;
DS13CLK =1;
DS13CLK =0;
DS13CLK =0;
_code =_code >> 1;
}
}
/*从DS1302读一个字节*/
uchar _rds13byte(void)
{
uchar i,_code;
_code=0;
DS13CLK =0;
DS13CLK =0;
DS13IO =1;
for(i=0;i<8;i++)
{
_code =_code >>1;
if(DS13IO) _code =_code|0x80;
DS13CLK =1;
DS13CLK =1;
DS13CLK =0;
DS13CLK =0;
}
return _code;
}
/*读功能_code读功能命令*/
uchar readds1302(uchar _code)
{
DS13CS =0; /*关闭DS1302*/
DS13CLK =0;
DS13CLK =0;
DS13CS =1; /*使能DS1302*/
_wds13byte(_code); /*读代码*/
_code=_rds13byte(); /*返回读取数字*/
DS13CLK =1;
DS13CS =0; /*关闭DS1302*/
return _code;
}
/*写功能fp写的地址,_code写的内容*/
void writeds1302(uchar fp,uchar _code)
{
DS13CS =0; /*关闭DS1302*/
DS13CLK =0;
DS13CLK =0;
DS13CS =1; /*使能DS1302*/
_wds13byte(fp); /*写控制命令*/
_wds13byte(_code); /*写入数据*/
DS13CLK=1;
DS13CS =0; /*关闭DS1302*/
}
/*******DS1302设置快速充电***************/
void ds13_charg(void)
{
writeds1302(0x8e,0x00); /*解除写保护*/
writeds1302(0x90,0xa5); /*单二极管2K电阻充电*/
writeds1302(0x8e,0x80); /*置位写保护*/
}
;;;DS1302读写程序(汇编);;;
;******************************************************************* **/
T_CLK Bit P1.5 ;实时时钟时钟线引脚
T_IO Bit P1.6 ;实时时钟数据线引脚
T_RST Bit P1.7 ;实时时钟复位线引脚
;**********************************************************
;子程序名:Set1302
;功能:设置DS1302 初始时间,并启动计时。
;说明:
;调用:RTInputByte
;入口参数:初始时间在:Second,Minute,Hour,Day,Month,Week.YearL(地址连续) ;出口参数:无
;影响资源:A B R0 R1 R4 R7
;**********************************************************
Set1302:
CLR T_RST
CLR T_CLK
SETB T_RST
MOV B, #8EH ;控制寄存器
LCALL RTInputByte
MOV B, #00H ;写操作前WP=0
LCALL RTInputByte
SETB T_CLK
CLR T_RST
MOV R0, #Second;
MOV R7, #7 ;秒分时日月星期年
MOV R1, #80H ;秒写地址
S13021: CLR T_RST
CLR T_CLK
SETB T_RST
MOV B, R1 ;写秒分时日月星期年地址
LCALL RTInputByte
MOV A, @R0 ;写秒数据
MOV B, A
LCALL RTInputByte
INC R0
INC R1
INC R1
SETB T_CLK
CLR T_RST
DJNZ R7, S13021
CLR T_RST
CLR T_CLK
SETB T_RST
MOV B, #8EH ;控制寄存器
LCALL RTInputByte
MOV B, #80H ;控制,WP=1,写保护
LCALL RTInputByte
SETB T_CLK
CLR T_RST
RET
;**********************************************************
;子程序名:Get1302
;功能:从DS1302 读时间
;说明:
;调用:RTInputByte,RTOutputByte
;读出: Second,Minute,Hour,Day,Month,Week.YearL
;出口参数:无
;影响资源:A B R0 R1 R4 R7
;********************************************************** Get1302:
MOV R0, #Second;
MOV R7, #7
MOV R1, #81H ;秒地址
G13021: CLR T_RST
CLR T_CLK
SETB T_RST
MOV B, R1 ;秒分时日月星期年地址
LCALL RTInputByte
LCALL RTOutputByte
MOV @R0, A ;秒
INC R0
INC R1
INC R1
SETB T_CLK
CLR T_RST
DJNZ R7, G13021
RET
;**********************************************************
;功能:写1302一字节(内部子程序)
;********************************************************** RTInputByte:
MOV R4, #8
Inbit1: MOV A, B
RRC A
MOV B, A
MOV T_IO, C
SETB T_CLK
CLR T_CLK
DJNZ R4, Inbit1
RET
;**********************************************************
;功能:读1302一字节(内部子程序)
;********************************************************** RTOutputByte:
MOV R4, #8
Outbit1: MOV C, T_IO
RRC A
SETB T_CLK
CLR T_CLK
DJNZ R4, Outbit1
RET。