DS1302模块
# DS1302时钟模块
涓流充电时钟芯片,内含有一个实时时钟/日历和31字节静态 RAM ,通过简单的串行接口与单片机进行通信
实时时钟/日历电路提供秒、分、时、日、月、周、年的信息,每天的天数和闰年的天数可自动调整
时钟操作可通过 RAM/PM 指示决定采用 24或12 小时格式。DS1302
与单片机间能简单采用同步串行的方式进行通信
RST
复位 高位允许读写 低位禁止读写I / O
数据线 双向输入线SCLK
串行时钟 输入端,控制数据输入与输出
- 秒寄存器
0x80
:当 CH = 0时,ds1302
内部时钟运行,反之停止 - 写保护寄存器
0x8e
:WP = 1无法写入,WP = 0可以写。每次写操作0x8e = 0x00
- 充电保护寄存器:
0x90
- 寄存器内容都是按
BCD
码存放(0-9) 如 83地址读到0x28
代表的就是28分钟
# DS1302
时序图
RST
从低到高时,CLK
必须为低- 上升沿写入,下降沿读出
- 写操作:写完命令的紧接着的上升沿写入数据
- 读操作:写完命令的紧接着的下降沿读出数据
# 基本使用
#include <>
sbit SCK = P;
sbit IO = p;
sbit RST = P;
//函数声明
int sec,min,hour;
void main(){
DS_wData(0x8E,0x00); //打开写保护,允许写入
DS_wData(0x84,0x12);//写入时
DS_wData(0x82,0x00);//写入分
DS_wData(0x80,0x00);//写入秒
DS_wData(0x8E,0x80);//禁止写入
while(1){
sec = DS_rData(0x81);
min = DS_rData(0x83);
hour = DS_rData(0x85);
}
}
//写入数据 上升沿写入 下降沿读出
void writeData(uchar dat){
uchar i;
for(i=0;i<8;i++){
sck = 0;
_nop_();
io = dat & 0x01;//取出低位
_nop_();
sck = 1;
_nop_();
dat>>1;
}
}
//读出数据
uchar readData(){
uchar i,dat;
for(i=0;i<8;i++){
dat>>=1;
sck = 0;
_nop_();
if(io==1){
dat = dat|0x80;
}else {
dat = dat|0x00;
}
sck=1;
_nop_();
}
return dat;
}
void DS_wData(uchar addr,uchar dat){
rst = 0;
sck = 0;
rst = 1;
writeDate(addr);
writeDate(dat);
rst = 0;
}
uchar DS_rData(uchar addr){
uchar dat;
rst = 0;
sck = 0;
rst = 1;
writeDate(addr);
dat = readData();
rst = 0;
return 0;
}
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
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
编辑 (opens new window)
上次更新: 2023/02/07, 14:51:48