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