我是一名初学者,遇到的问题很多,想寻问“三个单片机之间的通信,一主二从,电路图和程序”。那位高人帮个忙。
我是一名初学者,遇到的问题很多,想寻问“三个单片机之间的通信,一主二从,电路图和程序”。那位高人帮个忙。
//===================================================================== // 多机通讯主机程序 //zhuji.c //writer:谷雨 2008年3月22日于EDA实验室 //注:主机先发送地址,接收到应答后,再发送数据 //=====================================================================
#include<reg52.h>
#define addr1 0x31 //从机1地址 #define addr2 0x32 //从机2地址
unsigned char xx[10]; unsigned char p = 0;
void delay_1ms(unsigned int i) { unsigned char j; while ((i--)!=0) {for (j=0;j<125;j++);} } void Uart_Init(void) { TMOD = 0x20; //定时器T1使用工作方式2 TH1 = 0xF3; TL1 = 0xF3;
PCON = 0x00; //SMOD=1; SCON = 0xf0; //工作方式3,9位数据位,波特率9600bit/s,允许接收 SM2 = 0; TR1 = 1; //开始计时 EA = 1; //中断允许 ES = 1; //串行中断允许
} void Serial_INT() interrupt 4 { if(!RI) return;
ES = 0; RI = 0; xx[p] = SBUF; p++; ES = 1; } void send_addr(unsigned char addr) //发送地址 { p = 0; TB8 = 1; //发送地址帧 SBUF=addr; //发送地址 while(!TI); //等待发送完毕 TI=0; //软件复位TI } void send_data(unsigned char ddata) //发送数据 { TB8=0; //发送数据帧 SBUF=ddata; //发送数据 while(!TI); TI=0; //软件复位TI }
void main() { Uart_Init(); delay_1ms(2000); while(1) { send_addr(addr1); //向从机1发地址 send_data(0x33); send_data(0x01);
delay_1ms(500); if(xx[9]=='0') P1=0xaa;
delay_1ms(500);
send_addr(addr2); //向从机2发地址 send_data(0x33); send_data(0x01);
delay_1ms(500); if(xx[9]=='9') P1=0x55;
delay_1ms(500); } // while(1); }
//===================================================================== // 多机通讯从机1程序 //cong1.c //writer:谷雨 2008年3月22日于EDA实验室 //注: //=====================================================================
#include<reg52.h> #define addr 0x31 //从机1地址
unsigned char receive; unsigned char xx[ ]={"1234567890"};
void Uart_Init(void) { TMOD = 0x20; //定时器T1使用工作方式2 TH1 = 0xF3; TL1 = 0xF3;
PCON = 0x00; //SMOD=1; SCON = 0xf0; //工作方式3,9位数据位,波特率9600bit/s,允许接收
TR1 = 1; //开始计时 EA = 1; //中断允许 ES = 1; //串行中断允许
}
void Serial_INT() interrupt 4 { if(!RI) return; RI=0; if(RB8==1) { if(SBUF==addr) SM2=0; else SM2=1; } if(RB8==0) receive=SBUF; }
void SendOneByte(unsigned char c) { TB8=0; SBUF = c; while(!TI); TI = 0; } void SendListChar(unsigned char *DData,unsigned char Ef) { unsigned char L=0;
if(Ef!=0) { for( ;L<Ef;L++) //显示有效长度 SendOneByte(DData[L]); //发送单个字符 }else while (DData[L]!='\0') //发送至字串结束 { SendOneByte(DData[L]); //发送单个字符 L++; //下一个字符 } }
void main() { Uart_Init(); while(1) { switch(receive) { case 0xff: break; case 0x01: //在此可以写入要完成的动作,最多可完成256个动作 SendListChar(xx,0); break; case 0x02: break; case 0x33: P1=!P1; //为方便其间,赋值给P1口,测P1口电平来检测该程序 break; default: break; } receive=0xff; } }