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