双机通讯(还在等待审核)

2020-01-27 11:34发布

(还在等待审核。。。)
//甲机通过串口控制乙机LED
//名称:甲机发送控制命令字符
//说明:甲单片机负责向外发送控制命令字符“A”“B”“C”,或者停止发送,乙机根据所接收到的字符完成LED1闪烁、LED2闪烁、双闪烁、或停止闪烁。
//发送:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit  k=P3^3;
sbit  LED1=P0^0;
sbit  LED2=P0^1;
sbit  A1=P1^0;
sbit  A2=P1^1;
sbit  A3=P1^2;
sbit  A4=P1^3;       
sbit  A5=P1^4;

void delay(unsigned char z)
{      
      unsigned int x,y;
            for(x=z;x>0;x--)
                    for(y=120;y>0;y--);       
}

void send(unsigned char c)
{
      SBUF=c;   //发送c
      while(TI==0); //等待发送完毕
      TI=0;    //TI清零以便下次发送
}

void main()
{
    uchar X=0;
    TMOD=0X20; //T1工作模式2
    SCON=0X40;// 0100 0000(SM0 SM1 SM2 REN  TB8 RB8 TI RI)  串口模式1
  //REN=0;SM0=0;SM1=1;  // 0   1   0   0    0   0   0  0
    TH1=0xfd;  //12M 9600bps
    TL1=0xfd;
    TI=0;
    TR1=1;
      
    while(1)
    {
         if(k==0)    //按下K时选择操作代码0,1,2,3
         {
               while(k==0);
               X=(X+1)%4;         
         }
         switch(X)   //根据操作代码发送A/B/C或停止发送
         {
             case 0:                    
                    LED1=LED2=0;
                    break;
             case 1:
                    send('A');
                    LED1=~LED1;
                    LED2=0;
                    break;
             case 2:
                    send('B');
                    LED2=~LED2;
                    LED1=0;
                    break;
             case 3:
                    send('C');
                    LED1=~LED1;  
                    LED2=~LED2;                     
                    break;               
         }
         delay(100);      
    }
}

///////////////////////////////////////////////////////////////////////////////
//接收 乙机根据所接收到的字符完成LED1闪烁、LED2闪烁、双闪烁、或停止闪烁。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit  k=P3^3;
sbit  LED1=P0^0;
sbit  LED2=P0^1;
sbit  A1=P1^0;
sbit  A2=P1^1;
sbit  A3=P1^2;
sbit  A4=P1^3;       
sbit  A5=P1^4;

void delay(unsigned char z)
{      
      unsigned int x,y;
            for(x=z;x>0;x--)
            for(y=120;y>0;y--);       
}

void main()
{
    TMOD=0X20; //T1工作模式2
    SCON=0X50;// 0100 0000(SM0 SM1 SM2 REN  TB8 RB8 TI RI)  串口模式1 允许接收REN=1
                        // 0   1   0   1    0   0   0  0
    TH1=0xfd;  //12M 9600bps
    TL1=0xfd;
    RI=0;
    TR1=1;

    A1=A2=A3=A4=A5=0;
    LED1=LED2=0;
    A5=1;
    while(1)
    {
         if(RI)  //如收到则LED闪烁
         {
              RI=0;
              switch(SBUF)  //根据所收到的不同命令字符完成不同动作
              {
                   case 'A': LED1=~LED1;LED2=0;break;  //LED1闪烁
                   case 'B': LED2=~LED2;LED1=0;break; //LED2闪烁
                   case 'C': LED1=~LED1;LED2=~LED2;  //双闪烁
              }         
         }
         else LED1=LED2=0; //关闭LED
         delay(100);
    }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。