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

📄 text1

📁 基于STC做的温度控制程序-数据的保存STC89C58RD
💻
字号:
// Header:
// File Name: 
// Author:
// Date:
  #include<STC89C51RC_RD_PLUS.h>
  #include<intrins.h>
  #include<string.h>
  #include"dataflash.h"
  #include"gain_temp.h"
  #include"pid.h"
  typedef unsigned char unchar;
  sbit Data_Inc=0x90;
  sbit Control_Heat=0x91;
  sbit Control_Cold=0x92;
  sbit Data_Dec=0x93;
  sbit Shift=0x94;
  sbit Set=0x95; 
 ////菜单标志位
  bit Normal_Menu=1; 
  bit Work_End=0;	
  bit Time_Menu=0;//时间查看标志位(0),否则  
  bit A_Menu=0;
  bit B_Menu=0;
  bit Gain_On=0;//采集标志位
  //存放显示各个位值信息(高位放前面)
  unchar BInform_WTime[4]={0,0,0,0};//存放设定工作时间各个位的值
  unchar BInform_PV[4]={0,0,0,0}; //存放实测温度PV各个位的值
  unchar BInform_SV[4];// 存放设定温度SV各个位的值 (先存放高位)
  xdata unchar BInform_B[44];//存放AL1,SEC,COLD,SC,HL,P,I,D,LCK,SVL,SVH的各个位的值显示
  idata unchar BInform_AL1[4];												  
  idata unchar BInform_SEC[4];
  idata unchar BInform_COLD[4];
  idata unchar BInform_SC[4];
  idata unchar BInform_HL[4];
  idata unchar BInform_P[4];
  idata unchar BInform_I[4];
  idata unchar BInform_D[4];  
  idata unchar BInform_LCK[4];
  idata unchar BInform_SVH[4];
  idata unchar BInform_SVL[4];
  //存放参数数值信息
  idata unchar Value_Led;//存放指示灯的状态值
  idata unchar Value_WTime;//存放设定工作时间的值
  idata float Value_PV; //存放实测温度PV的值 
  idata float Value_SV=30.0;// 存放设定温度SV的值
  idata unchar Value_LCK;  
  idata float Value_SVH; //
  idata float Value_SVL;// 存放设定温度SV的值的上下限
  idata float Value_AL1;
  idata unchar Value_SEC;
  idata float Value_COLD;
  idata float Value_SC;
  idata float Value_HL;
  idata float Value_P;
  idata unchar Value_I;
  idata unchar Value_D;	 
  ////存放AL1,SEC,COLD,SC,HL,P,I,D,LCK的符号显示
  code unchar Display_T[4]={0xff,0xff,0xff,0xCE};
  code unchar Display_AL1[4]={0xff,0x88,0xc7,0xf9};   
  code unchar Display_SEC[4]={0xff,0x92,0x86,0xc6}; 
  code unchar Display_COLD[4]={0xc6,0xc0,0xc7,0xc0};
  code unchar Display_SC[4]={0xff,0xff,0x92,0xc6};
  code unchar Display_HL[4]={0xff,0xff,0x89,0xc7};
  code unchar Display_P[4]={0xff,0xff,0xff,0x8c};
  code unchar Display_I[4]={0xff,0xff,0xff,0xf9};
  code unchar Display_D[4]={0xff,0xff,0xff,0xc0};
  code unchar Display_LCK[4]={0xff,0xc7,0xc6,0x8f};
  code unchar Display_SVH[4]={0xff,0x92,0xc1,0x89};
  code unchar Display_SVL[4]={0xff,0x92,0xc1,0xc7};
  code unchar Display___[4]={0xf7,0xf7,0xf7,0xf7};
  code unchar Display_END[4]={0xff,0x86,0x89,0xc0};  
   ////
   unchar Value_Set=0; //存放功能键的序号=0时进入正常显示
   unchar Value_Shift=0;//存放移位键的序号
	////
   char sec=0;//制冷延时时间
   unchar Time0_Gain=0;//用于T0定时一秒20*50ms
   unchar Time1_USet=0;//A\B菜单中存放无键按下时间
   unchar Time2_Set=0;//存放Set键按下时间
   unchar Frequency=0;//供加热器频率
   ////显示程序
   void time_display(unchar *pf,unchar *pt,unchar Diode_Led);//显示当前温度,工作剩余时间,二极管状态
   void	norm_display(unchar *pv,unchar *ps,unchar Diode_Led);//	显示当前温度,设置温度,二极管状态
   void shanshuo_display(unchar *pf,unchar *pz,unchar Diode_Led);//显示各个参数符号,各个参数的值,二极管状态(当是设定温度时,pf显示的是当前温度)
   code unchar seven_seg[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
   code unchar seven_seg1[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
/*===================================================================================================================== 
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 =====================================================================================================================*/
   void delay(char x)//用在常态显示的延时
    { 
      unsigned char i,j;
     for (i=0;i<x;i++)for (j=0;j<255;j++);////大约1ms
    }
   ////////////////////////////////////////
   void idata_process(unchar pv,unchar *pp)
	      { 
		    *pp=pv/1000;
		    pv%=1000;
			*(pp+1)=pv/100;
		    pv%=100;
			*(pp+2)=pv/10;
			pv%=10;
			*(pp+3)=pv;
		  }

 /* ==================================================== 
    参数初始化程序
 ====================================================*/
    void init_parameter(void)
	{int i;
	  //参数数值信息
	 Value_Led=0;
	 Value_PV=0;
     Value_WTime=0; 
	 Value_SV=100*BInform_SV[0]+10*BInform_SV[1]+BInform_SV[2]+BInform_SV[3]/10;
     Value_AL1=0*BInform_B[0]+0*BInform_B[1]+BInform_B[2]+BInform_B[3]/10;
     Value_SEC=0*BInform_B[4]+0*BInform_B[5]+0*BInform_B[6]+BInform_B[7];
     Value_COLD=0*BInform_B[8]+0*BInform_B[10]+BInform_B[10]+BInform_B[11]/10;
	 Value_SC=0*BInform_B[12]+0*BInform_B[13]+BInform_B[14]+BInform_B[15]/10;
	 Value_HL=BInform_B[16]+BInform_B[17]/10+BInform_B[18]/100+BInform_B[19]/1000;
     Value_P=10*BInform_B[20]+BInform_B[21]+BInform_B[22]/10+BInform_B[23]/100;
     Value_I=1000*BInform_B[24]+100*BInform_B[25]+10*BInform_B[26]+BInform_B[27];
     Value_D=1000*BInform_B[28]+100*BInform_B[29]+10*BInform_B[30]+BInform_B[31]; 
	 Value_LCK=1000*BInform_B[32]+100*BInform_B[33]+10*BInform_B[34]+BInform_B[35];
	 Value_SVL=100*BInform_B[36]+10*BInform_B[37]+BInform_B[38]+BInform_B[39]/10;
	 Value_SVH=100*BInform_B[40]+10*BInform_B[41]+BInform_B[42]+BInform_B[43]/10;
	 //BInform_WTime[4];//存放设定工作时间各个位的值
    // BInform_PV[4]; //存放实测温度PV各个位的值
    // BInform_SV[4];// 存放设定温度SV各个位的值 (先存放高位)
	 for(i=0;i<44;i++)
	  {
	   if(i<4)BInform_AL1[i]=BInform_B[i];
	   else if(i<8)BInform_SEC[i-4]=BInform_B[i];
	   else if(i<12)BInform_COLD[i-8]=BInform_B[i];
	   else if(i<16)BInform_SC[i-12]=BInform_B[i];
	   else if(i<20)BInform_HL[i-16]=BInform_B[i];
	   else if(i<24)BInform_P[i-20]=BInform_B[i];
	   else if(i<28)BInform_I[i-24]=BInform_B[i];	
	   else if(i<32)BInform_D[i-28]=BInform_B[i];
	   else if(i<36)BInform_LCK[i-32]=BInform_B[i];
	   else if(i<40)BInform_SVL[i-36]=BInform_B[i];
	   else BInform_SVH[i-40]=BInform_B[i];
	   }
	 }
 /* ==================================================== 
    参数保存化程序
   ====================================================*/	
   void stor_parameter(void)  //参数数值信息
	{
	 int i;   
	 for(i=0;i<44;i++)
	  {if(i<4)BInform_B[i]= BInform_AL1[i];		 
	   else if(i<8)BInform_B[i]=BInform_SEC[i-4];
	   else if(i<12)BInform_B[i]=BInform_COLD[i-8];
	   else if(i<16)BInform_B[i]=BInform_SC[i-12];
	   else if(i<20)BInform_B[i]=BInform_HL[i-16];
	   else if(i<24)BInform_B[i]=BInform_P[i-20];
	   else if(i<28)BInform_B[i]=BInform_I[i-24];	
	   else if(i<32)BInform_B[i]=BInform_D[i-28];
	   else if(i<36)BInform_B[i]=BInform_LCK[i-32];
	   else if(i<40)BInform_B[i]=BInform_SVL[i-36];
	   else BInform_B[i]=BInform_SVH[i-40];}
  //////////////////////////////////////////////////////////////////////////////////////////////
      
     Value_SV=100*BInform_SV[0]+10*BInform_SV[1]+BInform_SV[2]+BInform_SV[3]/10;
	 if(Value_SV>=Value_SVH)	  
	   { 
	     Value_SV=Value_SVH;
	     for(i=0;i<4;i++)
	       {BInform_SV[i]=BInform_SVH[i];}	     
	    }
	 else if(Value_SV<=Value_SVL)	  
	   { 
	     Value_SV=Value_SVL;
	     for(i=0;i<4;i++)
	       {BInform_SV[i]=BInform_SVL[i];}	     
	    }
	 Value_WTime=1000*BInform_WTime[0]+100*BInform_WTime[1]+10*BInform_WTime[2]+BInform_WTime[3];
     Value_AL1=0*BInform_B[0]+0*BInform_B[1]+BInform_B[2]+BInform_B[3]/10;
     Value_SEC=0*BInform_B[4]+0*BInform_B[5]+0*BInform_B[6]+BInform_B[7];
     Value_COLD=0*BInform_B[8]+0*BInform_B[10]+BInform_B[10]+BInform_B[11]/10;
	 Value_SC=0*BInform_B[12]+0*BInform_B[13]+BInform_B[14]+BInform_B[15]/10;
	 Value_HL=BInform_B[16]+BInform_B[17]/10+BInform_B[18]/100+BInform_B[19]/1000;
     Value_P=10*BInform_B[20]+BInform_B[21]+BInform_B[22]/10+BInform_B[23]/100;
     Value_I=1000*BInform_B[24]+100*BInform_B[25]+10*BInform_B[26]+BInform_B[27];
     Value_D=1000*BInform_B[28]+100*BInform_B[29]+10*BInform_B[30]+BInform_B[31]; 
	 Value_LCK=1000*BInform_B[32]+100*BInform_B[33]+10*BInform_B[34]+BInform_B[35];
	 Value_SVL=100*BInform_B[36]+10*BInform_B[37]+BInform_B[38]+BInform_B[39]/10;
	 Value_SVH=100*BInform_B[40]+10*BInform_B[41]+BInform_B[42]+BInform_B[43]/10;
 
   }
  /* ====================================================
   SET键菜单选择程序
   ====================================================*/
   void set_key(void)//SET键的取值
   {
       if(Set==0)
	   {
	    delay(10);
	    if(Time2_Set==0&&Set==0)
	    {EA=1;
	     T2MOD=0x00;
		 TH2=0xc7; //10MS定时
         TL2=0xf0;
         TR2=1;}
		}
	   //对Time_Set判断来决定菜单选项
	   if(Time2_Set<500) 
	    {Normal_Menu=0;////进入A菜单	
		 A_Menu=1;}
	   else if(Time2_Set>=500&&Time2_Set<1500) 
	    {A_Menu=0;////进入B菜单	
		 B_Menu=1;}
	   else if(Time2_Set>=1500)			 
	     {B_Menu=0;////进入常态菜单	
		  Normal_Menu=1;} 
	   if(Set==1)
		{
		 delay(10);
		 if(Set==1)Time2_Set=0;
		 }		
	 }

/* ====================================================
   SHIF键查看工作剩余时间程序
   ====================================================*/
   void time_key(void)
	  {
	    bit x=0;//X=1表示恢复到正常显示
	    if(Normal_Menu==1||Time_Menu==1)
		{
		 if(Shift==0)
		  {	
		    delay(10);
			if(Shift==0)
			{
			 if(x==0)
			  {Time_Menu=1;
			   Normal_Menu=0;}
			 else
			  {Time_Menu=0;
			   Normal_Menu=1;} 
			 }
		   }		    
	   else if(Shift==1)
	          {
			   delay(10);
			   if(Shift==1)x^=0x01;
			   }
	     }
	  } 

⌨️ 快捷键说明

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