|
485雙全工通信,4個文件夾包含四個仿真和源代碼,資源比較少哦
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (23.08 KB, 下載次數(shù): 69)
下載附件
2021-3-6 22:23 上傳
單片機(jī)源程序如下:
- #include <reg51.h>
- #include <absacc.h>
- #define TR 1
- #define uchar unsigned char
- #define uint unsigned int
- uchar idata buf[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09}; //從機(jī)1發(fā)送的數(shù)據(jù)
- uchar idata buf1[10]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x09}; //從機(jī)2發(fā)送的數(shù)據(jù)
- uchar idata buf2[3]; //接受從機(jī)的數(shù)據(jù)
- uchar data1,data2,data3;
- uchar pf,addr,TRR,count,count1;
- uchar flag,flag1,flag2=3;
- uchar i;
- sbit key1=P2^0;
-
- /************延時程序************/
- void delay(uchar k)
- {
- uchar j;
- while((k--)!=0)
- {
- for(j=0;j<125;j++)
- {;}
- }
- }
- void init(void)
- {
- TMOD=0x20;
- TH1=0xfd;
- TL1=0xfd;
- PCON=0x00;
- TR1=1;
- SCON=0xd0;
- }
- void send(uchar addr,uchar TRR)
- {
-
-
- TB8=1;
- key1=1; //TB8置1
- SBUF=addr; //發(fā)送從機(jī)的地址
- while(TI==0)
- {
- ;
- }
- TI=0;
- key1=0;
- while(RI==0)
- {
- ;
- }
- data1=SBUF; //接受從機(jī)地址并檢驗
- RI=0;
- if(data1!=addr) //從機(jī)地址有錯誤
- {
- flag2=0;
-
- }
- else{ //從機(jī)地址正確--------是發(fā)送數(shù)據(jù)標(biāo)志0X01
- if(TRR==0x01)
- {
- TB8=0; //TB8置0
- key1=1;
- SBUF=TRR;
- while(TI==0)
- {
- ;
- }
- TI=0;
- key1=0;
- while(RI==0) //接受從機(jī)狀態(tài)
- {
- ;
- }
- data3=SBUF;
- RI=0;
- if(data3!=TRR) //從機(jī)沒有就緒
- {
- flag2=0;
- }
-
- else{ //從機(jī)就緒
- pf=0; //清效驗位
- key1=1;
- for(i=0;i<=9;i++) //發(fā)送數(shù)據(jù)
- {
- TB8=0;
- SBUF=buf[i];
- pf+=buf[i];
- while(TI==0)
- {
- ;
- }
- TI=0;
- }
- TB8=0;
- SBUF=pf; //發(fā)送效驗和
- while(TI==0)
- {
- ;
- }
- TI=0;
- key1=0;
- while(RI==0) //主機(jī)接受從機(jī)是否正確接受數(shù)據(jù)
- {
- ;
- }
- data2=SBUF;
- RI=0;
- if(data2==0xcc) //如果正確結(jié)束數(shù)據(jù)通信
- {
- flag2=3; //通信結(jié)束標(biāo)志
- }
- else{
- flag2=0; //如果不正確重新通信------即重新通信標(biāo)志
- }
- }
- }
- if(TRR==0x02)
- { //是接受從機(jī)數(shù)據(jù)標(biāo)志------即TRR=0X0
- TB8=0;
- key1=1;
- SBUF=TRR; //發(fā)送接受標(biāo)志0X02
- while(TI==0)
- {
- ;
- }
- TI=0;
- key1=0;
- while(RI==0) //接受從機(jī)的狀態(tài)
- {
- ;
- }
- data3=SBUF;
- RI=0;
- if(data3!=TRR) //從機(jī)沒有就緒
- {
- flag2=0;
- }
-
- else{ key1=0; //從機(jī)就緒---主機(jī)接受數(shù)據(jù)
- pf=0;
- for(i=0;i<=2;i++)
- {
- while(RI==0)
- {
- ;
- }
- buf2[i]=SBUF; //接受從機(jī)發(fā)送的數(shù)據(jù)
- pf+=buf2[i];
- RI=0;
- }
- key1=0;
- while(RI==0) //接受從機(jī)的效驗和
- {
- ;
- }
- data2=SBUF;
- RI=0;
- if(pf==data2) //比較效驗和
- {
- flag2=3; //效驗和正確標(biāo)志
- }
- else{
- flag2=0; //效驗和錯誤標(biāo)志
-
- }
- }
- }
-
- }
-
- }
- void display(void)
- {
- if(flag2==3) //如果接受正確開始顯示
- {
- for(i=0;i<=2;i++)
- {
- P0=buf2[i];
- delay(50);
- }
- }
- }
- void main(void)
- {
- delay(500);
- init();
- count=2;
- count1=2;
- while(1)
- {
- while(count!=0)
- {
- count--;
- send(0x03,0x01); //主機(jī)---從機(jī)1交換數(shù)據(jù)子函數(shù)
- send(0x03,0x02);
- display();
- }
-
- while(count1!=0)
- { count1--;
- send(0x04,0x01); //主機(jī)---從機(jī)1交換數(shù)據(jù)子函數(shù)
- send(0x04,0x02);
- display();
-
- }
- if(count1==0)
- {
- count1=2;
- count=2;
- }
-
-
- }
- }
復(fù)制代碼
51hei.png (12.28 KB, 下載次數(shù): 44)
下載附件
2021-3-6 22:24 上傳
所有資料51hei提供下載:
485全雙工通信.zip
(149.9 KB, 下載次數(shù): 67)
2021-3-6 18:00 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|