两个51单片机进行串口双向通信实现互相接收发送学号后四位并且显示在四位共阳数码管上,P0口连接数码管,主机数码管最初显示学号2313,从机数码管最开始显示学号2305,按下按键实现两个数码管显示学号的替换
时间: 2023-07-03 22:14:07 浏览: 174
好的,下面是一个可能的实现方式。其中,主机使用P1.0作为按键引脚,从机使用P1.1作为标志位引脚。
主机程序:
```c
#include <reg52.h>
sbit led = P0^0; // 数码管控制引脚
sbit btn = P1^0; // 按键引脚
void delay() { // 稍微延时,用于数码管显示
int i, j;
for (i=0; i<100; i++) {
for (j=0; j<100; j++);
}
}
void main() {
unsigned char flag = 0; // 标志位,用于判断是否收到从机发送的数据
unsigned char num[4] = {2, 3, 1, 3}; // 主机初始学号:2313
unsigned char recv[4]; // 存放从机发送的数据
unsigned char i;
TMOD = 0x20; // 定时器1工作在模式2,8位自动重载
TH1 = 0xfd; // 波特率设置为9600,误差小于1%
TL1 = 0xfd;
SCON = 0x50; // 启动串口,允许接收
TR1 = 1; // 启动定时器1
while (1) {
if (btn == 0) { // 按键被按下
SBUF = num[3]; // 发送学号后四位的最后一位
while (flag == 0); // 等待从机发送数据
flag = 0; // 清除标志位
for (i=0; i<4; i++) {
led = 1; // 打开数码管
P0 = recv[i]; // 显示数据
delay(); // 延时
led = 0; // 关闭数码管
delay(); // 延时
}
}
else {
SBUF = num[3]; // 发送学号后四位的最后一位
while (flag == 0); // 等待从机发送数据
flag = 0; // 清除标志位
for (i=0; i<3; i++) {
led = 1; // 打开数码管
P0 = recv[i]; // 显示数据
delay(); // 延时
led = 0; // 关闭数码管
delay(); // 延时
}
led = 1; // 打开数码管
P0 = recv[3]; // 显示数据
delay(); // 延时
led = 0; // 关闭数码管
delay(); // 延时
}
}
}
void serial() interrupt 4 {
static unsigned char i = 0;
if (RI == 1) { // 接收到数据
RI = 0; // 清除接收标志位
if (i < 4) {
recv[i] = SBUF; // 存储数据
i++;
if (i == 4) flag = 1; // 收到4个字节的数据,设置标志位
}
}
}
```
从机程序:
```c
#include <reg52.h>
sbit led = P0^0; // 数码管控制引脚
sbit flag = P1^1; // 标志位引脚
void delay() { // 稍微延时,用于数码管显示
int i, j;
for (i=0; i<100; i++) {
for (j=0; j<100; j++);
}
}
void main() {
unsigned char num[4] = {2, 3, 0, 5}; // 从机初始学号:2305
unsigned char recv[4]; // 存放主机发送的数据
unsigned char i;
TMOD = 0x20; // 定时器1工作在模式2,8位自动重载
TH1 = 0xfd; // 波特率设置为9600,误差小于1%
TL1 = 0xfd;
SCON = 0x50; // 启动串口,允许接收
TR1 = 1; // 启动定时器1
while (1) {
for (i=0; i<4; i++) {
led = 1; // 打开数码管
P0 = num[i]; // 显示数据
delay(); // 延时
led = 0; // 关闭数码管
delay(); // 延时
}
while (flag == 0); // 等待主机发送数据
flag = 0; // 清除标志位
for (i=0; i<4; i++) {
led = 1; // 打开数码管
P0 = recv[i]; // 显示数据
delay(); // 延时
led = 0; // 关闭数码管
delay(); // 延时
}
}
}
void serial() interrupt 4 {
static unsigned char i = 0;
if (RI == 1) { // 接收到数据
RI = 0; // 清除接收标志位
if (i < 4) {
recv[i] = SBUF; // 存储数据
i++;
if (i == 4) flag = 1; // 收到4个字节的数据,设置标志位
}
}
}
```
注意,以上程序仅供参考,具体实现方式可能会有所不同。您需要根据自己的实际情况进行调整。同时,为了简化程序,以上程序中没有进行错误检查和容错处理。在实际应用中,您需要考虑更多的因素,以保证程序的稳定性和可靠性。
阅读全文