📄 1302.lst
字号:
218
219 函 数 名:BurstW1302R()
220 功 能:往DS1302寄存器数写入数据(多字节方式)
221 说 明:先写地址,后写数据(寄存器多字节方式)
222 调 用:RTInputByte()
223 入口参数:pWReg: 寄存器数据地址
224 返 回 值:无
225 设 计:zhaojunjie 日 期:2002-03-19
226 修 改: 日 期:
227 ***********************************************************************/
228 void BurstW1302R(uchar *pWReg)
229 {
230 1 uchar i;
231 1 W1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/
232 1 T_RST = 0;
233 1 T_CLK = 0;
234 1 T_RST = 1;
235 1 RTInputByte(0xfe); /* 0xbe:时钟多字节写命令 */
236 1 for (i=31; i>0; i--) /* 31Byte 寄存器数据 */
237 1 {
238 2 RTInputByte(*pWReg); /* 写1Byte数据*/
239 2 pWReg++;
240 2 }
241 1 T_CLK = 1;
C51 COMPILER V7.50 1302 07/27/2007 22:38:52 PAGE 5
242 1 T_RST = 0;
243 1 }
244 /********************************************************************
245
246 函 数 名:BurstR1302R()
247 功 能:读取DS1302寄存器数据
248 说 明:先写地址,后读命令/数据(寄存器多字节方式)
249 调 用:RTInputByte() , RTOutputByte()
250 入口参数:pRReg: 寄存器数据地址
251 返 回 值:无
252 设 计:zhaojunjie 日 期:2002-03-19
253 修 改: 日 期:
254 ***********************************************************************/
255 void BurstR1302R(uchar *pRReg)
256 {
257 1 uchar i;
258 1 T_RST = 0;
259 1 T_CLK = 0;
260 1 T_RST = 1;
261 1 RTInputByte(0xff); /* 0xff:时钟多字节读命令 */
262 1 for (i=31; i>0; i--) /*31Byte 寄存器数据 */
263 1 {
264 2 *pRReg = RTOutputByte(); /* 读1Byte数据 */
265 2 pRReg++;
266 2 }
267 1 T_CLK = 1;
268 1 T_RST = 0;
269 1 }
270 /********************************************************************
271
272 函 数 名:Set1302()
273 功 能:设置初始时间
274 说 明:先写地址,后读命令/数据(寄存器多字节方式)
275 调 用:W1302()
276 入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
277 7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
278 返 回 值:无
279 设 计:zhaojunjie 日 期:2002-03-19
280 修 改: 日 期:
281 ***********************************************************************/
282 void Set1302(uchar *pClock)
283 {
284 1 uchar i;
285 1 uchar ucAddr = 0x80;
286 1 W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
287 1 for(i =7; i>0; i--)
288 1 {
289 2 W1302(ucAddr,*pClock); /* 秒 分 时 日 月 星期 年 */
290 2 pClock++;
291 2 ucAddr +=2;
292 2 }
293 1 W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
294 1 }
295 void delayms(int t)
296 {
297 1 uchar i;
298 1 while(t--)
299 1 {
300 2 i=100;
301 2 while(i--);
302 2 }
303 1 }
C51 COMPILER V7.50 1302 07/27/2007 22:38:52 PAGE 6
304 /********************************************************************
305
306 函 数 名:Get1302()
307 功 能:读取DS1302当前时间
308 说 明:
309 调 用:R1302()
310 入口参数:ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
311 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
312 返 回 值:无
313 设 计:zhaojunjie 日 期:2002-03-19
314 修 改: 日 期:
315 ***********************************************************************/
316 void Get1302(uchar ucCurtime[])
317 {
318 1 uchar i;
319 1 char j;
320 1 uchar ucAddr = 0x81;
321 1 for (i=0; i<7; i++)
322 1 {
323 2 j= R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
324 2 //if (j>=0)
325 2 ucCurtime[i] =j;/*格式为: 秒 分 时 日 月 星期 年 */
326 2 //ucCurtime[i] = R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
327 2 ucAddr += 2;
328 2 _nop_();
329 2 }
330 1 }
331 /*//////////////////////////////////////////////////////////////////////*/
332
333
334 void put_num(char cnum)
335 {
336 1 P0=seg[ cnum & 0x0f];
337 1 }
338
339 #define xt_mhz 11.0592 //晶体的振荡频率
340 //unsigned int TimeTHTL;
341 unsigned int TimeMode1Set(float timeslot)
342 {
343 1 return (unsigned int)(0x10000-xt_mhz*1000000/12*timeslot);
344 1 }
345 idata unsigned int TimeTick;
346 void timer0() interrupt 1 using 3
347 {
348 1 static char disppoint;
349 1 // unsigned char temp;
350 1 //晶振为 11.0592MHZ 时计数 9216(2400)=(0x10000-0xd800) 次为 10ms
351 1 //11.0592*10e6/12=每秒计数 /100=10ms应计数
352 1 TH0=(XMS/256);
353 1 TL0=(XMS%256);
354 1 TimeTick++;
355 1
356 1 P2=P2|0x3f;
357 1
358 1 //put_num(dispbuf[disppoint]);
359 1 P0=seg[ dispbuf[disppoint] & 0x0f];
360 1 if(disppoint==2) P0&=~dot; /* 小数点*/
361 1
362 1 P2=P2 & low[disppoint];
363 1
364 1 if (disppoint++>=5) disppoint=0;
365 1
C51 COMPILER V7.50 1302 07/27/2007 22:38:52 PAGE 7
366 1 }
367 void displed(void)
368 {
369 1
370 1 }
371 void systemini(void)
372 {
373 1 P0=0xff;
374 1 P1=0xff;
375 1 P2=0xff;
376 1 P3=0xff;
377 1 TMOD=0x01;
378 1 XMS=TimeMode1Set(0.004);
379 1 //XMS=2000;
380 1 //XMS=0x10000-1000;
381 1 TH0=XMS/256; /* 5ms */
382 1 TL0=XMS%256;
383 1 TR0=1;
384 1 ET0=1; //Enable timer 0 Interrupt
385 1 EA=1;
386 1 // stop=1;
387 1 }
388 void main(void)
389 {
390 1 uchar WClock[8]={0x01,0x02,0x03};/*格式为: 秒 分 时 日 月 星期 年 */
391 1 uchar RClock[8];
392 1 uchar ds_hour;
393 1 uchar ds_min;
394 1 uchar ds_sec;
395 1 systemini();
396 1 // Get1302(&RClock); /*把当前的时间值读取到数组SClock[3]中去*/
397 1 W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
398 1 W1302(0x90,0xA5); //TCS=1010:使能涓流充电 DS=01:选择一个二极管 RS=01:2K
399 1 W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
400 1 Set1302(WClock);
401 1 while(1)
402 1 {
403 2
404 2 //Get1302(&RClock); /*获取当前时间值*/
405 2 // displed();
406 2 BurstR1302T(&RClock);
407 2 // Get1302(&RClock); /*把当前的时间值读取到数组SClock[3]中去*/
408 2 // if (TimeTick>5)
409 2 // {
410 2 // TimeTick=0;
411 2 // Get1302(&RClock); /*把当前的时间值读取到数组SClock[3]中去*/
412 2 ds_sec = RClock[0];//&0x7f; /*得到当前时间秒值*/
413 2 ds_min = RClock[1]; /*得到当前时间分值*/
414 2 ds_hour = RClock[2]; /*得到当前时间小时值*/
415 2 dispbuf[0]=ds_hour>>4;
416 2 dispbuf[1]=ds_hour&0x0f;
417 2 dispbuf[2]=ds_min>>4;
418 2 dispbuf[3]=ds_min&0x0f;
419 2 dispbuf[4]=ds_sec>>4;
420 2 dispbuf[5]=ds_sec&0x0f;
421 2 // }
422 2 //delayms(2000);
423 2 // keyproc();
424 2 //ledrun();
425 2 }
426 1 }
C51 COMPILER V7.50 1302 07/27/2007 22:38:52 PAGE 8
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 624 ----
CONSTANT SIZE = 24 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 16 24
IDATA SIZE = 2 ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -