?? ds1302.lst
字號:
C51 COMPILER V8.09 DS1302 05/07/2009 17:12:25 PAGE 1
C51 COMPILER V8.09, COMPILATION OF MODULE DS1302
OBJECT MODULE PLACED IN DS1302.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE DS1302.c LARGE BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg52.h>
2 #define uchar unsigned char
3 sbit SCLK = P1^3;
4 sbit IO = P1^4;
5 sbit RSTB = P1^5;
6 /**************************** 函數原型說明 ****************************/
7 void clkwritebyte(); // 時鐘字節寫入函數
8 void ramwritebyte(); // RAM字節寫入函數
9 uchar rbyte_3w(); // 字節讀取函數
10 void reset_3w(); // 復位函數
11 void wbyte_3w(uchar); // 字節寫入函數
12 void initialize_DS1302(); // DS1302初始化函數
13 void disp_clk_regs(uchar); // 顯示時鐘寄存器內容函數
14 void burstramrd(); // 多字節突發方式讀取RAM函數
15 void burstramwr(); // 多字節突發方式寫入RAM函數
16
17 uchar sec, min, hrs, dte, mon, day, yr;
18
19 /***************************** 復位函數 ******************************/
20 void reset_3w() {
21 1 SCLK = 0;
22 1 RSTB = 0;
23 1 RSTB = 1;
24 1 }
25
26 /****************************** 字節寫入函數 ***************************/
27 void wbyte_3w(uchar W_Byte) {
28 1 uchar i;
29 1 for(i = 0; i < 8; ++i) {
30 2 IO = 0;
31 2 if(W_Byte & 0x01) IO = 1;
32 2 SCLK = 0;
33 2 SCLK = 1;
34 2 W_Byte >>= 1;
35 2 }
36 1 }
37
38 /****************************** 字節讀取函數 ****************************/
39 uchar rbyte_3w() {
40 1 uchar i;
41 1 uchar R_Byte;
42 1 uchar TmpByte;
43 1
44 1 R_Byte = 0x00;
45 1 IO = 1;
46 1 for(i=0; i<8; ++i) {
47 2 SCLK = 1;
48 2 SCLK = 0;
49 2 TmpByte = (uchar)IO;
50 2 TmpByte <<= 7;
51 2 R_Byte >>= 1;
52 2 R_Byte |= TmpByte;
53 2 }
54 1 return R_Byte;
55 1 }
C51 COMPILER V8.09 DS1302 05/07/2009 17:12:25 PAGE 2
56
57 /**************************** 時鐘字節寫入函數 *************************/
58 void clkwritebyte() {
59 1 uchar ClkAdd;
60 1 uchar ClkData;
61 1
62 1 // printf("\nWrite Clock ADDRESS:");
63 1 // scanf("%bu", &ClkAdd); // 輸入時鐘地址
64 1 // printf("\nWrite Clock DATA:");
65 1 // scanf("%bx", &ClkData); // 輸入時鐘數據
66 1
67 1 ClkAdd = ((ClkAdd * 2) | 0x80); // 時鐘數據寫入命令
68 1 reset_3w();
69 1 wbyte_3w(ClkAdd);
70 1 wbyte_3w(ClkData);
71 1 reset_3w();
72 1 }
73
74 /* ************************** RAM字節寫入函數 **************************/
75 void ramwritebyte() {
76 1 uchar ramadd;
77 1 uchar ramdata;
78 1
79 1 // printf("\nWrite Ram ADDRESS (HEX):");
80 1 // scanf("%bx", &ramadd); // 輸入RAM地址
81 1 // printf("\nWrite Ram DATA (HEX):");
82 1 // scanf("%bx", &ramdata); // 輸入RAM數據
83 1
84 1 ramadd = ((ramadd * 2) | 0xC0); // RAM數據寫入命令
85 1 reset_3w();
86 1 wbyte_3w(ramadd);
87 1 wbyte_3w(ramdata);
88 1 reset_3w();
89 1 }
90
91 /************************* 顯示時鐘寄存器內容函數 ***********************/
92 void disp_clk_regs()
93 {//uchar loop
*** ERROR C236 IN LINE 93 OF DS1302.C: '_disp_clk_regs': different length of parameter lists
94 1
95 1
96 1 //do { // 讀取并顯示時鐘寄存器的內容
97 1 reset_3w();
98 1 wbyte_3w(0xBF); // 以多字節突發方式讀取時鐘數據
99 1 sec = rbyte_3w(); // 秒
100 1 min = rbyte_3w(); // 分
101 1 hrs = rbyte_3w(); // 小時
102 1 dte = rbyte_3w(); // 日期
103 1 mon = rbyte_3w(); // 月份
104 1 day = rbyte_3w(); // 星期
105 1 yr = rbyte_3w(); // 年
106 1 reset_3w();
107 1 /* if(sec != lsec || !loop) { // 每秒顯示一次
108 1 printf("\nYr Day Mon Dte Hrs Min Sec");
109 1 printf("\n%2.bX %2.bX %2.bX %2.bX", yr, day, mon, dte);
110 1 printf(" %2.bX %2.bX %2.bX", hrs, min, sec);
111 1 lsec = sec;
112 1 }
113 1 if(!loop) break;*/
114 1 // } while(1); //!RI
115 1 //if(loop) _getkey();
116 1 }
C51 COMPILER V8.09 DS1302 05/07/2009 17:12:25 PAGE 3
117
118 /************************ 多字節突發方式讀取RAM函數 *********************/
119 void burstramrd() {
120 1 uchar rmary[31];
121 1 uchar i;
122 1
123 1 reset_3w();
124 1 wbyte_3w(0xFF); // 以多字節突發方式讀取RAM
125 1 for (i=0; i<31; ++i) {
126 2 rmary[i] = rbyte_3w();
127 2 }
128 1 reset_3w();
129 1
130 1 /* printf("\nDS1302 Ram");
131 1
132 1 printf("\n%2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX", rmary[0], rmary[1], rmary[2], rmary[3], rmary
-[4], rmary[5], rmary[6], rmary[7]);
133 1 printf("\n%2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX", rmary[8], rmary[9], rmary[10], rmary[11],rmar
-y[12], rmary[13], rmary[14], rmary[15]);
134 1 printf("\n%2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX",rmary[16], rmary[17], rmary[18], rmary[19],rma
-ry[20], rmary[21], rmary[22], rmary[23]);
135 1 printf("\n%2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX",rmary[24], rmary[25], rmary[26], rmary[27],rmary[28]
-, rmary[29], rmary[30]);
136 1 */
137 1 }
138
139 /************************ 多字節突發方式寫入RAM函數 *********************/
140 void burstramwr() {
141 1 uchar ramdata;
142 1 uchar i;
143 1
144 1 //printf("\nWrite Ram DATA (HEX):");
145 1 //scanf("%bx", &ramdata); // 輸入RAM數據
146 1
147 1 reset_3w();
148 1 wbyte_3w(0xfe); // 以多字節突發方式寫入RAM
149 1 for (i=0; i<31; ++i) {
150 2 wbyte_3w(ramdata);
151 2 }
152 1 reset_3w();
153 1 }
154
155 /**************************** DS1302初始化函數 **************************/
156 void initialize_DS1302() {
157 1 uchar yr, mn, date, dy, hr, min, sec;
158 1
159 1 /* printf("\nEnter the year (0-99): ");
160 1 scanf("%bx", &yr);
161 1 printf("\nEnter the month (1-12): ");
162 1 scanf("%bx", &mn);
163 1 printf("\nEnter the date (1-31): ");
164 1 scanf("%bx", &date);
165 1 printf("\nEnter the day (1-7): ");
166 1 scanf("%bx", &dy);
167 1 printf("\nEnter the hour (1-24): ");
168 1 scanf("%bx", &hr);
169 1 hr = hr & 0x3f; // 設置時鐘為24小時方式
170 1 printf("\nEnter the minute (0-59): ");
171 1 scanf("%bx", &min);
172 1 printf("\nEnter the second (0-59): ");
173 1 scanf("%bx", &sec);
174 1 */
C51 COMPILER V8.09 DS1302 05/07/2009 17:12:25 PAGE 4
175 1 reset_3w();
176 1 wbyte_3w(0x8e); // 寫保護控制寄存器
177 1 wbyte_3w(0); // 允許寫入
178 1 reset_3w();
179 1 wbyte_3w(0x90); // 涓流充電控制寄存器
180 1 wbyte_3w(0xab); // 允許充電, 雙二極管, 8K 電阻
181 1 reset_3w();
182 1 wbyte_3w(0xbe); // 以多字節突發方式寫入時鐘數據(8個字節)
183 1 wbyte_3w(sec);
184 1 wbyte_3w(min);
185 1 wbyte_3w(hr);
186 1 wbyte_3w(date);
187 1 wbyte_3w(mn);
188 1 wbyte_3w(dy);
189 1 wbyte_3w(yr);
190 1 wbyte_3w(0); // 以多字節突發方式寫入時鐘數據時
191 1 // 必須對寫保護控制寄存器寫入0值
192 1 reset_3w();
193 1 }
194
195 /****************************** 主函數 ********************************
196 main (void) {
197 uchar M, M1;
198 SCON = 0x50; // 設置串行口: 方式 1, 8位UART, 允許接收
199 TMOD |= 0x20; // 設置定時器T1, 方式 2, 8位自動重裝
200 TH1 = 221; // 設置串行口波特率: 1200 @ 16MHz
201 TR1 = 1;
202 TI = 1;
203 }
204 */
C51 COMPILATION COMPLETE. 0 WARNING(S), 1 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -