📄 ds1820.lst
字号:
158 //输入参数 : <pSN>温度芯片的序号(ROM码)
159 // : <pRdData> 存放读取出的数据
160 // : <byLen>需读取的数据的长度
161 void RdScratchpad(U8 *pSN, U8 *pRdData, U8 byLen)
162 {
163 1 U8 i;
164 1
165 1 //输入参数检查
166 1 if(byLen > 9)
167 1 {
168 2 byLen = 9;
169 2 }
170 1
171 1 SendHeaderData(pSN, 0xbe);
172 1
173 1 //读出数据
174 1 for(i=0;i<byLen;i++)
175 1 {
176 2 *pRdData++ = RdByte();
177 2 }
178 1
179 1 ResetChip(); //复位芯片,结束读操作
C51 COMPILER V7.01 DS1820 07/11/2004 16:17:48 PAGE 4
180 1 Delay_ms(1); //延时
181 1 }
182
183
184 //函数功能 : 写温度芯片中间寄存器(从偏移地址2开始)
185 //输入参数 : <pSN>温度芯片的序号(ROM码)
186 // : <pWrData> 写到中间寄存器的源数据
187 // : <byLen>写入数据的长度
188 void WrScratchpad(U8 *pSN, U8 *pWrData, U8 byLen)
189 {
190 1 U8 i;
191 1
192 1 //输入参数检查
193 1 if(byLen > 2)
194 1 {
195 2 byLen = 2;
196 2 }
197 1
198 1 SendHeaderData(pSN, 0x4e); //发送协议头
199 1
200 1 //写入数据
201 1 for(i=0;i<byLen;i++)
202 1 {
203 2 WrByte(*pWrData++);
204 2 }
205 1
206 1 ResetChip(); //复位芯片,结束写操作
207 1 Delay_ms(1); //延时
208 1 }
209
210 //函数功能:启动温度转换过程
211 //输入参数:<pSN>芯片序号
212 void StartConvertTmpt (U8 *pSN) //
213 {
214 1 U8 byBusyFlag=0;
215 1
216 1 SendHeaderData(pSN, 0x44); //发送协议头
217 1
218 1 while(1) //某些情况下,这里可能出现死循环
219 1 {
220 2 byBusyFlag = RdByte();
221 2 if(byBusyFlag == 0xff)
222 2 {
223 3 break;
224 3 }
225 2 }
226 1
227 1 ResetChip (); //复位,保持低电平480-960us //
228 1 Delay_ms(1);
229 1 }
230
231 //函数功能 :读取温度
232 //输入参数 : <pSN>芯片序号
233 //输出参数 : 温度值,放大10倍的整数
234 S16 RdTemperture (U8 *pSN) //
235 {
236 1 U8 byRdData[8];
237 1 U8 byTEMP_READ;
238 1 U8 byCOUNT_PER_C;
239 1 U8 byCOUNT_REMAIN;
240 1 S16 t;
241 1 float ft;
C51 COMPILER V7.01 DS1820 07/11/2004 16:17:48 PAGE 5
242 1
243 1
244 1 RdScratchpad(pSN, byRdData, 8); //读取数据,没有读CRC校验码
245 1
246 1 //0.5摄氏度精度的计算方法
247 1 // t = byRdData[0]+(byRdData[1]<<8); //1表示0.5摄氏度
248 1 // return t;
249 1
250 1 t = byRdData[0]+(byRdData[1]<<8);
251 1 byTEMP_READ = t>>1;
252 1 byCOUNT_REMAIN = byRdData[6];
253 1 byCOUNT_PER_C = byRdData[7];
254 1
255 1 ft = (float)byTEMP_READ - 0.25 + (float)(byCOUNT_PER_C - byCOUNT_REMAIN)/(float)byCOUNT_PER_C;
256 1 t = ft*10;
257 1
258 1 return t; //1表示0.1摄氏度
259 1 }
260
261 //函数功能 :读取芯片序号(只能在总线只有一个器件时调用)
262 //输入参数 : <pSN>返回的芯片序号存放地址
263 void ReadROM(U8 *pSN) //
264 {
265 1 U8 i;
266 1
267 1 ResetChip (); //复位
268 1 Delay_ms (1); //延时
269 1 WrByte(0x33); //发送读序列号子程序
270 1
271 1 for(i=0;i<8;i++)
272 1 {
273 2 *pSN ++ = RdByte(); //读取第一个序列号,应为10H; //
274 2 }
275 1 }
276
277 //功能 :写温度报警上下限
278 //输入参数 : <pSN>温度芯片序号
279 // : <nHighAlarmLim> 温度报警上限
280 // : <nLowAlarmLim> 温度报警下限
281 U8 WrTmptAlarmLim(U8 *pSN, S16 nHighAlarmLim, S16 nLowAlarmLim)
282 {
283 1 U8 byWrData[2];
284 1 U8 byRdData[4];
285 1
286 1 byWrData[0] = nHighAlarmLim;
287 1 byWrData[1] = nLowAlarmLim;
288 1
289 1 WrScratchpad(pSN, byWrData, 2); //写入数据
290 1
291 1 RdScratchpad(pSN, byRdData, 4); //读出数据进行校验
292 1 if((byRdData[2] != nHighAlarmLim) || (byRdData[3] != nLowAlarmLim))
293 1 {
294 2 return FALSE;
295 2 }
296 1
297 1 //将中间寄存器数据拷贝到E2RAM(存放报警限数据)
298 1 SendHeaderData(pSN, 0x48);
299 1 Delay_ms (6); //延时6ms
300 1 ResetChip(); //复位芯片,结束本次操作
301 1 }
302
303
C51 COMPILER V7.01 DS1820 07/11/2004 16:17:48 PAGE 6
304
305
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 711 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 51
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 + -