⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 all.c

📁 ds18b20测温程序,在keilc51调适通过
💻 C
📖 第 1 页 / 共 2 页
字号:
   {
    ISP_ADDRL=0x00+i;		//送地址低字节,均从每个扇区的起始地址开始
	ISP_TRIG=0x46;
	ISP_TRIG=0xB9;			//触发ISP指令
	Delay_short(1);			//短暂延时
	ID[Num][i]=ISP_DATA;	//读一个字节
   }
  ISP_CONTR=0x00;           //关ISP功能
}
													   
/*ISP写DS18B20 ID程序                                           */
/*入口参数:1,DS18b20编号(0-4)                                */
/*全局变量:DS18B20的ID号存储区:ID[5][8]                       */
/*功    能:将某个DS18B20的8字节ID写入某个扇区内(扇区必须为空)*/
void ISP_Write8(unsigned char Num)
{
  unsigned char i;
  ISP_CONTR=0x81;		    //允许ISP功能,并配制等待时间
  ISP_CMD=ISP_WeiteByte ;   //送ISP字节写指令
  ISP_ADDRH=0x20+Num*0x02;  //送地址高字节
  for(i=0;i<8;i++)			//写8字节
   {
    ISP_ADDRL=0x00+i;		//送地址低字节,均从每个扇区的起始地址开始
	ISP_DATA=ID[Num][i];	//送待写入的一个字节
	ISP_TRIG=0x46;
	ISP_TRIG=0xB9;			//触发ISP指令
	Delay_short(1);			//短暂延时
   }
  ISP_CONTR=0x00;           //关ISP功能
}

/*ISP擦除扇区指令                                */
/*入口参数:对应扇区的器件号(0-4)              */
/*全局变量:无                                   */
/*功    能:将某个扇区擦除                       */
void ISP_Eraser(unsigned char Num)
{
  ISP_CONTR=0x81;		     //允许ISP功能,并配制等待时间
  ISP_CMD=ISP_Erase ;        //送ISP擦除扇区指令
  ISP_ADDRH=0x20+Num*0x02;   //送地址高字节
  ISP_ADDRL=0x00;		     //送地址低字节,均从每个扇区的起始地址开始
  ISP_TRIG=0x46;
  ISP_TRIG=0xB9;			//触发ISP指令
  Delay_short(1);			//短暂延时
  ISP_CONTR=0x00;           //关ISP功能
}

////////////////////////////////////////////////
/******************程序预定义******************/
////////////////////////////////////////////////

void Auto_Mode(void);    //自动模式程序
void Hand_Mode(viod);    //手动模式程序
void ID_Mode(void);	     //显示ID模式程序
void Alarm_Set(void);    //报警设置程序
void Menu_Function(void);//菜单处理功能

/****自动切换温度显示模式程序****/
/*功能:自动从切换显示温度  */
void Auto_Mode()
{ unsigned char i;
  LCD_Initial();	 
  GotoXY(12,1);					  
  Print("Auto");
   while(1)
 {
  for(i=0;i<5;i++)
  {
    DS_ReadTemp(i);	  //循环显示温度和TH,TL
    TempDisp(i);
	ThTlDisp(i,2);
    Alarm();
	Menu_Function();  //菜单处理
    Delay_long(200);  //延时
    Delay_long(200);
    Delay_long(200);
    Delay_long(200);
   }
 }
}	

/****手动切换温度显示模式程序****/
/*功能:按Down键切换显示    */
void Hand_Mode()
{
  LCD_Initial();
  GotoXY(0,1);					  
  Print("Hand Mode");
  GotoXY(9,2);
  Print("S U D Q");
  while(1)					  //主菜单循环
  {
   unsigned char Key1=Key_scan();		  
   if(Key1==SET)              //如果按SET键
    {Delay_long(50);		  //延时0.25S等待释放按键
     if(Key_scan()==0)		  //释放后操作
     {
      unsigned char i=0;
	  LCD_Initial();
	  GotoXY(12,1);							  
 	  Print("Hand");		 //显示模式
	  while(1)
	  {
	    unsigned char Key2=Key_scan();		  
		DS_ReadTemp(i);
        TempDisp(i);	     //显示NO.i的温度
		ThTlDisp(i,2);
		Alarm();
	    if(Key2==DOWN)       //如果按DOWN键
	     {
	      Delay_long(50);    //延时0.25S等待释放按键
	      if(Key_scan()==0)	 //按键抬起后执行
	      {
	        i=i+1;		     //指针加1
		   	if(i>4)
			 i=0;				           
	      }
	     }
	  	else if(Key2==QUIT)	 //按QUIT返回自动模式
		 {Delay_long(50);					  
		   if(Key_scan()==0)				  
			{
			  Auto_Mode();
			}
		 }	
        } 
	 }
    }	
   else if(Key1==DOWN)
    {Delay_long(50);
	 if(Key_scan()==0)
	  {
	   ID_Mode();
	  }
	 }
   else if(Key1==UP)
    {Delay_long(50);
	 if(Key_scan()==0)
	  {
	   Alarm_Set();
	  }
	 }
   else if(Key1==QUIT)
    {Delay_long(50);		//延时0.25S等待释放按键
     if(Key_scan()==0)		//释放后操作
     {
   	  Auto_Mode();
     }
    }	
  }
} 

