📄 ds1302.lst.svn-base
字号:
C51 COMPILER V8.08 DS1302 01/12/2012 22:02:46 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE DS1302
OBJECT MODULE PLACED IN DS1302.OBJ
COMPILER INVOKED BY: D:\Program Files\keil_51\C51\BIN\C51.EXE DS1302.C BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "NEW_8051.H"
2 #include <intrins.h>
3 #include"task.h"
4 #include"sbit.h"
5
6 uchar starts_time[7]={0x00,0x10,0x22,0x20,0x05,0x04,0x10}; //初始化后设置
7
8 uchar Sec;
9 uchar Cent;
10 uchar Hour;
11 uchar Year;
12 uchar Day;
13 uchar Week;
14 uchar Month;
15 uchar AddTime=0;
16 uchar UpdateMode=0;
17 /******************************************************************/
18
19 //根据选择调整相应项目
20 void Set(uchar sel,uchar sel_1)
21 {
22 1 uchar address;
23 1 char max,min,time;
24 1
25 1 if(sel==11) {address=0xc2; max=22;min=1;} //自动转换时间时最大为20秒。
26 1 if(sel==10) {address=0xc0; max=1;min=0; } //显示自动转换或手动转换。为零自动,为1手动。
27 1 if(sel==9) {address=0xc6; max=20;min=0;}
28 1 if(sel==8) {address=0xc4; max=1;min=0;} //UpdateMode
29 1 if(sel==7) {address=0x80; max=59;min=0;} //秒
30 1 if(sel==6) {address=0x82; max=59;min=0;} //分钟
31 1 if(sel==5) {address=0x84; max=23;min=0;} //小时
32 1 if(sel==4) {address=0x8a; max=7; min=1;} //星期
33 1 if(sel==3) {address=0x86; max=31;min=1;} //日
34 1 if(sel==2) {address=0x88; max=12;min=1;} //月
35 1 if(sel==1) {address=0x8c; max=99;min=0;} //年
36 1
37 1
38 1 time=R1302(address+1)/16*10+R1302(address+1)%16; //变成BCD码
39 1 if (sel_1==0) time++; else time--;
40 1 if(time>max) time=min;
41 1 if(time<min) time=max;
42 1
43 1 W1302(0x8e,0x00);
44 1 W1302(address,time/10*16+time%10);
45 1 W1302(0x8e,0x80);
46 1 }
47
48 /**************************延时***********************/
49
50 void DelayMs(void)
51 {
52 1 uchar TempCyc;
53 1 for(TempCyc=50;TempCyc>1;TempCyc--)
54 1 {;}
55 1 }
C51 COMPILER V8.08 DS1302 01/12/2012 22:02:46 PAGE 2
56
57 //********DS1302读写程序***************//
58 /********************************************************************
59 函 数 名:RTInputByte()
60 功 能:实时时钟写入一字节
61 说 明:往DS1302写入1Byte数据 (内部函数)
62 入口参数:d 写入的数据
63 返 回 值:无
64 ***********************************************************************/
65 void RTInputByte(uchar d)
66 {
67 1 uchar h;
68 1 ACC = d;
69 1 for(h=8; h>0; h--)
70 1 {
71 2 T_IO = ACC0; /*相当于汇编中的 RRC */
72 2 T_CLK = 1;
73 2 T_CLK = 0;
74 2 ACC = ACC >> 1;
75 2 }
76 1 }
77 /********************************************************************
78 函 数 名:RTOutputByte()
79 功 能:实时时钟读取一字节
80 说 明:从DS1302读取1Byte数据 (内部函数)
81 入口参数:无
82 返 回 值:ACC
83 设 计:zhaojunjie 日 期:2002-03-19
84 修 改: 日 期:
85 ***********************************************************************/
86 uchar RTOutputByte(void)
87 {
88 1 uchar h;
89 1 for(h=8; h>0; h--)
90 1 {
91 2 ACC = ACC >>1; /*相当于汇编中的 RRC */
92 2 ACC7 = T_IO;
93 2 T_CLK = 1;
94 2 T_CLK = 0;
95 2 }
96 1 return(ACC);
97 1 }
98 /********************************************************************
99 函 数 名:W1302()
100 功 能:往DS1302写入数据
101 说 明:先写地址,后写命令/数据 (内部函数)
102 调 用:RTInputByte() , RTOutputByte()
103 入口参数:ucAddr: DS1302地址, ucData: 要写的数据
104 返 回 值:无
105 ***********************************************************************/
106 void W1302(uchar ucAddr, uchar ucDa)
107 {
108 1 T_RST = 0;
109 1 T_CLK = 0;
110 1 T_RST = 1;
111 1 RTInputByte(ucAddr); /* 地址,命令 */
112 1 RTInputByte(ucDa); /* 写1Byte数据*/
113 1 T_CLK = 1;
114 1 T_RST = 0;
115 1 }
116 /********************************************************************
117 函 数 名:R1302()
C51 COMPILER V8.08 DS1302 01/12/2012 22:02:46 PAGE 3
118 功 能:读取DS1302某地址的数据
119 说 明:先写地址,后读命令/数据 (内部函数)
120 调 用:RTInputByte() , RTOutputByte()
121 入口参数:ucAddr: DS1302地址
122 返 回 值:ucData :读取的数据
123 ***********************************************************************/
124 uchar R1302(uchar ucAddr)
125 {
126 1 uchar ucData;
127 1 T_RST = 0;
128 1 T_CLK = 0;
129 1 T_RST = 1;
130 1 RTInputByte(ucAddr); /* 地址,命令 */
131 1 ucData = RTOutputByte(); /* 读1Byte数据 */
132 1 T_CLK = 1;
133 1 T_RST = 0;
134 1 return(ucData);
135 1 }
136
137 /********************************************************************
138 函 数 名:Set1302()
139 功 能:设置初始时间
140 说 明:先写地址,后读命令/数据(寄存器多字节方式)
141 调 用:W1302()
142 入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
143 7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
144 返 回 值:无
145 ***********************************************************************/
146 void Set1302(uchar *pClock)
147 {
148 1 uchar h;
149 1 uchar ucAddr = 0x80;
150 1 W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
151 1 for(h =7; h>0; h--)
152 1 {
153 2 W1302(ucAddr,*pClock); /* 秒 分 时 日 月 星期 年 */
154 2 pClock++;
155 2 ucAddr +=2;
156 2 }
157 1 W1302(0xc0,0x01);
158 1 W1302(0XC2,0X03); //初始自动转换显示时间为3秒。
159 1 W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
160 1
161 1 }
162 /******************读取DS1302中的时间****************/
163 void du1302()
164 {
165 1 Sec=R1302(0x81); //对取 秒 分 时 日 月 星期 年
166 1 Cent=R1302(0x83);
167 1 Hour=R1302(0x85);
168 1 Day=R1302(0x87);
169 1 Month=R1302(0x89);
170 1 Week=R1302(0x8b);
171 1 Year=R1302(0x8d);
172 1 b=R1302(0xc1);
173 1 a=R1302(0xc3);
174 1 //a=a/16*10+a%16;
175 1 UpdateMode=R1302(0xc5);
176 1 AddTime=R1302(0xc7);
177 1 // AddTime=AddTime/16*10+AddTime%16;
178 1 }
C51 COMPILER V8.08 DS1302 01/12/2012 22:02:46 PAGE 4
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 458 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 16 6
IDATA SIZE = ---- ----
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 + -