📄 ds1302.lst
字号:
C51 COMPILER V7.02a DS1302 04/22/2003 22:51:04 PAGE 1
C51 COMPILER V7.02a, COMPILATION OF MODULE DS1302
OBJECT MODULE PLACED IN Ds1302.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Ds1302.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #pragma small
2 #include <reg52.h>
3 #define uchar unsigned char
4 /************************************引脚连接图*****************************************/
5 sbit ds1302_clk=P1^0;
6 sbit ds1302_dat=P1^1;
7 sbit ds1302_rst=P1^2;
8
9 sbit ACC_0 = ACC^0;
10 sbit ACC_1 = ACC^1;
11 sbit ACC_2 = ACC^2;
12 sbit ACC_3 = ACC^3;
13 sbit ACC_4 = ACC^4;
14 sbit ACC_5 = ACC^5;
15 sbit ACC_6 = ACC^6;
16 sbit ACC_7 = ACC^7;
17
18 /*************************************函数说明******************************************/
19 void Read(void); //写DS1302操作
20 void Write(void); //读DS1302操作
21 uchar ReadRam_Byte(uchar address); //从Ram中读出一个字节
22 uchar ReadRTC_Byte(uchar address); //从DS1302中读出一个字节
23 uchar WriteRam_Byte(uchar address,uchar number); //向Ram中写入一个字节
24 uchar WriteRTC_Byte(uchar address,uchar number); //向DS1302中写入一个字节
25 void ReadRam(uchar data * buffer,uchar size); //从Ram中读出多个字节
26 void ReadRTC(uchar data * buffer,uchar size); //从DS1302中读出多个字节
27 void WriteRam(uchar data * buffer,uchar size); //向Ram中写入多个字节
28 void WriteRTC(uchar data * buffer,uchar size); //向DS1302中写入多个字节
29 uchar ReadSec(void); //从DS1302中读出秒字节
30 uchar ReadMin(void); //从DS1302中读出分字节
31 uchar ReadHr(void); //从DS1302中读出时字节
32 uchar ReadDay(void); //从DS1302中读出日字节
33 uchar ReadMonth(void); //从DS1302中读出月字节
34 uchar ReadWeek(void); //从DS1302中读出星期字节
35 uchar ReadYear(void); //从DS1302中读出年字节
36 void WriteSec(uchar number); //向DS1302中写入秒字节
37 void WriteMin(uchar number); //向DS1302中写入分字节
38 void WriteHr(uchar number); //向DS1302中写入时字节
39 void WriteDay(uchar number); //向DS1302中写入日字节
40 void WriteMonth(uchar number); //向DS1302中写入月字节
41 void WriteWeek(uchar number); //向DS1302中写入星期字节
42 void WriteYear(uchar number); //向DS1302中写入年字节
43 void WriteControl(uchar number); //向慢速充电控制寄存器写入控制字节
44 void EnableWP(void); //禁止写保护
45 void DisableWP(void); //允许写保护
46
47 void Write(void) //写DS1302操作
48 {
49 1 ds1302_dat = ACC_0; //写DS1302
50 1 ds1302_clk = 1; //时钟上升沿,发送数据有效
51 1 ds1302_clk = 0; //清零时钟总线
52 1 ds1302_dat = ACC_1;
53 1 ds1302_clk = 1; ds1302_clk = 0;
54 1 ds1302_dat = ACC_2;
55 1 ds1302_clk = 1; ds1302_clk = 0;
C51 COMPILER V7.02a DS1302 04/22/2003 22:51:04 PAGE 2
56 1 ds1302_dat = ACC_3;
57 1 ds1302_clk = 1; ds1302_clk = 0;
58 1 ds1302_dat = ACC_4;
59 1 ds1302_clk = 1; ds1302_clk = 0;
60 1 ds1302_dat = ACC_5;
61 1 ds1302_clk = 1; ds1302_clk = 0;
62 1 ds1302_dat = ACC_6;
63 1 ds1302_clk = 1; ds1302_clk = 0;
64 1 ds1302_dat = ACC_7;
65 1 ds1302_clk = 1; ds1302_clk = 0;
66 1 }
67
68 void Read(void) //读DS1302操作
69 {
70 1 ACC_0 = ds1302_dat; //读取DS1302数据
71 1 ds1302_clk = 1; //时钟上升沿,发送数据有效
72 1 ds1302_clk = 0; //清零时钟总线
73 1 ACC_1 = ds1302_dat;
74 1 ds1302_clk = 1; ds1302_clk = 0;
75 1 ACC_2 = ds1302_dat;
76 1 ds1302_clk = 1; ds1302_clk = 0;
77 1 ACC_3 = ds1302_dat;
78 1 ds1302_clk = 1; ds1302_clk = 0;
79 1 ACC_4 = ds1302_dat;
80 1 ds1302_clk = 1;ds1302_clk = 0;
81 1 ACC_5 = ds1302_dat;
82 1 ds1302_clk = 1; ds1302_clk = 0;
83 1 ACC_6 = ds1302_dat;
84 1 ds1302_clk = 1; ds1302_clk = 0;
85 1 ACC_7 = ds1302_dat;
86 1 ds1302_rst = 0; ds1302_clk = 1;
87 1 }
88
89 uchar ReadRam_Byte(uchar address) //从RAM中读出一个字节
90 {
91 1 ds1302_rst = 0; //复位引脚为低电平,所有数据传送中止
92 1 ds1302_clk = 0; //清零时钟总线
93 1 ds1302_rst = 1; //复位引脚为高电平,逻辑控制有效
94 1 ACC = address;
95 1 Write(); //写DS1302操作
96 1 ds1302_dat = 1;
97 1 Read(); //读DS1302操作
98 1 return ACC;
99 1 }
100
101 uchar ReadRTC_Byte(uchar address) //从DS1302中读出一个字节
102 {
103 1 ds1302_rst = 0; //复位引脚为低电平,所有数据传送中止
104 1 ds1302_clk = 0; //清零时钟总线
105 1 ds1302_rst = 1; //复位引脚为高电平,逻辑控制有效
106 1 ACC = address;
107 1 Write(); //对DS1302写命令字和地址
108 1 ds1302_dat = 1;
109 1 Read(); //读DS1302操作
110 1 return ACC; //返回读取的数据
111 1 }
112
113 uchar WriteRam_Byte(uchar address,uchar number) //向RAM中写入一个字节
114 {
115 1 ds1302_clk = 0; ds1302_rst = 0;ds1302_rst = 1;
116 1 ACC = address;
117 1 Write(); //对DS1302写命令字和地址
C51 COMPILER V7.02a DS1302 04/22/2003 22:51:04 PAGE 3
118 1 ACC = number;
119 1 Write(); //对DS1302写命令字和数据
120 1 ds1302_rst = 0;
121 1 ds1302_clk = 1;
122 1 return ACC;
123 1 }
124
125 uchar WriteRTC_Byte(uchar address,uchar number) //向DS1302中写入一个字节
126 {
127 1 ds1302_clk = 0;
128 1 ds1302_rst = 0;ds1302_rst = 1;
129 1 ACC = address;
130 1 ACC |= 0x80;
131 1 Write(); //对DS1302写命令字和地址
132 1 ACC = number;
133 1 Write(); //对DS1302写命令字和数据
134 1 ds1302_rst = 0; ds1302_clk = 1;
135 1 return ACC;
136 1 }
137
138 void ReadRam(uchar data * buffer,uchar size) //从RAM中读出多个字节
139 {
140 1 register uchar a,b;
141 1 ds1302_clk = 0;
142 1 ds1302_rst = 0;
143 1 ds1302_rst = 1;
144 1 ACC = 0xff; //命令字为FFH
145 1 Write(); //对DS1302写命令字和地址
146 1 ds1302_dat = 1;
147 1 for(a=0;a<size;a++)
148 1 {
149 2 ACC_0 = ds1302_dat;
150 2 ds1302_clk = 1; ds1302_clk = 0; ACC_1 = ds1302_dat;
151 2 ds1302_clk = 1; ds1302_clk = 0; ACC_2 = ds1302_dat;
152 2 ds1302_clk = 1; ds1302_clk = 0; ACC_3 = ds1302_dat;
153 2 ds1302_clk = 1; ds1302_clk = 0; ACC_4 = ds1302_dat;
154 2 ds1302_clk = 1; ds1302_clk = 0; ACC_5 = ds1302_dat;
155 2 ds1302_clk = 1; ds1302_clk = 0; ACC_6 = ds1302_dat;
156 2 ds1302_clk = 1; ds1302_clk = 0; ACC_7 = ds1302_dat;
157 2 b = ACC;
158 2 *(buffer+a)=b;
159 2 ds1302_clk = 1; ds1302_clk = 0;
160 2 }
161 1 ds1302_rst = 0; ds1302_clk = 1;
162 1 }
163
164 void ReadRTC(uchar data * buffer,uchar size) //从DS1302中读出多个字节
165 {
166 1 register uchar a,b;
167 1 ds1302_clk = 0;
168 1 ds1302_rst = 0;
169 1 ds1302_rst = 1;
170 1 ACC = 0xbf; //命令字为BFH
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -