多机串口通讯实验 数码管显示 U1机循环向U2机发送整数00~99,再根据从U2机发来的返回值决定是继续发送新数(若返回值与发送值相同时)还是重复发送当前数(若返回值与发送值不同时);U2机则是将从U1机上接收到的值作为返回值再发送给U1机。两机都将当前值以十进制数形式显示在各机的2位共阴极数码管上。
时间: 2023-07-16 19:15:30 浏览: 144
这个实验需要用到两个单片机,U1和U2,以及两个数码管。我们可以使用串口通讯实现两个单片机之间的数据传输。
首先,我们需要在两个单片机上分别设置串口通讯的参数,包括波特率、数据位、停止位和校验位。为了简化实验,我们可以选择使用默认参数,即波特率为9600,数据位为8位,停止位为1位,无校验位。
然后,我们需要编写程序实现数据的发送和接收。对于U1机,我们可以使用循环语句向U2机发送00~99之间的整数,并等待U2机的返回值。如果返回值与发送值相同,则继续发送新数;如果返回值与发送值不同,则重复发送当前数。同时,U1机将当前值以十进制数形式显示在数码管上。
对于U2机,我们需要监听串口接收到的数据,并将其作为返回值再发送给U1机。同时,U2机将接收到的值以十进制数形式显示在数码管上。
下面是基本代码框架:
U1机:
```c
#include <reg52.h>
sbit dig1=P2^0;
sbit dig2=P2^1;
sbit D1=P1^0;
sbit D2=P1^1;
void init_serial()
{
// 初始化串口通讯参数
// ...
}
int send_receive(int data)
{
// 向U2机发送数据
// 等待U2机返回数据
// 根据返回值决定继续发送新数还是重复发送当前数
// 返回值为接收到的数据
}
void main()
{
int data = 0;
int ret = 0;
while (1)
{
ret = send_receive(data);
if (ret == data)
{
data++;
if (data == 100)
{
data = 0;
}
}
// 在数码管上显示当前值
// ...
}
}
```
U2机:
```c
#include <reg52.h>
sbit dig1=P2^0;
sbit dig2=P2^1;
sbit D1=P1^0;
sbit D2=P1^1;
void init_serial()
{
// 初始化串口通讯参数
// ...
}
int receive_send(int data)
{
// 监听串口接收到的数据
// 将接收到的数据作为返回值发送给U1机
// 返回值为接收到的数据
}
void main()
{
int data = 0;
int ret = 0;
while (1)
{
ret = receive_send(data);
// 在数码管上显示当前值
// ...
// 将接收到的数据作为当前值
data = ret;
}
}
```
需要注意的是,由于我们使用的是循环发送和接收,程序可能会出现死循环的情况。因此,在编写程序时,我们需要合理设计循环流程,确保程序能够正常运行。
阅读全文