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

📄 wkq.c

📁 一个电热水器的控制程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<reg51.h>

#define int0delayH1     0x9e
#define int0delayL1     0x58

typedef unsigned char   uchar;
typedef unsigned short  ushort;
typedef unsigned int    uint;


#define KEY_NULL        0xff  
#define KEY_SETTIME     0x0f    /* 定时*/
#define KEY_INC         0x27    /* 递增*/
#define KEY_OFFSET      0x17    /* 移位*/
#define KEY_IN_WATER    0x2e    /* 手动上水*/
#define KEY_SETTEMP     0x1f    /* 定温*/
#define KEY_HOTUP1      0x1d    /* 加热1*/
#define KEY_HOTUP2      0x2d    /* 加热2*/
#define KEY_RUN         0x1e    /* 运行*/
#define KEY_VERIFY_TIME 0x1b     /* 校时*/

#define KEY_RST         0x2b    /* 复位 */
#define KEY_SET_DEF     0x2a    /* 默认 =复位+手动上水*/
/*以下输出定义*/
sbit  OUT_HOTUP1      =     P1^6  ;  /* 加热1*/
sbit  OUT_HOTUP2      =     P1^5 ;   /* 加热2*/
sbit  OUT_WATER       =     P1^4 ;   /* 水泵运行控制*/    
sbit  OUT_WARNING     =     P1^1 ;   /* 报警*/
sbit  OUT_IN_WATER    =     P1^0 ;   /*上水*/

sbit  OUT_CHECK_TEMP  =     P1^7 ;   /* 测温*/

#define OUT_DISP_COM        P2
#define OUT_DISP_DATA       P0
#define KEYIN               P2
sbit    KEY_COM1   =        P2^6;
sbit    KEY_COM2   =        P2^7;
 
sbit    CHECK_POWER   =     P3^3;


/*以下输入定义*/
sbit  IN_WATER_SCARCITY =  P1^2 ;   /* 缺水*/
sbit  IN_OVER_WATER     =  P1^3 ;   /*满水*/   
sbit  IN_CHECK_TEMP     =  P3^2 ;   /* 测温*/


/////////////
sbit clock_dat=P3^0;
sbit clock_clk=P3^6;
sbit clock_rst=P3^1;

/////////////////////////////////////////////////////
uchar bdata FlagBit;
sbit  F_HotFlag1       = FlagBit^0;//加热1标志
sbit  F_HotFlag2       = FlagBit^1;//加热2标志
sbit  F_RuningFlag     = FlagBit^2;//运行标志
sbit  F_HotUpingFlag   = FlagBit^3;//加热标志
sbit  Bit_Flag         = FlagBit^4;//设定闪烁标志
sbit  F_DcFlag         = FlagBit^5;//秒显示标志
sbit  F_OutWaterFlag   = FlagBit^6;//水泵运行标志
sbit  F_TempHeightFlag = FlagBit^7;//最高温度标志

uchar bdata FlagBit2;
sbit  F_TimeChange     = FlagBit2^0;//时间改变
sbit  F_OutTempFlag    = FlagBit2^1;//测温标志
sbit  F_CheckWaterFlag = FlagBit2^2;  //缺水标志
sbit  F_WarningFlag    = FlagBit2^3;  //报警标志
sbit  F_KeyPressHot1Flag   = FlagBit2^4;
sbit  F_KeyPressHot2Flag   = FlagBit2^5;
sbit  F_InWaterFlag        = FlagBit2^6;//上水标志
sbit  F_KeyPressRunFlag    = FlagBit2^7;

uchar   data   KeyIn,State,KeyCode,KeyDelay;//键盘
uchar   data   DispBuf[6];
uchar   data   Offset_Bit;
ushort  data   DispDelay_Bit,HotKeyDelay;
ushort  data   DelayStartWater,DelayEndWater,DelayInWater;//上水



struct TIME {
        uchar sec;
        uchar min;
        uchar hour;
        uchar day;
        uchar month;
        uchar week;
        uchar year;
               
         };*/
