制作流水灯,保存文件,两份不一样的

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/155521158586151.jpg "#le
流水灯制作如图
按下K1,D1亮
按下K2,D2亮

两个单片机,要两个不同的程序
单片机1程序“

#include <reg51.h>
#define K1  P1^0
#define K2  P1^1
 
//串口初始化
void UartInit()        //4800bps@11.0592MHz
{
    PCON &= 0x7F;        //波特率不倍速
    SCON = 0x50;        //8位数据,可变波特率
    TMOD &= 0x0F;        //清除定时器1模式位
    TMOD |= 0x20;        //设定定时器18位自动重装方式
    TL1 = 0xFA;        //设定定时初值
    TH1 = 0xFA;        //设定定时器重装值
    ET1 = 0;        //禁止定时器1中断
    TR1 = 1;        //启动定时器1
 
    ES=0;    //串口中断关闭,用查询模式
    TI = 0;
}
 
void main()
{
  char status;
  UartInit();
  
  while(1){
    status = 0;
    if(K1 == 0) status += 1; //把开关状态编码,bit0代表K1是否按下,bit1代表K2是否按下
    if(K2 == 0) status +=2;
    SBUF = status; //发送状态
    while(TI == 0); //等待发送完成
    TI = 0;
     }

}
 
 

2号单片机程序:


#include <reg51.h>
#define D1  P2^0
#define D2  P2^1
 
//串口初始化,和1号单片机串口完全一样的工作模式和速率
void UartInit()        //4800bps@11.0592MHz
{
    PCON &= 0x7F;        //波特率不倍速
    SCON = 0x50;        //8位数据,可变波特率
    TMOD &= 0x0F;        //清除定时器1模式位
    TMOD |= 0x20;        //设定定时器18位自动重装方式
    TL1 = 0xFA;        //设定定时初值
    TH1 = 0xFA;        //设定定时器重装值
    ET1 = 0;        //禁止定时器1中断
    TR1 = 1;        //启动定时器1
    ES=0;    //串口中断关闭,用查询模式
    TI = 0;
}
 
void main()
{
  char status;
  UartInit();
  
  while(1){
    if(RI){//判断是否收到
        status = RI;//读取串口数据
        RI = 0;
        if(status& 0x01)  // 根据收到的数据决定LED的亮灭,bit0决定LED1的亮灭,bit1决定LED2的亮灭
                D1 = 0;
         else 
                 D1 = 1;
                 
        if(status& 0x02) 
                D2 = 0;
         else 
                 D2 = 1;
    }
 
     }

}
 
 

51单片机入门——Proteus上流水灯的实现
可以参考下
https://blog.csdn.net/weixin_64313535/article/details/130141133