DS1302时钟芯片
一、引脚图
Vcc2备用电源
SCLK:时钟线
二、时序图
三、代码
#include <reg52.h>
#include "LCD1602.h"
#include "delay.h"
sbit SCK = P2^0;
sbit SDA = P2^1;
sbit RST = P2^2;
#define ds1302_sec_add 0x80
#define ds1302_min_add 0x82
#define ds1302_hr_add 0x84
#define ds1302_date_add 0x86
#define ds1302_month_add 0x88
#define ds1302_day_add 0x8a
#define ds1302_year_add 0x8c
#define ds1302_control_add 0x8e
unsigned char timebuf[6] = {12,21,24,16,4,25};
unsigned char readtimebuf[6];
void ds_write_byte(unsigned char addr,unsigned char dat)
{
unsigned char i;
SCK = 0;
SDA = 0;
RST = 0;
RST = 1;
for(i = 0; i < 8; i++)
{
SDA = addr & 0x01;
SCK = 0;
SCK = 1;
addr >>= 1;
}
for(i = 0; i < 8; i++)
{
SDA = dat & 0x01;
SCK = 0;
SCK = 1;
dat >>= 1;
}
RST = 0;
}
unsigned char ds_read_byte(unsigned char addr)
{
unsigned char i;
unsigned char temp;
addr += 0x01;
SCK = 0;
SDA = 0;
RST = 0;
RST = 1;
for(i = 0; i < 8; i++)
{
SDA = addr & 0x01;
SCK = 0;
SCK = 1;
addr >>= 1;
}
for(i = 0; i < 8; i++)
{
SCK = 1;
SCK = 0;
temp >>= 1;
if(SDA)
{
temp += 0x80;
}
}
RST = 0;
return temp;
}
void ds_write_time()
{
unsigned char i;
unsigned char temp;
for(i = 0; i < 6; i++)
{
temp = timebuf[i] / 10;
timebuf[i] = timebuf[i] % 10;
timebuf[i] = (temp<<4) + timebuf[i];
}
ds_write_byte(ds1302_control_add,0x0);
ds_write_byte(ds1302_hr_add,timebuf[0]);
ds_write_byte(ds1302_min_add,timebuf[1]);
ds_write_byte(ds1302_sec_add,timebuf[2]);
ds_write_byte(ds1302_year_add,timebuf[3]);
ds_write_byte(ds1302_month_add,timebuf[4]);
ds_write_byte(ds1302_date_add,timebuf[5]);
ds_write_byte(ds1302_control_add,0x80);
}
void ds_read_time()
{
unsigned char i;
unsigned char temp;
readtimebuf[0] = ds_read_byte(ds1302_hr_add);
readtimebuf[1] = ds_read_byte(ds1302_min_add);
readtimebuf[2] = ds_read_byte(ds1302_sec_add);
readtimebuf[3] = ds_read_byte(ds1302_year_add);
readtimebuf[4] = ds_read_byte(ds1302_month_add);
readtimebuf[5] = ds_read_byte(ds1302_date_add);
for(i = 0; i < 6; i++)
{
temp = readtimebuf[i] >> 4;//与写时间操作相对比,写时间操作是将redatimebuf左移,而此为右移
readtimebuf[i] = readtimebuf[i] & 0x0f;
timebuf[i] = temp * 10 + readtimebuf[i];
}
}
void display_time()
{
unsigned char time[8] = {0};
unsigned char day[10] = {0};//此处必须为十个元素,否则溢出
time[0] = timebuf[0] / 10 + 0x30;
time[1] = timebuf[0] % 10 + 0x30;
time[2] = ':';
time[3] = timebuf[1] / 10 + 0x30;
time[4] = timebuf[1] % 10 + 0x30;
time[5] = ':';
time[6] = timebuf[2] / 10 + 0x30;
time[7] = timebuf[2] % 10 + 0x30;
lcd_dis_str(3,0,time);
day[0] = timebuf[3] / 10 + 0x30;
day[1] = timebuf[3] % 10 + 0x30;
day[2] = '-';
day[3] = timebuf[4] / 10 + 0x30;
day[4] = timebuf[4] % 10 + 0x30;
day[5] = '-';
day[6] = timebuf[5] / 10 + 0x30;
day[7] = timebuf[5] % 10 + 0x30;
lcd_dis_str(3,1,day);
}
void main()
{
lcd_init();
ds_write_time();
while(1)
{
ds_read_time();
display_time();
}
}