主页 > 互联网  > 

蓝桥杯备战——6.串口通讯


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; }
标签:

蓝桥杯备战——6.串口通讯由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“蓝桥杯备战——6.串口通讯