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

📄 dram.c

📁 ASC 信号机控制程序,国内最先进的信号机控制程序
💻 C
📖 第 1 页 / 共 2 页
字号:
                                               {XBYTE[startaddr]=XBYTE[0X7E07];
                                                for(i=0;i<10;i++){}
                                                if(XBYTE[startaddr]!=XBYTE[0X7E07])
                                                XBYTE[0xa06f]++;
                                                }          */

                                    XBYTE[0x7e06]=0;
                                    for(j=0;j<50;j++){}
                                   //* XBYTE[0XA019]=0xa0;           //R3,R4
                                    //XBYTE[0XA020]=0x80;

                                    //XBYTE[startaddr]=0;

}

//应答子程序
dram_answer()
{
  unsigned int xdata temp,startaddr;
  unsigned char xdata i,j;

  if((centrl_flag<0x20)&&(centrl_flag!=0x17))
                      {


         s_buffer=XBYTE[0X7f9e];
         s_buffer=0;
         XBYTE[0X7E00]=0X00;
         XBYTE[0X7E01]=1+3;    //E00~7E01H---发送字节的长度


         i=0;
         do{
            temp=0xa030+i*5;
            now_saddr=temp;
            i=i+1;
            }
         while(XBYTE[temp]>0&&XBYTE[temp]<=4&&i<=5);
         if(i==5){
                  //s_buffer.0=1,发送数据标志存储区已满
                  s_buffer=s_buffer&0x07;
                  s_buffer=s_buffer|0x01;
                  XBYTE[0XA023]=0;
                  }
          else
               {
                 XBYTE[temp]=0X87;
                 XBYTE[0X7E04]=now_saddr/256;
                 XBYTE[0X7E05]=now_saddr%256; //7E04~7E05H---使用的发送数据存储区的首地址(在双口RAM中)

                 s_buffer=(s_buffer&0x06);//*发送标志缓冲区不满 s_buffer.0=0
                 XBYTE[0XA023]=1;   // CPU板修改数据区头尾标志
                 for(i=0;i<10;i++){}
                 if(XBYTE[0XA023]!=1){
                                        XBYTE[0XA023]=1;
                                        for(i=0;i<10;i++){}
                                        if(XBYTE[0XA023]!=1)
                                                      {XBYTE[0XA023]=0;
                                                       s_buffer=s_buffer|0x04;     //通讯板修改数据区头尾
                                                       }
                                        }
                 else //if(XBYTE[0XA023]==1) //判断通讯板是否修改数据区头尾,A024H=1
                      {
                       i=30;
                       do{
                          for(j=0;j<10;j++){}
                          i=i-1;
                          }
                       while(i!=0&&XBYTE[0XA024]!=0);

                        if(i==0){
                                 XBYTE[0XA023]=0;
                                 s_buffer=s_buffer|0x04;     //通讯板修改数据区头尾
                                 }
                        else
                                { //XBYTE[0XA023]=1; XBYTE[0XA024]=0
                                  s_useaddr=XBYTE[0XA021]*256+XBYTE[0XA022];
                                    if(s_useaddr>0xa700||s_useaddr<0xa080)
                                    {
                                    XBYTE[0XA021]=0xa0;           //R3,R4
                                    XBYTE[0XA022]=0x80;
                                    }
                                   tos_length=XBYTE[0X7E00]*256+XBYTE[0X7E01];      //R1R2
                                   s_min_addr=XBYTE[0Xa01f]*256+XBYTE[0Xa020];      //R5R6
                                   s_min_addr=s_min_addr&0xa7ff;
                                   s_max_addr=XBYTE[0Xa021]*256+XBYTE[0Xa022];   //R7R0
                                   s_max_addr=s_max_addr&0xa7ff;
                                   s_useaddr=(s_max_addr-s_min_addr);           //R3R4
                                   if(s_max_addr>=s_min_addr)
                                                            s_useaddr=0x0780-s_useaddr;
                                   else {
                                        s_useaddr=s_min_addr-s_max_addr;       //R3R4
                                        s_useaddr=0x0780-s_useaddr;
                                        }
                                   if(s_useaddr>=tos_length)       //R3R4>R1R2
                                      {//*数据区有空间
                                       s_buffer=(s_buffer&0X05);
                                       temp_addr=XBYTE[0Xa021]*256+XBYTE[0Xa022];//*R5,R6*
                                       temp_addr=(temp_addr&0xa7ff);
                                       s_useaddr=temp_addr+tos_length;    //*R3R4=R5R6+R1R2*
                                       if(s_useaddr>=0xa7ff)
                                       s_useaddr=s_useaddr-0x0780;  //*超过界限*
                                       temp=s_useaddr;
                                       XBYTE[0XA021]=temp/256;           //R3,R4
                                       XBYTE[0XA022]=temp%256;
                                      // XBYTE[0XA021]=temp/256;           //R3,R4
                                      // XBYTE[0XA022]=temp%256;
                                       temp=temp_addr+1;
                                       XBYTE[0X7E02]=(temp)/256;            // /*R5,R6+1*
                                       XBYTE[0X7E03]=(temp)%256;

                                       startaddr=XBYTE[0X7E04]*256+XBYTE[0X7E05];
                                       temp=startaddr;
                                       temp_addr=temp_addr+1;
                                       XBYTE[temp+1]=(temp_addr)/256;          //*R5,R6*
                                       XBYTE[temp+2]=(temp_addr)%256;

                                       XBYTE[temp+3]=s_useaddr/256;          //R3,R4
                                       XBYTE[temp+4]=s_useaddr%256;
                                       //temp=temp_addr;

                                      }
                                    else
                                      {//*数据区空间不够
                                       s_buffer=s_buffer|0x02;
                                       XBYTE[now_saddr]=0;//*发送标志清零
                                       }
                              }
                      }
               }

         XBYTE[0XA023]=0;
                          if(s_buffer==0){
                                    XBYTE[0X6800]=centrl_flag;
                                    XBYTE[0X6801]=0X00;
                                    XBYTE[0X6802]=0X01;
                                    XBYTE[0X6803]=0X87;
                                    temp_addr=XBYTE[0x7e02]*256+XBYTE[0X7e03];   //R1R2

                                    temp_addr=temp_addr;
                                    for(j=0;j<4;j++){
                                                      if(temp_addr+j==0xf7ff)XBYTE[temp_addr+j]=0xf07f;
                                                      XBYTE[temp_addr+j]=XBYTE[0x6800+j];
                                                       }
                                   XBYTE[0xa02f]++;
                                   XBYTE[0Xa004]=0;
                                   XBYTE[0Xa01B]=0;
                                   startaddr=XBYTE[0X7E04]*256+XBYTE[0X7E05];
                                   XBYTE[startaddr]=1;
                                   XBYTE[0X7E07]=1;
                                   /*if(XBYTE[startaddr]!=XBYTE[0X7E07])
                                               {XBYTE[startaddr]=XBYTE[0X7E07];
                                                for(i=0;i<10;i++){}
                                                if(XBYTE[startaddr]!=XBYTE[0X7E07])
                                                XBYTE[0xa06f]++;
                                                }          */

                                    XBYTE[0x7e06]=0;
                                          }

                        }
                        commu=0;
}


dram_receive()
{
  unsigned char i;
  for(i=0;i<6;i++){
         now_addr=0XA050+5*i;
         comm_number=XBYTE[now_addr];
         if((comm_number>0)&&(comm_number<4)){
                                              read_dram();
                                              }
                   }
}
extern unsigned char xdata work_state,now_uncount,now_step;
extern unsigned char control_mod;
extern unsigned char time_id,sch_id;
extern unsigned char lamp_state[16];
extern signed char xdata lamp_color;
extern unsigned char xdata  machine_state;
extern unsigned char xdata key;
extern unsigned int xdata  sch_plan[32];
/***************************
 状态上传函数 后串口发送
****************************/

send_0x833()
{

 unsigned char i;
 drsend(24);
if(s_buffer==0)
  {
  XBYTE[0X6800]=0x83;

  XBYTE[0X6801]=0X00;
  XBYTE[0X6802]=0X18;
  XBYTE[0X6803]=work_state;
  XBYTE[0X6804]=control_mod;
  XBYTE[0X6805]=time_id;
  XBYTE[0X6806]=sch_id;
  for(i=0;i<16;i++){
                    XBYTE[0X6807+i]=lamp_state[i];
                   }
  XBYTE[0X6817]=now_step;     //*相位号
  XBYTE[0X6818]=lamp_color;     //*相位灯色
  XBYTE[0X6819]=now_uncount;
  XBYTE[0X681a]=machine_state;
  nram_addr=0x6800;
  dramsend(nram_addr);
  }
}
/****************************************/
/*时制信息传递                          */
/****************************************/


/***************************
 流量上传函数 后串口发送
****************************/

extern unsigned char xdata send_liul[32];
extern unsigned char xdata fix_period;
send_0x866()
{
 unsigned char time_flag,temp,temp1=0,temp2=0;
 unsigned char i;


 drsend(43);
if(s_buffer==0)
  {
 XBYTE[0x6900]=0X86;

 XBYTE[0x6901]=0X00;
 XBYTE[0x6902]=0x2A;
 temp=XBYTE[0X8017];

 if(temp==0x00)time_flag=fix_period;
 else          time_flag=temp;

 XBYTE[0x6903]=time_flag;
 XBYTE[0x6904]=now_year;      ////*年
 XBYTE[0x6905]=now_month;     //*月
 XBYTE[0x6906]=now_date;      //*日
 XBYTE[0x6907]=now_hour;      //*时
 XBYTE[0x6908]=now_min;       //*分
 XBYTE[0x6909]=now_sec;       //*秒
 XBYTE[0x690a]=usingloop_h/256;
 XBYTE[0x690b]=usingloop_h%256;
 XBYTE[0x690c]=usingloop_l/256;
 XBYTE[0x690d]=usingloop_l%256;
 for(i=0;i<32;i++){
                    XBYTE[0x690e+i]=send_liul[i];
                     send_liul[i]=0;

                     }

nram_addr=0x6900;

dramsend(nram_addr);
}
}
/***************************
 故障上传函数 后串口发送
****************************/
extern unsigned char xdata error84[11];
 send_0x844()
{

    unsigned char i;

    drsend(11);
    if(s_buffer==0)
               {if(error84[7]==0&&error84[8]==0)
                XBYTE[0x6800]=0X8b;
                else
                XBYTE[0x6800]=0X8a;
                //XBYTE[0x6800]=0X84;
                XBYTE[0x6801]=0X00;
                XBYTE[0x6802]=0x0b;
                for(i=0;i<11;i++)
                               {
                                XBYTE[0X6803+i]=error84[i];
                                }
                for(i=0;i<10;i++){}
                //nram_addr=0x6800;
                dramsend(0x6800);

               }

 }


send_timesch()
{
 unsigned char i;
 unsigned int temp;
 drsend(65);

 XBYTE[0x6900]=0X35;//时间计划标准用0x35做数据标识
 XBYTE[0x6901]=0X00;
 XBYTE[0x6902]=0x41;
 XBYTE[0x6903]=key;
 temp=0X6904;
 for(i=0;i<32;i++){
     XBYTE[temp+i]=sch_plan[i]/256;
     temp++;
     XBYTE[temp+i]=sch_plan[i]%256;
                   }

 dramsend(0x6900);

}

⌨️ 快捷键说明

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