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

📄 setbid.c

📁 ASC 信号机控制程序,国内最先进的信号机控制程序
💻 C
📖 第 1 页 / 共 3 页
字号:
#include <absacc.h>
#include <reg51.h>
#define  eeprom_addr    0x8050;
extern unsigned char receive_flag;
extern unsigned char xdata checkdata[512];
extern unsigned int check_temp;
extern unsigned int xdata tr_flagaddr;
extern unsigned char xdata second_flag;

sbit   WatchDog = P1^3;       //看门狗
unsigned char lin;
unsigned char add_transparence=0;

unsigned int add_transparence_valid=0;
unsigned int add_final_number;



unsigned char xdata data_final_number;
unsigned int xdata datanumber=0;
unsigned char xdata tempdata;
unsigned char xdata add_bit;
unsigned char xdata answer_data[310];
unsigned char xdata data_final[310];
unsigned char xdata h_address;
unsigned char xdata l_address;

extern unsigned char xdata  RX_BUF[512];
extern unsigned int xdata  head;
extern unsigned int xdata  tail;
extern unsigned int re_flagaddr;
extern unsigned int xdata data_address;
extern unsigned char xdata checkdata[512];
extern unsigned int xdata address;

extern unsigned short cal_crc(unsigned char *ptr,unsigned int len) ;
//发送数据到fpga
unsigned char tran_fpag(unsigned char flag,unsigned int len)//标志和长度
{
  unsigned int i;
  unsigned char j;
      for(i=0;i<6;i++){
           tr_flagaddr=0XA030+5*i;
           if(XBYTE[tr_flagaddr]==0x87)break;
                      }
  ///////////////////////////////////////////////////////
 // data_address=XBYTE[0XA021]<<8+XBYTE[0XA022]+1;     //当前数据区的尾地址

 // address=data_address;                              //当前数据区的尾地址偏移量
 // data_address=data_address+len;            //应答数据长度1字节
 // if(data_address>0x7f0)data_address=data_address-0x7f0+0x80;
  while((XBYTE[0xa023]==0)&&(XBYTE[0xa024]==1)){};    //等待FGPA修改头尾
  XBYTE[0xa023]=0x01;                              //CPU修改头尾
  XBYTE[0xa024]=0X00;
  data_address=(XBYTE[0XA021]<<8)+XBYTE[0XA022]+1;
  data_address=(data_address&0x7ff);
  address=data_address;                     //当前数据区的尾地址偏移量
  data_address=data_address+len;            //应答数据长度1字节
  if(data_address>0x7f0)data_address=data_address-0x7f0+0x80;
  data_address--;
  XBYTE[0XA021]=data_address>>8;          //
  XBYTE[0XA022]=data_address;
  XBYTE[0XA023]=0X00;                      //CPU修改头尾结束
  XBYTE[0XA024]=0X00;
  for(i=0;i<6;i++){
           tr_flagaddr=0XA030+5*i;
           if(XBYTE[tr_flagaddr]==0x87)break;
                      }
  if(i==6)return 1;

  XBYTE[tr_flagaddr+1]=address>>8;        //发送数据的首地址
  XBYTE[tr_flagaddr+2]=address;

  XBYTE[tr_flagaddr+3]=data_address>>8;   //发送数据的尾地址
  XBYTE[tr_flagaddr+4]=data_address;
 // XBYTE[tr_flagaddr]=0x01;
  address=address+0xa000;                 //发送应答数据
  if(address>0xa7f0)address=0xa080;
  ///////////////////////////////////////////////////
   switch(flag){
     case 0x94:if(checkdata[5]==0){
                    XBYTE[address]=0x94;
                    address++;       //  标识
                    if(address>0xa7f0)address=0xa080;
                    for(i=0;i<289;i++){
                             XBYTE[address]=XBYTE[0X5000+i];
                             address++;
                             if(address>0xa7f0)address=0xa080;
                                       }
                                   }else{
                    XBYTE[address]=0x94;
                    address++;
                    if(address>0xa7f0)address=0xa080;
                       for(i=0;i<289;i++){
                             XBYTE[address]=XBYTE[0X5121+i];
                             address++;
                             if(address>0xa7f0)data_address=0xa080;
                                         }
                    XBYTE[tr_flagaddr]=0x01;
                break;
     case 0x95: j=checkdata[5];
                j=(j-1)*98;
                XBYTE[address]=0x95;       //  标识
                address++;
                if(address>0xa7f0)address=0xa080;
                for(i=0;i<98;i++){
                             XBYTE[address]=XBYTE[0X5242+i+j];
                             address++;
                             if(address>0xa7f0)address=0xa080;
                                   }
               XBYTE[tr_flagaddr]=0x01;
                break;
     case 0x96: j=checkdata[5];
                j=(j-1)*41;
                XBYTE[address]=0x96;       //  标识
                address++;
                if(address>0xa7f0)address=0xa080;
                for(i=0;i<41;i++){
                             XBYTE[address]=XBYTE[0X5e82+i+j];
                             address++;
                             if(address>0xa7f0)address=0xa080;
                                   }
                XBYTE[tr_flagaddr]=0x01;
                break;
     case 0x97: break;
     case 0x98:j=checkdata[5];
                j=(j-1)*74;
                XBYTE[address]=0x96;       //  标识
                address++;if(address>0xa7f0)address=0xa080;
                for(i=0;i<41;i++){
                             XBYTE[address]=XBYTE[0X63a2+i+j];
                             address++;
                             if(address>0xa7f0)address=0xa080;
                                   }
                XBYTE[tr_flagaddr]=0x01;
                break;
     case 0x99: XBYTE[address]=0x99;       //  标识
                address++;
                if(address>0xa7f0)address=0xa080;
                for(i=0;i<60;i++){
                             XBYTE[address]=XBYTE[0X6ce2+i];
                             address++;
                             if(address>0xa7f0)address=0xa080;
                                   }
                XBYTE[tr_flagaddr]=0x01;
                break;
     case 0x9a: break;
     case 0x9b: break;
     case 0x9c:break;
     default:break;
              }
          }
     return 0;

}
//透明性检验
void add_transparences()
{
		switch(add_transparence)
		{
			case 0 :
				if(add_bit==1)
				{
					add_transparence=1;
                    add_transparence_valid=0;
				}
				else
				{
					add_transparence=0;
                    add_transparence_valid=0;
				}
				break;
			case 1 :
				if(add_bit==1)
				{
					add_transparence=2;
                    add_transparence_valid=0;
				}
				else
				{
					add_transparence=0;
                    add_transparence_valid=0;
				}
				break;
			case 2:
				if(add_bit==1)
				{
					add_transparence=3;
                    add_transparence_valid=0;
				}
				else
				{
					add_transparence=0;
                    add_transparence_valid=0;
				}
				break;
			case 3:
				if(add_bit==1)
				{
					add_transparence=4;
                    add_transparence_valid=0;
				}
				else
				{
					add_transparence=0;
                    add_transparence_valid=0;
				}
				break;
			case 4:
				if(add_bit==1)
				{
					add_transparence=0;
                    add_transparence_valid=1;
				}
				else
				{
					add_transparence=0;
                    add_transparence_valid=0;
				}
				break;
			}



}

