distm.c

来自「一个分选系统的软件:用SmallRtos操作系统」· C语言 代码 · 共 852 行 · 第 1/2 页

C
852
字号
}
        
void page_buffer2_trans(uint16 page)
{ 
        eerom_start();
	spi_writebits(0x55,8);
	spi_writebits(0x00,3);
	spi_writebits((uint8)(page>>8),4);
	spi_writebits((uint8)(page),8);
	spi_writebits(0x00,4);
	spi_writebits(0x00,5);
	CS0=1;
	delay(400);
}	
			
void bytes_write(uint8 n)
{/*byteaddr:一页内的字节地址.pa:页地址。n:写字节长度 12bit*/
/*写数据时可同时读操作*/
	uint16 count;//highbyte,
	//uchar lowbyte,i;
	
	count=byteaddr0;
	byteaddr0+=n;
	//if(byteaddr0>0xfe){byteaddr0=0;count=0;mon++;}//a page
	//if(mon>0x0fff) mon=1;                       //4096 page
     	sp=&ram0;
	sp0=&ram1;//pa=0;

     buffer1write(0x100,0);//byte lenths=0x100
     delay(400);
     buffer1topageprogerase(mon);//mon6m7d
     //AutoProgViaBuffer1(0x00,20);
     delay(400);
 
     page_buffer2_trans(mon);//pageaddr
     delay(400);
     buffer2_read(0x107,0);
     //lowbyte=mon;
     //highbyte=mon>>8;
if(mon>0x0ff){
	_nop_();}
	if(byteaddr0>0xfe){byteaddr0=0;count=0;mon++;}//a page
	if(mon>0x0fff) mon=1;                       //4096 page

     pa=mon;
     *(&pa+1)=mon>>8;
	sp=&pa; 
	buffer1write(2,260);
	delay(400);//buffertopateprogerase(1);       
     buffer1topageprogerase(0);	//pageaddr
     delay(400);
	//pageprogviabuf1(1,0x104,2);     

}
void selct_page_addr(void)
{uint8 lowbyte,highbyte;
        	sp0=&pa;
     page_buffer2_trans(0);//pageaddr
     delay(400);
     buffer2_read(2,260);
     delay(400);
     highbyte=pa;
     lowbyte=*(&pa+1);
     mon=highbyte+(lowbyte<<8);
}
void storage(void)
{//num_in应该存到EEPROM
	uint8 i,j;
	//sp=&ram0;
        j=cjtemp+6;
        read_date();
        read_time();
	     memdata[cjtemp]=date[0];
	     memdata[cjtemp+1]=date[1];
	     memdata[cjtemp+2]=date[2];
	     memdata[cjtemp+3]=date[3];
	     memdata[cjtemp+4]=date[4];
	     memdata[cjtemp+5]=date[5];
	     for(i=0;i<j;i++){
	     	*(sp+num_in)=memdata[i];num_in++;
	     	if(num_in>0xff){
	     	         bytes_write(0xff);
	     	         num_in=0;
	     	         sp=&ram0;}
	     	   }
             cjtemp=0;//variable=0;//04/10/18
             //andata10=andata00;
             //andata11=andata01;
             
             //old_out=out_xdata;
}
void serial_INT(void) interrupt 4 using 2
{
    uint8 i;

    if(TI){trans_over=1;TI=0;}

    if(RI){
	i=SBUF;
	if(!head00_over){
	    if(i==0xfc){ head00_over=1;}}
	//else if(!head01_over){if(i==0xfc){head01_over=1;}}    
	else if(!head02_over){ //re0_c=0;
	             if(i==0x33){rcv_inf00=7;head02_over=1;}
	             else if(i==0x01){head02_over=1;rcv_inf00=1;}
	             else if(i==0x02){rcv_inf00=2;head00_over=0;head01_over=0;head02_over=0;}
	             else if(i==0x03){head02_over=1;rcv_inf00=3;}
	             else if(i==0x04){head02_over=1;rcv_inf00=4;}
	             else if(i==0x05){rcv_inf00=5;head00_over=0;head01_over=0;head02_over=0;}
	             else{ if(i==0x06){rcv_inf00=6;head00_over=0;head01_over=0;head02_over=0;}}}
						
	else{
	       if(rcv_inf00==0x07){
	      	               rx[re0_c]=i;re0_c++;rcv_flag=0;noinf_4s=0;
	      	               if(re0_c>=5){rcv_inf01=7;re0_c=0;
	                     head00_over=0;head01_over=0;head02_over=0;}}
	       else if(rcv_inf00==0x01){date[re0_c]=i;re0_c++;
	            if(re0_c==6){head00_over=0;head01_over=0;head02_over=0;
	                 rcv_inf01=1;re0_c=0;}}
	       else if(rcv_inf00==0x03){lenth[re0_c]=i;re0_c++;
	             if(re0_c>=4){rcv_inf01=2;re0_c=0;
	                     head00_over=0;head01_over=0;head02_over=0;}}
	       else if(rcv_inf00==0x04){date[0]=i;rcv_inf01=3;head00_over=0;head01_over=0;head02_over=0;}}
	RI=0;
	}
}
void send_y_h(void)
{uint8 i;
         read_date();read_time();
         if(rcv_inf00==0x02){
         	rcv_inf00=0;
         while(!trans_over){}
         SBUF=0xfc;trans_over=0;
         while(!trans_over){}
         SBUF=0x02;trans_over=0;
         
         for(i=0;i<6;i++){
         while(!trans_over){}
         SBUF=date[i];
         trans_over=0;}}
         if(rcv_inf10==0x02){
         	rcv_inf10=0;
        	while((UARTLSR&0x60)==0){}
        	UARTTHR=0xfc;
        	while((UARTLSR&0x60)==0){}
        	UARTTHR=0xfc;
                for(i=0;i<6;i++){

        	while((UARTLSR&0x60)==0){}
        	UARTTHR=date[i];}}
         
}
void send_inf(void)
{
	uint16 i,j,start_octet,end_octet;
	lenth[2]=BCD_D(lenth[2]);
	lenth[3]=BCD_D(lenth[3]);
	start_octet=(lenth[0]<<8)+lenth[1];
	end_octet=start_octet+(lenth[2]<<8)+lenth[3];
	if(rcv_inf01==0x02){
		rcv_inf01=0;
	 while(!trans_over){}
         SBUF=0xfc;trans_over=0;
         while(!trans_over){}
         SBUF=0x03;trans_over=0;

	for(i=start_octet;i<end_octet;i++){
        page_buffer2_trans(i);
        delay(400);
        buffer2_read(0x107,0);
      delay(400);//可修改
        for(j=0;j<0x107;j++){
        	while(!trans_over){}
        	SBUF=*(sp0+j);trans_over=0;
        	}}
        }
        if(rcv_inf11==0x02){
        	rcv_inf11=0;
        	while((UARTLSR&0x60)==0){}
        	UARTTHR=0xfc;
        	while((UARTLSR&0x60)==0){}
        	UARTTHR=0x03;
	for(i=start_octet;i<end_octet;i++){
        page_buffer2_trans(i);
        delay(400);
        buffer2_read(0x107,0);
      delay(400);//可修改
        for(j=0;j<0x107;j++){
        	while((UARTLSR&0x60)==0){}
        	UARTTHR=*(sp0+j);
        	}}
        }
	
}         
void T0_INT(void) interrupt 1 using 3
{//0xf000 is alarm,6k out.83.333us
	TH0=0xff;
	TL0=0xb3;
	if(wave00){
		P14=!P14;
		//P15=!P15;
		}
	     else{
	     P14=1;P15=1;}
	if(wave01){
		P16=!P16;
		//P17=!P17;
		}
	     else{
	     P16=1;P17=1;}
	tt++;
	if(tt>0x5dc0){tt=0;time_2s=1;}
	if(rcv_flag){
		noinf_4s++;}//2004/10/13
	if(noinf_4s>0xbb80){noinf_4s=0;//bb80 4s若4秒无信息传来则落下所有继电器
	                wave00=0;wave01=0;
	                }
}
void EX_INT0(void) interrupt 0   using 2
{
    uint8 i,j,k;

	i=UARTRBR;
	j=UARTIIR;
	k=UARTLSR;
	//if((UARTLSR & 0x1a) != 0){
             
	if(!head10_over){
	    if(i==0xfc){ head10_over=1;}}
	else if(!head11_over){if(i==0xfc){head11_over=1;}}    
	else if(!head12_over){ re1_c=0;
	             if(i==0x01){head12_over=1;rcv_inf10=1;}
	             else if(i==0x02){head12_over=1;rcv_inf10=2;
	                              head10_over=0;head11_over=0;head12_over=0;}
	             else{ if(i==0x03){head12_over=1;rcv_inf10=3;}}}
	else{					
	if(rcv_inf10==0x01){date[re1_c]=i;re1_c++;
	            if(re1_c>=6){head10_over=0;head11_over=0;head12_over=0;
	                 rcv_inf11=1;}}
	      if(rcv_inf10==0x03){lenth[re1_c]=i;re1_c++;
	             if(re1_c>=4){rcv_inf11=2;
	                     head10_over=0;head11_over=0;head12_over=0;}}}
	
       //}
    //MR=1;
 
}
void out_6k(void)
{
	uint8 highbyte,lowbyte;
	uint16 condat0;
	pbuf=&rx[0];
      	        condat0=getcrccode(pbuf,3);
      	        lowbyte=condat0&0x00ff;
      	        highbyte=condat0>>8;
      	        if((lowbyte==rx[3])&&(highbyte==rx[4])){
      	        	if((rx[0]==0x44)&&(rx[1]==0x55)&&(rx[2]==0x66)){
      	        		wave00=1;wave01=0;
      	        	}
      	        	if((rx[0]==0x77)&&(rx[1]==0x88)&&(rx[2]==0x99)){
      	        		wave00=0;wave01=1;
      	        	}
      	        	if((rx[0]==0xaa)&&(rx[1]==0xbb)&&(rx[2]==0xcc)){
      	        		wave00=0;wave01=0;
      	        	}
      	        }
}      	        	
      	        	      	        		
