📄 ds18b20.lst
字号:
C51 COMPILER V7.50 DS18B20 04/06/2008 20:32:12 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN .\obj\DS18B20.obj
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE src\DS18B20.c BROWSE DEBUG OBJECTEXTEND PRINT(.\lst\DS18B20.lst) OBJECT(.\o
-bj\DS18B20.obj)
line level source
1
2 #include <reg51.h>
3
4 #include "DS18B20.h"
5
6 /******************************* 延时函数 ********************************
7 * 功能:在11.059MHz的晶振条件下调用本函数需要24μs ,然后每次计数需16μs
8 (16*n+24)us
9 **************************************************************************/
10 void Singlewire_Delay( int n )
11 {
12 1 int i;
13 1 for (i=0; i<n;i++);
14 1 }
15
16 /******************************* 复位函数 *******************************
17 * 功能:完成单总线的复位操作。
18 * 复位时间为480μs,因此延时时间为(480-24)/16 = 28.5,取29μs。
19 * 经过70μs之后检测存在脉冲,因此延时时间为(70-24)/16 = 2.875,取3μs。
20 **************************************************************************/
21 bit Singlewire_Reset( void )
22 {
23 1 bit state;
24 1 DQ = 0; // 将 DQ 线拉低
25 1 Singlewire_Delay(29); // 保持 480μs
26 1 DQ = 1; // DQ返回高电平
27 1 Singlewire_Delay(3); // 等待存在脉冲
28 1 state = DQ; // 获得存在信号
29 1 Singlewire_Delay(25); // 等待时间隙结束
30 1 return(~state); // 返回存在信号,1 = 器件存在, 0 = 无器件
31 1 }
32 /****************************** 位写入函数 *******************************
33 * 功能:向单总线写入1位值:bitval
34 *************************************************************************/
35 void Write_Bit( char bitval )
36 {
37 1 DQ = 0; // 将DQ 拉低开始写时间隙
38 1 if(bitval==1) DQ =1; // 如果写1,DQ 返回高电平
39 1 Singlewire_Delay(5); // 在时间隙内保持电平值,
40 1 DQ = 1; // Delay函数每次循环延时16μs,因此delay(5) = 104μs
41 1 }
42 /**************************** 字节写入函数 *******************************
43 * 功能:向单总线写入一个字节值:val
44 *************************************************************************/
45 void Write_Byte( char val )
46 {
47 1 uchar i;
48 1 uchar temp;
49 1 for (i=0; i<8; i++) // 写入字节, 每次写入一位
50 1 {
51 2 temp = val>>i;
52 2 temp &= 0x01;
53 2 Write_Bit(temp);
54 2 }
C51 COMPILER V7.50 DS18B20 04/06/2008 20:32:12 PAGE 2
55 1 Singlewire_Delay(5);
56 1 }
57
58 /**************************** 位读取函数 ********************************
59 * 功能:从单总线上读取一位信号,所需延时时间为15μs,因此无法调用前面定义
60 * 的delay()函数,而采用一个for()循环来实现延时。
61 * ***********************************************************************/
62 bit Read_Bit( void )
63 {
64 1 uchar i;
65 1 DQ = 0; //将DQ 拉低开始读时间隙
66 1 DQ = 1; // then return high
67 1 for (i=0; i<3; i++); // 延时15μs
68 1 return(DQ); // 返回 DQ 线上的电平值
69 1 }
70
71 /**************************** 字节读取函数 *******************************
72 * 功能:从单总线读取一个字节的值
73 *************************************************************************/
74 uchar Read_Byte( void)
75 {
76 1 uchar i;
77 1 uchar value = 0;
78 1 for (i=0;i<8;i++) // 读取字节,每次读取一个字节
79 1 {
80 2 if(Read_Bit()) value|=0x01<<i; // 然后将其左移
81 2 Singlewire_Delay(6);
82 2 }
83 1 return(value);
84 1 }
85
86 /******************************* 读取温度函数 *****************************
87 * 功能:如果单总线节点上只有一个器件则可以直接掉用本函数。如果节点上有多个器
88 * 件,为了避免数据冲突,应使用Match ROM函数来选中特定器件。
89 * 注: 本函数是根据DS1820的温度数据格式编写的,若用于DS18B20,必须根据
90 * DS18B20的温度数据格式作适当修改。
91 **************************************************************************/
92
93 uchar Read_Temperature(void)
94 {
95 1
96 1 char get[10];
97 1 uint t;
98 1 // char temp_lsb,temp_msb;
99 1 int k;
100 1 float temperature;
101 1 Singlewire_Reset(); //单总线复位//
102 1 Write_Byte(0xCC); // 跳过 ROM
103 1 Write_Byte(0x44); // 启动温度转换
104 1 Singlewire_Delay(5);
105 1 Singlewire_Reset(); //单总线复位//
106 1 Write_Byte(0xCC); // 跳过 ROM//
107 1 Write_Byte(0xBE); //发送出读数据命令//// 读暂存器/////
108 1 for (k=0;k<9;k++){get[k]=Read_Byte();}////连续读取9个寄存器中的数据////
109 1 temp_msb = get[1]; // Sign byte + lsbit
110 1 temp_lsb = get[0]; // Temp data plus lsb
111 1 if (temp_msb >= 0x80)
112 1 {temperature=125+((~temp_msb)*256+(~temp_lsb)+1)*0.0625;}
113 1 else{temperature=(temp_msb*256+temp_lsb)*0.0625; }
114 1 t=(uint)temperature;
115 1 return(t);
116 1
C51 COMPILER V7.50 DS18B20 04/06/2008 20:32:12 PAGE 3
117 1 }
118
119
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 317 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 2 14
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -