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

2023-05-16

文章目录

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

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

1、显示对应的流水灯

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

#include <reg52.h>
#define uchar unsigned char;  
//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=]//9600bps@11.0592MHz[/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 uchar unsigned char
#define uint unsigned int
Uartinit();
void delay(uint x);

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

// 串口通信初始化
void UartInit(void)		//9600bps@11.0592MHz
{
	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、控制数码管显示的数字

现串口通信接收上位机的信息,控制数码管显示的数字,发送数码管的段选信号,单片机接收信号并显示相应的数字,位置为左边4个位选,同时流水灯不断左移变化。

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

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--) ;
}

二、两机收发信息

实现不断收发信息,串口通信上的发送信息与接收信息,在上位机向单片机发送信息
然后单片机接收信息并将数据进行+2处理,再发送回上位机显示出来。

#include <reg52.h>
#define uchar unsigned char  
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;  
    }  
}  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