DS1302芯片怎么用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DS1302芯片怎么用相关的知识,希望对你有一定的参考价值。
参考技术A DS1302是DALLAS
公司推出的涓流充电时钟芯片内含有一个实时
时钟/日历和31
字节静态RAM
可通过简单的串行接口与单片机进行通信
可提供:
--秒分时日日期月年的信息
--每月的天数和闰年的天数可自动调整
--可通过AM/PM
指示决定采用24
或12
小时格式
--保持数据和时钟信息时功率小于1mW
DS1302引脚
X1
X2
32.768KHz
晶振管脚
GND
地
CE
复位脚
I/O
数据输入/输出引脚
SCLK
串行时钟
Vcc1,Vcc2
电源供电管脚
各引脚的功能为:
Vcc1:主电源;Vcc2:备份电源。当Vcc2>Vcc1+0.2V时,由Vcc2
向DS1302供电,当Vcc2<
Vcc1时,由Vcc1向DS1302供电。
SCLK:串行时钟,输入,控制数据的输入与输出;
I/O:三线接口时的双向数据线;
CE:输入信号,在读、写数据期间,必须为高。该引脚有两个功能:
第一,CE开始控制字访问移位寄存器的控制逻辑;其次,
CE提供结束单字节或多字节数据传输的方法。
DS1302与单片机的连接也仅需要3条线:CE引脚、SCLK串行时钟
引脚、I/O串行数据引脚,Vcc2为备用电源,外接32.768kHz晶振,
为芯片提供计时脉冲。
DS1302内部包括:
Power
control:电源控制模块
Input
shift
registers:输入移位寄存器
Command
and
control
logic:通讯与逻辑控制器
Oscillator
and
divider:晶体振荡器及分频器
DS1302
的内部主要组成部分虽然有:移位寄存器、控制逻辑、振荡器、实时时
钟以及RAM。虽然数据分成两种,但是对单片机的程序而言,其实是一样的,
就是对特定的地址进行读写操作。
DS1302控制字:
控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入
到DS1302中。
位6:如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;
位5至位1(A4~A0):指示操作单元的地址;
位0(最低有效位):如为0,表示要进行写操作,为1表示进行读操作。
控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上
升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。同样,在紧跟
8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读
出的数据也是从最低位到最高位。
单片机+ds1302+仿真程序 用三个按键调时间
51单片机对DS1302的仿真 用三个按键调时间
-
ds1302芯片
-
1602液晶
-
AT89C51主控
-
仿真效果
-
程序代码
#include <REGX52.H>
#define uchar unsigned char
#define uint unsigned int
#define data8 P0
sbit rst=P1^0;
sbit sck=P1^1;
sbit sda=P1^2;
sbit rs=P1^3;
sbit rw=P1^4;
sbit e=P1^5;
sbit key1=P2^0;
sbit key2=P2^1;
sbit key3=P2^2;
sbit start= P2^3;
sbit ale=P1^6;
sbit eoc=P1^7;
sbit oe=P2^4;
uchar table1[]="TIME:";
uchar table2[]="DATE:";
uchar table[]="0123456789:-";
uchar code chuzhi[]={0x80,0x34,0x18,0x15,0x04,0x04,0x21,0x00};
uchar code dizhi[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x80};
uchar code chushi1602[]={0x38,0x0c,0x01};
uchar chuncu[7]={0};
uchar song,temp1,adc;
void delayms(uint xms)
{
uchar i;uint j;
for(j=xms;j>0;j--)
for(i=110;i>0;i--);
}
void ad();
void t0()
{
TMOD = 0x01;
TH0 = 0x0FE;
TL0 = 0x0C;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void zl1602(uchar zlduan)
{
rs=0;
rw=0;
data8=zlduan;
delayms(1);
e=1;
delayms(5);
e=0;
}
void sj1602(uchar sjduan)
{
rs=1;
rw=0;
data8=table[sjduan];
delayms(1);
e=1;
delayms(5);
e=0;
}
void sc1602(uchar sjduan)
{
rs=1;
rw=0;
data8=sjduan;
delayms(1);
e=1;
delayms(5);
e=0;
}
void cs1602()
{
uchar i;
for(i=0;i<3;i++)
{
zl1602(chushi1602[i]);
}
}
void cs1302()
{
rst=0;
sck=0;
rst=1;
}
void xie1302(uchar temp) //1000 0000
{
uchar i;
for(i=8;i>0;i--)
{
sda=temp&0x01; //0
sck=0;
sck=1;
temp>>=1; //0100 0000
}
}
uchar song1302()
{
uchar i;
for(i=0;i<8;i++)
{
if(sda)
{
song|=0x80;
}
sck=1;
sck=0;
song>>=1;
}
return(song);
}
void r1302(uchar radd,uchar rdata)
{
cs1302();
delayms(1);
rst=1;
xie1302(radd);
xie1302(rdata);
rst=0;
}
void w1302(uchar add)
{
cs1302();
delayms(1);
rst=1;
xie1302(add);
temp1=song1302();
rst=0;
sck=0;
}
void chushi()
{
uchar i;
for(i=0;i<8;i++)
{
r1302(dizhi[i],chuzhi[i]);
}
}
uchar zhuanhuan()
{
uchar i,dat=0x81;
for(i=0;i<7;i++)
{
w1302(dat);
chuncu[i]=song;
dat+=2;
}
return(chuncu);
}
void xianshi()
{
uchar i;
for(i=0;i<5;i++)
{
zl1602(0x80+i);
sc1602(table1[i]);
delayms(2);
zl1602(0x80+i+0X40);
sc1602(table2[i]);
delayms(2);
}
zl1602(0x8C);
sj1602(chuncu[0]&0x0f);
delayms(2);
zl1602(0x8B);
sj1602(chuncu[0]>>4);
delayms(2);
zl1602(0x89);
sj1602(chuncu[1]&0x0f);
delayms(2);
zl1602(0x88);
sj1602(chuncu[1]>>4);
delayms(2);
zl1602(0x86);
sj1602(chuncu[2]&0x0f);
delayms(2);
zl1602(0x85);
sj1602(chuncu[2]>>4);
delayms(2);
zl1602(0x8e+0x40);
sj1602(chuncu[3]&0x0f);
delayms(2);
zl1602(0x8d+0x40);
sj1602(chuncu[3]>>4);
delayms(2);
zl1602(0x8b+0X40);
sj1602(chuncu[4]&0x0f);
delayms(2);
zl1602(0x8a+0x40);
sj1602(chuncu[4]>>4);
delayms(2);
zl1602(0x8f);
sj1602(chuncu[5]);
delayms(2);
zl1602(0x88+0X40);
sj1602(chuncu[6]&0x0f);
delayms(2);
zl1602(0x87+0X40);
sj1602(chuncu[6]>>4);
delayms(2);
zl1602(0x86+0X40);
sj1602(0);
delayms(2);
zl1602(0x85+0X40);
sj1602(2);
delayms(2);
zl1602(0x87);
sj1602(10);
delayms(2);
zl1602(0x8a);
sj1602(10);
delayms(2);
zl1602(0x89+0X40);
sj1602(11);
delayms(2);
zl1602(0x8c+0X40);
sj1602(11);
delayms(2);
}
void anjian()
{
uchar temp,mun,mun1,mun2;
if(key1==0)
{
delayms(10);
if(key1==0)
{
temp++;
}
}
while(!key1);
if(temp<=7)
{
switch(temp)
{
case 1:
if(key2==0)
{
delayms(10);
if(key2==0)
{
mun=chuncu[1];
mun++;
mun1=chuncu[1]&0x0f;
if(mun1>=0x09)
{
mun=mun&0xf0;
mun=mun+0x10;
}
r1302(0x82,mun);
}
}
if(key3==0)
{
delayms(10);
if(key3==0)
{
mun=chuncu[1];
mun--;
mun1=chuncu[1]&0x0f;
if(mun1<=0x00)
{
mun=mun&0xf0+9; //退位是15 直接清零+9
}
r1302(0x82,mun);
}
mun2=chuncu[1]&0xf0;
if(mun2>=0x59)
{
r1302(0x82,0x00);
}
} break;
case 2:
if(key2==0)
{
delayms(10);
if(key2==0)
{
mun=chuncu[2];
mun++;
mun1=chuncu[2]&0x0f;
if(mun1>=0x09)
{
mun=mun&0xf0;
mun=mun+0x10;
}
r1302(0x84,mun);
}
}
if(key3==0)
{
delayms(10);
if(key3==0)
{
mun=chuncu[2];
mun--;
mun1=chuncu[1]&0x0f;
if(mun1<0x01)
{
mun=mun&0xf0+9; //退位是15 直接清零+9
}
r1302(0x84,mun);
}
} break;
case 3:
if(key2==0)
{
delayms(10);
if(key2==0)
{
mun=chuncu[5];
mun++;
r1302(0x8a,mun);
}
}
if(key3==0)
{
delayms(10);
if(key3==0)
{
mun=chuncu[5];
mun--;
mun1=chuncu[1]&0x0f;
if(mun1<=0x00)
{
mun=mun&0xf0+9; //退位是15 直接清零+9
}
r1302(0x8a,mun);
}
} break;
case 4:
if(key2==0)
{
delayms(10);
if(key2==0)
{
mun=chuncu[3];
mun++;
mun1=chuncu[3]&0x0f;
if(mun1>=0x09)
{
mun=mun&0xf0;
mun=mun+0x10;
}
r1302(0x86,mun);
}
if(mun&0x0f==0x0a)
{
mun +=0x10;
}
}
if(key3==0)
{
delayms(10);
if(key3==0)
{
mun=chuncu[3];
mun--;
mun1=chuncu[1]&0x0f;
if(mun1<=0x00)
{
mun=mun&0xf0+9; //退位是15 直接清零+9
}
r1302(0x86,mun);
}
} break;
case 5:
if(key2==0)
{
delayms(10);
if(key2==0)
{
mun=chuncu[4];
mun++;
mun1=chuncu[4]&0x0f;
if(mun1>=0x09)
{
mun=mun&0xf0;
mun=mun+0x10;
}
r1302(0x88,mun);
}
}
if(key3==0)
{
delayms(10);
if(key3==0)
{
mun=chuncu[4];
mun--;
mun1=chuncu[1]&0x0f;
if(mun1<=0x00)
{
mun=munDS12C887,DS1302,DS3231时钟芯片那个精度比较高?