#include<reg51.h> #define uchar unsigned char #define SLAVE 0x02 #define NUMB 16 uchar idata rbuffer[16] uchar idata tbuffer[16]={“master transmit”} void error(void) { SBUF=0xff; while(TI!=1); TI=0; } uchar master(uchar address,uchar cmd) { uchar status,I,count; while(1) { SBUF=SLAVE; while(TI!=1); TI=0; while(RI!=1); RI=0; if(SBUF!=address) error(); else { TB8=0; SBUF=cmd; while(TI!=1); TI=0; while(RI!=1); RI=0; status-SBUE; if((status&0x08)==0x08) { TB8=1; error(); } else { if(cornmand==0x01) { if((status&0x01)==0x01) { do { count=0; for(i=0;i<NUMB;i++) { SBUF=tbuffer[i]; count+= tbuffer[i]; while(TI!=1); TI=0; SBUF=count; while(TI==0); TI=0; while(RI==0); R1=0; } while(SBUF!=0); TB8=1; return(0); } } else { if((status&0x02)==0x02) while(1) { count=0; for(i=0;i<NUMB;i++) { while(RI!=1); RI=0; Rbuffer[i]=SBUF; count+=rbuffer[i]; while(RI==0); RI=0; If(SBUF==COUNT) { SBUF=0x00; while(TI==0); TI=0; break; } else { SBUF=0xff; while(TI==0); TI=0; } } TB8=1; return(0); } } } } void main(void) { TMOD=0x20; TL1=0xfd;THl=0xfd; PCON=0x00; TR1=1; {SCON=0xf0; master(SLAVE,0x01); master(SLAVE,0x02); } #include<reg51.h> #define uchar unsigned char #define SLAVE 0x02 #ddfine NUMB 16 uchar idata trbuffer[16]; uchar idata rebuffer[16]; bit tok; bit rok; void main(void) { TMOD=0x20; TL1=0xfd; TH1=0xfd; PCON=0x00; TR1=1; SCON=0xf0; ES=1; EA=1; while(1) { tok=1; rok=1; } } void SSIO(void) { void send(void); void receive(void); uchar a,i; RI=0; ES=0; if(SBUF!=SLAVE) { ES=1; goto reback; } SM2=0; SBUF=SLAVE; while(TI!=1); TI=0; while(RI!=1); RI=0; if(RB8==1) { SM2=1; ES=1; goto reback; } a=SBUF; if(a= 0x01) { if(rok==1) SBUF=0x01; else SBUF=0x00; while(TI!=1); TI=0; while(RI!=1); RI=0; if(RB8==1) { SM2=1; ES=1; goto reback; } receive(); } else { if(a=0x02) { if(tok==1) SBUF=0x02; else SBUF=0x00; while(TI=1); TI=0; while(RI!=1); RI=0; if(RB8==1) { SM2=1; ES=1; goto reback; } send(); } else { SBUF=0x8; while(TI!=1); TI=0; SM2=1; ES=1; } ) reback; } void send (void) ( uchar sum,i; tok=0; do { sum=0; for(i=0;i<NUMB;i++) { SBUF=trbuffer[i]; Sum+=trbuffer[i; while(TI!=1); TI=0; } SBUF=sum; while(TI==0); TI=0; while(RI==0); RI=0; } while(SBUF!=0); SM2=1; ES=1; } void receive(void) { uchar sum,i; rok=0; while(1) { sum=0; for(i=0;i<NUMB;i++) { while(RI!=1); RI=0; rebuffer[i]=SBUF; sum+=rebuffer[i]; } while(RI!=1); RI=0; if(SBUF==sum) { SBUF=0x00; break; } else SBUF=0xff; while(TI==O); TI=0; } SM2=1; ES=1; }