//设置时间
set_time()
{
  unsigned char *p;
  unsigned short check_temp;
  unsigned char i,j;
  unsigned char beginbit=0;           ////////////////////////////////////////

  //设置时间后用
  datanumber=0;
  data_final_number=0;
  tempdata=0;
  XBYTE[0XC009]=checkdata[5];  //year
  XBYTE[0XC008]=checkdata[6];  //month
  XBYTE[0XC007]=checkdata[7];  //date
  XBYTE[0XC004]=checkdata[8];  //hour
  XBYTE[0XC002]=checkdata[9];  //min
  XBYTE[0XC000]=checkdata[10];  //sec
  XBYTE[0XC006]=checkdata[11];  //day
  //应答
  answer_data[0]=h_address;
  answer_data[1]=l_address;
  answer_data[2]=0xcc;
  answer_data[3]=0xc1;
  answer_data[4]=0xd3;
 // answer_data[5]=0x00;
  p=&answer_data[0];
  check_temp=cal_crc(p,5);
  answer_data[5]=(check_temp>>8);    //crc
  answer_data[6]=check_temp;         //crc
  answer_data[7]=0x7e;
  for(i=0;i<8;i++){
        for(j=0;j<8;j++){
           add_bit=(answer_data[i]>>(7-j))%2;
           add_transparences();
           tempdata=tempdata+(add_bit<<(7-data_final_number++));
           if((add_transparence_valid==1) && (i!=7)){ ///////////////////////////////////
                   if(data_final_number==8)beginbit=1;
                                      else data_final_number++;
                                          }      ///////////////////////////////////
           if(data_final_number>=8){             /////////////////////////////////
               if(beginbit==1){                  ////////////////////
                          data_final_number=1;   ////////////////////////
                          beginbit=0;            ////////////////////
                               }else{
                          data_final_number=0;
                                     }
                 data_final[datanumber++]=tempdata; 	  /////////////////////
	        tempdata=0;
                                    }
                         }
                    }
        if( data_final_number!=0)data_final[datanumber++]=tempdata;
        EA=0;
        SBUF=0X7E;
        while(TI==0);TI=0;
	for(i=0;i<datanumber;i++)
	{
	    SBUF=data_final[i];
            while(TI==0);TI=0;

	}EA=1;

}
//设置相位
set_phase()
{
  unsigned char *p;
  unsigned short check_temp;
  unsigned int i;
  unsigned int j,k;
  unsigned char beginbit=0;
  datanumber=0;
  data_final_number=0;
  //设置相位  0X5000
 // EA=0;

  if(checkdata[5]==0){
     for(i=0;i<289;i++){
           XBYTE[0X5000+i]=checkdata[5+i];
           k=eeprom_addr;
           k=k+i;
           XBYTE[k]=checkdata[5+i];
           k=0;
           do{k++;WatchDog = !WatchDog;}while(k<800);
           }
                  }else{
          for(i=0;i<289;i++){
             XBYTE[0X5121+i]=checkdata[5+i];
             k=eeprom_addr;
             k=k+0x121+i;
             XBYTE[k]=checkdata[5+i];
             k=0;
             do{k++;WatchDog = !WatchDog;}while(k<800);
                             }
                        }
  //EA=1;
  //应答
  answer_data[0]=h_address;
  answer_data[1]=l_address;
  answer_data[2]=0xcc;
  answer_data[3]=0xc1;
  answer_data[4]=0xd4;

  p=&answer_data[0];
  check_temp=cal_crc(p,5);
  answer_data[5]=(check_temp>>8);    //crc
  answer_data[6]=check_temp;         //crc
  answer_data[7]=0x7e;

  for(i=0;i<8;i++){
        for(j=0;j<8;j++){
           add_bit=(answer_data[i]>>(7-j))%2;
           add_transparences();
           tempdata=tempdata+(add_bit<<(7-data_final_number++));
           if((add_transparence_valid==1) && (i!=7)){ ///////////////////////////////////
                   if(data_final_number==8)beginbit=1;
                                      else data_final_number++;
                                          }      ///////////////////////////////////
           if(data_final_number>=8){             /////////////////////////////////
               if(beginbit==1){                  ////////////////////
                          data_final_number=1;   ////////////////////////
                          beginbit=0;            ////////////////////
                               }else{
                          data_final_number=0;
                                     }
                 data_final[datanumber++]=tempdata; 	  /////////////////////
	        tempdata=0;
                                    }
                         }
                    }
        if( data_final_number!=0)data_final[datanumber++]=tempdata;
        EA=0;
        SBUF=0X7E;
        while(!TI);TI=0;
	for(i=0;i<datanumber;i++)
	{
	   SBUF=data_final[i];
            while(!TI);TI=0;
	}
         EA=1;
   //更改FPGA数据内容
      tran_fpag(0x94,290);
}
//设置阶段表
set_stage()
{
  unsigned char *p;
  unsigned short check_temp;

  unsigned int i;
  unsigned int j,k;
  unsigned char beginbit=0;
  datanumber=0;
  data_final_number=0;
  //设置阶段表
  j=(checkdata[5]-1)*98;
  for(i=0;i<98;i++){
          XBYTE[0X5242+i+j]=checkdata[5+i];  //一个阶段表写入
          k=eeprom_addr;
          k=k+0x242+i+j;
          XBYTE[k]=checkdata[5+i];
          k=0;
          do{k++;WatchDog = !WatchDog;}while(k<800);
                    }
  //应答
  answer_data[0]=h_address;
  answer_data[1]=l_address;
  answer_data[2]=0XCC;
  answer_data[3]=0XC1;
  answer_data[4]=0XD5;
  p=&answer_data[0];
  check_temp=cal_crc(p,5);
  answer_data[5]=(check_temp>>8);    //crc
  answer_data[6]=check_temp;         //crc
  answer_data[7]=0x7e;

  for(i=0;i<8;i++){
        for(j=0;j<8;j++){
           add_bit=(answer_data[i]>>(7-j))%2;
           add_transparences();
          // if((add_transparence_valid==1) && (i!=17))data_final_number++;
           tempdata=tempdata+(add_bit<<(7-data_final_number++));
           if((add_transparence_valid==1) && (i!=7)){ ///////////////////////////////////
                   if(data_final_number==8)beginbit=1;
                                      else data_final_number++;
                                          }      ///////////////////////////////////
           if(data_final_number>=8){             /////////////////////////////////
               if(beginbit==1){                  ////////////////////
                          data_final_number=1;   ////////////////////////
                          beginbit=0;            ////////////////////
                               }else{
                          data_final_number=0;
                                     }
                 data_final[datanumber++]=tempdata; 	  /////////////////////
	        tempdata=0;
                                    }
                         }
                    }
        if( data_final_number!=0)data_final[datanumber++]=tempdata;
        EA=0;
        SBUF=0X7E;
        while(!TI);TI=0;
	for(i=0;i<datanumber;i++)
	{
	    SBUF=data_final[i];
            while(!TI);TI=0;
	}
        EA=1;
        tran_fpag(0x95,99);
}
//设置当前方案
set_project()
{
  unsigned char *p;
  unsigned short check_temp;

  unsigned int i,k;
  unsigned int j;
  unsigned char beginbit=0;
  data_final_number=0;
  datanumber=0;
  //设置当前方案
  j=(checkdata[5]-1)*41;

⌨️ 快捷键说明

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