📄 ds18b20.lst
字号:
C51 COMPILER V8.16 DS18B20 01/11/2009 10:40:51 PAGE 1
C51 COMPILER V8.16, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN .\bin\DS18B20.obj
COMPILER INVOKED BY: C:\Program Files\Keil\C51\BIN\C51.EXE src\DS18B20.c ROM(COMPACT) BROWSE DEBUG OBJECTEXTEND PRINT(.\
-bin\DS18B20.lst) OBJECT(.\bin\DS18B20.obj)
line level source
1 /*******************************************************************************
2 *
3 *file: DS18B20.c
4 *
5 *功能描述:DS18B20温度传感器的驱动
6 *编写人员:传承科技 吴明显
7 *编写日期:2009/01/10
8 *
9 *第一次修改人员:
10 *第一次修改日期:
11 ********************************************************************************/
12
13 #include<reg51.h>
14 #include"inc/define.h" //数据类型定义
15 #include"inc/exactdly.h" //精确延时函数
16 #include"inc/ds18b20.h"
17
18 /*给ROM命令字取个易记的名称 */
19 #define DS18B20_READ_ROM 0x33 //读取ROM中的64位序列号及CRC
20 #define DS18B20_MATCH_ROM 0x55 //让总线控制器选取多个DS18B20中的特定一个
21 #define DS18B20_SKIP_ROM 0xCC //跳过ROM命令字直接对RAM进行操作
22 #define DS18B20_SEARCH_ROM 0xF0 //用以获取总线上所有DS18B20的64位序列号及CRC
23 #define DS18B20_ALARM_SEARCH 0xEC //搜索有报警的所有DS18B20
24 /*给RAM命令字取个易记的名称 */
25 #define DS18B20_CONVERT_TEMPERT 0x44 //开始温度转换
26 #define DS18B20_RD_SCRATCHPAD 0xBE //读取暂存器和CRC中的值,共9个字节
27 #define DS18B20_WR_SCRATCHPAD 0x4E //把字节写入暂存器的地址2和3--报警触发
28 #define DS18B20_CP_SCRATCHPAD 0x48 //把暂存器内容(报警触发)拷贝到非易失的EEPROM
29 #define DS18B20_RECALL_EEPROM 0xB8 //把EEPROM中值召回暂存器
30 #define DS18B20_RD_POWER_MODE 0xB4 //用以判断DS18B20的供电方式
31
32
33 /*The DS18B20s' ROM Serial NUmbers */
34 u8 code DS18B20_NO[DS18B20_MAX_COUNT][8] =
35 {{0x28,0x30,0xC5,0xB8,0x00,0x00,0x00,0x8E},
36 {0x28,0xE5,0xE0,0xC9,0x01,0x00,0x00,0x07}};
37
38 u8 gActive_DS18B20 = 0;
39
40 /*******************************************************************
41 *功能描述:DS18B20复位及存在检测(通过存在脉冲判断有无正常工作的DS1820)
42 *函数名称:Reset
43 *函数参数:
44 *返回值: 0 存在正常工作的DS18B20;其他 不存在正常工作的 DS18B20
45 *注意事项:
46 ********************************************************************/
47 u8 Reset()
48 {
49 1 u8 flag=0;
50 1
51 1 DS18B20_DQ = 0; //单片机拉低总线以产生复位脉冲
52 1 Delay200us(); //延时480us--960us完成复位
53 1 Delay200us();
54 1 Delay200us();
C51 COMPILER V8.16 DS18B20 01/11/2009 10:40:51 PAGE 2
55 1 DS18B20_DQ = 1; //单片机释放总线
56 1 Delay50us(); //等待60--240us
57 1 Delay10us();
58 1 flag=DS18B20_DQ; //低电平表示有DS18B20回应
59 1 Delay200us(); //延时至少240us等待总线恢复
60 1 Delay200us();
61 1
62 1 return flag;
63 1 }
64
65 /**********************************************************
66 *功能描述:写一个字节数据到DS18B20
67 *函数名称:InputByte
68 *函数参数:
69 *返回值:
70 *注意事项:
71 **********************************************************/
72 void InputByte(u8 ibyte)
73 {
74 1 u8 i;
75 1 u8 delay;
76 1
77 1 for (i=8;i>0;i--)
78 1 {
79 2 DS18B20_DQ = 0; //拉低总线,产生写信号
80 2 for(delay=2;delay>0;delay--) ; //延时4us
81 2 DS18B20_DQ = ibyte&01; //发送1位
82 2 Delay50us(); //写时序至少要60us--120us
83 2 Delay50us();
84 2 DS18B20_DQ = 1; //释放总线,等待总线恢复
85 2 ibyte>>=1; //准备下一位数据的传送
86 2 }
87 1 }
88
89 /**********************************************************
90 *功能描述:从DS18B20中读出一个字节数据
91 *函数名称:OutputByte
92 *函数参数:
93 *返回值:
94 *注意事项:
95 **********************************************************/
96 u8 OutputByte()
97 {
98 1 u8 i,delay;
99 1 u8 obyte=0;
100 1
101 1 for (i=8;i>0;i--)
102 1 {
103 2 obyte>>=1;
104 2
105 2 DS18B20_DQ = 0; //拉低总线,产生读信号
106 2 for(delay=2;delay>0;delay--); //延时4us
107 2 DS18B20_DQ = 1; //释放总线,准备读数据
108 2 for (delay=4;delay>0;delay--); //延时8微秒读数据
109 2 if (DS18B20_DQ == 1)
110 2 obyte |= 0x80;
111 2 Delay50us(); //延时100us
112 2 Delay50us();
113 2 DS18B20_DQ = 1; //拉高总线,准备下一位数据的读取
114 2 }
115 1
116 1 return obyte;//返回读到的数据
C51 COMPILER V8.16 DS18B20 01/11/2009 10:40:51 PAGE 3
117 1 }
118
119 /**********************************************************
120 *功能描述:从单总线上所有DS18B20中选中一个进行后续操作
121 *函数名称:SelectOne
122 *函数参数:
123 *返回值:
124 *注意事项:在总线上只有一个DS18B20时,可以用不提供序列号使用
125 * 此器件,只要置同文件中的宏ONLY_ONE为1即可
126 **********************************************************/
127 void SelectOne( )
128 {
129 1 u8 i;
130 1
131 1 if(1==ONLY_ONE)
132 1 {
133 2 Reset(); //复位
134 2 InputByte(DS18B20_SKIP_ROM); //跳过ROM命令,当总线上只有一个DS18B20时此命令可简化操作
135 2 }
136 1 else
137 1 {
138 2 Reset(); //复位
139 2 InputByte(DS18B20_MATCH_ROM); //DS18B20匹配,后跟64位序列号用以选中总线上特定DS18B20
140 2 for(i=0;i<8;i++)
141 2 InputByte(DS18B20_NO[gActive_DS18B20 ][i]);
142 2 }
143 1 }
144
145 /**********************************************************
146 *功能描述:从给定的一组数据产生一个8位的CRC码
147 *函数名称:CRCGenerate
148 *函数参数:
149 *返回值:
150 *注意事项:要把给定数据的低字节存在数组的低地址
151 **********************************************************/
152 u8 CRCGenerate(u8 * to_data,u8 num)
153 {
154 1 u8 i;
155 1 u8 crc_data;
156 1
157 1 crc_data=0;
158 1 for(i=0;i<num * 8;i++)
159 1 {
160 2 u8 xor_l,xor_m,xor_r;
161 2 xor_r=((to_data[i/8] >> i%8) & 0x01) ^ (crc_data & 0x01);
162 2 xor_l=((crc_data >> 4) & 0x01) ^ xor_r;
163 2 xor_m=((crc_data >> 3) & 0x01) ^ xor_r;
164 2
165 2 crc_data >>=1;
166 2 if(1==xor_r)
167 2 crc_data |= 0x80;
168 2 else
169 2 crc_data &= 0x7F;
170 2 if(1==xor_l)
171 2 crc_data |= 0x08;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -