如何高效地使用51单片机串口输入输出

51单片机一般使用串口的方法都是这样的

#include<reg52.h>
#define uint unsigned int
void UART_Init();
uint num ;
/*
******************************************
**函数名称:主函数
*******************************************
*/
int main()
{
        UART_Init();
        while(1);
}
/*
*****************************************
**函数功能:串口初始化函数
*****************************************
*/
void UART_Init()
{
     
            TMOD = 0x20; //定时器0工作模式2,自动重装8位计数器
            TH1 = 0xfd;
            TL1 = 0xfd;//定时器溢出时,会自动将高8位中的值赋值给低8位.比特率9600
            TR1 = 1;
            SM0 = 0;
            SM1 = 1;
            REN = 1;
            EA = 1;
            ES = 1;
}
/*
********************************************
**函数名称:串口中断函数
********************************************
*/
void UART() interrupt 4
{
    if(RI == 1)        //如果接收到计算机发的数据
        {
            num = SBUF;  //取出数据
            num++;       
            RI = 0;       //清除标志位
            SBUF = num;  //把数据加1后再发送给计算机
        }
        if(TI == 1)    //如果发送完毕
        {
            TI = 0;       //清除标志位
        }
}

可以看到这样的代码非常麻烦而且不容易维护,有时候为了串口需要在逻辑代码里面添加一些串口控制,非常麻烦,而已小白看着也头疼,那如何高效地使用串口呢。我们可以使用printf和scanf。printf这个不用多说,但是scanf这个东西需要说一下,就是当串口输入空格回车换行的时候就结束了,在单片机串口通讯的过程中肯定有空格,比如接收一些AT指令,但不过这个scanf在单片机上运行的不是很顺利,我就改用getchar()了。

#include	"stc15fxxxx.h"
#include <stdio.h>
#include <string.h>

char xdata readData[300];

/*
******************************************
**    串口初始化
*******************************************
*/
void UartInit(void)                 //11.0592MHz
{
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x01;               //串口1选择定时器2为波特率发生器
        AUXR |= 0x04;               //定时器2时钟为Fosc,即1T
				
	    //9600
		//T2L = 0xE0;		        //设定定时初值
		//T2H = 0xFE;		        //设定定时初值
	
		//115200
		T2L = 0xE8;					//设定定时初值
		T2H = 0xFF;					//设定定时初值
        AUXR |= 0x10;               //启动定时器2
}
/*
******************************************
**    读取串口字符串
*******************************************
*/
void ReadString(){
		int i = 0;
		char ch;
		while((ch = getchar()) != '
'){
			readData[i] = ch;
			i++;
		}
}
/*
******************************************
**    主函数
*******************************************
*/
void main()
{
        UartInit();//串口初始化
        EA=1; //打开总中断
        ES=1; //串口1中断
        TI=1;
	
		while(1){
            
            readString();
			printf("%s
",readData);

        }
}
原文地址:https://www.cnblogs.com/kawayidamiao/p/13843770.html