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

📄 protocol.c

📁 这是一个51单片机实现的控制器程序
💻 C
字号:
#include "REGX52.H"
#include "yk.h"


extern DWORD Read_Hdd(BYTE);
extern void Write_Hdd(BYTE);
extern BYTE Read1B(BYTE cAddress,bit bRegion);
extern void Write1B(BYTE cData,BYTE cAddress,bit bRegion);
extern void YkPro(unsigned char,unsigned char);
extern BYTE data Station;
extern BYTE data Trs_Buf[25];
extern BYTE idata Rcv_Buf[30];
extern bit Trs_Flag,Rcv_Flag;
extern bit  data Yk_All,Disp_Flag;
extern BYTE data House_Max;
extern BYTE data Trs_Wp,Trs_Rp,Rcv_Wp,Rcv_Rp;
extern BYTE data Start;
extern BYTE idata YkNo,YkHf,YkStatus,Yk_En;

extern BYTE xdata Second   ;//    _at_ 0x00;
extern BYTE xdata Minute   ;//    _at_ 0x02;
extern BYTE xdata Hour     ;//    _at_ 0x04;
extern BYTE xdata Week    ;//     _at_ 0x06;
extern BYTE xdata Day     ;//     _at_ 0x07;
extern BYTE xdata Month    ;//     _at_ 0x08;
extern BYTE xdata Year     ;//     _at_ 0x09;
extern BYTE xdata RegB;
BYTE data Trs_Comm,Trs_Comm_Bak;
BYTE data Rcv_Comm,Trs_Check;
BYTE data House_R,Week_Tmp,No_Tmp;




void eb90(void)
{
  Trs_Buf[0]=0xeb;
  Trs_Buf[1]=0x90;
  Trs_Buf[2]=0x00;
  Trs_Buf[3]=0x00;
  Trs_Buf[4]=0x00;
  Trs_Buf[5]=0x00;
}

void Trs_Edit(void)
{
   BYTE i,Trs_Length;
   Trs_Flag=0;
   switch (Trs_Comm)
       {
        case (0xaa):
                eb90();
              	Trs_Length=5;
                Trs_Buf[6]=Trs_Length;
                Trs_Buf[7]=0;
                Trs_Buf[8]=Trs_Comm_Bak;
                Trs_Buf[9]=Station;
                Trs_Buf[10]=0;
                Trs_Buf[11]=0x80;    //
                Trs_Check=0;
                for(i=8;i<12;i++)
                 {
                   Trs_Check+=Trs_Buf[i];
                 }
             Trs_Buf[12]=Trs_Check;
             Trs_Wp=13;

          break;



         case (0xbb):

                eb90();
              	Trs_Length=6;
                Trs_Buf[6]=Trs_Length;
                Trs_Buf[7]=0;
                Trs_Buf[8]=Trs_Comm_Bak;
                Trs_Buf[9]=Station;
                Trs_Buf[10]=0;
                Trs_Buf[11]=House_R;
                Trs_Buf[12]=YkStatus;
                Trs_Check=0;
                for(i=8;i<13;i++)
                 {
                   Trs_Check+=Trs_Buf[i];
                 }
             Trs_Buf[13]=Trs_Check;
             Trs_Wp=14;

          break;
       case (0xd2):     // 查询供电时段

                eb90();
              	Trs_Length=13;
                Trs_Buf[6]=Trs_Length;
                Trs_Buf[7]=0;
                Trs_Buf[8]=Trs_Comm;
                Trs_Buf[9]=Station;
                Trs_Buf[10]=0;
                Trs_Buf[11]=0;
                Trs_Buf[12]=0;

                Trs_Buf[13]=0xff;
                Trs_Buf[14]=Week_Tmp;
                Trs_Buf[15]=No_Tmp;
                Trs_Buf[16]=Read1B(20+10*(Week_Tmp-1)+2*(No_Tmp-1),0);     //H Hour
                Trs_Buf[17]=Read1B(20+10*(Week_Tmp-1)+2*(No_Tmp-1)+1,0);   //H Minute

                Trs_Buf[18]=Read1B(90+10*(Week_Tmp-1)+2*(No_Tmp-1),0);     //F Hour
                Trs_Buf[19]=Read1B(90+10*(Week_Tmp-1)+2*(No_Tmp-1)+1,0);   //F Minute
                Trs_Check=0;
                for(i=8;i<20;i++)
                 {
                   Trs_Check+=Trs_Buf[i];
                 }
             Trs_Buf[20]=Trs_Check;
             Trs_Wp=21;

          break;

       case (0xd8):     // 时钟

                eb90();
              	Trs_Length=11;
                Trs_Buf[6]=Trs_Length;
                Trs_Buf[7]=0;
                Trs_Buf[8]=Trs_Comm;
                Trs_Buf[9]=Station;
                Trs_Buf[10]=0;
                Cs12887=0;
                Trs_Buf[11]=Year;
                Trs_Buf[12]=Month;

                Trs_Buf[13]=Day;
                Trs_Buf[14]=Hour;
                Trs_Buf[15]=Minute;
                Trs_Buf[16]=Second;
                Trs_Buf[17]=Week;
                Cs12887=1;
                Trs_Check=0;
                for(i=8;i<18;i++)
                 {
                   Trs_Check+=Trs_Buf[i];
                 }
             Trs_Buf[18]=Trs_Check;
             Trs_Wp=19;

          break;

        default:
          break;
       }
       DIR485=0;
       if(Trs_Buf[0]==0xeb && Trs_Buf[1]==0x90)
        {
         SBUF=0xfe;
         Trs_Rp=0;
        }
        else
        {
         SBUF=Trs_Buf[0];
         Trs_Rp=1;
        }
}

void Rcv_Pro(void)
{
  BYTE i;
  BYTE Rcv_Check,Rcv_Length,Rcv_Tmp,Tmp,Tmp1;
  if((Rcv_Wp-Rcv_Rp)>(Rcv_Buf[Rcv_Rp+4]+5) && Rcv_Wp>11)
   {
   	Rcv_Flag=0;
   	Rcv_Wp=0;
   	Rcv_Length=Rcv_Buf[Rcv_Rp+4];
   	Rcv_Check=0;
   	for(i=Rcv_Rp+6;i<Rcv_Rp+Rcv_Length+5;i++)
   	 {
   	 	Rcv_Check+=Rcv_Buf[i];
   	 }
         Rcv_Comm=0;
   	if(Rcv_Check==Rcv_Buf[Rcv_Rp+5+Rcv_Length])
   	 {
   	 	Rcv_Comm=Rcv_Buf[Rcv_Rp+6];

   	 }
   	switch (Rcv_Comm)
   	 {
   	 	case (0x20):
                 if(Rcv_Buf[Rcv_Rp+7]==Station
                    ||(Rcv_Buf[Rcv_Rp+7]==0xff&&Rcv_Buf[Rcv_Rp+8]==0xff)&&(!Key))

                   {

                     Trs_Comm=0xaa;
                     Trs_Comm_Bak=0xa0;
                     Trs_Flag=1;

                   }
   	 	break;
               case (0x21):
                 if(!Key)
                   {
                    Station=Rcv_Buf[Rcv_Rp+7];
                    Write1B(Station,0,0);
                    Trs_Comm=0xaa;
                    Trs_Comm_Bak=0xa1;
                    Trs_Flag=1;
                   }
   	 	break;
                 case (0x31):
                if(Rcv_Buf[Rcv_Rp+7]==Station)
                   {
                    House_R=Rcv_Buf[Rcv_Rp+9];
                    if(House_R!=0xff)
                      {
                          Yk_En=Read1B(15+(House_R-1)/8,0);
                          if (Rcv_Buf[Rcv_Rp+10]&0x80)
                           {
                            Yk_En|=(1<<((House_R-1)%8));
                            YkStatus=0x81;
                           }
                           else
                           {
                            Yk_En&=~(1<<((House_R-1)%8));
                            YkStatus=0x80;
                           }
                          Write1B(Yk_En,15+(House_R-1)/8,0);

                        }

                     else   //0xff
                      {
                         if (Rcv_Buf[Rcv_Rp+10]&0x80)
                           {
                            YkStatus=0x81;
                            for(i=0;i<5;i++)
                            {
                             Write1B(0xff,15+i,0);
                            }
                           }
                         else
                           {
                            YkStatus=0x80;
                            for(i=0;i<5;i++)
                            {
                             Write1B(0x0,15+i,0);
                            }
                           }
                        }
                    Trs_Comm=0xbb;
                    Trs_Comm_Bak=0xb1;
                    Trs_Flag=1;
                    Disp_Flag=1;
                   }
   	 	break;

               case (0x36):        // TongDuan Status
                 if(Rcv_Buf[Rcv_Rp+7]==Station)
                   {
                    Trs_Comm=0xbb;
                    Trs_Comm_Bak=0xb6;
                    Trs_Flag=1;
                    House_R=Rcv_Buf[Rcv_Rp+9];
                    i=(House_R-1)/8;
                    Tmp=Read1B(15+i,0);
                    i=(House_R-1)%8;
                    Tmp=Tmp>>i;
                    if(Tmp&1)                //yk enable
                     {
                      i=(House_R-1)/8;
                      Tmp=Read1B(10+i,0);
                      i=(House_R-1)%8;
                      Tmp=Tmp>>i;
                      if(Tmp&1)
                       {
                        YkStatus=0xcc;
                       }
                       else
                       {
                        YkStatus=0x33;
                       }
                     }
                     else             //  yk disable
                     {
                        YkStatus=0x55;
                     }
                  }
                 break;
               case (0x37):        //Yk TongDuan

                 if(Rcv_Buf[Rcv_Rp+7]==Station
                    ||(Rcv_Buf[Rcv_Rp+7]==0xff&&Rcv_Buf[Rcv_Rp+8]==0xff))
                   {
                    House_R=Rcv_Buf[Rcv_Rp+9];
                    YkNo=House_R-1;           //YkNo
                    YkHf=Rcv_Buf[Rcv_Rp+10];  //YkHf
                    if(House_R==0xff)
                     {
                      Yk_All=1;
                      YkNo=0;
                     }
                     else
                     {
                      Yk_All=0;
                      i=YkNo/8;
                      Tmp=Read1B(15+i,0);
                      i=YkNo%8;
                      Tmp=(Tmp>>i)&1;
                        {
                         YkPro(YkNo,YkHf);
                         Trs_Comm=0xbb;
                         Trs_Comm_Bak=0xb7;
                         YkStatus=0xaa;
                         Trs_Flag=1;
                        }
                     }
                   }

                 break;

              case (0x52):        //供电时段查询

                 if(Rcv_Buf[Rcv_Rp+7]==Station)

                   {
                    Week_Tmp=Rcv_Buf[Rcv_Rp+12];
                    No_Tmp=Rcv_Buf[Rcv_Rp+13];
                    Trs_Comm=0xD2;
                    Trs_Flag=1;
                   }

                 break;
               case (0x53):        //供电时段设置

                 if(Rcv_Buf[Rcv_Rp+7]==Station
                    ||(Rcv_Buf[Rcv_Rp+7]==0xff&&Rcv_Buf[Rcv_Rp+8]==0xff))
                   {
                    i=Rcv_Buf[Rcv_Rp+12]-1;  //WEEK
                    Tmp=Rcv_Buf[Rcv_Rp+13]-1;   //序号
                    if(i<7 && Tmp<5)
                    {
                    Tmp1=Rcv_Buf[Rcv_Rp+14];
                    Write1B(Tmp1,20+10*i+2*Tmp,0);    //开始 时
                    Tmp1=Rcv_Buf[Rcv_Rp+15];
                    Write1B(Tmp1,20+10*i+2*Tmp+1,0);    //开始 分

                    Tmp1=Rcv_Buf[Rcv_Rp+16];
                    Write1B(Tmp1,90+10*i+2*Tmp,0);    //结束 时
                    Tmp1=Rcv_Buf[Rcv_Rp+17];
                    Write1B(Tmp1,90+10*i+2*Tmp+1,0);    //结束 分
                    Trs_Comm=0xaa;
                    Trs_Comm_Bak=0xD3;
                    Trs_Flag=1;
                    }
                   }

                 break;

               case (0x58):        //查询时钟

                 if(Rcv_Buf[Rcv_Rp+7]==Station)

                   {
                    Trs_Comm=0xd8;
                    Trs_Flag=1;

                   }

                 break;

                case (0x59):        //对钟

                 if(Rcv_Buf[Rcv_Rp+7]==Station
                    ||(Rcv_Buf[Rcv_Rp+7]==0xff&&Rcv_Buf[Rcv_Rp+8]==0xff))
                   {
                    Cs12887=0;
                    RegB|=0x80;
                    Year=Rcv_Buf[Rcv_Rp+9];
                    Month=Rcv_Buf[Rcv_Rp+10];
                    Day=Rcv_Buf[Rcv_Rp+11];
                    Hour=Rcv_Buf[Rcv_Rp+12];
                    Minute=Rcv_Buf[Rcv_Rp+13];
                    Second=Rcv_Buf[Rcv_Rp+14];
                    Week=Rcv_Buf[Rcv_Rp+15];
                    RegB&=0x7f;
                    Cs12887=1;
                    Trs_Comm=0xaa;
                    Trs_Comm_Bak=0xD9;
                    Trs_Flag=1;
                   }

                 break;


                default:
                break;

   	 }
   }
}

⌨️ 快捷键说明

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