void trans_x1x2(void)
{
uint8 temp0,temp1,i,j,highbyte,lowbyte;
	uint16 condat0;
	temp0=out_xdata&0x03;
	temp1=old_out&0x03;
	//temp2=out_xdata&0x30;//2004/10/9
	//temp3=out_xdata&0xc0;//2004/10/9
	i=temp0^temp1;
	if((i!=0)||(time_2s==1)){time_2s=0;
	      while(!trans_over){}
              SBUF=0xfc;trans_over=0;
              while(!trans_over){}
              SBUF=0x33;trans_over=0;

           if(((out_xdata&0x03)==0x01)&&((out_xdata&0xf0)==0x00)){//2004/10/09
           //if((out_xdata&0x03)==0x01){
           	tx[0]=0x44;
           	tx[1]=0x55;
           	tx[2]=0x66;
           	pbuf=&tx[0];
				condat0=getcrccode(pbuf,3);
				lowbyte=condat0&0x00ff;
				highbyte=condat0>>8;
				tx[3]=lowbyte;
				tx[4]=highbyte;
           for(j=0;j<5;j++){	
                while(!trans_over){}
                SBUF=tx[j];trans_over=0;}}
           if(((out_xdata&0x03)==0x02)&&((out_xdata&0xf0)==0x00)){//2004/10/09
           //if((out_xdata&0x03)==0x02){
           	tx[0]=0x77;
           	tx[1]=0x88;
           	tx[2]=0x99;
           	pbuf=&tx[0];
      	        condat0=getcrccode(pbuf,3);
      	        lowbyte=condat0&0x00ff;
      	        highbyte=condat0>>8;
      	        tx[3]=lowbyte;
      	        tx[4]=highbyte;
           for(j=0;j<5;j++){	
                while(!trans_over){}
                SBUF=tx[j];trans_over=0;}}
           if((out_xdata&0x03)==0x00){
           	tx[0]=0xaa;
           	tx[1]=0xbb;
           	tx[2]=0xcc;
           	pbuf=&tx[0];
      	        condat0=getcrccode(pbuf,3);
      	        lowbyte=condat0&0x00ff;
      	        highbyte=condat0>>8;
      	        tx[3]=lowbyte;
      	        tx[4]=highbyte;
           for(j=0;j<5;j++){	
                while(!trans_over){}
                SBUF=tx[j];trans_over=0;}}
           old_out=out_xdata;
              while(!trans_over){}
              SBUF=out_xdata;trans_over=0;
           }              
        	

}	
void pick(void)
{uint8 i,j,k;
	cj_50hz();
	cj_6k();
	anly_50hz(0);
	andata00=mdtra;
	anly_50hz(8);
	andata01=mdtra;
	anly_6k(16);
	out_xdata=mdtra;
	
	i=andata00^andata10;
	j=andata01^andata11;
	k=out_xdata^old_out;
	if(i!=0){
		memdata[cjtemp]=andata00;
		memdata[cjtemp+1]=0x66;
		cjtemp+=2;
		storage();
		andata10=andata00;}
	if(j!=0){
		memdata[cjtemp]=andata01;
		memdata[cjtemp+1]=0x77;
		cjtemp+=2;
		storage();
		andata11=andata01;}
	if(k!=0){
		memdata[cjtemp]=out_xdata;
		memdata[cjtemp+1]=0x88;
		cjtemp+=2;
		storage();}
		//old_out=out_xdata;}
}	
void cj_50hz(void)
{//40ms采集两个周期
	uint8 i,j;
	for(i=0;i<40;i++){
		mdtra=cjdata0;
		transform(0);
		mdtra=cjdata1;
		transform(8);
		//mdtra=cjdata2;
		//transform(16);
		for(j=0;j<152;j++)_nop_();
	}
}	
void cj_6k(void)
{//一周期166.7us采4次,每次用39.0625US,共采9.375周期39*40=1.56ms
	uint8 i;
	for(i=0;i<40;i++){
		mdtra=cjdata3;
		transform(16);
		}
}

