前言
本人曾在第十三届蓝桥杯大赛单片机组中获得国一,以下是我在准备比赛过程中的一些记录,希望能给大家带来帮助
本人持续分享更多关于嵌入式和单片机的知识,如果大家喜欢,别忘点个赞加个关注哦,让我们一起共同进步~
前言:
串口通信是51单片机十分重要的一个部分,也是蓝桥杯国赛所考察的重点内容,本文不从原理,只从如何简单快速应用串口进行通信,并实现以下功能,希望对大家有所帮助。
1. 简单发送功能,通过单片机向上位机发送一位数据
2. 简单接受功能,接上位机发送的数据并加一返回上位机
实现步骤
1.配置相关寄存器,设置串口的模式和波特率
这里以串口1,波特率为9600,既然是直接应用我们不讲原理,直接通过STC下载器进行生成代码,结果如下。
void UartInit(void) //9600bps@12.000MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1为16位自动重装方式
TL1 = 0xC7; //设定定时初值
TH1 = 0xFE; //设定定时初值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES = 1;
EA = 1;
}
需要注意的是,和定时器一样生成的代码并不包含中断的开启,需要我们自己添加,也就是以下内容:
ES = 1; //打开串口中断
EA = 1; // 打开定时器中断
2.实现发送功能
- TI: 当数据发送成功时,TI 自动置1 ,但注意要手动清零
- SBUF: 数据缓存器,当有数据输入进去时,会自动通过串口发送数据,当数据发送结束,TI置1
有了以上知识就很容易写出了发送数据的代码
void send_date(unsigned char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
是不是很简单,,,
3.实现接收功能
- 当数据发送完成,或者是接受到数据,会立即进入中断,所以一但有数据接受到我们在中断中可以获取此数据
- SBUF:一旦有数据接受到,会缓存在SBUF中
- 当接受到数据,RI自动置1,但是别忘了软件清零
代码如下:
void Uart1() interrupt 4
{
if(RI){
dat = SBUF;
RI = 0;
send_date(dat + 1);
}
}
由此我们就已经实现了,数据的接受与发送。
完整代码
void UartInit(void) //9600bps@12.000MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1为16位自动重装方式
TL1 = 0xC7; //设定定时初值
TH1 = 0xFE; //设定定时初值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES = 1;
EA = 1;
}
void send_date(unsigned char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
unsigned char dat;
void Uart1() interrupt 4
{
if(RI){
dat = SBUF;
RI = 0;
send_date(dat + 1);
}
}
void main()
{
UartInit();
send_date(1);
while(1){
}
}
具体原理大家可以通过阅读数据手册,就可以有更加深入的理解。
更多相关资源
【全套完结】蓝桥杯单片机— 从省赛到国赛
https://blog.csdn.net/amimax/article/details/128749109?spm=1001.2014.3001.5501