51单片机实验15:DS1302时钟模块应用

开发板DS1302模块电路图如下:

51单片机实验15:DS1302时钟模块应用_第1张图片

 

目的:单片机查询DS1302时钟模块时间,并将其显示在数码管上。

DS1302的初始化时间为2019年1月1日12:00(星期二)

#include
#include

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

uc code x[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uc tim[9];

void delay(uc x)
{
	uc i,j;
	for(i=1;i<=x;i++)
		for(j=1;j<=110;j++);
}

void digdisplay()
{
	uc i;
	for(i=1;i<=8;i++)
	{
		switch(i)
		{
			case (1):
			LSA=0;LSB=0;LSC=0;break;
			case (2):
			LSA=1;LSB=0;LSC=0;break;
			case (3):
			LSA=0;LSB=1;LSC=0;break;
			case (4):
			LSA=1;LSB=1;LSC=0;break;
			case (5):
			LSA=0;LSB=0;LSC=1;break;
			case (6):
			LSA=1;LSB=0;LSC=1;break;
			case (7):
			LSA=0;LSB=1;LSC=1;break;
			case (8):
			LSA=1;LSB=1;LSC=1;break;
		}
		P0=tim[i];
		delay(1);
		P0=0x00;
	}
}

void datapros()//数据处理函数,将存储在ti数组中的时间,转化为可以在数码管上显示的时间。
{
	ds1302readtime();
	tim[8]=x[ti[2]/16];//数据以BCD码的形式存储在ti数组中(十六进制),在获取时间时注意处理方法。

	tim[7]=x[ti[2]%16];
	tim[6]=0x40;
	tim[5]=x[ti[1]/16];
	tim[4]=x[ti[1]%16];
	tim[3]=0x40;
	tim[2]=x[ti[0]/16];
	tim[1]=x[ti[0]%16];
}

void main()
{
	ds1302init();
	while(1)
	{
		datapros();
		digdisplay();
	}
}
#include

uc code read_addr[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};//读地址,读为1 
uc code write_addr[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};//写地址,写为0
uc ti[7] = {0, 0, 0x12, 0x01, 0x01, 0x02, 0x19};//初始化时间

void ds1302write(uc addr,uc dat)
{
	uc i;
	sclk=0;
	rst=0;
	rst=1;
	for(i=1;i<=8;i++)
	{
		dsio=addr&0x01;
		addr>>=1;
        sclk=1;
		sclk=0;
	}
	for(i=1;i<=8;i++)
	{
		dsio=dat&0x01;
		dat>>=1;
		sclk=1;
		_nop_();
		sclk=0;
		_nop_();
	}
	rst=0;
}

uc ds1302read(uc addr)
{
	uc i,dat,dat1;
	sclk=0;
	rst=0;
	rst=1;
	for(i=1;i<=8;i++)
	{
		dsio=addr&0x01;
		addr>>=1;
		sclk=1;
		sclk=0;
	}
	for(i=1;i<=8;i++)
	{
		dat1=dsio&0x01;
		dat=(dat>>1)|(dat1<<7);
		sclk=1;
		sclk=0;
	}
	rst=0;
	dsio=0;//ds1302芯片复位稳定时间,必须有这句。
	return dat;
}

void ds1302init()
{
	uc i;
	ds1302write(0x8e,0x00);
	for(i=0;i<7;i++)
	{
		ds1302write(write_addr[i],ti[i]);
	}
	ds1302write(0x8e,0x80);
}

void ds1302readtime()
{
	uc i;
	for(i=0;i<7;i++)
	{
		ti[i]=ds1302read(read_addr[i]);
	}
}
#ifndef _DS1302_H_
#define _DS1302_H_

#include
#include

#ifndef uc
#define uc unsigned char
#endif
#ifndef ui
#define ui unsigned int
#endif

sbit sclk=P3^6;
sbit dsio=P3^4;
sbit rst=P3^5;

void ds1302readtime();
void ds1302init();

extern uc ti[7];

#endif

 

你可能感兴趣的:(51单片机,进阶之路——单片机的学习)