📄 ds18b20.lst
字号:
C51 COMPILER V8.08 DS18B20 02/25/2009 16:20:26 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN ds18b20.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE ds18b20.c BROWSE DEBUG OBJECTEXTEND
line 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 P0
13 #define secondline 0xc0
14
15 unsigned char data ds18b20_read_data[9];
16 unsigned char data table[32] = "temperature 00.0designed by hwb ";
17 sbit data_pin = P3^7;
18 sbit RS = P2^7;
19 sbit RW = P2^6;
20 sbit E = P2^5;
21 sbit LED = P2 ^ 3;
22 bit zheng_fu_hao;
23
24 unsigned char lcd_busy(void)
25 {
26 1 unsigned char temp;
27 1
28 1 portdata = 0xff;
29 1 RS = 0;
30 1 RW = 1;
31 1 E = 1;
32 1 temp = portdata;
33 1 E = 0;
34 1 return (temp);
35 1 }
36
37 void lcd_command_writedata(unsigned char check,unsigned char dispdata)
38 {
39 1 if (check == COMMAND)
40 1 {
41 2 RS = 0;
42 2 }
43 1 else
44 1 {
45 2 RS = 1;
46 2 }
47 1 RW = 0;
48 1 portdata = dispdata;
49 1 E = 1;
50 1 E = 0;
51 1 while (lcd_busy() & BUSY);
52 1 }
53
54 void lcd_disp(unsigned char disp_data)
55 {
C51 COMPILER V8.08 DS18B20 02/25/2009 16:20:26 PAGE 2
56 1 static unsigned char flag = 0;
57 1
58 1 if (!flag || disp_data == 255)
59 1 {
60 2 lcd_command_writedata(COMMAND,LCD_CLEAR);
61 2 flag = 0;
62 2 if (disp_data == 255)
63 2 {
64 3 return;
65 3 }
66 2 }
67 1 if (flag == 16)
68 1 {
69 2 lcd_command_writedata(COMMAND,secondline);
70 2 }
71 1 lcd_command_writedata(WRITE_DATA,disp_data);
72 1 while (lcd_busy() & BUSY);
73 1 flag++;
74 1 if (flag >= 32) flag = 0;
75 1 }
76
77 void lcd_init(void)
78 {
79 1 lcd_command_writedata(COMMAND,LCD_CLEAR);
80 1 lcd_command_writedata(COMMAND,0x38);
81 1 lcd_command_writedata(COMMAND,0x0e);
82 1 lcd_command_writedata(COMMAND,0x06);
83 1 }
84
85
86 void ds18b20_delay(unsigned char delay_time) /*计数一次6us,再加上函数调用和返回所花费的14us时间*/
87 {
88 1 while (delay_time--);
89 1 }
90
91 void delay_ms(unsigned int ms_delay_time) /*计数一次大约1ms*/
92 {
93 1 unsigned char i;
94 1
95 1 while (ms_delay_time--)
96 1 {
97 2 for (i = 0; i < 120; i ++)
98 2 {
99 3 }
100 2 }
101 1 }
102
103 bit ds18b20_rst(void)
104 {
105 1 bit ack = 1;
106 1 unsigned char loop_time = 10;
107 1
108 1 while ((loop_time --) && ack)
109 1 {
110 2 ds18b20_delay(10);
111 2 data_pin = 1;
112 2 nop;
113 2 nop;
114 2 data_pin = 0;
115 2 ds18b20_delay(100);
116 2 data_pin = 1;
117 2 ds18b20_delay(10);
C51 COMPILER V8.08 DS18B20 02/25/2009 16:20:26 PAGE 3
118 2 ack = data_pin;
119 2 ds18b20_delay(70);
120 2 }
121 1 return (ack);
122 1 }
123
124
125 bit ds18b20_read_bit(void)
126 {
127 1 bit read_bit;
128 1
129 1 data_pin = 0;
130 1 nop;
131 1 nop;
132 1 data_pin = 1;
133 1 nop;
134 1 nop;
135 1 nop;
136 1 nop;
137 1 nop;
138 1 nop;
139 1 nop;
140 1 nop;
141 1 read_bit = data_pin;
142 1 ds18b20_delay(7);
143 1 return (read_bit);
144 1 }
145
146 unsigned char ds18b20_read_byte(void)
147 {
148 1 unsigned char i;
149 1 unsigned char read_temp = 0;
150 1
151 1 for (i = 8; i > 0; i --)
152 1 {
153 2 if(ds18b20_read_bit())
154 2 {
155 3 read_temp = read_temp >> 1;
156 3 read_temp = read_temp | 0x80;
157 3 }
158 2 else
159 2 {
160 3 read_temp = read_temp >> 1;
161 3 }
162 2 }
163 1 return (read_temp);
164 1 }
165
166
167 void ds18b20_write_bit(bit write_data)
168 {
169 1 if (write_data)
170 1 {
171 2 data_pin = 0;
172 2 nop;
173 2 nop;
174 2 data_pin = 1;
175 2 ds18b20_delay(10);
176 2 }
177 1 else
178 1 {
179 2 data_pin = 0;
C51 COMPILER V8.08 DS18B20 02/25/2009 16:20:26 PAGE 4
180 2 ds18b20_delay(10);
181 2 }
182 1 data_pin = 1;
183 1 nop;
184 1 nop;
185 1 }
186
187 void ds18b20_write_byte(unsigned char send_data)
188 {
189 1 unsigned char i;
190 1
191 1 for (i = 0; i < 8; i ++)
192 1 {
193 2 ds18b20_write_bit((bit)((send_data >> i) & 0x01));
194 2 }
195 1 }
196
197 unsigned int ds18b20_read_temperature(void)
198 {
199 1 unsigned char i;
200 1 unsigned int temperature;
201 1
202 1 zheng_fu_hao = 0;
203 1 if (!ds18b20_rst())
204 1 {
205 2 ds18b20_write_byte(jmp_rom);
206 2 ds18b20_write_byte(tmp_start);
207 2 }
208 1 delay_ms(1);
209 1 if (!ds18b20_rst())
210 1 {
211 2 ds18b20_write_byte(jmp_rom);
212 2 ds18b20_write_byte(tmp_ram_read);
213 2 for (i = 0; i < 9; i ++)
214 2 {
215 3 ds18b20_read_data[i] = ds18b20_read_byte();
216 3 }
217 2 }
218 1 temperature = (ds18b20_read_data[1] << 8) + ds18b20_read_data[0];
219 1 if ((ds18b20_read_data[1] & 0xf8) == 0xf8)
220 1 {
221 2 temperature = ~ temperature + 1;
222 2 zheng_fu_hao = 1;
223 2 }
224 1 return (temperature);
225 1 }
226
227 void tmp_disp(void)
228 {
229 1 unsigned long temperature_temp;
230 1 unsigned int tem_get;
231 1 unsigned char a,b,c,d;
232 1 unsigned char i;
233 1
234 1 tem_get = ds18b20_read_temperature();
235 1 temperature_temp =(unsigned long)((float)(tem_get)*(float)(0.0625)); /*温度计算*/
236 1 lcd_command_writedata(COMMAND,LCD_CLEAR);
237 1 /*if (!zheng_fu_hao) 判断温度正负值,判是否要显示负号
238 1 {
239 1 table[11] = 0xfe;
240 1 }
241 1 else
C51 COMPILER V8.08 DS18B20 02/25/2009 16:20:26 PAGE 5
242 1 {
243 1 lcd_disp(0x83,0x2d);
244 1 } */
245 1 a = temperature_temp / 100; /*温度百位显示,为0时不显示*/
246 1 if (a != 0x00)
247 1 {
248 2 table[11] = a + 0x30;
249 2 }
250 1 else table[11] = 0xfe;
251 1 b = temperature_temp / 10 % 10; /*温度十位显示,当百位和十位同时为0时不显示*/
252 1 if (b != 0x00)
253 1 {
254 2 table[12] = b + 0x30;
255 2 }
256 1 else table[12] = 0xfe;
257 1 c = temperature_temp % 100 % 10;/*温度个位显示,无论其值为何值必须显示*/
258 1 table[13] = c + 0x30;
259 1 d = temperature_temp - a * 100 - b * 10 - c;
260 1 table[15] = d + 0x30;
261 1 for (i = 0 ; i < 32; i ++)
262 1 {
263 2 lcd_disp(table[i]);
264 2 }
265 1 delay_ms(100);
266 1 ds18b20_read_data[1] = 0;
267 1 ds18b20_read_data[0] = 0;
268 1 table[12] = 0x30;
269 1 table[13] = 0x30;
270 1 table[15] = 0x30;
271 1
272 1 }
273
274 void system_init(void)
275 {
276 1 EA = 0;
277 1 TH0 = 0x00;
278 1 TL0 = 0x00;
279 1 TMOD = 0x01;
280 1 TF0 = 0;
281 1 TR0 = 0;
282 1 ET0 = 1;
283 1 EA = 1;
284 1 }
285
286 void main(void)
287 {
288 1 delay_ms(10);
289 1 lcd_init();
290 1 system_init();
291 1 LED = 0;
292 1 TR0 = 1;
293 1 while (1)
294 1 {
295 2 PCON = 0x01;
296 2 }
297 1 }
298
299 void timer_interrupt(void) interrupt 1
300 {
301 1 TH0 = 0x00;
302 1 TL0 = 0x00;
303 1 tmp_disp();
C51 COMPILER V8.08 DS18B20 02/25/2009 16:20:26 PAGE 6
304 1 TR0 = 0;
305 1 TR0 = 1;
306 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 720 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 42 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 + -