📄 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 + -