/*接受到的数据分别放在600到606个单元*/ /*协议如下 采用相同的波特率,双方约定,发送时,先发送一个呼叫信号(0x06) 以询问接受机是否可以接受数据,接受机收到呼叫信号后,若同意接受数据则回 发0x00作为答应信号,表示可以接受数据,否则回发0x05,表示暂不能接受数据 发送机只有在接收到接收机发回的答应信号0x00后才能将数据统一发送到接收机, 否则不断想接收机发送呼叫信号,直到接收到接收机发回的0x00的应答信号. 若接受正确,向发送机回发0x0f信号,表示正确,否则发送0xf0,表示接受到的数据出现了错误 */ void serial(void) interrupt 4 using 3 { uchar i=6; total_t=0x00; ramdata=0x600; while(1) { while(1) //等待接受呼叫信号 { if(RI) break; else ; } RI=0; if(SBUF==0x06) break; else { SBUF=0x05; //不允许接受 TI=0; } } SBUF=0x00; //允许接受 while(1) { if(RI) break; else ; } total_t=SBUF; RI=0; while(1) { while(1) { if(RI) break; else ; } RI=0; *ramdata=SBUF; ramdata++; total_t=(total_t+SBUF);//求累加和 i--; if(i==0) { ramdata=0x0600; break; } } //数据发送完 while(1) //等待接收校验和 { if(RI) break; else ; } RI=0; if(total_t==SBUF) //判断数据是否发送正确 { SBUF=0x0f; //数据正确则发回0x0f; TI=0; while(1) { if(TI) break; else ; } TI=0; } else //若错误 { SBUF=0xf0; //错误怎么发回0xf0 while(1) { if(TI) break; else ; } TI=0; // 从新接收 } } /****************************************************************/ /* 发送子函数*/ /*发送的数据是从1000到1006单元*/ void txaddr(void) { uchar i=6; total_t1=0x00; ramdata1=0x1000; while(1) { SBUF=0x06; //发送呼叫信号0x06 while(1) //等待发送完信号. { if(TI) break; else ; } TI=0; while(1) //等待回答信号 { if(RI) break; else ; } RI=0; if(SBUF==0x00) //判断回答信号,否则重新发送 break; else ; } while(1) { SBUF=*ramdata1; while(1) { if(TI) break; else ; } TI=0; total_t1=(total_t1+SBUF);//求累加和 ramdata1++; i--; if(i==0) break; } SBUF=total_t1; while(1) //等待发完 { if(TI) break; else ; } TI=0; RI=0; while(1) //等待接收机回答 { if(RI) break; else ; } RI=0; if(SBUF==0x0f) //判断传输是否正确 ; else ; //需要从新发送 } void main(void) { SCON=0x90; RCLK=1; TCLK=1; RCAP2H=0xff;//产生9.6K波特率 RCAP2L=0xd9; TR2=1; txaddr(); } |