ds1302数码管显示应用
ds1302数码管显示应用

scanbuff[2]=buff/16;//十位
scanbuff[3]=buff%16;//个位
buff=ReadByte(Read_Sec); //秒
scanbuff[4]=buff/16;//十位
scanbuff[5]=buff%16;//个位
void WriteDS1302(void);//向DS1302写入时间。
void ReadDS1302(void);//读取DS1302中的年,月,日,星期几,小时,分钟和秒.
void SendCmd(unsigned char cmd);//传送地址
void delayus(unsigned char tt);
}
//读取地址RCmd的时间/数据
unsigned char ReadByte(unsigned char RCmd)
{
unsigned char valu=0x00,temp;
CE=0;//初使化
SCLK=0;//初使化,并为rise edge做准备
CE=1;//初使化,传输开始。The SCLK must be low when CE is driven to high level.
#defineRead_Mon0x89
#defineRead_Day0x8b
#defineRead_Yea0x8d
#define CLK_BurstW0xbf//时钟突发模式写
#define CLK_BurstR0xbf//时钟突发模式读
#define Write_RAM_Begin0xc0//RAM第一个字节写指令
sbit _74hc154_D = P1^3;
实时时钟DS1302的原理与应用

可编辑ppt
7
表4-3-1 日历、时钟寄存器及其控制字对照表
可编辑ppt
8
表4-3-2 DS1302内部主要寄存器功能表
可编辑ppt
9
其中CH:时钟停止位;为0时振荡器工作;为1时 振荡器停止;AP=1时为下午模式,为0时上午模 式;DS1302的控制字节说明如下: 1.DS1302的控制字节的最高有效位(位7)必须是 逻辑1,如果它为0,则不能把数据写入到DS1302 中:位6如果为0,则表示存取日历时钟数据,为 1表示存取RAM数据;位5至位1指示操作单元的地 址:最低有效位(位0)如为0表示要进行写操作, 为1表示进行读操作,控制字节总是从最低位开 始输出。
可编辑ppt
10
2.在控制指令字输入后的下一个SCLK时钟的上升沿 时数据被写入DS1302,数据输入从低位即位0开 始。同样,在紧跟8位的控制指令字后的下一个 SCLK脉冲的下降沿读出DS1302的数据,读出数据 时从低位0位至高位7。
可编辑ppt
11
4.3.3 DS1302的读写时序
不仅要向寄存器写入控制字。还需要读取相 应寄存器的数据。4.3.3 DS1302的读写时序要想 与DS1302通信,首先要先了解DS1302的控制字。 DS1302的控制字见6.5.4节内容。控制字的最高 有效位(位7)必须是逻辑1,如果它为0。则不能 把数据写入到DS1302中。位6:如果为0,则表示 存取日历时钟数据,为1表示存取RAM数据;位5 至位1(A4~A0):指示操作单元的地址;位0(最 低有效位):如为0。
可编辑操作。 控制字总是从最低位开始输出。在控制字指令输 入后的下一个SCLK时钟的上升沿时,数据被写入 DS1302,数据输入从最低位(0位)开始。同样, 在紧跟8位的控制字指令后的下一个SCLK脉冲的 下降沿,读出DS1302的数据。读出的数据也是从 最低位到最高位。数据读写时序如下图4-3-3所 示。具体操作见驱动程序。
第3节-实时时钟DS1302的原理与应用(项目14)

本项目采用八位数码管显示时间,每两位之间利用 闪烁的“—”号表示走时,见图5-3-3所示。图中数码管的 驱动采用74HC573。DS1302的SCLK接单片机P3.7, I/O(SDA) 端口接P3.5,RST接P3.4;DS1302的X1和X2接32768Hz的标 准时钟晶振。
7
6
54321 0
寄存器名称
1 RAM/CK A4 A3 A2 A1 A0 RD/W
秒寄存器控制字
1
0
0 0 0 0 0 1/0
分寄存器控制字
1
0
0 0 0 0 1 1/0
时寄存器控制字
1
0
0 0 0 1 0 1/0
日寄存器控制字
1
0
0 0 0 1 1 1/0
月寄存器控制字
1
0
0 0 1 0 0 1/0
从由DS1302的读写时序可以看出,在SCLK上升沿来 到时写数据,下降沿来到时读数据,单片机向DS1302中发 送和接收的数据先从低位开始,因此在读写操作中需根据 读写时序完成一个字节的读写。
三、DS1302应用操作
DS1302应用操作包括向DS1302写一字节数据、读一 字节数据、读时间操作和调整时间操作。由于要先发送控 制字,从DS1302读时间需要调用一次写和一次读操作;向 对应地址读一字节数据需要调用两次写一字节数据操作, 此种操作用于调整时间。
//读1302数据
x = x >> 4;
dec
= dec + x * 10;
return(dec);
}
/*十进制到8421BCD码转换*/
uchar DEC_BCD_conv(uchar x)
IO口实时时钟芯片DS1302的应用实例

