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 + -
显示快捷键?