📄 ds18b20-lcd1602-c51.lst
字号:
225 2 dat >>= 1;
226 2 DQ = 1; // 给脉冲信号
227 2
228 2 if(DQ)
229 2 dat |= 0x80;
230 2 Delay(4);
231 2 }
232 1
233 1 return (dat);
234 1 }
235
236 /*******************************************************************/
237 /* */
238 /* 写一个字节 */
239 /* */
240 /*******************************************************************/
241 WriteOneChar(unsigned char dat)
C51 COMPILER V8.02 DS18B20_LCD1602_C51 08/21/2006 15:48:03 PAGE 5
242 {
243 1 unsigned char i = 0;
244 1 for (i = 8; i > 0; i--)
245 1 {
246 2 DQ = 0;
247 2 DQ = dat&0x01;
248 2 Delay(5);
249 2
250 2 DQ = 1;
251 2 dat>>=1;
252 2 }
253 1 }
254
255 /*******************************************************************/
256 /* */
257 /* 读取温度 */
258 /* */
259 /*******************************************************************/
260 Read_Temperature(unsigned char x)
261 {
262 1 unsigned char i;
263 1 Init_DS18B20();
264 1
265 1 WriteOneChar(0xCC); // 跳过读序号列号的操作
266 1 WriteOneChar(0x44); // 启动温度转换
267 1
268 1 Init_DS18B20();
269 1 // WriteOneChar(0xCC); //跳过读序号列号的操作
270 1 WriteOneChar(0x55); //匹配ROM命令
271 1 for(i=0;i<8;i++)
272 1 {
273 2 WriteOneChar(RomCode[x][i]);
274 2 }
275 1 WriteOneChar(0xBE); //读取温度寄存器
276 1
277 1 temp_data[0] = ReadOneChar(); //温度低8位
278 1 temp_data[1] = ReadOneChar(); //温度高8位
279 1 }
280
281 /*******************************************************************/
282 /* */
283 /* 数据转换与温度显示 */
284 /* */
285 /*******************************************************************/
286 Disp_Temperature(uchar x)
287 {
288 1 display[4]=temp_data[0]&0x0f;
289 1 display[0]=ditab[display[4]]+0x30; //查表得小数位的值
290 1
291 1 display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
292 1 display[3]=display[4]/100+0x30;
293 1 display[1]=display[4]%100;
294 1 display[2]=display[1]/10+0x30;
295 1 display[1]=display[1]%10+0x30;
296 1
297 1 if(display[3]==0x30) //高位为0,不显示
298 1 {
299 2 display[3]=0x20;
300 2 if(display[2]==0x30) //次高位为0,不显示
301 2 display[2]=0x20;
302 2 }
303 1 if(x==1)
C51 COMPILER V8.02 DS18B20_LCD1602_C51 08/21/2006 15:48:03 PAGE 6
304 1 {
305 2 lcd_pos(0x48); //在LCD第二行显示
306 2 lcd_wdat(display[3]); //百位数显示
307 2 lcd_pos(0x49);
308 2 lcd_wdat(display[2]); //十位数显示
309 2 lcd_pos(0x4a);
310 2 lcd_wdat(display[1]); //个位数显示
311 2 lcd_pos(0x4c);
312 2 lcd_wdat(display[0]); //小数位数显示
313 2 }
314 1 else
315 1 {
316 2 lcd_pos(0x08); //在LCD第一行显示
317 2 lcd_wdat(display[3]); //百位数显示
318 2 lcd_pos(0x09);
319 2 lcd_wdat(display[2]); //十位数显示
320 2 lcd_pos(0x0a);
321 2 lcd_wdat(display[1]); //个位数显示
322 2 lcd_pos(0x0c);
323 2 lcd_wdat(display[0]); //小数位数显示
324 2 }
325 1
326 1 }
327
328 /*******************************************************************/
329 /* */
330 /* 蜂鸣器响一声 */
331 /* */
332 /*******************************************************************/
333 void beep()
334 {
335 1 unsigned char y;
336 1 for (y=0;y<100;y++)
337 1 {
338 2 Delay(60);
339 2 BEEP=!BEEP; //BEEP取反
340 2 }
341 1 BEEP=1; //关闭蜂鸣器
342 1 Delay(40000);
343 1 }
344
345 /*******************************************************************/
346 /* */
347 /* DS18B20 OK 显示菜单 */
348 /* */
349 /*******************************************************************/
350 void Ok_Menu ()
351 {
352 1 uchar m;
353 1 lcd_init(); //初始化LCD
354 1
355 1 lcd_pos(0); //设置显示位置为第一行的第1个字符
356 1 m = 0;
357 1 while(cdis1[m] != '\0')
358 1 { //显示字符
359 2 lcd_wdat(cdis1[m]);
360 2 m++;
361 2 }
362 1
363 1 writetab(); //自定义字符写入CGRAM
364 1 delay1(5);
365 1 lcd_pos(0x0d);
C51 COMPILER V8.02 DS18B20_LCD1602_C51 08/21/2006 15:48:03 PAGE 7
366 1 lcd_wdat(0x00); //显示自定义字符
367 1
368 1 lcd_pos(0x40); //设置显示位置为第二行第1个字符
369 1 m = 0;
370 1 while(cdis2[m] != '\0')
371 1 {
372 2 lcd_wdat(cdis2[m]); //显示字符
373 2 m++;
374 2 }
375 1
376 1 // writetab(); //自定义字符写入CGRAM
377 1 // delay1(5);
378 1 lcd_pos(0x4d);
379 1 lcd_wdat(0x00); //显示自定义字符
380 1 }
381
382 /*******************************************************************/
383 /* */
384 /* DS18B20 ERROR 显示菜单 */
385 /* */
386 /*******************************************************************/
387 void Error_Menu ()
388 {
389 1 uchar m;
390 1 lcd_init(); //初始化LCD
391 1
392 1 lcd_pos(0); //设置显示位置为第一行的第1个字符
393 1 m = 0;
394 1 while(cdis3[m] != '\0')
395 1 { //显示字符
396 2 lcd_wdat(cdis3[m]);
397 2 m++;
398 2 }
399 1
400 1 lcd_pos(0x40); //设置显示位置为第二行第1个字符
401 1 m = 0;
402 1 while(cdis4[m] != '\0')
403 1 {
404 2 lcd_wdat(cdis4[m]); //显示字符
405 2 m++;
406 2 }
407 1 }
408
409 /*******************************************************************/
410 /* */
411 /* 主函数 */
412 /* */
413 /*******************************************************************/
414 void main()
415 {
416 1 Ok_Menu ();
417 1
418 1 do
419 1 {
420 2 Read_Temperature(0);
421 2 Disp_Temperature(0);
422 2 delay1(30);
423 2 Read_Temperature(1);
424 2 Disp_Temperature(1);
425 2 delay1(30);
426 2 }
427 1 while(!presence) ;
C51 COMPILER V8.02 DS18B20_LCD1602_C51 08/21/2006 15:48:03 PAGE 8
428 1
429 1 Error_Menu ();
430 1
431 1 do
432 1 {
433 2 Init_DS18B20();
434 2 beep();
435 2 }
436 1 while(presence);
437 1 }
438
439 /*******************************************************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 738 ----
CONSTANT SIZE = 108 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 ----
IDATA SIZE = ---- ----
BIT SIZE = 1 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -