📄 sd2000drv.lst
字号:
C51 COMPILER V7.09 SD2000DRV 07/12/2005 15:35:29 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE SD2000DRV
OBJECT MODULE PLACED IN .\sd2000drv.obj
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE ..\sd2000drv\sd2000drv.c BROWSE DEBUG OBJECTEXTEND PRINT(.\sd2000drv.lst) O
-BJECT(.\sd2000drv.obj)
line level source
1 /****************************************************************************/
2 /* */
3 /* Copyright (c) 2005, 老树工作室 */
4 /* All rights reserved. */
5 /* */
6 /* http://www.saintone.net Email:hxm0902@163.com */
7 /* QQ:112431149 Tel:010-62966630 */
8 /* */
9 /****************************************************************************/
10 /****************************************************************************/
11 /* 文件名:sd2000drv.c */
12 /* 版 本:Version 1.0 */
13 /* 描 述:sd2000驱动代码 */
14 /* 作 者:spot */
15 /* 函 数: */
16 /* sd2000_wait */
17 /* sd2000_start */
18 /* sd2000_stop */
19 /* sd2000_ack */
20 /* sd2000_no_ack */
21 /* sd2000_wait_ack */
22 /* sd2000_send_byte */
23 /* sd2000_receive_byte */
24 /* */
25 /* 历史记录: */
26 /* spot 2005-06-20 Creat Inital version. (Version 1.0) */
27 /****************************************************************************/
28 #include <reg51.h>
29 #include <absacc.h>
30 #include <intrins.h>
31
32 sbit SDA = P1^3; /* sd2000数据传送位 */
33 sbit SCL = P1^4; /* sd2000时钟控制位 */
34
35 /* 函数声明 */
36 void sd2000_wait(void); /* sd2000延时 */
37 void sd2000_start(void); /* 开启sd2000总线 */
38 void sd2000_stop(void); /* 关闭sd2000总线 */
39 void sd2000_ack(void); /* 发送ACK信号 */
40 void sd2000_no_ack(void); /* 发送NOACK信号 */
41 bit sd2000_wait_ack(void); /* 等待ACK信号 */
42 void sd2000_send_byte(unsigned char demand, bit order); /* MCU向sd2000发送一个字节 */
43 unsigned char sd2000_receive_byte(void); /* MCU从sd2000接收一个字节 */
44 /* 声明结束 */
45
46 unsigned char date[7];
47
48 /* sd2000延时 */
49 void sd2000_wait(void)
50 {
51 1 _nop_();
52 1 _nop_();
53 1 _nop_();
54 1 _nop_();
C51 COMPILER V7.09 SD2000DRV 07/12/2005 15:35:29 PAGE 2
55 1 }
56
57 /* 开启sd2000总线 */
58 void sd2000_start(void)
59 {
60 1 SDA = 1;
61 1 SCL = 1;
62 1 sd2000_wait();
63 1 SDA = 0;
64 1 sd2000_wait();
65 1 SCL = 0;
66 1 }
67
68 /* 关闭sd2000总线 */
69 void sd2000_stop(void)
70 {
71 1 SDA=0;
72 1 SCL=0;
73 1 sd2000_wait();
74 1 SCL=1;
75 1 sd2000_wait();
76 1 SDA=1;
77 1 }
78
79 /* 发送ACK信号 */
80 void sd2000_ack(void)
81 {
82 1 SDA=0;
83 1 sd2000_wait();
84 1 SCL=1;
85 1 sd2000_wait();
86 1 SCL=0;
87 1 }
88
89 /* 发送NOACK信号 */
90 void sd2000_no_ack(void)
91 {
92 1 SDA=1;
93 1 sd2000_wait();
94 1 SCL=1;
95 1 sd2000_wait();
96 1 SCL=0;
97 1 }
98
99 /****************************************************************************/
100 /* 函数名:sd2000_wait_ack */
101 /* 功 能:等待ACK信号 */
102 /* 作 者:spot */
103 /* 输 入:无 */
104 /* 输 出:1-ACK 0-ERROR */
105 /* */
106 /* 历史记录: */
107 /* spot 2005-06-20 Creat Inital version. (Version 1.0) */
108 /****************************************************************************/
109 bit sd2000_wait_ack(void)
110 {
111 1 unsigned char errtime=255;
112 1
113 1 SDA=1;
114 1 sd2000_wait();
115 1 SCL=1;
116 1 sd2000_wait();
C51 COMPILER V7.09 SD2000DRV 07/12/2005 15:35:29 PAGE 3
117 1
118 1 while(SDA)
119 1 {
120 2 errtime--;
121 2 if(!errtime)
122 2 return 0;
123 2 }
124 1
125 1 SCL=0;
126 1 return 1;
127 1 }
128
129 /****************************************************************************/
130 /* 函数名:sd2000_send_byte */
131 /* 功 能:MCU向sd2000设备发送一个字节 */
132 /* 作 者:spot */
133 /* 输 入: */
134 /* demand 待发送命令或数据 */
135 /* order 1,发送命令; 0,发送数据 */
136 /* */
137 /* 输 出:无 */
138 /* */
139 /* 历史记录: */
140 /* spot 2005-06-20 Creat Inital version. (Version 1.0) */
141 /****************************************************************************/
142 void sd2000_send_byte(unsigned char demand, bit order)
143 {
144 1 unsigned char i = 8;
145 1
146 1 if (order)
147 1 {
148 2 while(i--)
149 2 {
150 3 SCL = 0;
151 3 _nop_();
152 3 SDA = (bit)(demand&0x80);
153 3 demand <<= 1;
154 3 sd2000_wait();
155 3 SCL = 1;
156 3 sd2000_wait();
157 3 }
158 2 SCL=0;
159 2 }
160 1 else
161 1 {
162 2 while(i--)
163 2 {
164 3 SCL = 0;
165 3 _nop_();
166 3 SDA = (bit)(demand&0x01);
167 3 demand >>= 1;
168 3 sd2000_wait();
169 3 SCL = 1;
170 3 sd2000_wait();
171 3 }
172 2 SCL=0;
173 2 }
174 1
175 1 }
176
177 /****************************************************************************/
178 /* 函数名:sd2000_receive_byte */
C51 COMPILER V7.09 SD2000DRV 07/12/2005 15:35:29 PAGE 4
179 /* 功 能:MCU从sd2000设备接收一个字节 */
180 /* 作 者:spot */
181 /* 输 入:无 */
182 /* 输 出:ddata 接收数据 */
183 /* */
184 /* 历史记录: */
185 /* spot 2005-06-20 Creat Inital version. (Version 1.0) */
186 /****************************************************************************/
187 unsigned char sd2000_receive_byte(void)
188 {
189 1 unsigned char i=8;
190 1 unsigned char ddata=0;
191 1
192 1 SDA=1;
193 1 while(i--)
194 1 {
195 2 ddata >>= 1;
196 2 SCL=0;
197 2 sd2000_wait();
198 2 SCL=1;
199 2 sd2000_wait();
200 2 if(SDA)
201 2 {
202 3 ddata |= 0x80;
203 3 }
204 2
205 2 }
206 1 SCL=0;
207 1 return ddata;
208 1 }
209
210 /****************************************************************************/
211 /* 函数名:sd2000_read_date */
212 /* 功 能:读取sd2000时钟数据 */
213 /* 作 者:spot */
214 /* 输 入:无 */
215 /* 输 出:无 */
216 /* */
217 /* 历史记录: */
218 /* spot 2005-06-20 Creat Inital version. (Version 1.0) */
219 /****************************************************************************/
220 void sd2000_read_date(void)
221 {
222 1 unsigned char i;
223 1
224 1 sd2000_start();
225 1 sd2000_send_byte(0x65,1); /* 从年开始读取数据 */
226 1 sd2000_wait_ack();
227 1
228 1 for (i=0; i<7; i++)
229 1 {
230 2 date[i] = sd2000_receive_byte();
231 2
232 2 if (i != 6) /* 最后一个数据不应答 */
233 2 {
234 3 sd2000_ack();
235 3 }
236 2 }
237 1
238 1 sd2000_no_ack();
239 1 sd2000_stop();
240 1 }
C51 COMPILER V7.09 SD2000DRV 07/12/2005 15:35:29 PAGE 5
241
242 /****************************************************************************/
243 /* 函数名:sd2000_write_status */
244 /* 功 能:写sd2000状态寄存器 */
245 /* 作 者:spot */
246 /* 输 入:无 */
247 /* 输 出:无 */
248 /* */
249 /* 历史记录: */
250 /* spot 2005-06-20 Creat Inital version. (Version 1.0) */
251 /****************************************************************************/
252 void sd2000_write_status(void)
253 {
254 1 sd2000_start();
255 1 sd2000_send_byte(0x62,1); /* 发送SD20001C状态寄存器命令 */
256 1 sd2000_wait_ack();
257 1 sd2000_send_byte(0xc0,0); /* 24小时制,关所有中断 */
258 1 sd2000_wait_ack();
259 1 sd2000_stop();
260 1 }
261
262 main()
263 {
264 1 sd2000_write_status();
265 1
266 1 sd2000_read_date();
267 1
268 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 230 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -