将两个51单片机串行起来,其中一个通过P1口连接两个开关,另一个通过P2口连接两个300欧电阻和两个led,最终实现开关控制led亮灭
时间: 2024-03-13 17:44:17 浏览: 63
两个80c51单片机通信;单片机一控制两位按键从而控制单片机二的两位数码管加一和减一
好的,这里是一个简单的基于串口通信的示例程序,可以实现您的需求:
发送端单片机代码:
```c
#include <reg51.h>
#define BAUDRATE 9600
#define TIMER_1MS 65536-50000 // 定时器1的计数器初值
void init_serial() {
TH1 = 256 - (11059200/12/16/BAUDRATE); // 设置波特率
TMOD &= 0x0F;
TMOD |= 0x20; // 设置定时器1为模式2
TR1 = 1; // 启动定时器1
SCON = 0x50; // 串口工作在模式1
}
void init_io() {
P1 = 0xFF; // 设置P1口为上拉输入
}
void main() {
unsigned char sw;
init_serial();
init_io();
while(1) {
sw = P1; // 读取开关状态
SBUF = sw; // 发送数据
while(!TI); // 等待发送完成
TI = 0; // 清除发送完成标志
// 延时一段时间
TH1 = TIMER_1MS >> 8;
TL1 = TIMER_1MS & 0xFF;
TR1 = 1;
while(!TF1);
TF1 = 0;
TR1 = 0; // 延时结束
}
}
```
接收端单片机代码:
```c
#include <reg51.h>
#define BAUDRATE 9600
#define TIMER_1MS 65536-50000 // 定时器1的计数器初值
void init_serial() {
TH1 = 256 - (11059200/12/16/BAUDRATE); // 设置波特率
TMOD &= 0x0F;
TMOD |= 0x20; // 设置定时器1为模式2
TR1 = 1; // 启动定时器1
SCON = 0x50; // 串口工作在模式1
}
void init_io() {
P2 = 0xFF; // 设置P2口的LED为初始状态
}
void main() {
unsigned char sw;
init_serial();
init_io();
while(1) {
while(!RI); // 等待接收数据
sw = SBUF; // 读取开关状态
RI = 0; // 清除接收标志
if(sw & 0x01) P2 &= 0xFC; // 控制LED1
else P2 |= 0x01;
if(sw & 0x02) P2 &= 0xF3; // 控制LED2
else P2 |= 0x04;
// 延时一段时间
TH1 = TIMER_1MS >> 8;
TL1 = TIMER_1MS & 0xFF;
TR1 = 1;
while(!TF1);
TF1 = 0;
TR1 = 0; // 延时结束
}
}
```
上述代码中,发送端单片机通过P1口读取开关状态,并将其通过串口发送给接收端单片机。接收端单片机通过串口接收发送端单片机发送的数据,并将其转换为开关状态,然后控制P2口的LED亮灭。同时,为了避免串口通信时序问题,我们在发送端和接收端都加入了一段短暂的延时。
注意:以上代码仅为示例,可能需要根据具体硬件平台进行适当修改和调试。
阅读全文