-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDS1302.c
113 lines (97 loc) · 2.63 KB
/
DS1302.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <REGX52.H>
sbit DS1302_CE = P3^5;
sbit DS1302_IO = P3^6;
sbit DS1302_SCLK = P3^7;
#define DS1302_Seconds 0x80
#define DS1302_Minutes 0x82
#define DS1302_Hour 0x84
#define DS1302_Date 0x86
#define DS1302_Month 0x88
#define DS1302_Year 0x8C
#define DS1302_WP 0x8E
unsigned char DS1302_TIME[] = {24, 9, 10, 20, 55, 55}; //年,月,日,时,分,秒
void DS1302_Init()
{
DS1302_CE = 0;
DS1302_SCLK = 0;
}
void DS1302_writeByte(unsigned char command, Data)
{
unsigned char i;
DS1302_CE = 1;
//读取命令
for(i = 0; i < 8; i++)
{
DS1302_IO = command & (0x01 << i);
DS1302_SCLK = 1;
DS1302_SCLK = 0;
}
//输入数据
for(i = 0; i < 8; i++)
{
DS1302_IO = Data & (0x01 << i);
DS1302_SCLK = 1;
DS1302_SCLK = 0;
}
DS1302_CE = 0;
}
unsigned char DS1302_readByte(unsigned char command)
{
unsigned char i, Data = 0x00;
command |= 0x01; //将命令转换为读命令
DS1302_CE = 1;
//读取命令
for(i = 0; i < 8; i++)
{
DS1302_IO = command & (0x01 << i);
DS1302_SCLK = 0;
DS1302_SCLK = 1;
}
//读取数据
for(i = 0; i < 8; i++)
{
DS1302_SCLK = 1;
DS1302_SCLK = 0;
if(DS1302_IO) //如果此时IO口数据为1
{
Data |= 0x01 << i;
}
}
DS1302_CE = 0;
//DS1302_IO = 0; //读取后将IO置0,否则会报错
return Data;
}
//将 DS1302 的BCD时间转换成十进制时间
unsigned char DS1302_BCD_TO_DEC(unsigned char Data)
{
unsigned ret;
ret = Data / 16 * 10 + Data % 16;
return ret;
}
//将十进制的时间,转换为 DS1302 的BCD时间
unsigned char DS1302_DEC_TO_BCD(unsigned char Data)
{
unsigned char ret;
ret = Data / 10 * 16 + Data % 10;
return ret;
}
void DS1302_setTime()
{
DS1302_writeByte(DS1302_WP, 0x00); //取消写保护
DS1302_writeByte(DS1302_Year, DS1302_DEC_TO_BCD(DS1302_TIME[0]));
DS1302_writeByte(DS1302_Month, DS1302_DEC_TO_BCD(DS1302_TIME[1]));
DS1302_writeByte(DS1302_Date, DS1302_DEC_TO_BCD(DS1302_TIME[2]));
DS1302_writeByte(DS1302_Hour, DS1302_DEC_TO_BCD(DS1302_TIME[3]));
DS1302_writeByte(DS1302_Minutes, DS1302_DEC_TO_BCD(DS1302_TIME[4]));
DS1302_writeByte(DS1302_Seconds, DS1302_DEC_TO_BCD(DS1302_TIME[5]));
DS1302_writeByte(DS1302_WP, 0x80); //写保护
}
void DS1302_readTime()
{
DS1302_TIME[0] = DS1302_BCD_TO_DEC(DS1302_readByte(DS1302_Year));
DS1302_TIME[1] = DS1302_BCD_TO_DEC(DS1302_readByte(DS1302_Month));
DS1302_TIME[2] = DS1302_BCD_TO_DEC(DS1302_readByte(DS1302_Date));
DS1302_TIME[3] = DS1302_BCD_TO_DEC(DS1302_readByte(DS1302_Hour));
DS1302_TIME[4] = DS1302_BCD_TO_DEC(DS1302_readByte(DS1302_Minutes));
DS1302_TIME[5] = DS1302_BCD_TO_DEC(DS1302_readByte(DS1302_Seconds));
}