📄 main.lst
字号:
C51 COMPILER V7.08 MAIN 01/03/2011 21:03:11 PAGE 1
C51 COMPILER V7.08, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*
2 * DS1302
3 *
4 */
5
6 #include <reg52.h>
7 #include <intrins.h>
8
9 typedef unsigned char uint8;
10 typedef unsigned int uint16;
11
12 sbit SCK = P3^5; //时钟
13 sbit SDA = P3^4; //数据
14 sbit RST = P1^7; //DS1302复位(片选)
15
16 #define DS1302_W_ADDR 0x80
17 #define DS1302_R_ADDR 0x81
18
19
20 uint8 time[7]={50,59,23,15,8,7,10};//秒分时日月周年10-08-15 23:59:50
21
22
23 void delay(uint16 n)
24 {
25 1 while (n--);
26 1 }
27
28 /**
29 * 写一个字节
30 */
31 void write_ds1302_byte(uint8 dat)
32 {
33 1 uint8 i;
34 1
35 1 for (i=0;i<8;i++)
36 1 {
37 2 SDA = dat & 0x01;
38 2 SCK = 1;
39 2 dat >>= 1;
40 2 SCK = 0;
41 2 }
42 1 }
43
44 /**
45 * 读一个字节
46 */
47 uint8 read_ds1302_byte(void)
48 {
49 1 uint8 i, dat=0;
50 1
51 1 for (i=0;i<8;i++)
52 1 {
53 2 dat >>= 1;
54 2 if (SDA)
55 2 dat |= 0x80;
C51 COMPILER V7.08 MAIN 01/03/2011 21:03:11 PAGE 2
56 2 SCK = 1;
57 2 SCK = 0;
58 2 }
59 1
60 1 return dat;
61 1 }
62
63 void reset_ds1302(void)
64 {
65 1 RST = 0;
66 1 SCK = 0;
67 1 RST = 1;
68 1 }
69
70 /**
71 * 清除写保护
72 */
73 void clear_ds1302_WP(void)
74 {
75 1 reset_ds1302();
76 1 RST = 1;
77 1 write_ds1302_byte(0x8E);
78 1 write_ds1302_byte(0);
79 1 SDA = 0;
80 1 RST = 0;
81 1 }
82
83 /**
84 * 设置写保护
85 */
86 void set_ds1302_WP(void)
87 {
88 1 reset_ds1302();
89 1 RST = 1;
90 1 write_ds1302_byte(0x8E);
91 1 write_ds1302_byte(0x80);
92 1 SDA = 0;
93 1 RST = 0;
94 1 }
95
96 /**
97 * 写入DS1302
98 */
99 void write_ds1302(uint8 addr, uint8 dat)
100 {
101 1 reset_ds1302();
102 1 RST = 1;
103 1 write_ds1302_byte(addr);
104 1 write_ds1302_byte(dat);
105 1 SDA = 0;
106 1 RST = 0;
107 1 }
108
109 /**
110 * 读出DS1302数据
111 */
112 uint8 read_ds1302(uint8 addr)
113 {
114 1 uint8 temp=0;
115 1
116 1 reset_ds1302();
117 1 RST = 1;
C51 COMPILER V7.08 MAIN 01/03/2011 21:03:11 PAGE 3
118 1 write_ds1302_byte(addr);
119 1 temp = read_ds1302_byte();
120 1 SDA = 0;
121 1 RST = 0;
122 1
123 1 return (temp);
124 1 }
125
126 /**
127 * 设定时钟数据
128 */
129 void set_time(uint8 *timedata)
130 {
131 1 uint8 i, tmp;
132 1
133 1 for (i=0; i<7; i++) // 转化为BCD格式
134 1 {
135 2 tmp = timedata[i] / 10;
136 2 timedata[i] = timedata[i] % 10;
137 2 timedata[i] = timedata[i] + tmp*16;
138 2 }
139 1
140 1 clear_ds1302_WP();
141 1 tmp = DS1302_W_ADDR; //传写地址
142 1 for (i=0; i<7; i++) //7次写入 秒分时日月周年
143 1 {
144 2 write_ds1302(tmp, timedata[i]);
145 2 tmp += 2;
146 2 }
147 1 set_ds1302_WP();
148 1 }
149
150 /**
151 * 读时钟数据(BCD格式)
152 */
153 void read_time(uint8 *timedata)
154 {
155 1 uint8 i, tmp;
156 1
157 1 tmp = DS1302_R_ADDR;
158 1 for (i=0; i<7; i++) //分7次读取 秒分时日月周年
159 1 {
160 2 timedata[i] = read_ds1302(tmp);
161 2 tmp += 2;
162 2 }
163 1 }
164
165
166
167 /**
168 * UART初始化
169 * 波特率:9600
170 */
171 void uart_init(void)
172 {
173 1 TMOD = 0x21; // 定时器1工作在方式2(自动重装)
174 1 SCON = 0x50; // 10位uart,允许串行接受
175 1
176 1 TH1 = 0xFD;
177 1 TL1 = 0xFD;
178 1
179 1 TR1 = 1;
C51 COMPILER V7.08 MAIN 01/03/2011 21:03:11 PAGE 4
180 1 }
181
182 /**
183 * UART发送一字节
184 */
185 void UART_Send_Byte(uint8 dat)
186 {
187 1 SBUF = dat;
188 1 while (TI == 0);
189 1 TI = 0;
190 1 }
191
192 /**
193 * 将数据转换成ASC码并通过UART发送出去
194 */
195 void UART_Send_Dat(uint8 dat)
196 {
197 1 UART_Send_Byte(dat/16 + '0');
198 1 UART_Send_Byte(dat%16 + '0');
199 1 }
200
201 main()
202 {
203 1
204 1 uart_init();
205 1 set_time(&time); //设定时间值
206 1
207 1 while(1)
208 1 {
209 2
210 2 read_time(&time); //秒分时日月周年
211 2
212 2 UART_Send_Dat(time[6]);
213 2 UART_Send_Byte('-');
214 2 UART_Send_Dat(time[4]);
215 2 UART_Send_Byte('-');
216 2 UART_Send_Dat(time[3]);
217 2 UART_Send_Byte(' ');
218 2
219 2 UART_Send_Dat(time[2]);
220 2 UART_Send_Byte(':');
221 2 UART_Send_Dat(time[1]);
222 2 UART_Send_Byte(':');
223 2 UART_Send_Dat(time[0]);
224 2 UART_Send_Byte('\r');
225 2 UART_Send_Byte('\n');
226 2
227 2 delay(10000);
228 2 }
229 1 }
230
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 412 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 7
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILER V7.08 MAIN 01/03/2011 21:03:11 PAGE 5
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -