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

📄 dram.c

📁 ASC 信号机控制程序,国内最先进的信号机控制程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <absacc.h>
#include <reg51.h>
unsigned char comm_number;
unsigned int now_addr;
unsigned char centrl_flag,s_buffer;
unsigned int begin_addr,end_addr;
unsigned int now_saddr;
unsigned int tos_length,s_min_addr;
unsigned int s_max_addr,s_useaddr;
unsigned int xdata nram_addr;
unsigned char xdata commu,temp3;        /*定义了一个位 */
extern unsigned char xdata key;
extern unsigned int xdata sch_plan[32];
unsigned int temp_addr;
extern  unsigned int  xdata usingloop_h,usingloop_l;
extern unsigned char now_day;  /*星期*/
extern unsigned char now_hour; /*小时*/
extern unsigned char now_min;  /*分钟*/
extern unsigned char now_sec;  /*秒*/
extern unsigned char now_year; /*年份*/
extern unsigned char now_month;/*月份*/
extern unsigned char now_date; /*日子*/
extern char  wirte28c64(length,addr_ram,addr_eeprom);

sch_update()
{
  unsigned char i,temp1,temp2;
  unsigned int  temp;

   key=XBYTE[0X7003];
   temp=0X7004;
  for(i=0;i<32;i++){
     temp1=XBYTE[temp+i];
     temp++;
     temp2=XBYTE[temp+i];
     sch_plan[i]=temp2+temp1*256;
            }

}
/***************************************************************/
/*          将NVRAM中来自双口RAM中的数据写入EEPROM             */
/*    调用本函数前请将地址单元0x7f98、0x7f99设定为被读数据的   */
/*起始地址,其中,0x7f98为高位地址单元,0x7f99为低位地址单元。 */
/*数据被写入的EEPROM地址严格遵照通信协议。                     */
/***************************************************************/


meeprom()
{
   unsigned int addr;
   unsigned char mflag,load;
   unsigned char xdata *nv_addr;
   addr=XBYTE[0X7F98]*256+XBYTE[0X7F99];
   nv_addr=addr;
   mflag=XBYTE[addr];
   addr=addr+3;
   switch(mflag){
           case 0x01:break;
           case 0x02:load=wirte28c64(   7,addr,0x8009);
                      XBYTE[0XC000]=XBYTE[0X800e];
                      XBYTE[0XC002]=XBYTE[0X800d];
                      XBYTE[0XC004]=XBYTE[0X800c];
                      XBYTE[0XC007]=XBYTE[0X800b];
                      XBYTE[0XC008]=XBYTE[0X800a];
                      XBYTE[0XC009]=XBYTE[0X8009];
                      XBYTE[0XC006]=XBYTE[0X800f];     break;/*标识为02H的数据体内容存储在以800AH为起始地址的EEPROM空间*/
           case 0x03:load=wirte28c64(   0,addr,0x8000);break;/*标识为03H的数据体内容存储在以800AH为起始地址的EEPROM空间*/
           case 0x04:load=wirte28c64(   3,addr,0x8010);break;/*标识为04H的数据体内容存储在以8010H为起始地址的EEPROM空间*/
           case 0x05:load=wirte28c64(   2,addr,0x8014);break;/*标识为05H的数据体内容存储在以8014H为起始地址的EEPROM空间*/
           case 0x06:load=wirte28c64(   6,addr,0x8016);break;/*标识为06H的数据体内容存储在以8016H为起始地址的EEPROM空间*/
           case 0x07:load=wirte28c64(  32,addr,0x8020);break;/*标识为07H的数据体内容存储在以8020H为起始地址的EEPROM空间*/
           case 0x08:load=wirte28c64(  32,addr,0x8040);break;/*标识为08H的数据体内容存储在以8040H为起始地址的EEPROM空间*/
           case 0x09:load=wirte28c64(  32,addr,0x8060);break;/*标识为09H的数据体内容存储在以8060H为起始地址的EEPROM空间*/
           case 0x0a:load=wirte28c64(  64,addr,0x8080);break;/*标识为0aH的数据体内容存储在以8080H为起始地址的EEPROM空间*/
           case 0x0b:load=wirte28c64(   8,addr,0x80c0);break;/*标识为0bH的数据体内容存储在以80c0H为起始地址的EEPROM空间*/
           case 0x0c:load=wirte28c64(  14,addr,0x80c8);break;/*标识为0cH的数据体内容存储在以80c8H为起始地址的EEPROM空间*/
           case 0x0d:load=wirte28c64(   1,addr,0x80e0);break;/*标识为0dH的数据体内容存储在以80e0H为起始地址的EEPROM空间*/
           case 0x0e:load=wirte28c64(   1,addr,0x80ef);break;/*标识为0eH的数据体内容存储在以80efH为起始地址的EEPROM空间*/
           case 0x0f:load=wirte28c64(  48,addr,0x8130);break;/*标识为0fH的数据体内容存储在以8130H为起始地址的EEPROM空间*/
           case 0x10:load=wirte28c64(  48,addr,0x8160);break;/*标识为10H的数据体内容存储在以8160H为起始地址的EEPROM空间*/
           case 0x11:load=wirte28c64(  100,addr,0x8110);break;/*标识为11H的数据体内容存储在以8190H为起始地址的EEPROM空间*/
           case 0x12:load=wirte28c64(  2,addr,0x81D5);break;/*标识为12H的数据体内容存储在以81ceH为起始地址的EEPROM空间*/
           case 0x13:load=wirte28c64(1560,addr,0x8200);break;/*标识为13H的数据体内容存储在以8200H为起始地址的EEPROM空间*/
           case 0x14:load=wirte28c64(1560,addr,0x8900);break;/*标识为14H的数据体内容存储在以8900H为起始地址的EEPROM空间*/
           case 0x15:load=wirte28c64(  128,addr,0x8230);break;/*标识为15H的数据体内容存储在以81e0H为起始地址的EEPROM空间*/
           case 0x16:load=wirte28c64(  12,addr,0x80E1);break;/*标识为16H的数据体内容存储在以80E1H为起始地址的EEPROM空间*/
           case 0x17:load=wirte28c64(   2,addr,0x7E29);break;/*标识为17H的数据体内容存储在以7e29H为起始地址的EEPROM空间*/
           case 0x18:load=wirte28c64(  64,addr,0x8f40);break;/*标识为18H的数据体内容存储在以8f40H为起始地址的EEPROM空间*/
           case 0x19:load=wirte28c64(  20,addr,0x8f1e);break;/*标识为19H的数据体内容存储在以8f1eH为起始地址的EEPROM空间*/
           case 0x1a:load=wirte28c64(   2,addr,0x8f32);break;/*标识为1aH的数据体内容存储在以8f32H为起始地址的EEPROM空间*/
           case 0x1b:load=wirte28c64(   1,addr,0x8f34);break;/*标识为1bH的数据体内容存储在以8f34H为起始地址的EEPROM空间*/
           case 0x1c:load=wirte28c64(  98,addr,(XBYTE[addr]-1)*98+0x9200);
                                                       break;/*保存多方案*/
           case 0x1d:load=wirte28c64(  72,addr,0x9FB0);break;/*标识为1dH的数据体内容存储在以9EF0H为起始地址的EEPROM空间*/
           case 0x1e:load=wirte28c64( 504,addr,0x9000);break;/*标识为1eH的数据体内容存储在以9000H为起始地址的EEPROM空间*/
           case 0x1f:load=wirte28c64(  72,addr,0x8fb0);break;/*标识为1fH的数据体内容存储在以8fb0H为起始地址的EEPROM空间*/
           case 0x25:load=wirte28c64(   2,addr,0x7F87);break;/*标识为1fH的数据体内容存储在以7F87H为起始地址的EEPROM空间*/
           case 0x20:load=wirte28c64(  65,addr,0x6780);break;/*标识为20H的数据体内容存储在以7F87H为起始地址的EEPROM空间*/
           case 0x30:load=wirte28c64(  24,addr,0x9ee8);break;/*标识为30H的数据体是每时段的相位差*/
           case 0x35:sch_update();break;                     /*接收到上位机的配时计划*/

           default  :break;                                  /*标识为30H的数据体是每时段的相位差*/
           }
}

read_dram()
{
  unsigned int flag_addr;
  unsigned char xdata *wr;
  unsigned char modi_va,i;
  unsigned int lai,length;
  unsigned int temp;
  unsigned int b_addr,e_addr;
  unsigned char MODI_FLAG;
  flag_addr=XBYTE[now_addr+1]*256+XBYTE[now_addr+2];
  XBYTE[0X7F98]=0x70;
  XBYTE[0X7F99]=0x00;
  flag_addr=flag_addr&0xafff; /*标识存储位置*/
  centrl_flag=XBYTE[flag_addr];  //数据标识
  begin_addr=flag_addr;          /*接收数据开始地址*/
  end_addr=XBYTE[now_addr+3]*256+XBYTE[now_addr+4];
  end_addr=end_addr&0xafff;      /*接收数据结束地址*/
  length=XBYTE[flag_addr+1]*256+XBYTE[flag_addr+2];
  wr=0x7000;
  for(lai=0;lai<length+3;lai++){  /*双口RAM数据 写入NVRAM*/
           temp=flag_addr+lai;
           *wr=XBYTE[temp];
           wr++;
                 }
  meeprom();       /* NVRAM数据写入28C64*/
  commu=1;
  XBYTE[now_addr]=0; /*对数据接收标志进行清零操作*/
  for(i=0;i<30;i++){
          modi_va=XBYTE[0XA024];
          if(modi_va==0)break;
                     }
  modi_va=XBYTE[0XA024];
  if(modi_va==1){
        XBYTE[0XA023]=1;
        for(i=0;i<30;i++){}
        if(XBYTE[0XA023]==1){
                b_addr=(XBYTE[0XA01F]&0XAF)*256+XBYTE[0XA020];
                e_addr=(XBYTE[0XA021]&0XAF)*256+XBYTE[0XA022];
                MODI_FLAG=0x0f;
                if(begin_addr==b_addr){
                     XBYTE[0XA01F]=end_addr/256;
                     XBYTE[0XA020]=end_addr%256;
                     MODI_FLAG=0;
                                       }else{
                                 if(end_addr==e_addr){
                                      XBYTE[0XA021]=begin_addr/256;
                                      XBYTE[0XA022]=begin_addr%256;
                                      if(MODI_FLAG==0){
                                            XBYTE[0XA01F]=0XA0;
                                            XBYTE[0XA020]=0X80;
                                            XBYTE[0XA021]=0XA0;
                                            XBYTE[0XA022]=0X80;
                                                   }
                                                      }
                                        }
                             }
                 }
  XBYTE[0XA023]=0;

}

/*
unsigned char drsend(unsigned int length,unsigned int nv_addr,unsigned int du_addr)
{

return 0;
} */



/****************************************************************************
;向双口RAM发送数据地址计算子程序DRSEND
;入口:7E00~7E01H---发送字节的长度,
;出口:7E02~7E03H---发送数据写入双口RAM的首地址(NVRAM中)
;      7E04~7E05H---存放所使用的发送数据存储区的首地址(在双口RAM中)
******************************************************************************/

drsend(unsigned int  length)   //
{
 unsigned int xdata temp,startaddr;
 unsigned char xdata i,j;
         s_buffer=XBYTE[0X7f9e];
         s_buffer=0;
         XBYTE[0X7E00]=0X00;
         XBYTE[0X7E01]=length+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;
}
/*****************************************************************
NRAM数据传送到DRAM且dram数据发送 子程序
入口:源地址R3R4中,目的地址R1R2中,数据长度R6R7中
出口:修改后目的地址R1R2中
*****************************************************************/

dramsend(nram_addr)
{  unsigned char xdata j;
   unsigned int  data startaddr;
                                    temp_addr=XBYTE[0x7e02]*256+XBYTE[0X7e03];   //R1R2
                                    tos_length=XBYTE[0X7E00]*256+XBYTE[0X7E01];
                                    temp_addr=temp_addr;
                                    for(j=0;j<tos_length;j++){
                                                      if(temp_addr+j==0xf7ff)XBYTE[temp_addr+j]=0xf07f;
                                                      XBYTE[temp_addr+j]=XBYTE[nram_addr+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])

⌨️ 快捷键说明

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