照课本上的例子写的,看了感觉没问题,编译也能通过,下载到单片机上就是不好用.找了很长时间也找不出毛病。 B机(接收)程序: #include <reg51.h> #include "intrins.h" #define uchar unsigned char #define uint unsigned int #define ulong unsigned long uchar idata buf[1]; uint pf; void init1(void) //串口初始化// { TMOD=0x20; TH1=0xe8; TL1=0xe8; PCON=0x00; TR1=1; SCON=0x50; } void receive(uchar idata *d) { uchar i; do { while(RI==0); RI=0; }while((SBUF^0xaa)!=0); //判断A机发送请求// SBUF=0xbb; //发应答信号// while(TI==0); TI=0; while(1) { pf=0; for(i=0;i<16;i++) { while(RI==0); RI=0; d=SBUF; //接收数据// pf+=d; //求校验和// } while(RI==0); RI=0; if((SBUF^pf)==0) //比较校验和// { SBUF=0x00; break; } else { SBUF=0xff; //出错发FF 重新接收// while(TI==0); TI=0; } } } void main() { init1(); receive(buf); } A机(发送)程序: #include <reg51.h> #include <absacc.h> #include "intrins.h" #define uchar unsigned char #define uint unsigned int uchar idata buf[1]={0x35}; uchar ab=0; uint pf; uchar a,m,p; void init1(void) //串口初始化// { TMOD=0x20; TH1=0xe8; TL1=0xe8; PCON=0x00; TR1=1; SCON=0x50; } void send(uchar idata *d) { uchar i; do { SBUF=0xaa; //发送联络信号// while(TI==0); //等待发送成功// TI=0; while(RI==0); //等待B机// RI=0; }while((SBUF^0xbb)!=0); //B机未准备好,继续联络// do { pf=0; for(i=0;i<16;i++) { SBUF=d; //发送数据// pf+=d; while(TI==0); TI=0; } SBUF=pf; //发送校验和// while(TI==0); TI=0; while(RI==0); RI=0; }while(SBUF!=0); //B机回答出错则重发// } void main(void) { init1(); send(buf); }
|