大家好,我是『芯知识学堂』的SingleYork,前一篇文章给大家介绍了“SYK-0806-A2S1 工业自动化控制之【12-步进电机精确定位】”,
这一篇中,笔者要给大家介绍串口的使用了。
本例中,笔者主要跟大家介绍单个字符的收发,具体逻辑如下:
串口助手发送字符’A’,单片机收到后返回字符’A’,同时Y00输出ON;
串口助手发送字符’B’,单片机收到后返回字符’B’,同时Y01输出ON;
串口助手发送字符其他字符,单片机收到后返回收到的字符,同时Y00、Y01均输出OFF;
串口的硬件部分很简单,就是用到了一个RS232接口芯片:
所以,重点我们还是一起来看软件部分,代码还是在上一讲的基础上做修改,不过这次改动会有点大。
首先,因为本例中暂时没有用到定时器,所以我们把跟定时器相关的timer.c文件和bsp_timer.c文件都移除了,
然后分别在SYSTEM和BSP中添加usart.c库文件和bsp_usart.c文件。
关于库文件的使用,这里需要特别注意一下,因为我们所使用的IAP15W413AS单片机的xdata只有256字节,
且官方提供的库函数中定义的
TX1_Buffer[COM_TX1_Lenth]、RX1_Buffer[COM_RX1_Lenth]、TX2_Buffer[COM_TX2_Lenth]、RX2_Buffer[COM_RX2_Lenth]
四个数组均放在了xdata空间,但是官方定义的COM_TX1_Lenth、COM_RX1_Lenth、COM_TX2_Lenth、COM_RX2_Lenth这四个参数的值都是128,
也就是这四个数组占用的空间已经达到了512个字节,显然超过了单片机本身的xdata,
可恶的是,这样编译后编译器居然不会报错,因此这里大家一定要注意,我们需要在usart.h文件中,
手动将COM_TX1_Lenth、COM_RX1_Lenth、COM_TX2_Lenth、COM_RX2_Lenth的值改小,
使其总和加起来要小于256,笔者这里都改成了32:
接下来就是串口的配置,这部分主要放在了usart.c文件中:
- #include "bsp_usart.h"
-
- /*************** 串口初始化函数 *****************/
- void UART_config(void)
- {
- COMx_InitDefine COMx_InitStructure; //结构定义
-
- COMx_InitStructure.UART_Mode = UART_8bit_BRTx; //模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
- COMx_InitStructure.UART_BRT_Use = BRT_Timer2; //使用波特率, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
- COMx_InitStructure.UART_BaudRate = 115200ul; //波特率, 一般 110 ~ 115200
- COMx_InitStructure.UART_RxEnable = ENABLE; //接收允许, ENABLE或DISABLE
- COMx_InitStructure.UART_Interrupt = ENABLE; //中断允许, ENABLE或DISABLE
- COMx_InitStructure.UART_P_SW = UART1_SW_P30_P31; //切换端口, UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17(必须使用内部时钟)
-
- USART_Configuration(USART1, &COMx_InitStructure); //初始化串口1 USART1,USART2
- }
复制代码
这里有个地方需要特别注意一下:就是波特率使用的定时器,这里只有两个选择,即定时器1或定时器2,
由于IAP15W413AS单片机只有定时器0和定时器2两个定时器,因此这里我们需要选择“BRT_Timer2”;
另外,由于app.c中需要调用UART_config()函数对串口进口初始化,因此,还需要在app.h文件中添加包含bsp_usart.h的头文件:
- #ifndef __APP_H
- #define __APP_H
-
- #include "delay.h"
- #include "bsp_gpio.h"
- #include "bsp_usart.h"
-
- void app_init(void);
- void app_run(void);
-
- #endif
复制代码
这样一来,在app.c文件的app_init()函数中调用UART_config()函数就不会报错了:
- void app_init(void)
- {
- UART_config(); //UART初始化
- GPIO_Config(); //GPIO初始化
-
- EA = 1; //开启总中断
- }
复制代码
主要功能的实现,放在了app.c文件中的UART1的中断函数中:
- /********************* UART1中断函数************************/
- void UART1_int (void) interrupt UART1_VECTOR
- {
- u8 RX_Data;
-
- if(RI)
- {
- RI = 0;
- RX_Data = SBUF;
-
- if(RX_Data == 'A') //若接收到的字符为‘A’,Y00输出ON
- {
- Y00 = OutputT_ON;
- }
- else if(RX_Data == 'B')//若接收到的字符为‘B’,Y01输出ON
- {
- Y01 = OutputT_ON;
- }
- else //若接收到其他字符,Y00、Y01输出OFF
- {
- Y00 = OutputT_OFF;
- Y01 = OutputT_OFF;
- }
-
- SBUF = RX_Data; //发送接收到的字符
- }
-
- if(TI)
- {
- TI = 0;
- }
- }
复制代码
编译成功后,下载程序到板子中,使用串口助手,分别发送字符‘A’、字符’B’、字符’C’,现象如下:
原理很简单,代码部分也很简单,这里需要注意的是,单片机串口收发时只能是按字节来收发,
一个字符占一个字节,如果发送多个字符时,SUBF里面接收到的新的数据会把旧的数据覆盖掉。
因此,即使看上去用串口助手发送字符串“ABC”时单片机也能返回字符串“ABC”,实际上,
程序最终执行的效果只会保留接收到字符“C”时的效果。同时,需要注意的是,单个字符是用单引号(’ '),字符串是用双引号(" ")。
好了,关于使用本节内容笔者就介绍到这里了,有疑问的小伙伴们可以给笔者留言或者直接参与评论,
下一节笔者将继续给大家介绍“串口的基本使用”,详见“SYK-0806-A2S1 工业自动化控制之【14-串口收发字符串】”,感谢大家的支持!
本章附件:
【STC15系列】SYK-0806-A2S1- 13-串口收发单个字符.rar
(67.97 KB, 下载次数: 2)
|