多机通信说明
主机功能:按下S1,从机1灯亮;按下S2,从机1灯灭;
按下S3,从机2灯亮;按下S4,从机2灯亮;
按下key2,从机1和从机2同时灯亮;
按下key3,从机1和从机2同时灯灭;
接 线: 主机P3^0(RXD)分别接从机1和从机2的P3^1(TXD);
主机P3^1(TXD)分别接从机1和从机2的P3^0(RXD);
从机1和从机2共地;
主机P1^7接地,使矩阵键盘S1-S4为独立键盘使用。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
丛机程序:
- #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 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()
- {
- 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;
- P2=Buff[0]; //查看接收到的数据
- }
- }
复制代码
所有资料51hei提供下载:
51多机通信.rar
(125.2 KB, 下载次数: 405)
|