两个51单片机分别连接一个四位共阳7段数码管(数码管段选引脚连接P0口、位选引脚连接P2口),两个单片机进行串口通信,要求单片机1的数码管初始显示2313,单片机2的数码管初始显示2305,按下按钮两个单片机互相发送并接受数据并显示在数码管上(按下按钮后单片机1显示2305、单片机2显示2313),请写出符合上述要求的代码
时间: 2023-07-03 22:18:33 浏览: 86
好的,以下是一个基于Keil C51编写的示例代码:
单片机1代码:
```c
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit KEY = P1^0; // 按键
uchar code smgduan[] = { // 数码管段码
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
uint rec_data = 0; // 接收到的数据
uchar send_data = 0; // 发送的数据
uchar num[4] = {3, 3, 1, 2}; // 初始数码管显示 2313
// 数码管显示函数
void display(uchar dat[]) {
uchar i;
for(i=0; i<4; i++) {
P0 = smgduan[dat[i]];
P2 = 0x0f - (1 << i);
delay(1);
P0 = 0x00;
}
}
// 延时函数
void delay(uint z) {
uint x, y;
for(x=z; x>0; x--)
for(y=110; y>0; y--);
}
// 串口初始化
void init_serial() {
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
}
void main() {
init_serial(); // 初始化串口
while(1) {
display(num); // 显示数码管
while(KEY==0); // 等待按键
delay(10); // 延时去抖动
if(KEY == 1) { // 判断按键是否按下
send_data = 0x05; // 发送数据 0x05
SBUF = send_data; // 发送数据
while(!TI); // 等待发送完成
TI = 0; // 清除发送标志
while(!RI); // 等待接收完成
rec_data = SBUF; // 读取接收到的数据
RI = 0; // 清除接收标志
num[0] = 2; // 更新数码管显示为 2305
}
}
}
```
单片机2代码:
```c
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit KEY = P1^0; // 按键
uchar code smgduan[] = { // 数码管段码
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
uint rec_data = 0; // 接收到的数据
uchar send_data = 0; // 发送的数据
uchar num[4] = {2, 3, 1, 3}; // 初始数码管显示 2305
// 数码管显示函数
void display(uchar dat[]) {
uchar i;
for(i=0; i<4; i++) {
P0 = smgduan[dat[i]];
P2 = 0x0f - (1 << i);
delay(1);
P0 = 0x00;
}
}
// 延时函数
void delay(uint z) {
uint x, y;
for(x=z; x>0; x--)
for(y=110; y>0; y--);
}
// 串口初始化
void init_serial() {
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
}
void main() {
init_serial(); // 初始化串口
while(1) {
display(num); // 显示数码管
while(KEY==0); // 等待按键
delay(10); // 延时去抖动
if(KEY == 1) { // 判断按键是否按下
send_data = 0x0d; // 发送数据 0x0d
SBUF = send_data; // 发送数据
while(!TI); // 等待发送完成
TI = 0; // 清除发送标志
while(!RI); // 等待接收完成
rec_data = SBUF; // 读取接收到的数据
RI = 0; // 清除接收标志
num[0] = 2; // 更新数码管显示为 2313
}
}
}
```
注意:以上代码仅供参考,具体的实现方式可能需要根据具体的硬件和编程环境进行调整。
阅读全文