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