📄 ds18b20-ds1302.lst
字号:
C51 COMPILER V6.23a DS18B20_DS1302 01/11/2004 19:02:17 PAGE 1
C51 COMPILER V6.23a, COMPILATION OF MODULE DS18B20_DS1302
OBJECT MODULE PLACED IN DS18B20-DS1302.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE DS18B20-DS1302.C BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <reg52.h>
2 #include <intrins.h>
3 #define jmp_rom 0xcc
4 #define tmp_start 0x44
5 #define tmp_ram_read 0xbe
6 #define nop _nop_()
7 #define BUSY 0x80
8 #define WRITE_DATA 0xff
9 #define delay_data 0xff
10 #define COMMAND 0x00
11 #define LCD_CLEAR 0x01
12 #define portdata P3
13
14 unsigned char data ds18b20_read_data[9];
15 unsigned char code write_ds1302_data[3]={0x12,0x00,0x00};
16 unsigned char data read_ds1302_data[3];
17
18 bit zheng_fu_hao;
19 sbit data_pin = P1^1;
20 sbit RS = P2^2;
21 sbit RW = P2^1;
22 sbit E = P2^0;
23 sbit CK=P1^5;
24 sbit IO=P1^6;
25 sbit DSRST=P1^7;
26 sbit ACC7=ACC^7;
27 sbit ACC0=ACC^0;
28
29 unsigned char lcd_busy(void)
30 {
31 1 unsigned char temp;
32 1
33 1 portdata = 0xff;
34 1 RS = 0;
35 1 RW = 1;
36 1 E = 1;
37 1 temp = portdata;
38 1 E = 0;
39 1 return (temp);
40 1 }
41
42 void lcd_command_writedata(unsigned char check,unsigned char dispdata)
43 {
44 1 if (check == COMMAND)
45 1 {
46 2 RS = 0;
47 2 }
48 1 else
49 1 {
50 2 RS = 1;
51 2 }
52 1 RW = 0;
53 1 portdata = dispdata;
54 1 E = 1;
55 1 E = 0;
C51 COMPILER V6.23a DS18B20_DS1302 01/11/2004 19:02:17 PAGE 2
56 1 while (lcd_busy() & BUSY);
57 1 }
58
59 void lcd_disp(unsigned char address,unsigned char disp_data)
60 {
61 1 lcd_command_writedata(COMMAND,address);
62 1 lcd_command_writedata(WRITE_DATA,disp_data);
63 1 }
64
65 void lcd_init(void)
66 {
67 1 lcd_command_writedata(COMMAND,LCD_CLEAR);
68 1 lcd_command_writedata(COMMAND,0x38);
69 1 lcd_command_writedata(COMMAND,0x0e);
70 1 lcd_command_writedata(COMMAND,0x06);
71 1 }
72
73 void ds1302open(void)//打开DS1302
74 {
75 1 CK=0;
76 1 DSRST=0;
77 1 DSRST=1;
78 1 }
79
80 void ds1302stop(void)//关闭DS1302
81 {
82 1 DSRST=0;
83 1 CK=1;
84 1 }
85
86 void ds1302write(unsigned char putin)
87 {
88 1 unsigned char i;
89 1 ACC=putin;
90 1 for (i=8;i>0;i--)
91 1 {
92 2 IO=ACC0;
93 2 CK=1;
94 2 CK=0;
95 2 ACC=ACC>>1;
96 2 }
97 1 }
98
99 unsigned char ds1302read (void)
100 {
101 1 unsigned char i;
102 1 ACC=0;
103 1 for (i=8;i>0;i--)
104 1 {
105 2 ACC=ACC>>1;
106 2 ACC7=IO;
107 2 CK=1;
108 2 CK=0;
109 2 }
110 1 return ACC;
111 1 }
112
113 void ds1302wt(unsigned char address,unsigned char val) //DS1302写数据
114 {
115 1 ds1302open();
116 1 ds1302write(address);
117 1 ds1302write(val);
C51 COMPILER V6.23a DS18B20_DS1302 01/11/2004 19:02:17 PAGE 3
118 1 ds1302stop();
119 1 }
120
121 unsigned char ds1302rt(unsigned char address)//DS1302读数据
122 {
123 1 unsigned char tempdata;
124 1 ds1302open();
125 1 ds1302write(address);
126 1 tempdata=ds1302read();
127 1 ds1302stop();
128 1 return tempdata;
129 1 }
130
131 void ds1302_write_data(void)
132 {
133 1 ds1302wt(0x84,write_ds1302_data[0]);
134 1 ds1302wt(0x82,write_ds1302_data[1]);
135 1 ds1302wt(0x80,write_ds1302_data[2]);
136 1 }
137
138 void ds1302_read_data(void)
139 {
140 1 read_ds1302_data[0] = ds1302rt(0x85);
141 1 read_ds1302_data[1] = ds1302rt(0x83);
142 1 read_ds1302_data[2] = ds1302rt(0x81);
143 1 }
144
145 void ds18b20_delay(unsigned char delay_time) /*计数一次6us,再加上函数调用和返回所花费的14us时间*/
146 {
147 1 while (delay_time--);
148 1 }
149
150 void delay_ms(unsigned int ms_delay_time) /*计数一次大约1ms*/
151 {
152 1 unsigned char i;
153 1
154 1 while (ms_delay_time--)
155 1 {
156 2 for (i = 0; i < 120; i ++)
157 2 {
158 3 }
159 2 }
160 1 }
161
162 bit ds18b20_rst(void)
163 {
164 1 bit ack = 1;
165 1 unsigned char loop_time = 10;
166 1
167 1 while ((loop_time --) && ack)
168 1 {
169 2 ds18b20_delay(10);
170 2 data_pin = 1;
171 2 nop;
172 2 nop;
173 2 data_pin = 0;
174 2 ds18b20_delay(100);
175 2 data_pin = 1;
176 2 ds18b20_delay(10);
177 2 ack = data_pin;
178 2 ds18b20_delay(70);
179 2 }
C51 COMPILER V6.23a DS18B20_DS1302 01/11/2004 19:02:17 PAGE 4
180 1 return (ack);
181 1 }
182
183
184 bit ds18b20_read_bit(void)
185 {
186 1 bit read_bit;
187 1
188 1 data_pin = 0;
189 1 nop;
190 1 nop;
191 1 data_pin = 1;
192 1 nop;
193 1 nop;
194 1 nop;
195 1 nop;
196 1 nop;
197 1 nop;
198 1 nop;
199 1 nop;
200 1 read_bit = data_pin;
201 1 ds18b20_delay(7);
202 1 return (read_bit);
203 1 }
204
205 unsigned char ds18b20_read_byte(void)
206 {
207 1 unsigned char i;
208 1 unsigned char read_temp = 0;
209 1
210 1 for (i = 8; i > 0; i --)
211 1 {
212 2 if(ds18b20_read_bit())
213 2 {
214 3 read_temp = read_temp >> 1;
215 3 read_temp = read_temp | 0x80;
216 3 }
217 2 else
218 2 {
219 3 read_temp = read_temp >> 1;
220 3 }
221 2 }
222 1 return (read_temp);
223 1 }
224
225
226 void ds18b20_write_bit(bit write_data)
227 {
228 1 if (write_data)
229 1 {
230 2 data_pin = 0;
231 2 nop;
232 2 nop;
233 2 data_pin = 1;
234 2 ds18b20_delay(10);
235 2 }
236 1 else
237 1 {
238 2 data_pin = 0;
239 2 ds18b20_delay(10);
240 2 }
241 1 data_pin = 1;
C51 COMPILER V6.23a DS18B20_DS1302 01/11/2004 19:02:17 PAGE 5
242 1 nop;
243 1 nop;
244 1 }
245
246 void ds18b20_write_byte(unsigned char send_data)
247 {
248 1 unsigned char i;
249 1
250 1 for (i = 0; i < 8; i ++)
251 1 {
252 2 ds18b20_write_bit((bit)((send_data >> i) & 0x01));
253 2 }
254 1 }
255
256 unsigned int ds18b20_read_temperature(void)
257 {
258 1 unsigned char i;
259 1 unsigned int temperature;
260 1
261 1 zheng_fu_hao = 0;
262 1 if (!ds18b20_rst())
263 1 {
264 2 ds18b20_write_byte(jmp_rom);
265 2 ds18b20_write_byte(tmp_start);
266 2 }
267 1 delay_ms(1);
268 1 if (!ds18b20_rst())
269 1 {
270 2 ds18b20_write_byte(jmp_rom);
271 2 ds18b20_write_byte(tmp_ram_read);
272 2 for (i = 0; i < 9; i ++)
273 2 {
274 3 ds18b20_read_data[i] = ds18b20_read_byte();
275 3 }
276 2 }
277 1 temperature = (ds18b20_read_data[1] << 8) + ds18b20_read_data[0];
278 1 if ((ds18b20_read_data[1] & 0xf8) == 0xf8)
279 1 {
280 2 temperature = ~ temperature + 1;
281 2 zheng_fu_hao = 1;
282 2 }
283 1 return (temperature);
284 1 }
285
286 void disp_data(void)
287 {
288 1 unsigned long temperature_temp;
289 1 unsigned int tem_get;
290 1 unsigned char a,b,c,d;
291 1
292 1 tem_get = ds18b20_read_temperature();
293 1 temperature_temp =(unsigned long)((float)(tem_get)*(float)(0.0625)); /*温度计算*/
294 1 lcd_command_writedata(COMMAND,LCD_CLEAR);
295 1 if (!zheng_fu_hao) /*判断温度正负值,判是否要显示负号*/
296 1 {
297 2 lcd_disp(0x83,0xfe);
298 2 }
299 1 else
300 1 {
301 2 lcd_disp(0x83,0x2d);
302 2 }
303 1
C51 COMPILER V6.23a DS18B20_DS1302 01/11/2004 19:02:17 PAGE 6
304 1 a = temperature_temp / 100; /*温度百位显示,为0时不显示*/
305 1 if (a == 0x00)
306 1 {
307 2 lcd_disp(0x84,0xfe);
308 2 }
309 1 else
310 1 {
311 2 lcd_disp(0x84,a + 0x30);
312 2 }
313 1
314 1 b = temperature_temp / 10 % 10; /*温度十位显示,当百位和十位同时为0时不显示*/
315 1 if (a == 0x00 && b == 0x00)
316 1 {
317 2 lcd_disp(0x85,0xfe);
318 2 }
319 1 else
320 1 {
321 2 lcd_disp(0x85,b + 0x30);
322 2 }
323 1 c = temperature_temp % 100 % 10;/*温度个位显示,无论其值为何值必须显示*/
324 1 lcd_disp(0x86,c + 0x30);
325 1 lcd_disp(0x87,0x2e);
326 1
327 1 d = temperature_temp - a * 100 - b * 10 - c; /*温度小数位显示*/
328 1 lcd_disp(0x88,d + 0x30); /*时钟显示*/
329 1 lcd_disp(0x89,0xdf);
330 1 lcd_disp(0x8a,0x43);
331 1 ds1302_read_data();
332 1 lcd_disp(0xc4,(read_ds1302_data[0] >> 4 & 0x0f) + 0x30);
333 1 lcd_disp(0xc5,(read_ds1302_data[0] & 0x0f) + 0x30);
334 1 lcd_disp(0xc6,0x3a);
335 1 lcd_disp(0xc7,(read_ds1302_data[1] >> 4 & 0x0f) + 0x30);
336 1 lcd_disp(0xc8,(read_ds1302_data[1] & 0x0f) + 0x30);
337 1 lcd_disp(0xc9,0x3a);
338 1 lcd_disp(0xca,(read_ds1302_data[2] >> 4 & 0x0f) + 0x30);
339 1 lcd_disp(0xcb,(read_ds1302_data[2] & 0x0f) + 0x30);
340 1 lcd_disp(0xcf,0xfe);
341 1 }
342 void main(void)
343 {
344 1 delay_ms(10);
345 1 lcd_init();
346 1 ds1302_write_data();
347 1 while (1)
348 1 {
349 2 disp_data();
350 2 }
351 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 830 ----
CONSTANT SIZE = 3 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 12 6
IDATA SIZE = ---- ----
BIT SIZE = 1 3
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -