天天看点

蓝桥杯51单片机之串口通信发送接收信息【单片机开发初学者串口必会】

文章目录

  • ​​一、上位机发送信号控制单片机​​
  • ​​1、显示对应的流水灯​​
  • ​​2、显示对应数码管​​
  • ​​3、控制数码管显示的数字​​
  • ​​二、两机收发信息​​

一、上位机发送信号控制单片机

1、显示对应的流水灯

实现现串口通信接收上位机的信息,控制流水灯的亮灭与亮的位置,发送流水灯控制信号,单片机接收信号并显示对应的流水灯。

#include <reg52.h>
#define
//sbit LED = P1^4;  
uchar UART_buff;  
bit Money = 0;  
//----------------------------------------------  
void main (void)  
{  
    SCON = 0x50;   //串口方式1, 8-n-1, 允许接收.  
    TMOD = 0x20;   //T1方式2  
    
    TH1 = 0xFD;    //[url=]//[email protected][/url]  
    TL1 = 0xFD;
      
    TR1 = 1;
                              
    ES  = 1;       //开中断.  
    EA  = 1;
      
    while(Money==0);    //等待中断触发,等着再次输入信号
}  
//----------------------------------------------  
void ser_int (void) interrupt 4   //一旦串口打开了,就执行该中断服务函数,中断号为4
{  
    if(RI == 1)    //如果收到消息.
    {   
      RI = 0;      //清除标志.   
      UART_buff = SBUF;   //将接收的数据变为uchar类型 
      P1 = UART_buff;   //点亮对应的流水灯
      if(UART_buff == '$')  Money = 1; //中断返回,一旦有$符号,中断就永久触发了,不断循环收发消息 
    }    
}      

2、显示对应数码管

现串口通信接收上位机的信息,控制数码管显示的位置,发送数码管的位选信号,单片机接收信号并显示对应的数码管,显示数字为9。

#include <reg52.h>
#define
#define
Uartinit();
void delay(uint x);

sbit dula= P2^6;
sbit wela= P2^7;
uchar Uart_buff;

// 串口通信初始化
void UartInit(void)    //[email protected]
{
  SCON = 0x50;    //8位数据,可变波特率
  TMOD = 0x20;    //设定定时器1为16位自动重装方式

  TL1 = 0xFD;    //设定定时初值
  TH1 = 0xFD;    //设定定时初值
  
  ET1= 0;  //禁止定时器1中断
  TR1= 1;  //启动定时器1

  ES= 1;  //串口中断
  EA= 1;  //总中断
}


void main()
{
  Uartinit();  //执行初始化
  
  while(1) ;  //等待串口中断的触发   
}

// 显示数码管
void display() interrupt 4
{
  if(RI==1)   //如果接收到消息
  {

    RI= 0;  //手动清零接收位

    Uart_buff= SBUF;
      wela= 1;
      P0= Uart_buff;
      wela= 0;

    dula= 1;
      P0= 0x6F;  //显示数字9
      dula= 0;  
    delay(500); 
  }    
}

void delay(uint x)  //延时x毫秒的函数
{
  uint i,j;
  for(i=x; i>0; i--)
  {
    for(j=110; j>0; j--) ;
  }
}      

3、控制数码管显示的数字

#include <reg52.h>
#define
#define

void display_ISR();    //中断显示函数
void Uart_Init();  //中断初始化函数
void delay_ms(uint x);
void light();

uchar UART_buff;
sbit dula = P2^6;
sbit wela = P2^7;

void Uart_Init()
{
  SCON = 0x50;
  TMOD = 0x20;  //方式2

  TH1 = 0xFD;    //定时器1重装初值
  TL1 = 0xFD;

  ET1 = 0;  //关定时器1中断
  TR1 = 1;  //启动定时器1运行

  ES = 1;  //串口中断
  EA = 1;  //总中断
}

void main()
{
  uchar temp = 0xFE;
  Uart_Init();
  P1 = temp;
  delay_ms(500);
  while(1)  //等待中断触发
  {  
    light(temp);
  }  
}

void light(temp)
{
  if(temp != 0x00)     
  {
    temp = temp << 1;  //左移一位,不断循环不断左移
    P1 = temp;
    delay_ms(500);  
  }
  else   //如果全亮了
    temp = 0xFF;
    P1 = temp;
}


void display_ISR() interrupt 4
{
  if(RI==1)     //如果收到消息
  {
    UART_buff = SBUF;
    RI = 0;

    wela = 1;
    P0 = 0xF0;
    wela = 0;
    dula = 1;
    P0 = UART_buff;
    dula = 0;
    delay_ms(1500);  //延时1500ms,1.5秒
      
  }
}

void delay_ms(uint x)
{
  uint i, j;
  for(i=x; i>0; i--)
    for(j=110; j>0; j--) ;
}      

二、两机收发信息

#include <reg52.h>
#define
void Uart_Init();  //初始化函数
sbit LED= P1^4;

bit new=0, sended=1;
/*错误点:sended初始必须为1*/

uchar UART_buff;

void Uart_Init()
{
    SCON= 0x50;
    TMOD= 0x20;

    TH1= 0xFD;
    TL1= 0xFD;

    ET1= 0;
    TR1= 1;

    ES = 1;
    EA = 1;
}

void main()
{
    Uart_Init();
    while(1)     //正常运行,并等待中断的触发
    {
        if((new==1) && (sended==1))
        {
            /*易错遗忘点*/
            SBUF = UART_buff; //那就发送 
            new = 0;  
            sended = 0;    
        }
    }
}

void ser_int (void)    interrupt 4
{
    if(RI == 1)    //如果收到信息 
    {  
        RI = 0;      //清除标志.
        new= 1;    
        UART_buff = SBUF;  //接收.  
        if(UART_buff == '1')  
            LED= 1;  //启动一个LED灯
        else if(UART_buff == '0')  
            LED= 0;
        else
        {
            UART_buff = UART_buff + 2;
        }  
    }  
    else  
    {        //如果送毕.  
        TI = 0;      //清除标志.  
        sended = 1;  
    }  
}