struct TIME  CurTime;
//struct DATE  date;
uchar SetTime[2];
uchar  SetNum;
uchar  SetTemp,CurTemp;

uchar   data   DispBuf[6];
uchar   data   Offset_Bit;
uchar          DispDelay;KeyDelay;

ushort  data   DelayStartWater,DelayEndWater,DelayInWater;//上水

ushort  data   OutTempDelay;

/*==================================================*/




extern void Read_Ram(uchar cpu_addr,uchar dsram_addr,uchar i);
extern void Write_Ram(uchar cpu_addr,uchar dsram_addr,uchar i);
extern void v_Get1302(uchar ucCurtime[]) ;
extern void v_Set1302(uchar *pSecDa) ;

////////////////////////////////////

void main(void)
{
  INIT_SYS();
 
strart:


while(1)
 {
   CheckWater();
   GetCurTemp();
   GetCUrTime();
   if(F_auto_Flag)
      AutoRunSub();
    else SdRunSub();
   SetDispSub();
  
   KeyIN=ScanKey();
     
   switch(KeyIn)
      {
        case	KEY_RST:
                        goto start;
		        return;
           case	KEY_SETTIME:
		        SetTimeSub();
                        F_TimeChange =1;
		        State=0;
			break;
           case	KEY_SETTEMP:
		        SetTempSub();
                        F_TimeChange =1;
		        State=0;
		        break;
           case	KEY_VERIFY_TIME:
			SetChangTimeSub();
                        F_TimeChange =1;
		        State=0;
			break;
           case	KEY_HOTUP1:
			HotKeyDelay = 0;
                        F_HotFlag1=!F_HotFlag1;
			F_KeyPressHot1Flag =1; 
                        if(F_HotUpingFlag)
                                 SetHotUp(1);
                        DelayStartWater =0;
                        DelayEndWater   =0;
                        F_TimeChange =1;
                        break;
           case	KEY_HOTUP2:
                        HotKeyDelay=0;  
			F_HotFlag2=!F_HotFlag2;
			F_KeyPressHot2Flag = 1;   
                        if(F_HotUpingFlag)
                                SetHotUp(1);
                        DelayStartWater =0;
                        DelayEndWater   =0;
                        F_TimeChange    =1;
			break;
           case	KEY_RUN:
                        F_WarningFlag=!F_WarningFlag;
                        if(F_WarningFlag)
                        {
                                SetHotUp(0);
	                        SetWater(0);
                                 F_InWaterFlag=0;
                                 OUT_IN_WATER=1;

                        }
                        F_TempHeightFlag =0;
                        F_TimeChange     =1;
                        F_KeyPressRunFlag=1;
                        HotKeyDelay=0;
                        break;
           case KEY_IN_WATER:
                        F_InWaterFlag=!F_InWaterFlag;
                        F_CheckWaterFlag=!F_InWaterFlag;
                        DelayInWater    =0;
                        F_TimeChange    =1;
                        break;
           case  KEY_SET_DEF:
                       x5045_write(DefSetBuf,0,13);
                       goto IniMain;
                       break;
           default:
		        break;
	}
     }
   
  goto strart;
  
 }



//##################################################################

