?? 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 + -