1.分析原理图


由上图我们可以看到串口1通过CH340接到了USB口上,通过串口1我们就能跟电脑进行数据交互。

另外需要注意的是STC15F是有两组高速串口的,而且可以切换端口。

2.配置串口

由于比赛时间紧,我们最好不要去现场查寄存器手册,去计算波特率。建议直接使用STC-ISP烧录软件里面的小工具去配置就行。例如我这是使用定时器2用作串口1的波特率发生器,波特率9600。需要注意的是如果你想要使能串口1中断,需要加上 ES = 1;EA = 1;

如果你使能了串口中断,下面就是串口中断函数的写法:

/*----------------------------UART 中断服务程序-----------------------------*/void Uart() interrupt 4{if(RI) RI = 0; //清除RI位if (TI){TI = 0;//清除TI位 busy = 0;//清忙标志}}

3.封装串口收发函数

串口收发函数其实也不需要我们自己现场去写,在STC-ISP烧录软件里面有示例,复制出来稍作修改就行。

下面是我修改过后的代码

#include "uart.h"bit busy;void UartInit(void)//9600bps@12.000MHz{SCON = 0x50;//8位数据,可变波特率AUXR |= 0x01;//串口1选择定时器2为波特率发生器AUXR &= 0xFB;//定时器时钟12T模式T2L = 0xE6;//设置定时初始值T2H = 0xFF;//设置定时初始值AUXR |= 0x10;//定时器2开始计时ES = 1; //使能串口1中断EA = 1;}/*----------------------------UART 中断服务程序-----------------------------*/void Uart() interrupt 4{if(RI) RI = 0; //清除RI位if (TI){TI = 0;//清除TI位 busy = 0;//清忙标志}}/*----------------------------发送串口数据----------------------------*/void SendData(u8 dat){while (busy); //等待前面的数据发送完成busy = 1;SBUF = dat; //写数据到UART数据寄存器}/*----------------------------发送字符串----------------------------*/void SendString(char *s){while (*s)//检测字符串结束标志{SendData(*s++); //发送当前字符}}

4.使用printf函数

C51也是可以通过串口重定向,就能直接使用printf()函数往串口发送格式化数据,具体操作如下:

/*-----------------------------串口重定向-------------------------------*/char putchar(char c){SendData(c);return c;}

然后就能直接使用printf()函数了,示例:按键按下后将获取到的温度数据通过串口发送到电脑


需要注意的是如果提示printf函数未定义,请引入头文件stdio.h 如果还是提示没有定义,请自行往stdio.h头文件里面添加如下代码:

5.完整封装库

#include "uart.h"bit busy;void UartInit(void)//9600bps@12.000MHz{SCON = 0x50;//8位数据,可变波特率AUXR |= 0x01;//串口1选择定时器2为波特率发生器AUXR &= 0xFB;//定时器时钟12T模式T2L = 0xE6;//设置定时初始值T2H = 0xFF;//设置定时初始值AUXR |= 0x10;//定时器2开始计时ES = 1; //使能串口1中断EA = 1;}/*----------------------------UART 中断服务程序-----------------------------*/void Uart() interrupt 4{if(RI) RI = 0; //清除RI位if (TI){TI = 0;//清除TI位 busy = 0;//清忙标志}}/*----------------------------发送串口数据----------------------------*/void SendData(u8 dat){while (busy); //等待前面的数据发送完成busy = 1;SBUF = dat;//写数据到UART数据寄存器}/*----------------------------发送字符串----------------------------*/void SendString(char *s){while (*s)//检测字符串结束标志{SendData(*s++); //发送当前字符}}/*-----------------------------串口重定向-------------------------------*/char putchar(char c){SendData(c);return c;}