|
多機(jī)通信說明
主機(jī)功能:按下S1,從機(jī)1燈亮;按下S2,從機(jī)1燈滅;
按下S3,從機(jī)2燈亮;按下S4,從機(jī)2燈亮;
按下key2,從機(jī)1和從機(jī)2同時(shí)燈亮;
按下key3,從機(jī)1和從機(jī)2同時(shí)燈滅;
接 線: 主機(jī)P3^0(RXD)分別接從機(jī)1和從機(jī)2的P3^1(TXD);
主機(jī)P3^1(TXD)分別接從機(jī)1和從機(jī)2的P3^0(RXD);
從機(jī)1和從機(jī)2共地;
主機(jī)P1^7接地,使矩陣鍵盤S1-S4為獨(dú)立鍵盤使用。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (25.9 KB, 下載次數(shù): 67)
下載附件
2018-3-28 03:38 上傳
0.png (49.81 KB, 下載次數(shù): 73)
下載附件
2018-3-28 03:38 上傳
單片機(jī)源程序如下:
叢機(jī)程序:
- #include<reg51.h>
- #include<string.h>
- #define addr 0x01//從機(jī)1的地址
- #define _SUCC_ 0x0f//數(shù)據(jù)傳送成功
- #define _ERR_ 0xf0//數(shù)據(jù)傳送失敗
- unsigned char aa=0xff;//主機(jī)與從機(jī)之間通信標(biāo)志
- unsigned char Buff[20];//數(shù)據(jù)緩沖區(qū)
- //串口初始化函數(shù)
- void init()
- {
- TMOD=0x20; //定時(shí)器1工作于方式2
- TH1=0xfd;
- TL1=0xfd; //波特率為9600
- PCON=0;
- SCON=0xd0; //串口工作于方式3
- TR1=1; //開啟定時(shí)器
- TI=0;
- RI=0;
- }
- //接收數(shù)據(jù)函數(shù)
- unsigned char RECE_data(unsigned char *Buff)
- {
- unsigned char i,temp;
- unsigned char lenth;
- unsigned char check;
- RI=0; //接收數(shù)據(jù)長度
- while(!RI);
- if(RB8==1) //若接收到地址幀,則返回0xfe
- return 0xfe;
- lenth=SBUF;
- RI=0;
- check=lenth;
- for(i=0;i<lenth;i++) //接收數(shù)據(jù)
- {
- while(!RI);
- if(RB8==1) //若接收到地址幀,則返回0xfe
- return 0xfe;
- Buff[i]=SBUF;
- check=check^(Buff[i]);
- RI=0;
- }
- while(!RI); //接收校驗(yàn)字節(jié)
- if(RB8==1) //若接收到地址幀,則返回0xfe
- return 0xfe;
- temp=SBUF;
- RI=0;
- check=temp^check; //將從主機(jī)接收到的校驗(yàn)碼與自己計(jì)算的校驗(yàn)碼比對
- if(check!=0) //校驗(yàn)碼不一致,表明數(shù)據(jù)接收錯(cuò)誤,向主機(jī)發(fā)送錯(cuò)誤信號,函數(shù)返回0xff
- {
- TI=0;
- TB8=0;
- SBUF=_ERR_;
- while(!TI);
- TI=0;
- return 0xff;
- }
- TI=0; //校驗(yàn)碼一致,表明數(shù)據(jù)接收正確,向主機(jī)發(fā)送成功信號,函數(shù)返回0x00
- TB8=0;
- SBUF=_SUCC_;
- while(!TI);
- TI=0;
- return 0;
- }
- void main()
- {
- init();
- while(1)
- {
- SM2=1; //接收地址幀
- while(aa!=addr) //從機(jī)等待主機(jī)請求自己的地址
- {
- RI=0;
- while(!RI);
- aa=SBUF;
- RI=0;
- }
- TI=0; //一旦被請求,從機(jī)返回自己的地址作為應(yīng)答,等待接收數(shù)據(jù)
- TB8=0;
- SBUF=addr;
- while(!TI);
- TI=0;
- SM2=0; //接收數(shù)據(jù)幀
- aa=0xff; //從機(jī)接收數(shù)據(jù),并將數(shù)據(jù)保存到數(shù)據(jù)緩沖區(qū)
- while(aa==0xff)
- {
- aa=RECE_data(Buff);
- }
- if(aa==0xfe)
- continue;
- P2=Buff[0]; //查看接收到的數(shù)據(jù)
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
51多機(jī)通信.rar
(125.2 KB, 下載次數(shù): 405)
2018-3-27 20:46 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|