📄 ds1302.c
字号:
/*
*********************************************************************************************************
* DS1302 Driver for C8051F340 MCU
* version 1.0
* File : DS1302.c
* By : ZJP 2008/07/28
*********************************************************************************************************
*/
#include "C8051F340.h"
#include <stdio.h>
#include <absacc.h>
#include <init.h>
unsigned char my_second,my_minute,my_hour;
unsigned char my_date,my_month,my_year;
unsigned char my_week;
sbit time_clock= P2^5;
sbit time_ce = P1^4;
sbit time_data = P1^5;
/*========== 读ds1302 地址为0时是秒,地址为1时是分,地址为2时是小时=============*/
//3是日期,4是月,5是星期,6是年,7是控制//
unsigned char read_time(unsigned char address)
{
unsigned char commend;
unsigned char kk;
unsigned char my_data;
time_clock=0;
time_clock=0;
time_ce=0;
time_ce=0;
time_ce=1;
time_ce=1;
address<<=1;
commend=address+0x81; // 高位为1是使能读写,低位为1是读操作
for(kk=0;kk<8;kk++)
{
time_data=(bit)(commend&0x01);
time_clock=1;
time_clock=1;
commend>>=1;
time_clock=0;
time_clock=0;
}
my_data=0;
for(kk=0;kk<7;kk++)
{
if(time_data==1) my_data += 0x80;
time_clock=1;
time_ce=1;
my_data>>=1;
time_clock=0;
time_clock=0;
}
if(time_data==1) my_data += 0x80;
time_clock=1;
time_clock=1;
time_clock=0;
time_clock=0;
time_ce=0;
return my_data;
}
/*========== 写ds1302 =============*/
void write_time(unsigned char address,unsigned char number)
{
unsigned char kk,outime_data;
time_clock=0;
time_clock=0;
time_ce=0;
time_ce=1;
time_ce=1;
address<<=1;
outime_data=address+0x80; // 高位为1是使能读写,低位为0是写操作
for(kk=0;kk<8;kk++)
{
time_data=(bit)(outime_data&0x01);
time_clock=1;
time_clock=1;
outime_data>>=1;
time_clock=0;
time_clock=0;
}
outime_data=number;
for(kk=0;kk<8;kk++)
{
time_data=(bit)(outime_data&0x01);
time_clock=1;
time_clock=1;
outime_data>>=1;
time_clock=0;
time_clock=0;
}
time_clock=0;
time_ce=0;
}
void corr_time(unsigned char *pda)
{
unsigned char temp;
unsigned char my_time;
unsigned char set_year=*(pda-6); //初始化数据的正确
unsigned char set_week=*(pda-5);
unsigned char set_month=*(pda-4);
unsigned char set_date=*(pda-3);
unsigned char set_hour=*(pda-2);
unsigned char set_minute=*(pda-1);
unsigned char set_second=*pda;
time_ce=0;
time_ce=0;
for(temp=0;temp<10;temp++);
if( set_second>59) set_second=0;
write_time(7,0); //写入命令
my_time=( set_second/10)*16+ set_second%10; //转换成秒的格式
write_time(0,my_time); //将当前的秒写入到芯片
if( set_minute>59) set_minute=0;
write_time(7,0); //写入命令
my_time=(set_minute/10)*16+ set_minute%10; //转换成分的格式
write_time(1,my_time); //将当前的分写入到芯片
if( set_hour>24) set_hour=0; //小时从0到23
write_time(7,0); //写入命令
my_time=( set_hour/10)*16+ set_hour%10; //换算成BCD数写入
write_time(2,my_time); //将当前的小时写入到芯片
write_time(7,0); //写入命令
my_time=( set_date/10)*16+ set_date%10; //换算成BCD数写入
write_time(3,my_time);
write_time(7,0); //写入命令
my_time=( set_month/10)*16+ set_month%10; //换算成BCD数写入
write_time(4,my_time);
write_time(7,0); //写入命令
my_time=( set_week/10)*16+ set_week%10; //换算成BCD数写入
write_time(5,my_time);
if( set_year<07) set_year=07; //
write_time(7,0); //写入命令
my_time=( set_year/10)*16+ set_year%10; //换算成BCD数写入
write_time(6,my_time);
}
//======================================================//
//得到系统时间,输出返回当前的时间
//========================================================//
void get_time(unsigned char *curtime)
{
my_second=read_time(0); //读时间
my_second=(my_second&0x0f)+((my_second&0x70)>>4)*10; //秒,秒时间的格式转换;
my_minute=read_time(1);
my_minute=(my_minute&0x0f)+((my_minute&0x70)>>4)*10; //分,分时间格式转换;
my_hour=read_time(2);
my_hour=(my_hour&0x0f)+((my_hour&0x30)>>4)*10; //时;换算成十进制数
my_year=read_time(6); //读时间
my_year=(my_year&0x0f)+((my_year&0x70)>>4)*10; //;
my_month=read_time(4);
my_month=(my_month&0x0f)+((my_month&0x70)>>4)*10; //月,格式转换;
my_date=read_time(3);
my_date=(my_date&0x0f)+((my_date&0x30)>>4)*10; //日期;换算成十进制数
my_week=read_time(5);
my_week=(my_week&0x0f)+((my_week&0x70)>>4)*10; //日期;换算成十进制数
*curtime=my_second;
*(curtime+1)=my_minute;
*(curtime+2)=my_hour;
*(curtime+3)=my_date;
*(curtime+4)=my_month;
*(curtime+5)=my_week;
*(curtime+6)=my_year;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -