logo资料库

51单片机双机通信硬件电路图及C程序.pdf

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
单片机双机通信硬件电路图及C程序程序 51单片机双机通信硬件电路图及 本文主要讲了51单片机双机通信硬件电路图及C程序,下面以来学习一下 双机通信的硬件电路 需要注意的是,两单片机要保证正确通信,主机的RXD连接从机的TXD,从机的RXD连接主机的TXD。 双机通信C语言程序 (1)主机程序 #include #include #define _READY_ 0x06//主机握手信号 #define _BUSY_ 0x15//从机忙应答 #define_OK_ 0x00//从机准备好 #define _SUCC_ 0x0f//数据传送成功 #define _ERR_ 0xf0//数据传送失败 unsigned charTable[9]={0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; unsigned char Buff[20]; //数据缓冲区 unsigned char temp=_BUSY_; sbit KEY=P1^6; //延时1ms函数 void delay_1ms(unsigned int t) { unsigned int x,y; for(x=t;x>0;x--) for(y=110;y>0;y--); } //缓冲区初始化 void Buff_init()
{ unsigned chari; //将Table里的数据放到缓冲区里 for(i=0;i { Buff= Table; delay_1ms(100); } } //串口初始化函数 void serial_init() { TMOD=0x20; //定时器1工作于方式2 TH1=0xfd; TL1=0xfd; //波特率为9600 PCON=0; SCON=0x50; //串口工作于方式1 TR1=1; //开启定时器 TI=0; RI=0; } //发送数据函数 void SEND_data(unsigned char *Buff) { unsigned char i; unsigned char lenth; unsigned char check; lenth=strlen(Buff); //计算数据长度 check=lenth; TI=0; //发送数据长度 SBUF=lenth; while(!TI); TI=0; for(i=0;i { check=check^Buff; SBUF=Buff; while(!TI);
TI=0; } SBUF=check; //发送校验字节 while(!TI); TI=0; } void main() { Buff_init(); serial_init(); while(1) { if(KEY==0) { delay_1ms(5); if(KEY==0) { while(!KEY); TI=0; //主机发送握手信号 SBUF=_READY_; while(!TI); TI=0; while(temp!=_OK_) //主机等待从机应答信号 { RI=0; while(!RI); temp=SBUF; RI=0; } temp=_ERR_; //主机等待从机数据接收成功信号 while(temp!=_SUCC_) { SEND_data(Buff); RI=0; while(!RI); temp=SBUF; RI=0;
} } } } } (2)从机程序 #include #include #define _READY_ 0x06//主机握手信号 #define _BUSY_ 0x15//从机忙应答 #define_OK_ 0x00//从机准备好 #define _SUCC_ 0x0f//数据传送成功 #define _ERR_ 0xf0//数据传送失败 unsigned char aa=_BUSY_;//主机与从机之间通信标志 unsigned char Buff[20];//数据缓冲区 //串口初始化函数 void serial_init() { TMOD=0x20; //定时器1工作于方式2 TH1=0xfd; TL1=0xfd; //波特率为9600 PCON=0; SCON=0x50; //串口工作于方式1 TR1=1; //开启定时器 TI=0; RI=0; } //接收数据函数 www.dgzj.com unsigned char RECE_data(unsigned char *Buff) { unsigned char i,temp; unsigned char lenth; unsigned char check; RI=0; //接收数据长度 while(!RI); lenth=SBUF; RI=0;
check=lenth; for(i=0;i { while(!RI); Buff=SBUF; check=check^(Buff); RI=0; } while(!RI); //接收校验字节 temp=SBUF; RI=0; check=temp^check; //将从主机接收到的校验码与自己计算的校验码比对 if(check!=0) //校验码不一致,表明数据接收错误,向主机发送错误信号,函数返回0xff { TI=0; SBUF=_ERR_; while(!TI); TI=0; return 0xff; } TI=0; //校验码一致,表明数据接收正确,向主机发送成功信号,函数返回0x00 SBUF=_SUCC_; while(!TI); TI=0; return 0; } void main() { serial_init(); while(1) { while(aa!=_READY_) //从机等待主机发送的握手信号 { RI=0; while(!RI); aa=SBUF; RI=0;
} TI=0; //一旦接收到握手信号,从机返回OK,等待接收数据 SBUF=_OK_; while(!TI); TI=0; aa=0xff; //从机接收数据,并将数据保存到数据缓冲区 while(aa==0xff) { aa=RECE_data(Buff); } P1=Buff[0]; //查看接收到的数据 } }
分享到:
收藏