📄 main.lst
字号:
C51 COMPILER V7.06 MAIN 10/29/2006 14:35:36 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <absacc.h>
2 #include <intrins.h>
3 #include <./Atmel/at89x51.h>
4
5 //定义常量
6 #define true 1
7 #define false 0
8
9 //定义变量
10 unsigned char data1,data2,data3,data4;
11 unsigned char date[7]; /*日期数组date[0]=year,date[1]=month,date[2]=day,date[3]=week,
12 date[4]=hour,date[5]=minute,date[6]=second*/
13 //定义IO口
14 sbit SDA=P3^0;
15 sbit SCL=P3^1;
16
17 //函数声名
18 void I2CWait(void);
19 bit I2CStart(void);
20 void I2CStop(void);
21 void I2CSendAck(void);
22 void I2CSendNoAck(void);
23 bit I2CWaitAck(void);
24
25 void I2CSendByte(unsigned char demand,bit order);
26 unsigned char I2CReceiveByte(void);
27
28 void I2CWriteStatus(void);
29 void I2CWriteTime(void);
30 void I2CReadDate(void);
31 void Delay(unsigned int nn);
32
33 /*******************************************************
34 功能:主函数
35 描述:初始化、实时时间校准、读入时间、显示
36 参数:无
37 返回:无
38 ********************************************************/
39 main()
40 {
41 1 P3=0xFF;
42 1 I2CWriteStatus();//设置为24小时制
43 1 I2CWriteTime();//对实时时间进行校准,一般情况下不需要
44 1 while(1)
45 1 {
46 2 I2CReadDate();
47 2 //此处添加显示程序,可参考5、6、7章
48 2 Delay(250);
49 2 Delay(250);
50 2 }
51 1
52 1 }
53
54 /*******************************************************
55 功能:I2CWait
C51 COMPILER V7.06 MAIN 10/29/2006 14:35:36 PAGE 2
56 描述:I2C延时
57 参数:无
58 返回:无
59 ********************************************************/
60 void I2CWait(void)
61 {
62 1 _nop_();_nop_();_nop_();_nop_();
63 1 }
64
65
66 /*******************************************************
67 功能:I2CStart
68 描述:开启SD2000的I2C总线
69 参数:无
70 返回:位变量I2CStart,1=I2C总线可用,0=I2C总线不可用
71 ********************************************************/
72 bit I2CStart(void)
73 {
74 1 SDA=1;
75 1 SCL=1;
76 1 I2CWait();
77 1 if(!SDA)return false;//SDA线为低电平则总线忙,退出
78 1 SDA=0;
79 1 I2CWait();
80 1 while(SDA)return false;//SDA线为高电平则总线出错,退出
81 1 SCL=0;
82 1 I2CWait();
83 1 return true;
84 1 }
85
86 /*******************************************************
87 功能:I2CStop
88 描述:关闭SD2000的I2C总线
89 参数:无
90 返回:无
91 ********************************************************/
92 void I2CStop(void)
93 {
94 1 SDA=0;
95 1 SCL=0;
96 1 I2CWait();
97 1 SCL=1;
98 1 I2CWait();
99 1 SDA=1;
100 1 }
101
102 /*******************************************************
103 功能:I2CSendAck
104 描述:发送 ACK
105 参数:无
106 返回:无
107 ********************************************************/
108 void I2CSendAck(void)
109 {
110 1 SDA=0;
111 1 SCL=0;
112 1 I2CWait();
113 1 SCL=1;
114 1 I2CWait();
115 1 SCL=0;
116 1 }
117
C51 COMPILER V7.06 MAIN 10/29/2006 14:35:36 PAGE 3
118 /*******************************************************
119 功能:I2CSendNoAck
120 描述:发送NO ACK
121 参数:无
122 返回:无
123 ********************************************************/
124 void I2CSendNoAck(void)
125 {
126 1 SDA=1;
127 1 SCL=0;
128 1 I2CWait();
129 1 SCL=1;
130 1 I2CWait();
131 1 SCL=0;
132 1 }
133
134 /*******************************************************
135 功能:I2CWaitAck
136 描述:读取ACK信号
137 参数:无
138 返回:位变量I2CWaitAck,返回为:1=有ACK,0=无ACK
139 ********************************************************/
140 bit I2CWaitAck(void)
141 {
142 1 unsigned char errtime=255;
143 1 SCL=0;
144 1 SDA=1;
145 1 I2CWait();
146 1 SCL=1;
147 1 I2CWait();
148 1 while(SDA)
149 1 {
150 2 errtime--;
151 2 if(!errtime)
152 2 SCL=0;
153 2 return false;
154 2 }
155 1 SCL=0;
156 1 return true;
157 1 }
158
159 /*******************************************************
160 功能:I2CSendByte
161 描述:向SD2000发送一个字节
162 参数:待发送字节demand,发送顺序指示order
163 order=1,从HI-->LO发送8bit数据
164 order=0,从LO-->HI发送8bit数据
165 返回:无
166 ********************************************************/
167 void I2CSendByte(unsigned char demand,bit order)
168 {
169 1 unsigned char i=8;
170 1
171 1 if(order)
172 1 {
173 2 while(i--)
174 2 {
175 3 SCL=0;
176 3 _nop_();
177 3 SDA=(bit)(demand&0x80);
178 3 demand<<=1;
179 3 I2CWait();
C51 COMPILER V7.06 MAIN 10/29/2006 14:35:36 PAGE 4
180 3 SCL=1;
181 3 I2CWait();
182 3 }
183 2 SCL=0;
184 2 }
185 1 else
186 1 {
187 2 while(i--)
188 2 {
189 3 SCL=0;
190 3 _nop_();
191 3 SDA=(bit)(demand&0x01);
192 3 demand>>=1;
193 3 I2CWait();
194 3 SCL=1;
195 3 I2CWait();
196 3 }
197 2 SCL=0;
198 2 }
199 1 }
200
201 /*******************************************************
202 功能:I2CReceiveByte
203 描述:从SD2000读入一字节
204 参数:无
205 返回:读取的字节I2CReceiveByte
206 ********************************************************/
207 unsigned char I2CReceiveByte(void)
208 {
209 1 unsigned char i=8;
210 1 unsigned char ddata=0;
211 1 SDA=1;
212 1 while(i--)
213 1 {
214 2 ddata>>=1; //数据从低位开始读取
215 2 SCL=0;
216 2 I2CWait();
217 2 SCL=1;
218 2 I2CWait(); //从低位开始 ddata|=SDA;ddata>>=1
219 2 if(SDA)
220 2 {
221 3 ddata|=0x80;
222 3 }
223 2 }
224 1 SCL=0;
225 1 return ddata;
226 1 }
227
228 /*******************************************************
229 功能:I2CReadDate
230 描述:读SD2000实时数据寄存器,将结果写入date数组
231 参数:无
232 返回:无
233 ********************************************************/
234 void I2CReadDate(void)
235 {
236 1 unsigned char n;
237 1 I2CStart();
238 1 I2CSendByte(0x65,1); //从年开始读取数据
239 1 I2CWaitAck();
240 1 for(n=0;n<7;n++)
241 1 {
C51 COMPILER V7.06 MAIN 10/29/2006 14:35:36 PAGE 5
242 2 date[n]=I2CReceiveByte();
243 2 if (n!=6) //最后一个数据不应答
244 2 {
245 3 I2CSendAck();
246 3 }
247 2 }
248 1 I2CSendNoAck();
249 1 I2CStop();
250 1 }
251
252 /*******************************************************
253 功能:I2CWriteStatus
254 描述:写SD2000状态寄存器命令,设置为24小时制
255 参数:无
256 返回:无
257 ********************************************************/
258 void I2CWriteStatus(void)
259 {
260 1 I2CStart();
261 1 I2CSendByte(0x62,1); //发送SD2000状态寄存器命令,
262 1 I2CWaitAck();
263 1 I2CSendByte(0x40,0); //24小时制,关所有中断
264 1 I2CWaitAck();
265 1 I2CStop();
266 1 }
267
268 /*******************************************************
269 功能:I2CWriteTime
270 描述:写SD2000时间寄存器命令
271 参数:无
272 返回:无
273 ********************************************************/
274 void I2CWriteTime(void)
275 {
276 1
277 1 unsigned char n;
278 1 date[0]=0x06;//year
279 1 date[1]=0x08;//month
280 1 date[2]=0x01;//day
281 1 date[3]=0x02;//week
282 1 date[4]=0x13;//hour
283 1 date[5]=0x14;//minute
284 1 date[6]=0x50;//second
285 1 I2CStart();
286 1 I2CSendByte(0x64,1); //发送SD2000写时间寄存器命令,
287 1 I2CWaitAck();
288 1 for(n=0;n<7;n++)
289 1 {
290 2 I2CSendByte(date[n],0);
291 2 I2CWaitAck();
292 2 }
293 1 I2CStop();
294 1
295 1 }
296
297 /*******************************************************
298 功能:Delay
299 描述:延时子程序
300 参数:延时长度nn
301 返回:无
302 ********************************************************/
303 void Delay(unsigned int nn)
C51 COMPILER V7.06 MAIN 10/29/2006 14:35:36 PAGE 6
304 {
305 1 while(nn--);
306 1 }
307
308
309
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 336 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 11 ----
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 + -