📄 ds18b20.lst
字号:
172 2 else
173 2 crc_data &= 0xF7;
174 2 if(1==xor_m)
175 2 crc_data |= 0x04;
176 2 else
177 2 crc_data &= 0xFB;
178 2 }
C51 COMPILER V8.16 DS18B20 01/11/2009 10:40:51 PAGE 4
179 1
180 1 return crc_data;
181 1 }
182
183 /**********************************************************
184 *功能描述:获取暂存器中的所有数据--包括CRC
185 *函数名称:GetRAMData
186 *函数参数:ramData 指向接收暂存器数据数组的指针
187 *返回值:
188 *注意事项:从DS18B20中读出的值全以unsigned char 形式保存在数
189 * 组中,有符号数一补码形式存储
190 **********************************************************/
191 void GetRAMData(u8 * ramData)
192 {
193 1 u8 i,j;
194 1
195 1 SelectOne();
196 1 InputByte(DS18B20_CONVERT_TEMPERT); //温度转换命令
197 1 for(i=100;i>0;i--) //完成温度转换至少需要750ms
198 1 for(j=50;j>0;j--)
199 1 Delay200us();
200 1
201 1 SelectOne();
202 1 InputByte(DS18B20_RD_SCRATCHPAD); //读DS1820温度暂存器命令
203 1 for(i=0;i<9;i++)
204 1 ramData[i]=OutputByte(); //获取温度数据和报警设置
205 1 }
206
207 /**********************************************************
208 *功能描述:获取当前温度并根据参数决定是否进行CRC校验
209 *函数名称:GetTempert
210 *函数参数:do_crc 赋值1时进行CRC校验,否则不进行
211 *返回值:获取温度方法1:
212 * tempert_value = tempert/16.0
213 * 获取温度方法2:
214 * tempertH = tempert/16; //温度值整数部分
215 * tempertL = tempert & 0x0F //温度值小数部分
216 *注意事项: DS18B20的有效温度值为-55——128;本函数以返回
217 * -64即-0x8400表示CRC验证未通过,即获取的温度错误
218 **********************************************************/
219 s16 GetTempert(u8 do_crc)
220 {
221 1 s16 tempert;
222 1 u8 crc_data=0;
223 1 u8 ramData[9]={0};
224 1
225 1 GetRAMData(ramData);
226 1 tempert =(ramData[1] << 8) + ramData[0]; //提取温度数据
227 1
228 1 if(1 == do_crc)
229 1 {
230 2 crc_data=CRCGenerate(ramData,8);
231 2 if(crc_data == ramData[8])
232 2 return tempert;
233 2 else
234 2 return -0x8400;
235 2 }
236 1
237 1 return tempert;
238 1 }
239 /**********************************************************
240 *功能描述:设置报警温度上限值和下限值
C51 COMPILER V8.16 DS18B20 01/11/2009 10:40:51 PAGE 5
241 *函数名称:SetAlarm
242 *函数参数:Alarm_H 当温度高于这个值时触发报警
243 * Alarm_L 当温度低于这个值时触发报警
244 *返回值:
245 *注意事项:
246 **********************************************************/
247 void SetAlarm(s8 Alarm_H,s8 Alarm_L)
248 {
249 1 u8 i;
250 1
251 1 SelectOne();
252 1 InputByte(DS18B20_WR_SCRATCHPAD); //将温度报警触发写入暂存器的地址2、3
253 1 InputByte(Alarm_H);
254 1 InputByte(Alarm_L);
255 1
256 1 SelectOne();
257 1 InputByte(DS18B20_CP_SCRATCHPAD); //将暂存器中的报警触发值写入ROM相应位置
258 1 for(i=50;i>0;i--)
259 1 Delay200us(); //写ROM需要一定时间
260 1
261 1 SelectOne();
262 1 InputByte(DS18B20_RECALL_EEPROM); //将ROM中报警触发值召回到暂存器
263 1 }
264 /**********************************************************
265 *功能描述:获取当前总线上唯一DS18B20的序列号
266 *函数名称:ReadSerialNO
267 *函数参数:serialNO 用以传递64位序列号
268 * do_crc 赋值1时进行CRC校验,否则不进行
269 *返回值:返回0表示校验正确,1为不正确;不进行校验时总返回0
270 *注意事项:本函数是一个工具函数,可以在总线上只有一个DS18B20时
271 * 获取他的64位序列号
272 ************************************************************/
273 u8 GetSerialNO(u8 * serialNO,u8 do_crc)
274 {
275 1 u8 i;
276 1 u8 crc_data;
277 1
278 1 Reset(); //复位
279 1 InputByte(DS18B20_READ_ROM);
280 1 for(i=0;i<8;i++)
281 1 serialNO[i]=OutputByte();
282 1
283 1 if(1 == do_crc)
284 1 {
285 2 crc_data=CRCGenerate(serialNO,7);
286 2 if(crc_data == serialNO[7])
287 2 return 0;
288 2 else
289 2 return 1;
290 2 }
291 1
292 1 return 0;
293 1 }
294 /*
295 void DS18B20_alarmSearch()
296 {
297 bit search_direction =0;
298 bit last_device_flag =0;
299 bit last_discrepancy =0;
300 bit id_bit,id_bit_cmp;
301 u8 id_bit_num;
302 u8 last_zero=0;
C51 COMPILER V8.16 DS18B20 01/11/2009 10:40:51 PAGE 6
303 byte Rom_Value[8] = {0};
304
305 Reset();
306 InputByte(0xF0); //Search ROM命令
307 for(id_bit_num=1;id_bit_num !=64;id_bit_num++)
308 {
309 id_bit=DS18B20_outputBit();
310 id_bit_cmp=DS18B20_outputBit();
311 if(1==id_bit && 1==id_bit_cmp) //总线上没有传感器了
312 {
313 break;
314 }
315 else if(1==id_bit && 0==id_bit_cmp) //参与搜索传感器的ROM 相应位为1
316 {
317 search_direction=1;
318 }
319 else if(0==id_bit && 1==id_bit_cmp) //参与搜索传感器的ROM 相应位为0
320 {
321 search_direction=0;
322 }
323 else if(0==id_bit && 0==id_bit_cmp) //参与搜索传感器的ROM 相应位既有0 又有1
324 {
325 search_direction=0;
326 }
327
328 if(0==search_direction)
329 Rom_Value[id_bit_num/8] |= 0<<(id_bit_num%8);
330 else
331 Rom_Value[id_bit_num/8] |= 1<<(id_bit_num%8);
332 DS18B20_inputBit(search_direction);
333 }
334 } */
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 578 ----
CONSTANT SIZE = 33 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 38
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -