|
下面是郭天祥課本源碼:
新概念51單片機(jī),11.4
單片機(jī)源程序如下:
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define SLAVE2 0x02 //從機(jī)地址02
- #define BN 16
- uchar rbuf[16];
- uchar tbuf[16];
- void err(void)
- {
- SBUF=0xff;
- while(TI!=1);
- TI=0;
- }
- uchar master(uchar addr,uchar command)
- {
- uchar aa,i,p;
- while(1)
- {
- SBUF=addr; //呼叫地址
- while(TI!=1);
- TI=0;
- while(RI!=1);
- RI=0; //等待從機(jī)回答
- if(SBUF!=addr)
- err(); //若地址錯(cuò)發(fā)復(fù)位信號(hào)
- else //地址相符
- {
- TB8=0; //清地址標(biāo)志
- SBUF=command; //發(fā)命令,數(shù)據(jù)幀發(fā),命令是主函數(shù)輸入
- while(TI!=1);
- TI=0;
- while(RI!=1);
- RI=0;
- aa=SBUF; //接受從機(jī)狀態(tài)字
- if((aa&0x08)==0x08) //若命令未被接受發(fā)復(fù)位信號(hào)
- {
- TB8=1;
- err();
- }
- else
- {
- if(command==0x01) //是發(fā)送命令
- {
- if((aa&0x01)==0x01) //從機(jī)準(zhǔn)好就緒
- {
- do
- {
- p=0; //清校驗(yàn)和
- for(i=0;i<BN;i++)
- {
- SBUF=tbuf[i]; //發(fā)送數(shù)據(jù)
- p+=tbuf[i];
- while(TI!=1)
- TI=0;
- }
- SBUF=p; //發(fā)送校驗(yàn)和
- while(TI!=1);
- TI=0;
- while(RI!=1);
- RI=0;
- }
- while(SBUF!=0); //接受不正確,重新發(fā)送
- TB8=1; //置地址標(biāo)志
- return(0);
- }
- }
- else
- {
- if((aa&0x02)==0x02) //是接受命令,從機(jī)準(zhǔn)備好發(fā)送
- {
- while(1)
- {
- p=0; //清校驗(yàn)和
- for(i=0;i<BN;i++)
- {
- while(RI!=1);
- RI=0;
- rbuf[i]=SBUF; //接受數(shù)據(jù)
- p+=rbuf[i];
-
- }
- while(RI!=1);
- RI=0;
- if(SBUF==p)
- {
- SBUF=0x00; //校驗(yàn)和相同發(fā)“00”
- while(TI!=1)
- TI=0;
- break;
- }
- else
- {
- SBUF=0xff; //校驗(yàn)和不同發(fā)ff重新接受
- while(TI!=1);
- TI=0;
-
- }
- }
- TB8=1; //置地址標(biāo)志
- return(0);
- }
-
-
- }
- }
- }
- }
- }
- void main()
- {
- TMOD=0x20; //T/C1定義為方式2
- TL1=0xfd;
- TH1=0xfd; //置初值
- PCON=0x00;
- TR1=1;
- SCON=0xf8; //串行口方式3
- master(SLAVE2,0x01); //命令從機(jī)02接受
- master(SLAVE2,0x02); //命令從機(jī)02發(fā)送
- while(1);
-
- }
- 從機(jī)
- //=======================================================================================
- #include <reg52.h>
- #define uchar unsigned char
- #define SLAVE2 0x02
- #define BN 16
- uchar code trbuf[16]={"congji transmit"};
- uchar rebuf[16];
- bit tready;
- bit rready;
- void str(void);
- void sre(void);
- void main(void)
- {
- TMOD=0x20; //T/C1定義為方式2
- TL1=0xfd;
- TH1=0xfd; //置初值
- PCON=0x00;
- TR1=1;
- SCON=0xf0; //串行口方式3,TB8=1,發(fā)地址命令
- ES=1;
- EA=1; //開串行口中斷
- while(1)
- {
- tready=1;
- rready=1;
- } //假定準(zhǔn)備好發(fā)送和接受
- }
- void ssio(void) interrupt 4
- {
- uchar a;
- RI=0;
- ES=0; //關(guān)串行中斷
- if(SBUF!=SLAVE2)
- {
- ES=1;
- goto reti;
- }
- SM2=0; //取消監(jiān)聽狀態(tài)
- SBUF=SLAVE2; //從本地址發(fā)回
- while(TI!=1);
- TI=0;
- while(RI!=1);
- RI=0;
- if(RB8==1) //是復(fù)位信號(hào),恢復(fù)監(jiān)聽
- {
- SM2=1;
- ES=1;
- goto reti;
- }
- a=SBUF; //接受命令
- if(a==0x01) //主機(jī)接受的數(shù)據(jù)
- {
- if(rready==1)
- SBUF=0x01; //接受準(zhǔn)備好發(fā)狀態(tài)
- else
- SBUF=0x00;
- while(TI!=1)
- TI=0;
- while(RI!=1)
- RI=0;
- if(RB8==1)
- {
- SM2=1;
- ES=1;
- goto reti;
- }
- sre(); //接受數(shù)據(jù)
- }
- else
- {
- if(a==0x02) //從機(jī)向主機(jī)發(fā)送數(shù)據(jù)
- {
- if(tready==1)
- SBUF=0x02; //發(fā)送準(zhǔn)備好狀態(tài)
- else
- SBUF=0x00;
- while(TI!=1);
- TI=0;
- while(RI!=1);
- RI=0;
- if(RB8==1)
- {
- SM2=1;
- ES=1;
- goto reti;
-
- }
- str(); //發(fā)送數(shù)據(jù)
- }
- else
- {
- SBUF=0x80; //命令非法,發(fā)送狀態(tài)
- while(TI!=1);
- TI=0;
- SM2=1;
- ES=1; //恢復(fù)監(jiān)聽
- }
- }
- reti:;
-
- }
- void str(void) //發(fā)送數(shù)據(jù)塊
- {
- uchar p,i;
- tready=0;
- do
- {
- p=0; //清校驗(yàn)和
- for(i=0;i<BN;i++)
- {
- SBUF=trbuf[i]; //發(fā)送數(shù)據(jù)塊
- p+=trbuf[i];
- while(TI!=1);
- TI=0;
- }
- SBUF=p;
- while(TI!=1);
- TI=0;
- while(RI!=1);
- RI=0;
- }
- while(SBUF!=0); //主機(jī)接受不正確,重新發(fā)送
- SM2=1;
- ES=1;
- }
- void sre(void) //接受數(shù)據(jù)塊
- {
- uchar p,i;
- rready=0;
- while(1)
- {
- p=0; //清校驗(yàn)和
- for(i=0;i<BN;i++)
- {
- while(RI!=1);
- RI=0; //接受數(shù)據(jù)
- rebuf[i]=SBUF;
- p+=rebuf[i];
-
- }
- while(RI!=1);
- RI=0;
- if(SBUF==P)
- {
- SBUF=0x00;
- break; //校驗(yàn)和相同發(fā)“00”
- }
- else
- {
- SBUF=0xff; //校驗(yàn)和不同發(fā)ff重新接受
- while(TI!=0);
- TI=0;
- }
- }
- SM2=1;
- ES=1;
- }
復(fù)制代碼
//===========================================================================
課本源碼有明顯2處紕漏修改了一下,但是proteus仿真沒有結(jié)果,求助大神幫分析下
|
|