void INIT_SYS()
{
    KeyIn=KeyCode =0x1f;
    OUT_DISP_COM  =0x00;
IniMain: 
    EA    =0;
   
     IN_WATER_SCARCITY =0; 
     IN_OVER_WATER     =0;     
     for(State=0;State<8;State++)
        SetTimeBuf[State]=0;
     FlagBit =0x03;
     FlagBit2=0;
   //  SetTemp =50;
  //  CurTime =0;
     state=read_clock(0xc0|0x00);
     if(State!=0x55)
     {
         State=0x55;
         write_clock(0xc1|0x00,0x55);
         SetClock();
     }
    
      watchdog();
      read_clockT(uchar *CurTime)
     
    
 start:  
     EA    =0;
     PCON  =0x00;          /*电源控制寄存器 地址97H*/
    TMOD  =0X10;
     //定时器0
    // TH0   =int0delayH;    // 6M 1ms 
    // TL0   =int0delayL; 
     TR0=1;
     ET0=1;
     //定时器1    
     TH1   =int0delayH1;    // 6M 1ms 
     TL1   =int0delayL1; 
     TR1=1;
     ET1=1;
     //外部0
     IT0=1;
     EX0=1;
     //外部1
     IT1=1;
     EX1=1; 
     
     watchdog();
     OUT_HOTUP1      =1;  
     OUT_HOTUP2      =1;  
     OUT_WATER       =1;   
     OUT_WARNING     =1;  
     OUT_IN_WATER    =1;   

     Dc_TimeCount         =0;
     OutTempDelay         =0;         
     DelayStartWater      =0;
     DelayEndWater        =0;
     DelayInWater         =0;

     F_KeyPressHot1Flag   = 0;
     F_KeyPressHot2Flag   = 0;
     F_KeyPressRunFlag    = 0;

     F_HotUpingFlag=0;
     F_OutWaterFlag=0;
  
     Bit_Flag=1;
     F_DcFlag=1;

     F_TimeChange     =1;
     F_OutTempFlag    =0;
     F_CheckWaterFlag =0;
     F_WarningFlag    =0;
     F_TempHeightFlag =0;
     watchdog();
   
     KeyDelay=0;
     State   =0;
     EA =1;
}


void Int_Timer1(void) interrupt 3  //using 2
{ 
     TH1 = int0delayH1;
     TL1 = int0delayL1;

     DelayStartWater++;
     HotKeyDelay++;
     DispDelay_Bit++;
     KeyDelay++;
     DispDelay++;
     DelayInWater++;
     
     TimeCount++;
     Dc_TimeCount++;

     delaydog++;
     if(delaydog>4)
     {
         x5045_reset_watchdog();
         delaydog=0;
     }
     if(HotKeyDelay>DefKeyHotDelay)
     {
        F_KeyPressHot1Flag =0;   
        F_KeyPressHot2Flag =0; 
        F_KeyPressRunFlag  =0;
     }
     if(Dc_TimeCount>=DefDcTime)
     {
        Dc_TimeCount=0;
        F_DcFlag=!F_DcFlag;
     }
     if(CHECK_POWER) PowerDown=0;
     if(TimeCount>=DefMinute)
     {
         F_TimeChange  =1;
         TimeCount=0;
         CurTime++;
         if(CurTime>=1440)
	       CurTime =0;
         DelayEndWater++;
    }
 }



//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void   CheckWater()
{
    if(F_WarningFlag)
    {
        if(DelayInWater>DefWarningTime)
        {
           F_CheckWaterFlag=0;     
           OUT_WARNING     =1;
        }
        return ;
   }

   if(!F_CheckWaterFlag&&(!IN_WATER_SCARCITY||F_InWaterFlag))
   {  
       F_InWaterFlag    =1;
       F_CheckWaterFlag =1;
       OUT_IN_WATER     =0;      
       DelayInWater     =0; 
       SetHotUp(0);
   }

   if(F_CheckWaterFlag&&(!IN_OVER_WATER||!F_InWaterFlag))
   {
       F_WarningFlag    =0;
       F_InWaterFlag    =0;
       F_CheckWaterFlag =0;
       OUT_IN_WATER     =1;     
       OUT_WARNING      =1;

       F_TimeChange     =1;
       return;
   }
   if(DelayInWater>DefInWaterTime&&F_InWaterFlag)
   {
      if(!IN_WATER_SCARCITY)
      {
          F_WarningFlag =1;
          F_CheckWaterFlag=0;
          F_InWaterFlag =0;
          OUT_WARNING   =0;
          OUT_IN_WATER  =1; 
          SetWater(0);
          DelayInWater=0;         
      }  
      else
      {

⌨️ 快捷键说明

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