描述:
#include"reg52.h"
#include"intrins.h"
typedef unsigned char uint8;
typedef unsigned int uint6;
sbit SDA=P1^1;
sbit SCK=P1^0;
sbit RST=P3^6;
#define ds1302wa 0x80
#define ds1302ra 0x81
uint8 time[7]={2,35,15,2,7,6,16};
void delay(uint6 n)
{
while(n--);
}
void write_ds1302_byte(uint8 dat)
{
uint8 i;
for(i=0;i<8;i++)
{
SDA=dat & 0x01;
SCK=1;
SCK=0;
dat>>=1;
}
}
uint8 read_ds1302_byte()
{
uint8 i,dat=0;
for(i=0;i<8;i++)
{
dat>>=1;
if(SDA==1)
dat= dat | 0x80;
SCK=1;
SCK=0;
}
return dat;
}
void reset_ds1302()
{
RST=0;
SCK=0;
RST=1;
}
void clear_ds1302_wp()
{
reset_ds1302();
RST=1;
write_ds1302_byte(0x8E);
write_ds1302_byte(0x00);
SDA=0;
RST=0;
}
void set_ds1302_wp()
{
reset_ds1302();
RST=1;
write_ds1302_byte(0x8E);
write_ds1302_byte(0x80);
SDA=0;
RST=0;
}
void write_ds1302(uint8 a,uint8 dat)
{
reset_ds1302();
RST=1;
write_ds1302_byte(a);
write_ds1302_byte(dat);
SDA=0;
RST=0;
}
uint8 read_ds1302(uint8 a)
{
uint8 temp=0;
reset_ds1302();
RST=1;
write_ds1302_byte(a);
temp=read_ds1302_byte();
SDA=0;
RST=0;
return temp;
}
void set_time(uint8 *timedata)
{
uint8 i;
uint8 tmp=0;
for(i=0;i<7;i++)
{
tmp=timedata[i]/10;
timedata[i]=timedata[i]%10;
timedata[i]=timedata[i]+tmp*16;
}
clear_ds1302_wp();
tmp=ds1302wa;
for(i=0;i<7;i++)
{
write_ds1302(tmp,timedata[i]);
tmp+=2;
}
set_ds_1302_wp();
}
void read_time(uint8 *timedata)
{
uint8 i,tmp;
tmp=ds1302ra;
for(i=0;i<7;i++)
{
timedata[i]=read_ds1302(tmp);
tmp+=2;
}
}
void uart_init(void)
{
TMOD=0x21;
SCON=0x50;
TH1=0xFD;
TL1=0xFD;
TR1=1;
}
void uart_send_byte(uint8 dat)
{
SBUF=dat;
while(TI==0);
TI=0;
}
void uart_send_dat(uint8 dat)
{
uart_send_byte(dat/16+'0');
uart_send_byte(dat%16+'0');
}
void main()
{
uart_init();
set_time(&time);
while(1)
{
read_time(&time);
uart_send_dat(time[6]);
uart_send_byte('-');
uart_send_dat(time[4]);
uart_send_byte('-');
uart_send_dat(time[3]);
uart_send_byte(' ');
uart_send_dat(time[2]);
uart_send_byte(':');
uart_send_dat(time[1]);
uart_send_byte(':');
uart_send_dat(time[0]);
uart_send_byte('\r');
uart_send_byte('\n');
delay(10000);
}
}