|
功能說(shuō)明:主機(jī)功能:按下key1,從機(jī)1燈亮,lcd顯示從機(jī)1發(fā)送的數(shù)據(jù),按下key2,從機(jī)1燈。按下key3,從機(jī)2燈亮,lcd顯示從機(jī)2發(fā)送的數(shù)據(jù);按下key4,從機(jī)2燈滅,按下key5,從機(jī)1和從機(jī)2燈滅;按下key6,從機(jī)1和從機(jī)2燈滅;
proteus仿真圖:
主機(jī)部分單片機(jī)代碼:
- /*******************************************************************************
- * 標(biāo)題: 多機(jī)通信 *
- * 時(shí)間 2019年3月11日16:14:33 *
- * *
- * 實(shí)驗(yàn)說(shuō)明:主機(jī)功能:按下key1,從機(jī)1燈亮,lcd顯示從機(jī)1發(fā)送的數(shù)據(jù),按下key2, *
- 從機(jī)1燈。按下key3,從機(jī)2燈亮,lcd顯示從機(jī)2發(fā)送的數(shù)據(jù);按下key4,從機(jī)2燈滅,按下*
- key5,從機(jī)1和從機(jī)2燈滅;按下key6,從機(jī)1和從機(jī)2燈滅; *
- ********************************************************************************
- * 實(shí)驗(yàn)心得:1.例如發(fā)送的字符串?dāng)?shù)組是buff[]={0x01,0x02,0x03},那么接收端前三位收到*
- 的數(shù)據(jù)就是0x01,0x02,0x03,之后也是有數(shù)據(jù)發(fā)送過(guò)來(lái),但是數(shù)據(jù)的值不是字符串賦的值 *
- 2.check=check^Buff[i];這句話的意思是check和buff的值進(jìn)行二進(jìn)制或與,相同為0, *
- 不同為1,按這個(gè)進(jìn)行主機(jī)與從機(jī)數(shù)據(jù)的校驗(yàn) *
- ********************************************************************************/
- #include<reg51.h>
- #include<string.h>
- #include "lcd.h"
- #define _SUCC_ 0x0f//數(shù)據(jù)傳送成功
- #define _ERR_ 0xf0//數(shù)據(jù)傳送失敗
- unsigned char aa=0xff;//主機(jī)與從機(jī)之間通信標(biāo)志
- unsigned char temp=0xff;
- unsigned char Buff[20];//數(shù)據(jù)緩沖區(qū)
- unsigned char recive[6]; //用于保存從機(jī)發(fā)送的數(shù)據(jù)
- sbit KEY1=P1^3;
- sbit KEY2=P1^2;
- sbit KEY3=P1^1;
- sbit KEY4=P1^0;
- sbit KEY5=P3^2;
- sbit KEY6=P3^3;
- //sbit KEY5=P1^4;
- //sbit KEY6=P1^5;
- //延時(shí)1ms函數(shù)
- void delay_1ms(unsigned int i)
- {
- unsigned int x,y;
- for(x=i;x>0;x--)
- for(y=110;y>0;y--);
- }
- //串口初始化函數(shù)
- void init()
- {
- TMOD=0x20; //定時(shí)器1工作于方式2
- TH1=0xfd;
- TL1=0xfd; //波特率為9600
- PCON=0;
- SCON=0xd0; //串口工作于方式3
- TR1=1; //開(kāi)啟定時(shí)器
- TI=0;
- RI=0;
- }
- //發(fā)送數(shù)據(jù)函數(shù)
- void SEND_data(unsigned char *Buff)
- {
- unsigned char i,lenth,check;
- lenth=strlen(Buff); //計(jì)算數(shù)據(jù)長(zhǎng)度
- check=lenth;
- TI=0; //發(fā)送數(shù)據(jù)長(zhǎng)度
- TB8=0; //發(fā)送數(shù)據(jù)幀
- SBUF=lenth;
- while(!TI);
- TI=0;
-
- for(i=0;i<lenth;i++) //發(fā)送數(shù)據(jù)
- {
- check=check^Buff[i];
- TB8=0;
- SBUF=Buff[i];
- while(!TI);
- TI=0;
- }
- TB8=0; //發(fā)送校驗(yàn)字節(jié)
- SBUF=check;
- while(!TI);
- TI=0;
- }
- //接收數(shù)據(jù)函數(shù)
- unsigned char RECE_data(unsigned char *Buff)
- {
- unsigned char i;
- unsigned char lenth;
- unsigned char check;
- RI=0; //接收數(shù)據(jù)長(zhǎng)度
- while(!RI);
- if(RB8==1)
- {
- RI = 0;
- return 0xfe; //若接收到地址幀,則返回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)碼比對(duì)
- if(check!=0) //校驗(yàn)碼不一致,表明數(shù)據(jù)接收錯(cuò)誤,向主機(jī)發(fā)送錯(cuò)誤信號(hào),函數(shù)返回0xff
- {
- TI=0;
- TB8=0;
- SBUF=_ERR_;
- while(!TI);
- TI=0;
- return 0xff;
- }
- TI=0; //校驗(yàn)碼一致,表明數(shù)據(jù)接收正確,向主機(jī)發(fā)送成功信號(hào),函數(shù)返回0x00
- TB8=0;
- SBUF=_SUCC_;
- while(!TI);
- TI=0;
- return 0;
- }
- //發(fā)送從機(jī)地址
- void ADDR_data(unsigned addr)
- {
- while(temp!=addr) //主機(jī)等待從機(jī)返回其地址作為應(yīng)答信號(hào)
- {
- TI=0; //發(fā)送從機(jī)地址
- TB8=1; //發(fā)送地址幀
- SBUF=addr;
- while(!TI);
- TI=0;
-
- RI=0;
- while(!RI);
- temp=SBUF;
- RI=0;
- }
- }
- void keyscan()
- {
-
- if(KEY1==0)
- {
- delay_1ms(5);
- if(KEY1==0)
- {
- while(!KEY1);
- ADDR_data(0x01);//發(fā)送從機(jī)地址
- temp=_ERR_; //主機(jī)等待從機(jī)數(shù)據(jù)接收成功信號(hào)
- while(temp!=_SUCC_)
- {
- unsigned char Buff[]={0xfe};
- SEND_data(Buff);//發(fā)送數(shù)據(jù)
- RI=0;
- while(!RI);
- temp=SBUF;
- RI=0;
- }
- SM2=0; //接收數(shù)據(jù)幀
- aa=0xff; //從機(jī)接收數(shù)據(jù),并將數(shù)據(jù)保存到數(shù)據(jù)緩沖區(qū)
- while(aa==0xff)
- {
- aa=RECE_data(Buff);
- P0 = 0xff;
- }
- P0 = 0xfe;
- recive[0] = Buff[0];
- recive[1] = Buff[1];
- recive[2] = Buff[2];
-
- }
- }
- if(KEY2==0)
- {
- delay_1ms(5);
- if(KEY2==0)
- {
- while(!KEY2);
- ADDR_data(0x01);
- temp=_ERR_; //主機(jī)等待從機(jī)數(shù)據(jù)接收成功信號(hào)
- while(temp!=_SUCC_)
- {
- unsigned char Buff[]={0xff};
- SEND_data(Buff);
- RI=0;
- while(!RI);
- RI=0;
- temp=SBUF;
- }
- }
- }
- if(KEY3==0)
- {
- delay_1ms(5);
- if(KEY3==0)
- {
- while(!KEY3);
- ADDR_data(0x02);
- temp=_ERR_; //主機(jī)等待從機(jī)數(shù)據(jù)接收成功信號(hào)
- while(temp!=_SUCC_)
- {
- unsigned char Buff[]={0xfe};
- SEND_data(Buff);
- RI=0;
- while(!RI);
- temp=SBUF;
- RI=0;
- }
- SM2=0; //接收數(shù)據(jù)幀
- aa=0xff; //從機(jī)接收數(shù)據(jù),并將數(shù)據(jù)保存到數(shù)據(jù)緩沖區(qū)
- while(aa==0xff)
- {
- aa=RECE_data(Buff);
- P0 = 0xff;
- }
- P0 = 0xfe;
- recive[3] = Buff[0];
- recive[4] = Buff[1];
- recive[5] = Buff[2];
- }
- }
- if(KEY4==0)
- {
- delay_1ms(5);
- if(KEY4==0)
- {
- while(!KEY4);
- ADDR_data(0x02);
- temp=_ERR_; //主機(jī)等待從機(jī)數(shù)據(jù)接收成功信號(hào)
- while(temp!=_SUCC_)
- {
- unsigned char Buff[]={0xff};
- SEND_data(Buff);
- RI=0;
- while(!RI);
- temp=SBUF;
- RI=0;
- }
- }
- }
- if(KEY5==0)
- {
- delay_1ms(5);
- if(KEY5==0)
- {
- while(!KEY5);
- ADDR_data(0x01);
- temp=_ERR_; //主機(jī)等待從機(jī)數(shù)據(jù)接收成功信號(hào)
- while(temp!=_SUCC_)
- {
- unsigned char Buff[]={0xff};
- SEND_data(Buff);
- RI=0;
- while(!RI);
- temp=SBUF;
- RI=0;
- }
- ADDR_data(0x02);
- temp=_ERR_; //主機(jī)等待從機(jī)數(shù)據(jù)接收成功信號(hào)
- while(temp!=_SUCC_)
- {
- unsigned char Buff[]={0xff};
- SEND_data(Buff);
- RI=0;
- while(!RI);
- temp=SBUF;
- RI=0;
- }
- }
- }
- if(KEY6==0)
- {
- delay_1ms(5);
- if(KEY6==0)
- {
- while(!KEY6);
- ADDR_data(0x01);
- temp=_ERR_; //主機(jī)等待從機(jī)數(shù)據(jù)接收成功信號(hào)
- while(temp!=_SUCC_)
- {
- unsigned char Buff[]={0xff};
- SEND_data(Buff);
- RI=0;
- while(!RI);
- temp=SBUF;
- RI=0;
- }
- ADDR_data(0x02);
- temp=_ERR_; //主機(jī)等待從機(jī)數(shù)據(jù)接收成功信號(hào)
- while(temp!=_SUCC_)
- {
- unsigned char Buff[]={0xff};
- SEND_data(Buff);
- RI=0;
- while(!RI);
- temp=SBUF;
- RI=0;
- }
- }
- }
- }
- void main()
- {
- init();
- LcdInit(); //初始化LCD1602
- LcdWriteCom(0x01);
- while(1)
- {
- keyscan();
- LcdWriteData(recive[0]);
- LcdWriteData(recive[1]);
- LcdWriteData(recive[2]);
- LcdWriteData(recive[3]);
- LcdWriteData(recive[4]);
- LcdWriteData(recive[5]);
- LcdWriteCom(0x80);
- }
- }
復(fù)制代碼 從機(jī)1部分代碼:
從機(jī)2部分代碼:
全套代碼可以下載附件
注意這個(gè)仿真只能用Proteus7.8版本打開(kāi),經(jīng)過(guò)測(cè)試其他版本均無(wú)反應(yīng):
多機(jī)通信-1602顯示從機(jī)信息.zip
(194.84 KB, 下載次數(shù): 137)
2019-3-11 16:43 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|