资源描述
两个单片机之间的串行通信
一、设计要求
在某个控制系统中有U1、U2这两个单片机,U1单片机首先将P1端口指拨开关数据载入SBUF,然后经由TXD将数据传送给U2单片机,U2单片机将接收数据存入SBUF,再由SBUF载入累加器,并输出至P1端口,点亮相应端口的LED。
二、实验所需元器件
单片机AT89C51
瓷片电容CAP-22pF
晶振CRYSTAL
电解电容CAP-ELEC
电阻RES
按扭BUTTON
发光二极管LED-YELLOW
发光二极管LED-RED
开关SWITCH
拨码开关DIPSW-S
发光二极管LED-GREEN
发光二极管LED-RED
三、电路原理图:
两个单片机之间的串行通信电路图
四、程序设计
这两个单片机均工作在半工状态,U1将P1端口的状态通过TXD发半空给U2,而U2接收U1的数据,然后控制P1端口的LED显示。因此,需编写两个不同的程序,其程序流程图如下所示:
设置波特率
单片机2开始
设置波特率
单片机1开始
是否发送完毕?
结束
结束
清除RI
数据输出到P1
数据暂存
载入SBUF发送
是否接收到数据?
启动TR
串行寄存器设置
载入SBUF发送
键值是否与前次相同
读拨入键值
启动TR
串行寄存器设置
Y
N
N
五、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;
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;
}
}
六、调试与仿真:
展开阅读全文