📄 18b20.lst
字号:
C51 COMPILER V8.02 18B20 11/19/2008 17:14:39 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 18B20
OBJECT MODULE PLACED IN 18b20.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE 18b20.c DEBUG OBJECTEXTEND
line level source
1 /********************************************************
2 * DS18B20温度传感器 *
3 * C51 *
4 * yajou 2008-06-28 无CRC *
5 ********************************************************/
6
7 #include "reg51.h"
8 #include "intrins.h"
9 //#include "DS18B20.h"
10 //////////DS18B20.h/////////////////////////
11
12 /********************************************************
13 * I/O口定义 *
14 ********************************************************/
15 sbit dq = P3^7;
16 sbit dv = P1^4; //DS18B20强上拉电源
17 int i;
18
19 /********************************************************
20 * 命令字定义 *
21 ********************************************************/
22 #define uchar unsigned char
23 #define uint unsigned int
24
25
26 #define ReleaseDQ() dq = 1; //上拉/释放总线
27 #define PullDownDQ() dq = 0; //下拉总线
28
29 #define Delay2us() _nop_();_nop_(); //延时2us,每nop 1us
30 #define Delay8us() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
31
32 //设置重复检测次次数,超出次数则超时
33 #define ReDetectTime 20
34
35
36 //ds18b20命令
37 #define SkipROM 0xCC
38 #define MatchROM 0x55
39 #define ReadROM 0x33
40 #define SearchROM 0xF0
41 #define AlarmSearch 0xEC
42
43 #define Convert 0x44
44 #define WriteScr 0x4E
45 #define ReadScr 0xBE
46 #define CopyScr 0x48
47 #define RecallEE 0xB8
48 #define ReadPower 0xB4
49
50
51 /********************************************************
52 * 函数 *
53 ********************************************************/
54 void Delayus(uchar us);
55 //void Dog(void);
C51 COMPILER V8.02 18B20 11/19/2008 17:14:39 PAGE 2
56 bit Ds18b20_Init(void); //DS18B20初始化,存在返0,否则返1
57 void Ds18b20_WriteBit(bit bitdata); //写bit2DS18B20
58 void Ds18b20_WriteByte(uchar chrdata); //写Byte DS18B20
59 void Ds18b20_Write(uchar *p_readdata, uchar bytes); //写 DS18B20
60 bit Ds18b20_ReadBit(void); //读bit From DS18B20
61 uchar Ds18b20_ReadByte(void); //读Byte DS18B20
62 bit Ds18b20_ReadRom(uchar *p_readdata); //读 DS18B20 ROM:成功返0,失败返1
63 bit Ds18b20_ReadEE(uchar *p_readdata); //读 DS18B20 EE :成功返0,失败返1
64 bit TempCal(float *p_wendu); //成功返0,失败返1 (温度范围-55 --- +128)
65
66
67 /********************************************************
68 * us延时程序 *
69 ********************************************************/
70 void Delayus(uchar us)
71 {
72 1 while(us--); //12M,一次6us,加进入退出14us(8M晶振,一次9us)
73 1 }
74
75
76 /********************************************************
77 * DS18B20初始化 *
78 ********************************************************/
79 bit Ds18b20_Init(void) //存在返0,否则返1
80 {
81 1 bit temp = 1;
82 1 uchar outtime = ReDetectTime; //超时时间
83 1 while(outtime-- && temp)
84 1 {
85 2 Delayus(10); //(250)1514us时间可以减小吗
86 2 ReleaseDQ();
87 2 Delay2us();
88 2 PullDownDQ();
89 2 Delayus(100); //614us(480-960)
90 2 ReleaseDQ();
91 2 Delayus(10); //73us(>60)
92 2 temp = dq;
93 2 Delayus(70); //us
94 2 }
95 1 return temp;
96 1 }
97
98 /********************************************************
99 * 写bit2DS18B20 *
100 ********************************************************/
101 void Ds18b20_WriteBit(bit bitdata)
102 {
103 1 if(bitdata)
104 1 {
105 2 PullDownDQ();
106 2 Delay2us(); //2us(>1us)
107 2 ReleaseDQ(); //(上述1-15)
108 2 Delayus(12); //86us(45- x,总时间>60)
109 2 }else
110 1 {
111 2 PullDownDQ();
112 2 Delayus(12); //86us(60-120)
113 2 }
114 1 ReleaseDQ();
115 1 Delay2us(); //2us(>1us)
116 1 }
117
C51 COMPILER V8.02 18B20 11/19/2008 17:14:39 PAGE 3
118 /********************************************************
119 * 写Byte DS18B20 *
120 ********************************************************/
121 void Ds18b20_WriteByte(uchar chrdata)
122 {
123 1 uchar ii;
124 1 for(ii = 0; ii < 8; ii++)
125 1 {
126 2 Ds18b20_WriteBit(chrdata & 0x01);
127 2 chrdata >>= 1;
128 2 }
129 1 }
130
131 /********************************************************
132 * 写 DS18B20 *
133 ********************************************************/
134 //void Ds18b20_Write(uchar *p_readdata, uchar bytes)
135 //{
136 // while(bytes--)
137 // {
138 // Ds18b20_WriteByte(*p_readdata);
139 // p_readdata++;
140 // }
141 //}
142
143
144 /********************************************************
145 * 读bit From DS18B20 *
146 ********************************************************/
147 bit Ds18b20_ReadBit(void)
148 {
149 1 bit bitdata;
150 1 PullDownDQ();
151 1 Delay2us(); //2us( >1us)
152 1 ReleaseDQ();
153 1 Delay8us(); //8us( <15us)
154 1 bitdata = dq;
155 1 Delayus(7); //86us(上述总时间要>60us)
156 1 return bitdata;
157 1 }
158
159
160 /********************************************************
161 * 读Byte DS18B20 *
162 ********************************************************/
163 uchar Ds18b20_ReadByte(void)
164 {
165 1 uchar ii,chardata;
166 1 for(ii = 0; ii < 8; ii++)
167 1 {
168 2 chardata >>= 1;
169 2 if(Ds18b20_ReadBit()) chardata |= 0x80;
170 2 }
171 1 return chardata;
172 1 }
173
174
175 /********************************************************
176 * 读 DS18B20 ROM *
177 ********************************************************/
178 bit Ds18b20_ReadRom(uchar *p_readdata) //成功返0,失败返1
179 {
C51 COMPILER V8.02 18B20 11/19/2008 17:14:39 PAGE 4
180 1 uchar ii = 8;
181 1 if(Ds18b20_Init()) return 1;
182 1 Ds18b20_WriteByte(ReadROM);
183 1 while(ii--)
184 1 {
185 2 *p_readdata = Ds18b20_ReadByte();
186 2 p_readdata++;
187 2 }
188 1 return 0;
189 1 }
190
191
192 /********************************************************
193 * 读 DS18B20 EE *
194 ********************************************************/
195 bit Ds18b20_ReadEE(uchar *p_readdata) //成功返0,失败返1
196 {
197 1 uchar ii = 2;
198 1
199 1 if(Ds18b20_Init()) return 1;
200 1 Ds18b20_WriteByte(SkipROM);
201 1 Ds18b20_WriteByte(ReadScr);
202 1 while(ii--)
203 1 {
204 2 *p_readdata = Ds18b20_ReadByte();
205 2 p_readdata++;
206 2 }
207 1 return 0;
208 1 }
209
210
211 /********************************************************
212 * 温度采集计算 *
213 ********************************************************/
214 bit TempCal(float *p_wendu) //成功返0,失败返1 (温度范围-55 --- +128)
215 {
216 1 uchar temp[9],ii;
217 1 uint tmp;
218 1 float tmpwendu;
219 1
220 1 TR1 = 0;
221 1 TR0 = 0;
222 1
223 1 //读暂存器和CRC值-----------------------
224 1 if(Ds18b20_ReadEE(temp))
225 1 {
226 2 TR1 = 1;
227 2 TR0 = 1;
228 2 return 1;
229 2 }
230 1 //-------------------------------------
231 1
232 1 //CRC校验------------------------------
233 1 //
234 1 //此处应加入CRC校验等
235 1 //
236 1 //
237 1 //-------------------------------------
238 1
239 1
240 1 //使温度值写入相应的wendu[i]数组中-----
241 1 for(ii = i; ii > 0; ii--)
C51 COMPILER V8.02 18B20 11/19/2008 17:14:39 PAGE 5
242 1 {
243 2 p_wendu++;
244 2 }
245 1 i++;
246 1 if(i > 4) i = 0;
247 1 //-------------------------------------
248 1
249 1
250 1 //温度正负数处理-----------------------
251 1 //
252 1
253 1 //-------------------------------------
254 1
255 1
256 1 //温度计算-----------------------------
257 1 tmp = temp[1]; //
258 1 tmp <<= 8; //
259 1 tmp |= temp[0]; //组成温度的两字节合并
260 1 tmpwendu = tmp;
261 1 *p_wendu = tmpwendu / 16;
262 1 //-------------------------------------
263 1
264 1
265 1 //开始温度转换-------------------------
266 1 if(Ds18b20_Init())
267 1 {
268 2 TR1 = 1;
269 2 TR0 = 1;
270 2 return 1;
271 2 }
272 1 Ds18b20_WriteByte(SkipROM);
273 1 Ds18b20_WriteByte(Convert);
274 1 ReleaseDQ(); //寄生电源时要拉高DQ
275 1 //------------------------------------
276 1
277 1 TR1 = 1;
278 1 TR0 = 1;
279 1 return 0;
280 1 }
281
282
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 393 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 2 20
IDATA SIZE = ---- ----
BIT SIZE = ---- 3
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -