C51 COMPILER V9.59.0.0 ONEWIRE 05/02/2024 15:57:34 PAGE 1 C51 COMPILER V9.59.0.0, COMPILATION OF MODULE ONEWIRE OBJECT MODULE PLACED IN .\Objects\onewire.obj COMPILER INVOKED BY: D:\Keil_v5\C51\BIN\C51.EXE ..\Driver\onewire.c OPTIMIZE(8,SPEED) BROWSE INCDIR(..\Driver) DEBUG OBJ -ECTEXTEND PRINT(.\Listings\onewire.lst) TABS(2) OBJECT(.\Objects\onewire.obj) line level source 1 /* # 单总线代码片段说明 2 1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。 3 2. 参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、 -行速度和试题 4 中对单片机时钟频率的要求,进行代码调试和修改。 5 */ 6 #include "onewire.h" 7 #include "REG52.H" 8 #include "intrins.h" 9 sbit DQ = P1 ^ 4; // 单总线数据口 10 void Delay4us(void) //@12.000MHz 11 { 12 1 unsigned char data i; 13 1 14 1 _nop_(); 15 1 _nop_(); 16 1 i = 9; 17 1 while (--i) 18 1 ; 19 1 } 20 21 // 22 void Delay_OneWire(unsigned int t) 23 { 24 1 unsigned char i; 25 1 while (t--) 26 1 { 27 2 for (i = 0; i < 12; i++) 28 2 ; 29 2 } 30 1 } 31 32 // 33 void Write_DS18B20(unsigned char dat) 34 { 35 1 unsigned char i; 36 1 for (i = 0; i < 8; i++) 37 1 { 38 2 DQ = 0; 39 2 DQ = dat & 0x01; 40 2 Delay_OneWire(5); 41 2 DQ = 1; 42 2 dat >>= 1; 43 2 } 44 1 Delay_OneWire(5); 45 1 } 46 47 // 48 unsigned char Read_DS18B20(void) 49 { 50 1 unsigned char i; 51 1 unsigned char dat; 52 1 53 1 for (i = 0; i < 8; i++) C51 COMPILER V9.59.0.0 ONEWIRE 05/02/2024 15:57:34 PAGE 2 54 1 { 55 2 DQ = 0; 56 2 dat >>= 1; 57 2 DQ = 1; 58 2 Delay4us(); 59 2 if (DQ) 60 2 { 61 3 dat |= 0x80; 62 3 } 63 2 Delay_OneWire(5); 64 2 } 65 1 return dat; 66 1 } 67 68 // 69 bit init_ds18b20(void) 70 { 71 1 bit initflag = 0; 72 1 73 1 DQ = 1; 74 1 Delay_OneWire(12); 75 1 DQ = 0; 76 1 Delay_OneWire(80); 77 1 DQ = 1; 78 1 Delay_OneWire(10); 79 1 initflag = DQ; 80 1 Delay_OneWire(5); 81 1 82 1 return initflag; 83 1 } 84 85 float rd_temperature() 86 { 87 1 unsigned char low, high; 88 1 init_ds18b20(); 89 1 Write_DS18B20(0xcc); // 跳过ROM 90 1 Write_DS18B20(0x44); // 启动温度转换 91 1 Delay_OneWire(200); // 等待温度转换 92 1 init_ds18b20(); 93 1 Write_DS18B20(0xcc); // 跳过ROM 94 1 Write_DS18B20(0xbe); // 读取温度值 95 1 low = Read_DS18B20(); 96 1 high = Read_DS18B20(); 97 1 return (float)(high << 8 | low) * 0.0625; 98 1 } MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 212 ---- CONSTANT SIZE = ---- ---- XDATA SIZE = ---- ---- PDATA SIZE = ---- ---- DATA SIZE = ---- ---- IDATA SIZE = ---- ---- BIT SIZE = ---- 1 END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)