6.5
DS1302的读写时序
不仅要向寄存器写入控制字。还需要读取相应寄存器 的数据。要想与DS1302通信,首先要先了解DS1302的控
日历、 时钟寄存器及其控制字对照表 7 6 5 4 A3 0 0 0 0 0 0 0 0 1 1 3 A2 0 0 0 0 1 1 1 1 0 1 2 A1 0 0 1 1 0 0 1 1 0 1 1 A0 0 1 0 1 0 1 0 1 0 1 0 RD/W 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0
//秒 //分 //时 //日 //月 //星期 //年
time1[4]=d&0x0f; time1[5]=(d>>4)&0x0f; } void set_time(void) { v_W1302(0x8e,0x00); v_W1302(0x80,0x80); v_W1302(0x82,min); v_W1302(0x84,hou); v_W1302(0x86,day); v_W1302(0x88,mon); v_W1302(0x8c,yea); v_W1302(0x80,0x00); v_W1302(0x8e,0x80); } 以上函数为DS1302.H文件,在主函数中要调用该函数
源,外接32.768kHz晶振。RST是复位/片选线,通过把
RST输入驱动置高电平来启动所有的数据传送。RST输入
有两种功能:首先,RST接通控制逻辑,允许地址/命令序 列送入移位寄存器;其次,RST提供终止单字节或多字节 数据的传送手段。 当RST为高电平时,所有的数据传送被初始化,允许 对DS1302进行操作。如果在传送过程中RST置为低电平, 则会终止此次数据传送,I/O引脚变为高阻态。上电运
ds1302用法

ds1302用法时钟ic_ds1302的应用之一……基础知识2021-11-0613:09在网上看了很久,发现初学者最有兴趣的就是ds1302时钟电路,也很自然,它是个做出来就让你觉得最实用的电路了,但实际上制做上并不简单,首先你要让你的显示部分(不管是数码管还是lcd)调试通过。
然后把ds1302接好,调试正确了才能在成功显示时间和日期。
下面我们就来说说ds1302的用法。
ds1302的图如下:ds1302就是美国dallas公司面世的一种高性能、低功耗的实时时钟芯片,额外31字节静态ram,使用spi三线USB与cpu展开同步通信,并可以使用突发性方式一次传输多个字节的时钟信号和ram数据。
实时时钟可以提供更多秒、分后、时、日、星期、月和年,一个月大与31天时可以自动调整,且具备闰年补偿功能。
工作电压长约2.5~5.5v。
使用双电源供电(主电源和水泵电源),可以设置水泵电源电池方式,提供更多了对后背电源展开涓细电流电池的能力。
下面就是标准的接线电路图:各引脚功能如下:插槽号名称功能①vcc2主电源②、③x1,x2接32768hz晶振④gnd地线⑤rst复位⑥i/0数据输入输出⑦sclk串行时钟⑧vccl后备电源ds1302有关日历、时间的寄存器共计12个,其中存有7个寄存器(念时81h~8dh,写下时80h~8ch)就是放置秒、分后,小时、日、月、年、周数据的,放置的数据格式为bcd码形式它的内部时间寄存器如下:这张表呢是ds1302内部的7个与时间、日期有关的寄存器图和一个写保护寄存器,我们要做的就是将初始设置的时间、日期数据写入这几个寄存器,然后再不断地读取这几个寄存器来获取实时时间和日期。
这几个寄存器的说明如下:1、秒寄存器(81h、80h)的位7定义为时钟暂停标志(ch)。
当起始上电时该边线为1,时钟振荡器暂停,ds1302处在低功耗状态;只有将秒寄存器的该边线重写为0时,时钟就可以开始运行。
实时时钟电路DS1302芯片的原理及应用

实时时钟电路DS1302芯片的原理及应用DS1302是一种实时时钟(RTC)电路芯片,由Dallas Semiconductor (现被Maxim Integrated收购)设计和制造。
它提供了一个准确的时间和日期计时功能,适用于许多应用,例如电子设备、仪器仪表、通讯设备和计算机系统等。
DS1302芯片的原理如下:1.时钟发生器:DS1302芯片内部集成了一个时钟发生器电路,它使用外部XTAL晶体和一个频率分频器来产生准确的时钟信号。
晶体的频率通常为32.768kHz,这是由于此频率具有较好的稳定性。
2.电源管理:DS1302芯片可以使用3V到5.5V的电源供电。
它内部具有电源管理电路,可以自动切换到低功耗模式以延长电池寿命。
3.时间计数器:DS1302芯片内部包含一个时间计数器,用于计算并保存当前时间、日期和星期。
它采用24小时制,并提供了BCD编码的小时、分钟、秒、日、月和年信息。
4.控制和数据接口:DS1302芯片使用串行接口与外部器件进行通信,如微控制器或外部检测电路。
控制和数据信息通过三根线SCLK(串行时钟)、I/O(串行数据输入/输出)和CE(片选)进行传输。
5.电源备份:为了确保即使在电源中断的情况下仍能保持时间数据,DS1302芯片通过附带的外部电池来提供电源备份功能。
当主电源中断时,芯片会自动切换到电池供电模式,并将时间数据存储在内部RAM中。
DS1302芯片的应用包括但不限于以下几个方面:1.时钟和日历显示:DS1302芯片可以直接连接到LCD显示屏、LED显示器或数码管等设备,用于显示当前时间和日期。
2.定时控制:DS1302芯片可以用作定时器或闹钟,在特定的时间触发一些事件。
例如,可以使用它作为控制家庭设备的定时开关。
3.数据记录:由于DS1302芯片具有时间计数功能,它可以用于记录事件的时间戳,如数据采集、操作记录或系统状态记录。
4.电源失效保护:DS1302芯片的电源备份功能可确保即使在电源中断的情况下,时间数据也能被保存,以避免系统重新启动后时间重置的问题。
时钟芯片DS1302及其应用

时钟停止标志位
秒控制寄存器
秒寄存器
bit7
秒寄存器的最高位,定义为时钟停止位,当该位置1,时 钟振荡停止,DS1302进入低功耗待机模式;
当该位置0,时钟振荡启动;
初始上电状态是没有定义。
启动时钟示例
uchar val;
val = read_DS1302(0x81); //读秒寄存器到val
val &= 0x7f;
最初通过 8 个时钟周期载入控制字节到移位寄存器。如果 控制指令选择的是单字节模式,后来的连续的 8 个时钟脉冲可 以进行 8 位数据的写或 8 位数据的读操作,SCLK 时钟的上升 沿时,数据被写入 DS1302 , SCLK 脉冲的下降沿读出 DS1302 的数据。
• DS1302的基本操作方式是:先写地址(最 后一位是0),再写数据;或者先写地址(最 后一位是1) ,再读数据。
dat|=0x80;
的低位。
DS1302_CLK=1;
nop;
DS1302_CLK=0;
}
return dat;
}
将上面的写字节和读字节放在一起研究 这是一种方案
写一个字节子程序
void sendbyte(uchar a) {
uchar i; for(i=8;i>0;i--) {
DS1302_IO = a & 0x01; a >>= 1; DS1302_CLK=1; _nop_(); DS1302_CLK=0; _nop_(); } }
复位与时钟控制
所有的数据传输必须从将 RST 置高电平开始;
数据传输时序
复位与时钟控制
所有的数据传输必须从将 RST置高电平开始; 一个时钟周期是由下降沿、上升沿组成的序列; 对于数据输入来说,数据必须在数据必须在时钟的上 升沿到来之前有效, 对于数据输入来说,在时钟的下降沿输出数据位。 如果 RST是低电平,所有的数据传输端和IO引脚都为 高阻态。
实时时钟电路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芯片是一种低功耗的实时时钟电路,具有精确计时、可靠存储和简单接口等优点,适用于计时、显示和能量管理等各种应用中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DS1302应用刚学单片机,好多好奇,所以想做个简单的时钟。
下面是PROTEUS仿真电路和电路图,简单易懂。
文笔不好,说了多余。
下面是程序。
#include<reg52.h>#include<intrins.h>#include<ds1302.h>#define uint unsigned int#define uchar unsigned char#define BCDTUAN(str) (str/10*16+str%10) //定义宏,将要写入DS1302的时间转化为BCD码#define Write_Sec 0x80#define Write_Min 0x82#define Write_Hou 0x84#define Write_Dat 0x86#define Write_Mon 0x88#define Write_day 0x8a#define Write_Yea 0x8c#define Write_WP 0x8e //写保护位#define Write_TCR 0x90#define Read_Sec 0x81#define Read_Min 0x83#define Read_Hou 0x85#define Read_Dat0x87#define Read_Mon 0x89#define Read_Day 0x8b#define Read_Yea 0x8d#define CLK_BurstW 0xbf //时钟突发模式写#define CLK_BurstR 0xbf //时钟突发模式读#define Write_RAM_Begin 0xc0 //RAM第一个字节写指令#define Read_RAM_Begin 0xc1 //RAM第一个字节读指令#define RAM_BurstW 0xfe //突发模式写RAM#define RAM_BurstR 0xff //突发模式读RAMsbit _74hc154_A = P1^0;sbit _74hc154_B = P1^1;sbit _74hc154_C = P1^2;sbit _74hc154_D = P1^3;sbit CE =P1^6;sbit SCLK=P1^5;sbit IO =P1^4;uchar code scan[][4]={{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1},{0,1,0,0},{0,1,0,1},{0,1,1,0},{0,1,1,1},{1,0,0,0},{1,0,0,1},{1,0,1,0},{1,0,1,1},{1,1,0,0},{1,1,0,1},{1,1,1,0},{1,1,1,1}};uchar scanbuff[]={0,0,0,0,0,0,0,0,0,0,0,0};uchar code dispdate[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};void WriteDS1302(void); //向DS1302写入时间。
void ReadDS1302(void); //读取DS1302中的年,月,日,星期几,小时,分钟和秒.void SendCmd(unsigned char cmd); //传送地址void delayus(unsigned char tt);void delay(uchar z){uchar x,y;for(x=z;x>0;x--)for(y=120;y>0;y--);}void _74hc154(uchar k) //位扫描设定{_74hc154_A=scan[k][0];_74hc154_B=scan[k][1];_74hc154_C=scan[k][2];_74hc154_D=scan[k][3];}void main(){uchar i;while(1){WriteDS1302();ReadDS1302() ;for(i=0;i<12;i++){_74hc154(i); //位扫描P0=~dispdate[scanbuff[i]];//数据送P0口delay(10);}}}void WriteDS1302(void){WriteByte(Write_Yea,BCDTUAN(13)); //写13年}//读取DS1302中的年,月,日,星期几,小时,分钟和秒.void ReadDS1302(void){unsigned char buff;//将读取的数据送入缓存数组,住输出数据为16进制buff=ReadByte(Read_Yea); //年scanbuff[10]=buff/16; //十位scanbuff[11]=buff%16; //个位buff=ReadByte(Read_Mon); //月scanbuff[6]=buff/16; //十位scanbuff[7]=buff%16; //个位buff=ReadByte(Read_Dat); //日scanbuff[8]=buff/16; //十位scanbuff[9]=buff%16; //个位buff=ReadByte(Read_Hou); //时scanbuff[0]=buff/16; //十位scanbuff[1]=buff%16; //个位buff=ReadByte(Read_Min); //分scanbuff[2]=buff/16; //十位scanbuff[3]=buff%16; //个位buff=ReadByte(Read_Sec); //秒scanbuff[4]=buff/16; //十位scanbuff[5]=buff%16; //个位}//读取地址RCmd的时间/数据unsigned char ReadByte(unsigned char RCmd){unsigned char valu=0x00,temp;CE=0; //初使化SCLK=0; //初使化,并为rise edge做准备CE=1; //初使化,传输开始。
The SCLK must be low when CE is driven to high level.SendCmd(RCmd); //传送地址for(temp=0;temp<8;temp++){valu>>=1;SCLK=0;if(IO==1)valu|=0x80;delayus(1);SCLK=1;delayus(1);}CE=0; //结束传输return valu;}//向WCmd地址写入时间/数据若写入时间,则时间用#define BCD(time) (time/10*16+time%10)处理.void WriteByte(unsigned char WCmd,unsigned char valu){unsigned char temp;CE=0;SCLK=0; //初使化,并为rise edge做准备CE=1; //初使化,传输开始。
SendCmd(WCmd);for(temp=0;temp<8;temp++){SCLK=0;IO=valu&0x01;delayus(2);SCLK=1;delayus(2);valu>>=1;}CE=0; //结束传输}//突发模式读RAM num个字节void BurstRead_CLK(unsigned char *ptr){unsigned char temp,temp2,valu;CE=0;SCLK=0;CE=1;SendCmd(RAM_BurstR); //突发模式读取CLK开始for(temp2=0;temp2<8;temp2++){for(temp=0;temp<8;temp++) //读取到的分别是秒,分,时,日,月,星期几,年,写保护位,注意,TCR是不可以突发模式的。
{valu>>=1;SCLK=0;if(IO==1)valu|=0x80;delayus(2);SCLK=1;delayus(2);}*ptr=valu;ptr++;}CE=0; //结束突发模式读}void BurstRead_RAM(unsigned char *ptr,unsigned char num){unsigned char temp1,temp2,valu;CE=0;SCLK=0;CE=1;SendCmd(CLK_BurstR); //突发模式读取CLK开始for(temp2=0;temp2<num;temp2++){for(temp1=0;temp1<8;temp1++) //读取到的分别是秒,分,时,日,月,星期几,年,写保护位,注意,TCR是不可以突发模式的。
{valu>>=1;SCLK=0;if(IO==1)valu|=0x80;delayus(2);SCLK=1;delayus(2);}*ptr=valu;ptr++;}CE=0; //结束突发模式读}//突发模式写RAMvoid BurstWrite_RAM(unsigned char Data[]){unsigned char size=sizeof(Data),temp1,temp2,valu;if(size>31)size=31;CE=0;SCLK=0;CE=1;SendCmd(RAM_BurstW);for(temp2=0;temp2<size;temp2++){valu=Data[temp2];for(temp1=0;temp1<8;temp1++){SCLK=0;IO=valu&0x01;delayus(2);SCLK=1;delayus(2);valu>>=1;}}CE=0;}void BurstWrite_CLK(unsigned char Time[]){unsigned char size=sizeof(Time),temp1,temp2,valu;if(size>8)size=8;CE=0;SCLK=0;CE=1;SendCmd(CLK_BurstW);for(temp2=0;temp2<size;temp2++){valu=Time[temp2];for(temp1=0;temp1<8;temp1++){SCLK=0;IO=valu&0x01;delayus(2);SCLK=1;delayus(2);valu>>=1;}}CE=0;}//传送指令void SendCmd(unsigned char cmd){unsigned char temp;for(temp=0;temp<8;temp++){SCLK=0; //为下一个上升沿做准备IO=cmd&0x01;SCLK=1;delayus(1);cmd>>=1;}}void delayus(unsigned char tt) //tt=2,延时为2us{tt--;}这个是ds1302.h头文件内容,建个txt文档将下面内容复制进去,改后缀为.h即可添加了#ifndef DS1302_H#define DS1302_Hextern unsigned char ReadByte(unsigned char RCmd);extern void WriteByte(unsigned char WCmd,unsigned char valu);extern void BurstRead_CLK(unsigned char *ptr);extern void BurstRead_RAM(unsigned char *ptr,unsigned char num);extern void BurstWrite_CLK(unsigned char Time[]);extern void BurstWrite_RAM(unsigned char Data[]);#endif。