开发板DS1302模块电路图如下:
目的:单片机查询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