
在设计单片机多机通信时,可以采用C语言编程实现。例如,主机A通过UART与从机B和C通信。AB两端各并上120欧电阻,AB线互相残绕,再与公共的接地线缠绕,以减低误差。主机A的主程序如下:
主机A的主程序代码:
#include
#define uchar unsigned char
#define F_OSC 12000000UL
#define F_BAUD 1200UL
#define RELOAD (uchar)(256-F_OSC/12/32/F_BAUD)
#define B_ID 2
#define C_ID 3
#define LED_ON 4
#define LED_OFF (~LED_ON)
sbit P20 = P2^0;
sbit LEDB = P1^0;
sbit LEDC = P1^1;
typedef union {
uchar buf[2];
struct {
uchar databuf;
uchar TXID;
}Option;
}TYPE_UART_SERIAL;
TYPE_UART_SERIAL SysUart;
void UartInit() {
SCON = 0x50;
TMOD = 0x20;
TH1 = RELOAD;
TR1 = 1;
TI = 0;
EA = 1;
ES=1;
P20=0;
}
void main(void) {
UartInit();
LEDB=0;
LEDC=0;
while(1) {
if((SysUart.Option.TXID==B_ID)&&(SysUart.Option.databuf!=0)) {
SysUart.Option.TXID=0;
if (SysUart.Option.databuf==LED_ON) {
LEDB=1;
}
if(SysUart.Option.databuf==LED_OFF) {
LEDB=0;
}
SysUart.Option.databuf=0;
}
if((SysUart.Option.TXID==C_ID)&&(SysUart.Option.databuf!=0)) {
SysUart.Option.TXID=0;
if (SysUart.Option.databuf==LED_ON) {
LEDC=1;
}
if(SysUart.Option.databuf==LED_OFF) {
LEDC=0;
}
SysUart.Option.databuf=0;
}
}
}
void SerialServe() interrupt 4 {
static uchar pcnt=0;
if (RI == 1) {
RI = 0;
SysUart.buf[pcnt] = SBUF;
pcnt =(pcnt+1)%2;
}
if (TI == 1) {
}
}
从机B的代码:
#include
#define uchar unsigned char
#define F_OSC 12000000UL
#define F_BAUD 1200UL
#define RELOAD (uchar)(256-F_OSC/12/32/F_BAUD)
#define B_ID 2
#define LED_ON 4
#define LED_OFF (~LED_ON)
sbit P20 = P2^0;
sbit key = P1^0;
typedef union {
uchar buf[2];
struct {
uchar databuf;
uchar TXID;
}Option;
}TYPE_UART_SERIAL;
TYPE_UART_SERIAL SysUart;
void UartInit() {
SCON = 0x40;
TMOD = 0x20;
TH1 = RELOAD;
TR1 = 1;
TI = 0;
EA = 1;
P20=1;
}
void SerialSenData(uchar *SerialBuf) {
uchar i;
i=2;
while (i--) {
SBUF = *SerialBuf;
SerialBuf++;
while (!TI);
TI = 0;
}
}
void main(void) {
uchar ledbuf;
UartInit();
ledbuf=LED_OFF;
while(1) {
if(key==0) {
ledbuf=~ledbuf;
SysUart.Option.databuf=ledbuf;
SysUart.Option.TXID = B_ID;
SerialSenData(SysUart.buf);
while(key==0);
}
}
}
void SerialServe() interrupt 4 {
if (RI == 1) {
RI = 0;
}
if (TI == 1) {
}
}
从机C的代码与从机B类似,只是TXID设为3,LED控制引脚为P1^1。这些代码实现了通过UART进行单片机多机通信的功能。
在实际应用中,还需要根据具体需求调整波特率、电阻值等参数,以确保通信的稳定性和准确性。
通过这种方式,可以实现单片机之间的多机通信,提高系统的灵活性和可扩展性。详情