|
|
C51 COMPILER V9.56.0.0 DS1302 04/28/2022 23:43:37 PAGE 1 |
|
|
|
|
|
|
|
|
C51 COMPILER V9.56.0.0, COMPILATION OF MODULE DS1302 |
|
|
OBJECT MODULE PLACED IN ds1302.OBJ |
|
|
COMPILER INVOKED BY: D:\Keil_v5\C51\BIN\C51.EXE ds1302.c OPTIMIZE(8,SPEED) BROWSE DEBUG OBJECTEXTEND TABS(2) |
|
|
|
|
|
line level source |
|
|
|
|
|
1 #include"ds1302.h" |
|
|
2 |
|
|
3 //---DS1302写入和读取时分秒的地址命令---// |
|
|
4 //---秒分时日月周年 最低位读写位;-------// |
|
|
5 uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; |
|
|
6 uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c}; |
|
|
7 |
|
|
8 //---DS1302时钟初始化2013年1月1日星期二12点00分00秒。---// |
|
|
9 //---存储顺序是秒分时日月周年,存储格式是用BCD码---// |
|
|
10 |
|
|
11 uchar TIME[7] = {0X00, 0X01, 0x23, 0x28, 0x04, 0x04, 0x22}; |
|
|
12 |
|
|
13 |
|
|
14 void Ds1302Write(uchar addr, uchar dat) |
|
|
15 { |
|
|
16 1 uchar n; |
|
|
17 1 RST = 0; |
|
|
18 1 _nop_(); |
|
|
19 1 |
|
|
20 1 SCLK = 0;//先将SCLK置低电平。 |
|
|
21 1 _nop_(); |
|
|
22 1 RST = 1; //然后将RST(CE)置高电平。 |
|
|
23 1 _nop_(); |
|
|
24 1 |
|
|
25 1 for (n=0; n<8; n++)//开始传送八位地址命令 |
|
|
26 1 { |
|
|
27 2 DSIO = addr & 0x01;//数据从低位开始传送 |
|
|
28 2 addr >>= 1; |
|
|
29 2 SCLK = 1;//数据在上升沿时,DS1302读取数据 |
|
|
30 2 _nop_(); |
|
|
31 2 SCLK = 0; |
|
|
32 2 _nop_(); |
|
|
33 2 } |
|
|
34 1 for (n=0; n<8; n++)//写入8位数据 |
|
|
35 1 { |
|
|
36 2 DSIO = dat & 0x01; |
|
|
37 2 dat >>= 1; |
|
|
38 2 SCLK = 1;//数据在上升沿时,DS1302读取数据 |
|
|
39 2 _nop_(); |
|
|
40 2 SCLK = 0; |
|
|
41 2 _nop_(); |
|
|
42 2 } |
|
|
43 1 |
|
|
44 1 RST = 0;//传送数据结束 |
|
|
45 1 _nop_(); |
|
|
46 1 } |
|
|
47 |
|
|
48 uchar Ds1302Read(uchar addr) |
|
|
49 { |
|
|
50 1 uchar n,dat,dat1; |
|
|
51 1 RST = 0; |
|
|
52 1 _nop_(); |
|
|
53 1 |
|
|
54 1 SCLK = 0;//先将SCLK置低电平。 |
|
|
55 1 _nop_(); |
|
|
C51 COMPILER V9.56.0.0 DS1302 04/28/2022 23:43:37 PAGE 2 |
|
|
|
|
|
56 1 RST = 1;//然后将RST(CE)置高电平。 |
|
|
57 1 _nop_(); |
|
|
58 1 |
|
|
59 1 for(n=0; n<8; n++)//开始传送八位地址命令 |
|
|
60 1 { |
|
|
61 2 DSIO = addr & 0x01;//数据从低位开始传送 |
|
|
62 2 addr >>= 1; |
|
|
63 2 SCLK = 1;//数据在上升沿时,DS1302读取数据 |
|
|
64 2 _nop_(); |
|
|
65 2 SCLK = 0;//DS1302下降沿时,放置数据 |
|
|
66 2 _nop_(); |
|
|
67 2 } |
|
|
68 1 _nop_(); |
|
|
69 1 for(n=0; n<8; n++)//读取8位数据 |
|
|
70 1 { |
|
|
71 2 dat1 = DSIO;//从最低位开始接收 |
|
|
72 2 dat = (dat>>1) | (dat1<<7); |
|
|
73 2 SCLK = 1; |
|
|
74 2 _nop_(); |
|
|
75 2 SCLK = 0;//DS1302下降沿时,放置数据 |
|
|
76 2 _nop_(); |
|
|
77 2 } |
|
|
78 1 |
|
|
79 1 RST = 0; |
|
|
80 1 _nop_(); //以下为DS1302复位的稳定时间,必须的。 |
|
|
81 1 SCLK = 1; |
|
|
82 1 _nop_(); |
|
|
83 1 DSIO = 0; |
|
|
84 1 _nop_(); |
|
|
85 1 DSIO = 1; |
|
|
86 1 _nop_(); |
|
|
87 1 return dat; |
|
|
88 1 } |
|
|
89 |
|
|
90 void Ds1302Init() |
|
|
91 { |
|
|
92 1 uchar n; |
|
|
93 1 Ds1302Write(0x8E,0X00); //禁止写保护,就是关闭写保护功能 |
|
|
94 1 for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年 |
|
|
95 1 { |
|
|
96 2 Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]); |
|
|
97 2 } |
|
|
98 1 Ds1302Write(0x8E,0x80); //打开写保护功能 |
|
|
99 1 } |
|
|
100 |
|
|
101 void Ds1302ReadTime() |
|
|
102 { |
|
|
103 1 uchar n; |
|
|
104 1 for (n=0; n<7; n++)//读取7个字节的时钟信号:分秒时日月周年 |
|
|
105 1 { |
|
|
106 2 TIME[n] = Ds1302Read(READ_RTC_ADDR[n]); |
|
|
107 2 } |
|
|
108 1 } |
|
|
109 |
|
|
110 |
|
|
|
|
|
|
|
|
MODULE INFORMATION: STATIC OVERLAYABLE |
|
|
CODE SIZE = 184 ---- |
|
|
CONSTANT SIZE = 14 ---- |
|
|
XDATA SIZE = ---- ---- |
|
|
PDATA SIZE = ---- ---- |
|
|
C51 COMPILER V9.56.0.0 DS1302 04/28/2022 23:43:37 PAGE 3 |
|
|
|
|
|
DATA SIZE = 7 ---- |
|
|
IDATA SIZE = ---- ---- |
|
|
BIT SIZE = ---- ---- |
|
|
END OF MODULE INFORMATION. |
|
|
|
|
|
|
|
|
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
|
|
|
|