📄 all.lst
字号:
231 1 unsigned char i=0;
232 1 unsigned char j=0;
233 1 unsigned char dat=0;
234 1 for (i=0;i<8;i++)
235 1 {
236 2 DQ = 0; //给脉冲信号
237 2 dat>>=1; //右移位等待接收一位数据
238 2 DQ = 1; //给脉冲信号
239 2 for(j=0;j<3;j++) ; //延时15微秒
240 2 if(DQ) //从低位开始接收数据
241 2 dat|=0x80;
C51 COMPILER V7.20 ALL 01/16/2009 13:29:33 PAGE 5
242 2 Delay_short(6); //等待复位
243 2 }
244 1 return(dat);
245 1 }
246
247 /*向ds18b20写一个字节 dat为待写入字节*/
248 void DS_WriteByte(unsigned char dat)
249 {
250 1 unsigned char i=0;
251 1 for (i=0; i<8; i++)
252 1 {
253 2 DQ = 0; //给脉冲信号
254 2 DQ = dat&0x01; //从低位开始发送数据
255 2 Delay_short(5);
256 2 DQ = 1; //给脉冲信号
257 2 dat>>=1; //右移位等待发送
258 2 }
259 1 Delay_short(5) ;
260 1 }
261
262 /*读DS18B20序列号程序*/
263 /*入口参数:器件序号*/
264 /*全局变量:ID[5][8]*/
265 void DS_ReadID(unsigned char Num)
266 {
267 1 signed char i;
268 1 DS_Reset();
269 1 DS_WriteByte(READ_ROM) ;
270 1 for(i=7;i>-1;i--) //从最低位开始读取
271 1 {
272 2 ID[Num][i]=DS_ReadByte();
273 2 }
274 1 }
275
276 /*匹配序列号程序 */
277 /*入口参数:器件序号(0-4)*/
278 /*全局变量:ID[5][8] */
279 unsigned char Match_ID(unsigned char Num)
280 {
281 1 signed char i;
282 1 if(DS_Reset()==1) //有器件响应
283 1 {
284 2 DS_WriteByte(MATCH_ROM); //发送ID
285 2 for(i=7;i>-1;i--)
286 2 {
287 3 DS_WriteByte(ID[Num][i]);
288 3 }
289 2 return 1; //返回1表示成功
290 2 }
291 1 else
292 1 return 0; //返回0表示失败
293 1 }
294
295 /*显示序列号程序 */
296 /*入口参数为器件序号(0-4)*/
297 /*全局变量:ID[5][8] */
298 void Show_ID(unsigned char Num) //Num为序号
299 {
300 1 unsigned char i;
301 1 GotoXY(0,2); //显示NO:
302 1 Print("NO:");
303 1 GotoXY(3,2);
C51 COMPILER V7.20 ALL 01/16/2009 13:29:33 PAGE 6
304 1 LCD_Write(LCD_DATA,Num+1+0x30); //显示序号(1-5)对应ID0-ID4
305 1 GotoXY(0,1);
306 1 for(i=0;i<8;i++)
307 1 {
308 2 unsigned char l=ID[Num][i]&0x0f; //取低4位
309 2 unsigned char h=ID[Num][i]&0xf0; //取高4位
310 2 h>>=4;
311 2 if((h>=0x00)&&(h<=0x09))
312 2 LCD_Write(LCD_DATA,h+0x30); //取ASCII码
313 2 else
314 2 LCD_Write(LCD_DATA,h+0x37); //取ASCII码
315 2
316 2 if((l>=0x00)&&(l<=0x09))
317 2 LCD_Write(LCD_DATA,l+0x30); //取ASCII码
318 2 else
319 2 LCD_Write(LCD_DATA,l+0x37); //取ASCII码
320 2 }
321 1 }
322
323 /*读取ds18b20当前温度 和Th,Tl */
324 /*入口参数:器件编号(0-4) */
325 /*全局变量DS_Temp[5][3] DS_Th[5] DS_Tl[5]*/
326
327 void DS_ReadTemp(unsigned char Num)
328 {
329 1 unsigned char temp_lsb=0; //温度寄存器低字节
330 1 unsigned char temp_msb=0; //温度寄存器高字节
331 1 unsigned char Temp=0;
332 1
333 1 DS_Reset(); //初始化
334 1 DS_WriteByte(SKIP_ROM); //跳过读序号列号的操作
335 1 DS_WriteByte(CONVERT_T); //启动温度转换
336 1
337 1 Delay_short(5); //延时过程
338 1 DS_Reset(); //初始化
339 1 Match_ID(Num); //匹配ROM
340 1 DS_WriteByte(READ_SCR); //读取温度寄存器前两个就是温度
341 1
342 1 temp_lsb=DS_ReadByte(); //读取温度寄存器低字节
343 1 temp_msb=DS_ReadByte(); //读取温度寄存器高字节
344 1 DS_Th[Num]=DS_ReadByte(); //读取TH
345 1 DS_Tl[Num]=DS_ReadByte(); //读取TL
346 1
347 1 if(temp_msb>0xf0)
348 1 DS_Temp[Num][0]=1; //取温度符号(正为0,负为1)
349 1 else
350 1 DS_Temp[Num][0]=0;
351 1
352 1 DS_Temp[Num][1]=temp_msb<<4; //取温度整数部分的高四位
353 1 DS_Temp[Num][1]+=(temp_lsb&0xf0)>>4; //取温度整数部分的低四位
354 1 Temp=DS_Temp[Num][1];
355 1 DS_Temp[Num][2]=temp_lsb&0x0f; //取温度小数部分
356 1
357 1 if(DS_Temp[Num][0]==1) //温度为负的处理
358 1 {
359 2 DS_Temp[Num][1]=~DS_Temp[Num][1]; //整数取反
360 2 DS_Temp[Num][2]=~DS_Temp[Num][2]+1;//小数取反加1
361 2 if(DS_Temp[Num][2]==0x10) //如果有进位(在温度为负整数时)
362 2 {
363 3 DS_Temp[Num][1]=DS_Temp[Num][1]+1; //整数加1
364 3 DS_Temp[Num][2]= 0; //小数清0
365 3 }
C51 COMPILER V7.20 ALL 01/16/2009 13:29:33 PAGE 7
366 2 }
367 1 if((Temp+1>DS_Th[Num])||(Temp<DS_Tl[Num]))
368 1 Alarm_flag=1;
369 1 else
370 1 Alarm_flag=0;
371 1 }
372
373 /*温度数据转换成液晶字符显示 */
374 /*全局变量 DS_Temp[5][3] */
375 /*入口参数 器件序号(0-4) */
376 void TempDisp(unsigned char Num)
377 {
378 1 GotoXY(0,1);
379 1 Print("NO."); //显示NO.
380 1 GotoXY(3,1);
381 1 LCD_Write(LCD_DATA,Num+1+'0'); //显示器件序号(1-5)
382 1 LCD_Write(LCD_DATA,':'); //显示“:”
383 1 if(DS_Temp[Num][0]==0)
384 1 LCD_Write(LCD_DATA,'+') ; //温度为正显示“+”否则显示“-”
385 1 else
386 1 LCD_Write(LCD_DATA,'-') ;
387 1
388 1 LCD_Write(LCD_DATA,DS_Temp[Num][1]/100+'0') ; //百位
389 1 LCD_Write(LCD_DATA,(DS_Temp[Num][1]%100)/10+'0') ; //十位
390 1 LCD_Write(LCD_DATA,DS_Temp[Num][1]%10+'0') ; //个位
391 1 LCD_Write(LCD_DATA,'.') ; //小数点
392 1 LCD_Write(LCD_DATA,DS_Temp[Num][2]*10/16+'0') ; //十分位
393 1 }
394
395
396 /*显示TH和TL程序 */
397 /*入口参数:器件序号Num(0-4)位置坐标y(1,2) */
398 /*全局变量:DS_Tl[5] DS_Th[5] */
399
400 void ThTlDisp(unsigned char Num,unsigned char y)
401 {
402 1 unsigned char Th=DS_Th[Num]; //
403 1 unsigned char Tl=DS_Tl[Num];
404 1
405 1 GotoXY(1,y);
406 1 Print("TH="); //显示TH
407 1 if(Th>=0x80) //为负显示“-”并取绝对值
408 1 {
409 2 LCD_Write(LCD_DATA,'-');
410 2 Th=~Th+1;
411 2 }
412 1 else
413 1 LCD_Write(LCD_DATA,'+'); //为正显示“+”
414 1
415 1 LCD_Write(LCD_DATA,Th/100+'0'); //百位
416 1 LCD_Write(LCD_DATA,(Th%100)/10+'0'); //十位
417 1 LCD_Write(LCD_DATA,Th%10+'0'); //个位
418 1
419 1 GotoXY(9,y);
420 1 Print("TL="); //显示TL
421 1 if(Tl>=0x80) //为负显示“-”并取绝对值
422 1 {
423 2 LCD_Write(LCD_DATA,'-');
424 2 Tl=~Tl+1;
425 2 }
426 1 else
427 1 LCD_Write(LCD_DATA,'+'); //为正显示“+”
C51 COMPILER V7.20 ALL 01/16/2009 13:29:33 PAGE 8
428 1
429 1 LCD_Write(LCD_DATA,Tl/10+'0'); //十位
430 1 LCD_Write(LCD_DATA,Tl%10+'0'); //个位
431 1 }
432
433
434 /////////////////////////////////////////////////////
435 /***************STC单片机ISP功能部分****************/
436 /////////////////////////////////////////////////////
437
438 /*STC新增特殊功能寄存器声明*/
439 sfr ISP_DATA = 0xe2; //ISP数据寄存器
440 sfr ISP_ADDRH = 0xe3; //EEPROM地址高8位
441 sfr ISP_ADDRL = 0xe4; //EEPROM地址高8位
442 sfr ISP_CMD = 0xe5; //ISP命令模式寄存器:0无操作,1读,2写,3擦除
443 sfr ISP_TRIG = 0xe6; //ISP命令触发寄存器:先写46H再写B9H则ISP_CMD生效
444 sfr ISP_CONTR = 0xe7; //ISP控制寄存器:取81H允许ISP功能
445
446 /*定义ISP命令模式*/
447 #define ISP_ReadByte 0x01 //字节读指令
448 #define ISP_WeiteByte 0x02 //字节写指令
449 #define ISP_Erase 0x03 //扇区擦除指令
450
451
452 /*ISP读DS18B20 ID程序 */
453 /*入口参数:1,DS18b20编号(0-4) */
454 /*全局变量:DS18B20的ID号存储区:ID[5][8] */
455 /*功 能:读出某个扇区内的8字节DS18B20的ID载入RAM */
456 void ISP_Read8(unsigned char Num)
457 {
458 1 unsigned char i;
459 1 ISP_CONTR=0x81; //允许ISP功能,并配制等待时间
460 1 ISP_CMD=ISP_ReadByte; //送ISP字节读指令
461 1 ISP_ADDRH=0x20+Num*0x02; //送地址高字节
462 1 for(i=0;i<8;i++) //读8字节
463 1 {
464 2 ISP_ADDRL=0x00+i; //送地址低字节,均从每个扇区的起始地址开始
465 2 ISP_TRIG=0x46;
466 2 ISP_TRIG=0xB9; //触发ISP指令
467 2 Delay_short(1); //短暂延时
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -