?? ds1820.lst
字號:
184 1 else //搜索成功
185 1 {
186 2 LastData = discrepMarker; //置位LastData, lastOne和nxt
187 2 EndFlag = (LastData==0);
188 2 nxt = TRUE; //表示總線上還有其它器件,搜索未結束
189 2 }
190 1 return nxt;
191 1 }
192
193
194 uchar FindFirstDevice(void)
195 {
196 1 LastData = 0;
197 1 EndFlag = FALSE;
198 1 return SearchDevice(); //搜索器件函數SearchDevice
199 1 }
200
201
202
203 void ReadData(void)
204 {
205 1 int j;
206 1 char pad[10];
207 1 printf("\nReading ScratchPad Data\n");
208 1 WriteByte(0xBE); //讀暫存器命令(代碼為BEH)
209 1 for (j=0;j<9;j++) //循環讀取暫存器中9個字節的數據
210 1 {
211 2 pad[j]=ReadByte(); //字節讀取函數
212 2 }
213 1 printf("\n ScratchPAD DATA =%X%X%X%X%X%X\n",
214 1 pad[8],pad[7],pad[6],pad[5],pad[4],pad[3],pad[2],pad[1],pad[0]);
215 1 }
216
217
218 void FindDevices(void)
219 {
220 1 uchar m;
221 1 if(!Reset()) //復位總線
222 1 { //如果存在器件則開始處理
223 2 if(FindFirstDevice()) //調用FindFirstDevice函數
224 2 {
225 3 numROMs=0;
226 3 do //循環
227 3 {
228 4 numROMs++;
229 4 for(m=0;m<8;m++)
230 4 { //識別ROM代碼
231 5 ROMFound[numROMs][m]=DS18S20ROM[m];
232 5 }
233 4 printf("\nDS18S20 ROM CODE =%02X%02X%02X%02X\n",
234 4 ROMFound[5][7],ROMFound[5][6],ROMFound[5][5],ROMFound[5][4],
235 4 ROMFound[5][3],ROMFound[5][2],ROMFound[5][1],ROMFound[5][0]);
236 4 }while (SearchDevice()&&(numROMs<10)); //直到沒有發現其它器件
237 3 }
238 2 }
239 1 }
240
241
C51 COMPILER V8.08 DS1820 07/04/2008 11:10:12 PAGE 5
242
243 void ReadTemperature(void)
244 {
245 1 char get[10];
246 1 char temp_lsb,temp_msb;
247 1 int k;
248 1 char Ftemperature,Ctemperature;
249 1 Reset(); //復位
250 1 WriteByte(0xCC); //跳過ROM序列號命令(代碼為CCH)
251 1 WriteByte(0x44); //啟動溫度轉換命令(代碼為44H)
252 1 Delay(5);
253 1 Reset();
254 1 WriteByte(0xCC); //跳過ROM序列號命令(代碼為CCH)
255 1 WriteByte(0xBE); //讀暫存器命令(代碼為BEH)
256 1 for (k=0;k<9;k++)
257 1 {
258 2 get[k]=ReadByte(); //循環讀取
259 2 }
260 1 printf("\n Scratch DATA = %X%X%X%X%X\n",
261 1 get[8],get[7],get[6],get[5],get[4],get[3],get[2],get[1],get[0]);
262 1 temp_msb = get[1];
263 1 temp_lsb = get[0];
264 1 if (temp_msb <= 0x80)
265 1 {
266 2 temp_lsb = (temp_lsb/2); //移位,得到完整的溫度值
267 2 }
268 1 temp_msb = temp_msb & 0x80; //屏蔽符號位之外的所有數據位
269 1 if (temp_msb >= 0x80)
270 1 {
271 2 temp_lsb = (~temp_lsb)+1; // temp_lsb取補
272 2 }
273 1 if (temp_msb >= 0x80)
274 1 {
275 2 temp_lsb = (temp_lsb/2); //移位,得到完整的溫度值
276 2 }
277 1 if (temp_msb >= 0x80)
278 1 {
279 2 temp_lsb = ((-1)*temp_lsb); //符號位
280 2 }
281 1 printf( "\nTempC= %d degrees C\n", (int)temp_lsb );//攝氏溫度值輸出
282 1 Ctemperature = temp_lsb;
283 1 Ftemperature = (((int)Ctemperature)* 9)/5 + 32;
284 1 printf( "\nTempF= %d degrees F\n", (int)Ftemperature );//華氏溫度值輸出
285 1 }
286
287
288 void main(void)
289 {
290 1 uchar Select_Menu; //功能選擇
291 1
292 1 SCON=0x50; //初始化串行口模式1
293 1 TMOD=0x20; //初始化T1為定時功能,模式2
294 1 PCON=0x80; //設置SMOD=1
295 1 TL1=0xF4; //波特率4800bit/s,初值
296 1 TH1=0xF4;
297 1
298 1 TR1 = 1; //啟動T1
299 1 TI = 1; //啟動發送
300 1
301 1 while(1) //主循環
302 1 {
303 2 printf (" AT89S52 Control DS18S20\n"); //輸出信息
C51 COMPILER V8.08 DS1820 07/04/2008 11:10:12 PAGE 6
304 2 printf("\n*********************************************************\n");
305 2 printf (" Select Control Menu Option\n");
306 2 printf (" 1. Reset 1-Wire.\n");
307 2 printf (" 2. Read DS18S20 ROM Code.\n");
308 2 printf (" 3. Search DS18S20 ROM.\n");
309 2 printf (" 4. Find All DS18S20.\n");
310 2 printf (" 5. Read DS18S20 Scratch.\n");
311 2 printf (" 6. Read DS18S20 Temperature.\n");
312 2 printf (" 7. Exit.\n");
313 2 printf (" Please Input Menu Option:\n");
314 2
315 2 Select_Menu = _getkey(); //從鍵盤輸入選擇數字
316 2 switch(Select_Menu)
317 2 {
318 3 case '1': //復位1-Wire總線
319 3 printf ("\n You Select 1. Reset 1-Wire\n");
320 3 Reset(); //復位函數
321 3 break;
322 3 case '2': //讀DS18S20 ROM
323 3 printf ("\n You Select 2. Read DS18S20 ROM Code \n");
324 3 Reset();
325 3 ReadROMSerialNumber(); //讀取ROM代碼函數
326 3 break;
327 3 case '3': //搜索DS18S20
328 3 printf("\n You Select 3. Search DS18S20 ROM \n");
329 3 Reset();
330 3 FindFirstDevice(); //搜索第一個器件
331 3 printf("\nDS18S20 ROM CODE =%02X%02X%02X%02X\n",
332 3 ROMFound[5][7],ROMFound[5][6],ROMFound[5][5],ROMFound[5][4],
333 3 ROMFound[5][3],ROMFound[5][2],ROMFound[5][1],ROMFound[5][0]);
334 3 break;
335 3 case '4': //搜索所有DS18S20
336 3 printf ("\n You Select 4. Find All DS18S20\n");
337 3 Reset();
338 3 FindDevices(); //查找器件函數
339 3 break;
340 3 case '5': //讀取高速暫存器
341 3 printf ("\n You Select 5. Read DS18S20 Scratch \n");
342 3 Reset();
343 3 WriteByte(0xCC); //跳過ROM序列號命令(代碼為CCH)
344 3 ReadData(); //讀取高速暫存器
345 3 break;
346 3 case '6': //讀取溫度
347 3 printf ("\n You Select 6. Read DS18S20 Temperatur\n");
348 3 ReadTemperature(); //讀取溫度值
349 3 break;
350 3 case '7': //退出程序
351 3 printf ("\n You Select 7. Exit\n");
352 3 goto Exit; //轉向Exit標號處
353 3 break;
354 3 default:
355 3 printf ("\n Error: Please Select Right Menu Option\n");
356 3 break;
357 3 };
358 2 }
359 1 Exit: printf("Exit the program!"); //退出
360 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1237 ----
CONSTANT SIZE = 1089 ----
C51 COMPILER V8.08 DS1820 07/04/2008 11:10:12 PAGE 7
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 52 37
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 + -