两个单片机之间的串行通信
一、设计要求
在某个控制系统中有U1、U2这两个单片机,U1单片机首先将P1端口指拨开关数据载入SBUF,然后经由TXD将数据传送给U2单片机,U2单片机将接收数据存入SBUF,再由SBUF载入累加器,并输出至P1端口,点亮相应端口的LED。
二、实验所需元器件 单片机AT89C51 电阻RES 瓷片电容CAP-22pF 晶振CRYSTAL 按扭BUTTON 发光二极管LED-YELLOW 开关SWITCH 拨码开关DIPSW-S 发光二极管LED-GREEN
三、电路原理图:
1
电解电容CAP-ELEC 发光二极管LED-RED 发光二极管LED-RED
两个单片机之间的串行通信电路图
四、程序设计
这两个单片机均工作在半工状态,U1将P1端口的状态通过TXD发半空给U2,而U2接收U1的数据,然后控制P1端口的LED显示。因此,需编写两个不同的程序,其程序流程图如下所示:
2
单片机1开始
设置波特率 单片机2开始 设置波特率 串行寄存器设置 启动 TR 串行寄存器设置 启动 TR 读拨入键值 键值是否与前次相同 是否接收到数据? Y 载入SBUF发送 N
结束 N 是否发送完毕? 载入SBUF发送 数据暂存 数据输出到P1 清除RI 3
五、C语言程序:
U1的C语言程序: #include \"reg51.h\" #define uint unsigned int #define uchar unsigned char
void send(uchar state) { SBUF=state; while(TI==0); TI=0;
}
void SCON_init(void) { SCON=0x50; TMOD=0x20; PCON=0x00; TH1=0xfd; TL1=0xfd; TI=0;
TR1=1;
ES=1;
}
void main() { P1=0xff; SCON_init(); while(1) { send(P1); }
}
U2的C语言程序: #include \"reg51.h\" #define uint unsigned int #define uchar unsigned char uchar state; void receive() { while(RI==0)
state=SBUF; 4
RI=0;
}
void SCON_init(void) { SCON=0x50; TMOD=0x20; PCON=0x00; TH1=0xfd; TL1=0xfd; RI=0; TR1=1;
六、调试与仿真:
}
void main() { SCON_init(); while(1) { receive(); P1=state;
}
}
5
6
因篇幅问题不能全部显示,请点此查看更多更全内容