?? 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 V8.08 DS1820 08/03/2007 13:39:32 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 V8.08 DS1820 08/03/2007 13:39:32 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 V8.08 DS1820 08/03/2007 13:39:32 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 + -