51单片机代码多机通信。一个主机上有3个 按键,3个从机分別连接8个小灯: 主机技健分别控制3个单片机小灯不 同的亮厦情况
时间: 2023-12-10 07:37:13 浏览: 82
51单片机从两边到中间亮的流水灯控制程序(内附源代码以及仿真电路图)
5星 · 资源好评率100%
以下是基于51单片机的多机通信代码,其中主机通过按键控制3个从机的8个小灯的亮灭情况:
```
// 主机代码
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1 = P2^0; // 从机1小灯控制引脚
sbit LED2 = P2^1; // 从机2小灯控制引脚
sbit LED3 = P2^2; // 从机3小灯控制引脚
sbit KEY1 = P1^0; // 第一个按键
sbit KEY2 = P1^1; // 第二个按键
sbit KEY3 = P1^2; // 第三个按键
void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<125;j++);
}
// 发送数据到从机
void send_data(uchar data)
{
SBUF = data; // 发送数据
while(!TI); // 等待发送完成
TI = 0; // 清除发送完成标志位
}
void main()
{
uchar cnt = 0; // 计数器,用于控制从机
uchar data = 0; // 发送数据
TMOD = 0x20; // 定时器1工作在方式2
TH1 = 0xfd; // 波特率9600,定时器初值
TL1 = 0xfd; // 波特率9600,定时器初值
TR1 = 1; // 启动定时器1
SCON = 0x50; // 8位数据,无校验,1位停止位,Ri和Ti可用
ES = 1; // 允许串口中断
EA = 1; // 开启总中断
while(1)
{
if(KEY1 == 0) // 第一个按键被按下
{
delay(10); // 延时去抖
if(KEY1 == 0) // 再次判断按键是否被按下
{
cnt = 1; // 控制从机1
data = 0x01; // 发送数据为00000001,从机1的第一盏灯亮
send_data(data); // 发送数据到从机1
delay(100); // 延时等待从机响应
}
}
else if(KEY2 == 0) // 第二个按键被按下
{
delay(10);
if(KEY2 == 0)
{
cnt = 2; // 控制从机2
data = 0x01; // 发送数据为00000001,从机2的第一盏灯亮
send_data(data); // 发送数据到从机2
delay(100);
}
}
else if(KEY3 == 0) // 第三个按键被按下
{
delay(10);
if(KEY3 == 0)
{
cnt = 3; // 控制从机3
data = 0x01; // 发送数据为00000001,从机3的第一盏灯亮
send_data(data); // 发送数据到从机3
delay(100);
}
}
else // 没有按键被按下
{
data = 0x00; // 发送数据为00000000,关闭所有灯
if(cnt == 1) // 控制从机1
{
send_data(data); // 发送数据到从机1
delay(100);
}
else if(cnt == 2) // 控制从机2
{
send_data(data); // 发送数据到从机2
delay(100);
}
else if(cnt == 3) // 控制从机3
{
send_data(data); // 发送数据到从机3
delay(100);
}
}
}
}
// 从机代码
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1 = P2^0; // 第一盏小灯控制引脚
sbit LED2 = P2^1; // 第二盏小灯控制引脚
sbit LED3 = P2^2; // 第三盏小灯控制引脚
sbit LED4 = P2^3; // 第四盏小灯控制引脚
sbit LED5 = P2^4; // 第五盏小灯控制引脚
sbit LED6 = P2^5; // 第六盏小灯控制引脚
sbit LED7 = P2^6; // 第七盏小灯控制引脚
sbit LED8 = P2^7; // 第八盏小灯控制引脚
void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<125;j++);
}
// 接收主机发送过来的数据
void receive_data() interrupt 4
{
uchar data = 0; // 接收到的数据
if(RI) // 如果接收到数据
{
data = SBUF; // 读取数据
if(data == 0x01) // 如果数据为00000001,打开第一盏小灯
{
LED1 = 1;
delay(100);
}
else if(data == 0x02) // 如果数据为00000010,打开第二盏小灯
{
LED2 = 1;
delay(100);
}
else if(data == 0x03) // 如果数据为00000011,打开第一、二盏小灯
{
LED1 = 1;
LED2 = 1;
delay(100);
}
else if(data == 0x04) // 如果数据为00000100,打开第三盏小灯
{
LED3 = 1;
delay(100);
}
else if(data == 0x05) // 如果数据为00000101,打开第一、三盏小灯
{
LED1 = 1;
LED3 = 1;
delay(100);
}
else if(data == 0x06) // 如果数据为00000110,打开第二、三盏小灯
{
LED2 = 1;
LED3 = 1;
delay(100);
}
else if(data == 0x07) // 如果数据为00000111,打开第一、二、三盏小灯
{
LED1 = 1;
LED2 = 1;
LED3 = 1;
delay(100);
}
else if(data == 0x08) // 如果数据为00001000,打开第四盏小灯
{
LED4 = 1;
delay(100);
}
else if(data == 0x09) // 如果数据为00001001,打开第一、四盏小灯
{
LED1 = 1;
LED4 = 1;
delay(100);
}
else if(data == 0x0a) // 如果数据为00001010,打开第二、四盏小灯
{
LED2 = 1;
LED4 = 1;
delay(100);
}
else if(data == 0x0b) // 如果数据为00001011,打开第一、二、四盏小灯
{
LED1 = 1;
LED2 = 1;
LED4 = 1;
delay(100);
}
else if(data == 0x0c) // 如果数据为00001100,打开第三、四盏小灯
{
LED3 = 1;
LED4 = 1;
delay(100);
}
else if(data == 0x0d) // 如果数据为00001101,打开第一、三、四盏小灯
{
LED1 = 1;
LED3 = 1;
LED4 = 1;
delay(100);
}
else if(data == 0x0e) // 如果数据为00001110,打开第二、三、四盏小灯
{
LED2 = 1;
LED3 = 1;
LED4 = 1;
delay(100);
}
else if(data == 0x0f) // 如果数据为00001111,打开第一、二、三、四盏小灯
{
LED1 = 1;
LED2 = 1;
LED3 = 1;
LED4 = 1;
delay(100);
}
else if(data == 0x10) // 如果数据为00010000,打开第五盏小灯
{
LED5 = 1;
delay(100);
}
else if(data == 0x11) // 如果数据为00010001,打开第一、五盏小灯
{
LED1 = 1;
LED5 = 1;
delay(100);
}
else if(data == 0x12) // 如果数据为00010010,打开第二、五盏小灯
{
LED2 = 1;
LED5 = 1;
delay(100);
}
else if(data == 0x13) // 如果数据为00010011,打开第一、二、五盏小灯
{
LED1 = 1;
LED2 = 1;
LED5 = 1;
delay(100);
}
else if(data == 0x14) // 如果数据为00010100,打开第三、五盏小灯
{
LED3 = 1;
LED5 = 1;
delay(100);
}
else if(data == 0x15) // 如果数据为00010101,打开第一、三、五盏小灯
{
LED1 = 1;
LED3 = 1;
LED5 = 1;
delay(100);
}
else if(data == 0x16) // 如果数据为00010110,打开第二、三、五盏小灯
{
LED2 = 1;
LED3 = 1;
LED5 = 1;
delay(100);
}
else if(data == 0x17) // 如果数据为00010111,打开第一、二、三、五盏小灯
{
LED1 = 1;
LED2 = 1;
LED3 = 1;
LED5 = 1;
delay(100);
}
else if(data == 0x18) // 如果数据为00011000,打开第四、五盏小灯
{
LED4 = 1;
LED5 = 1;
delay(100);
}
else if(data == 0x19) // 如果数据为00011001,打开第一、四、五盏小灯
{
LED1 = 1;
LED4 = 1;
LED5 = 1;
delay(100);
}
else if(data == 0x1a) // 如果数据为00011010,打开第二、四、五盏小灯
{
LED2 = 1;
LED4 = 1;
LED5 = 1;
delay(100);
}
else if(data == 0x1b) // 如果数据为00011011,打开第一、二、四、五盏小灯
{
LED1 = 1;
LED2 = 1;
LED4 = 1;
LED5 = 1;
delay(100);
}
else if(data == 0x1c) // 如果数据为00011100,打开第三、四、五盏小灯
{
LED3 = 1;
LED4 = 1;
LED5 = 1;
delay(100);
}
else if(data == 0x1d) // 如果数据为00011101,打开第一、三、四、五盏小灯
{
LED1 = 1;
LED3 = 1;
LED4 = 1;
LED5 = 1;
delay(100);
}
else if(data == 0x1e) // 如果数据为00011110,打开第二、三、四、五盏小灯
{
LED2 = 1;
LED3 = 1;
LED4 = 1;
LED5 = 1;
delay(100);
}
else if(data == 0x1f) // 如果数据为00011111,打开所有灯
{
LED1 = 1;
LED2 = 1;
LED3 = 1;
LED4 = 1;
LED5 = 1;
LED6 = 1;
LED7 = 1;
LED8 = 1;
delay(100);
}
RI = 0; // 清除接收标志位
}
}
void main()
{
LED1 = LED2 = LED3 = LED4 = LED5 = LED6 = LED7 = LED8 = 0; // 所有灯初始关闭
TMOD = 0x20; // 定时器1工作在方式2
TH1 = 0xfd; // 波特率9600,定时器初值
TL1 = 0xfd; // 波特率9600,定时器初值
TR1 = 1; // 启动定时器1
SCON = 0x50; // 8位数据,无校验,1位停止位,Ri和Ti可用
ES = 1; // 允许串口中断
EA = 1; // 开启总中断
while(1);
}
```
需要注意的是,以上代码仅提供了一种思路,具体实现还需要根据实际情况进行调整。
阅读全文