從機程序:http://www.zg4o1577.cn/bbs/dpj-87068-1.html
主機程序:http://www.zg4o1577.cn/bbs/dpj-87067-1.html
- #include<reg51.h>
- #include<string.h>
- #define addr 0x01//從機1的地址
- #define _SUCC_ 0x0f//數據傳送成功
- #define _ERR_ 0xf0//數據傳送失敗
- unsigned char aa=0xff;//主機與從機之間通信標志
- unsigned char Buff[20];//數據緩沖區
- //串口初始化函數
- void serial_init()
- {
- TMOD=0x20; //定時器1工作于方式2
- TH1=0xfd;
- TL1=0xfd; //波特率為9600
- PCON=0;
- SCON=0xd0; //串口工作于方式3
- TR1=1; //開啟定時器
- TI=0;
- RI=0;
- }
- //接收數據函數
- unsigned char RECE_data(unsigned char *Buff)
- {
- unsigned char i,temp;
- unsigned char lenth;
- unsigned char check;
- RI=0; //接收數據長度
- while(!RI);
- if(RB8==1) //若接收到地址幀,則返回0xfe
- return 0xfe;
- lenth=SBUF;
- RI=0;
- check=lenth;
- for(i=0;i<lenth;i++) //接收數據
- {
- while(!RI);
- if(RB8==1) //若接收到地址幀,則返回0xfe
- return 0xfe;
- Buff[i]=SBUF;
- check=check^(Buff[i]);
- RI=0;
- }
- while(!RI); //接收校驗字節
- if(RB8==1) //若接收到地址幀,則返回0xfe
- return 0xfe;
- temp=SBUF;
- RI=0;
- check=temp^check; //將從主機接收到的校驗碼與自己計算的校驗碼比對
- if(check!=0) //校驗碼不一致,表明數據接收錯誤,向主機發送錯誤信號,函數返回0xff
- {
- TI=0;
- TB8=0;
- SBUF=_ERR_;
- while(!TI);
- TI=0;
- return 0xff;
- }
- TI=0; //校驗碼一致,表明數據接收正確,向主機發送成功信號,函數返回0x00
- TB8=0;
- SBUF=_SUCC_;
- while(!TI);
- TI=0;
- return 0;
- }
- void main()
- {
- serial_init();
- while(1)
- {
- SM2=1; //接收地址幀
- while(aa!=addr) //從機等待主機請求自己的地址
- {
- RI=0;
- while(!RI);
- aa=SBUF;
- RI=0;
- }
- TI=0; //一旦被請求,從機返回自己的地址作為應答,等待接收數據
- TB8=0;
- SBUF=addr;
- while(!TI);
- TI=0;
- SM2=0; //接收數據幀
- aa=0xff; //從機接收數據,并將數據保存到數據緩沖區
- while(aa==0xff)
- {
- aa=RECE_data(Buff);
- }
- if(aa==0xfe)
- continue;
- P1=Buff[1]; //查看接收到的數據
- }
- }
復制代碼 |