void transform(uint8 temp)
{
	
	if(si0) ++aiha[temp];
	if(si1) ++aiha[temp+1];
	if(si2) ++aiha[temp+2];
	if(si3) ++aiha[temp+3];
	if(si4) ++aiha[temp+4];
	if(si5) ++aiha[temp+5];
	if(si6) ++aiha[temp+6];
	if(si7) ++aiha[temp+7];
	//mdtra=0;
}	
uint8 anly_50hz(uint8 temp)
{
	
	if((15<aiha[temp]) && (aiha[temp]<41))si0=1;else{si0=0;}
	if((15<aiha[temp+1]) && (aiha[temp+1]<41))si1=1;else{si1=0;}
	if((15<aiha[temp+2]) && (aiha[temp+2]<41))si2=1;else{si2=0;}
	if((15<aiha[temp+3]) && (aiha[temp+3]<41))si3=1;else{si3=0;}
	if((15<aiha[temp+4]) && (aiha[temp+4]<41))si4=1;else{si4=0;}
	if((15<aiha[temp+5]) && (aiha[temp+5]<41))si5=1;else{si5=0;}
	if((15<aiha[temp+6]) && (aiha[temp+6]<41))si6=1;else{si6=0;}
	if((15<aiha[temp+7]) && (aiha[temp+7]<41))si7=1;else{si7=0;}
	return(mdtra);
}
uint8 anly_6k(uint8 temp)
{
	if((30<aiha[temp]) && (aiha[temp]<=40))si0=1;else{si0=0;}		
	if((30<aiha[temp+1]) && (aiha[temp+1]<=40))si1=1;else{si1=0;}	
	si2=0;si3=0;
	if(aiha[temp+7]==40)si4=1;else{si4=0;}
	if(aiha[temp+6]==40)si5=1;else{si5=0;}
	if(aiha[temp+5]==40)si6=1;else{si6=0;}
	if(aiha[temp+4]==40)si7=1;else{si7=0;}
	return(mdtra);
}	


⌨️ 快捷键说明

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