/****显示DS18B20序列号模式程序****/
/*功能:显示或替换器件ID         */
void ID_Mode(void)                             
{
 LCD_Initial();
 GotoXY(0,1);					  
 Print(" ID Mode ");
 GotoXY(9,2);
 Print("S U D Q") ;
 while(1)					//主菜单循环
 {
  unsigned char Key1=Key_scan();		  
  if(Key1==SET)             //如果按SET键
   {Delay_long(50);		    //延时0.25S等待释放按键
    if(Key_scan()==0)		//释放后操作
    {
     unsigned char i=0;
	 LCD_Initial();
	 GotoXY(0,1);
	 Print("Please Press D");
     GotoXY(10,2);							  
 	 Print("C D Q ");		//显示有效按键
	  while(1)              //进入二级菜单循环
	  {
	   unsigned char Key2=Key_scan();		  
	   if(Key2==DOWN)      //如果按DOWN键
	    {
	     Delay_long(50);   //延时0.25S等待释放按键
	     if(Key_scan()==0) //按键抬起后执行
	     {
		  i=i+1;
		  switch(i)
		   {
		   	 case 1 :Show_ID(0);break;
			 case 2 :Show_ID(1);break;
			 case 3	:Show_ID(2);break;
			 case 4	:Show_ID(3);break;
			 case 5	:Show_ID(4);break;
			 case 6	:i=0;break;
		   }
	     }
	    }
	   else if(Key2==CHANGE)      //如果按CHANGE键
		{Delay_long(200);
		 Delay_long(200);		  //延时两秒
		 if(Key_scan()==0)
		  {
			DS_ReadID(i-1);
			Show_ID(i-1);
			ISP_Eraser(i-1);
			ISP_Write8(i-1);
		  }
		}

	    else if(Key2==QUIT)	//按QUIT返回自动模式
		 {Delay_long(50);					  
		   if(Key_scan()==0)				  
			{
			 Auto_Mode();
			}
		 }	
        } 
     }	
   }
   else if(Key1==DOWN)	 //按DOWN键切换至报警设置模式
    {Delay_long(50);
	 if(Key_scan()==0)
	  {
	   Alarm_Set();
	  }
	 }
   else if(Key1==UP)	 //按DOWN键切换至报警设置模式
    {Delay_long(50);
	 if(Key_scan()==0)
	  {
	   Hand_Mode();
	  }
	 }
   else if(Key1==QUIT)	 //按QUIT返回自动模式
    {Delay_long(50);					  
     if(Key_scan()==0)					  
     {
   	  Auto_Mode();
     }
    }	
 }
}

/*修改器件TH和TL程序         */
/*入口参数:器件序号(0-4)  */
/*全局变量:DS_Tl[5] DS_Th[5]*/
void SetThTl(unsigned char Num)
{
  LCD_Initial();
  GotoXY(5,2);							  
  Print("S C UD LR Q");		//显示有效按键
  GotoXY(0,2);
  Print("NO.");
  LCD_Write(LCD_DATA,Num+1+'0');
  ThTlDisp(Num,1);
  while(1)
  {
    unsigned char Key2=Key_scan();   //二级菜单扫描
    if(Key2==CHANGE)
     {
       Delay_long(50);
       if(Key_scan()==0)
	   {
	     unsigned char i=0;	  //左右指示
         GotoXY(8,1);
		 LCD_Write(LCD_DATA,0x7f);    
		 while(1)
		 {
		  unsigned char Key3=Key_scan();   //三级菜单扫描
		  if(Key3==LEFT)
		   {
		   	 Delay_long(50);
			 if(Key_scan()==0)
			  {
			   i=0;				//选择TH
			   GotoXY(15,1);
			   LCD_Write(LCD_DATA,0x20);
			   GotoXY(8,1);
			   LCD_Write(LCD_DATA,0x7f);
			  }
		   }
		  else if(Key3==RIGHT)
		   {
			 Delay_long(50);
			 if(Key_scan()==0)
			  {
			  	i=1;			//选择TL
				GotoXY(8,1);
			    LCD_Write(LCD_DATA,0x20);
				GotoXY(15,1);
			    LCD_Write(LCD_DATA,0x7f);
			  }
		   }
		  else if(Key3==UP)
		   {
		   	 Delay_long(100);
			 if(i==0)
			  DS_Th[Num]=DS_Th[Num]+1;
			 else
			  DS_Tl[Num]=DS_Tl[Num]+1;
			 ThTlDisp(Num,1);
		   } 
		  else if(Key3==DOWN)
		   {
		   	 Delay_long(100);
			 if(i==0)
			  DS_Th[Num]=DS_Th[Num]-1;
			 else
			  DS_Tl[Num]=DS_Tl[Num]-1;
			 ThTlDisp(Num,1);
		   } 
		  else if(Key3==SET)
		   {
		   	 Delay_long(50);
			 if(Key_scan()==0)
			  {
			   DS_Reset();
			   Match_ID(Num);                  //匹配ROM
	           DS_WriteByte(WRITE_SCR);        //  
			   DS_WriteByte(DS_Th[Num]);
			   DS_WriteByte(DS_Tl[Num]);
			   DS_WriteByte(0x7f);
			   DS_Reset();
			   Match_ID(Num);
			   DS_WriteByte(COPY_SCR);
			   SetThTl(Num);
			  }
		   }
		  else if(Key3==QUIT)
		  {
   	        Delay_long(50);
            if(Key_scan()==0)
	        {
	          Auto_Mode(); 
	        }
          } 
		}
	  }
   }
  else if(Key2==DOWN)
   {
   	 Delay_long(50);
     if(Key_scan()==0)
	  {
	    Num=Num+1;
		if(Num>4)
		  Num=0;
		SetThTl(Num);
	  }
   }
  else if(Key2==QUIT)
   {
   	 Delay_long(50);
     if(Key_scan()==0)
	  {
	    Auto_Mode(); 
	  }
   }
 }
}

/****报警设置模式程序*****/
/*功能:设置Th和Tl   */
void Alarm_Set()
{
 LCD_Initial();
 GotoXY(0,1);					  
 Print("Alarm Set");
 GotoXY(9,2);
 Print("S U D Q") ;
 while(1)			      //主菜单循环
 {
  unsigned char Key1=Key_scan()	;	  	  
 
  if(Key1==SET)           //如果按SET键
   {Delay_long(50);       //延时0.25S等待释放按键
    if(Key_scan()==0)	  //释放后操作
    {
      SetThTl(0);
    }	
   }
   else if(Key1==DOWN)	//按DOWN键切换至手动模式
    {Delay_long(50);
	 if(Key_scan()==0)
	  {
	   Hand_Mode();
	  }
	}
   else if(Key1==UP)	//按DOWN键切换至手动模式
    {Delay_long(50);
	 if(Key_scan()==0)
	  {
	   ID_Mode();
	  }
	}
   else if(Key1==QUIT)	//按QUIT键返回AUTO模式
    {Delay_long(50);					 
     if(Key_scan()==0)					 
     {
   	  Auto_Mode();
     }
    }	
 }
}	  

/////////////////////////////////////////////////
/*****************菜单选择部分******************/
/////////////////////////////////////////////////

void Menu_Function(void)
{
   if(Key_scan()==MENU)   //如果菜单键按下
    {
	 Delay_long(200);	 
	 Delay_long(200);	   //延时2S(长按有效)
	  if(Key_scan()==MENU) //菜单键有效
	  {
	   LCD_Initial();		//初始化LCD
	   GotoXY(0,1);
	   Print("Boot Menu");  //显示"Boot Menu"
	   GotoXY(10,2);
	   Print("  D Q "); 	//显示有效按键
	   while(1)                              
	    {
	   	  unsigned char Key=Key_scan()	;		  
		  if(Key==DOWN)        //如果按DOWN键
		  {Delay_long(50);	   //延时0.25S等待释放按键
		   if(Key_scan()==0)   //按键抬起后执行
		    {
			 Hand_Mode();						 
		    }
		  }
	     else if(Key==QUIT)	   //如果QUIT键按下
		  {Delay_long(50);	   //延时0.25S等待释放按键
		   if(Key_scan()==0)   //按键抬起后执行AUTO模式
			{
			 Auto_Mode();	   //返回自动模式
		  	}
		  }	
		}
	  }
	}
}

////////////////////////////////////////////////////////
/**********************主程序**************************/
////////////////////////////////////////////////////////

main()
{
  unsigned char i;
  LCD_Initial();
  GotoXY(2,1);
  Print("Sun Yunhui");	  
  GotoXY(3,2);
  Print("04021313");	 //开机显示画面 
  for(i=0;i<5;i++)	     //将EEPROM中的ID载入RAM
    ISP_Read8(i);
  for(i=0;i<5;i++)
    DS_ReadTemp(i);		//读出器件Th和Tl
  Delay_long(200);
  Delay_long(200);
  Auto_Mode();

}	  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -