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时钟芯片那个精度比较高?

4.7 51单片机-DS1302 实时时钟芯片

4.7 51单片机-DS1302 实时时钟芯片

ds1302时钟芯片。。。谁给我看下这个程序?液晶可以显示,但是时钟不会走显示的也不是我初始化的时间。

STM8驱动RTC芯片DS1302

既然单片机本身有定时器,为啥还需要采用DS1302来定时呢,DS1302的优点是啥呢?