STC15利用库函数实现printf和scanf重载示例模板
Posted perseverance52
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STC15利用库函数实现printf和scanf重载示例模板相关的知识,希望对你有一定的参考价值。
【STC15】利用库函数实现printf和scanf重载
- 这里以
STC15F2K60S2
功能演示
-> 本实例是通过官方库函数示例修改得来,利用串口1中断来收发。
- 测试的芯片型号:
STC15w408AS
以及STC15F2A60S2
. - 《【开源STC15开发板】STC15F2K60S2开发板》
- 《【开源分享】自制STC15W408AS开发板》
代码说明
1.晶振频率。由于STC15系列自带内部晶振,在STC-ISP烧录的时候选择内部晶振,也可以使用外部晶振。频率设置:config.h
头文件的宏定义出修改:
//#define MAIN_Fosc 16000000L //定义主时钟
//#define MAIN_Fosc 22118400L //定义主时钟
//#define MAIN_Fosc 12000000L //定义主时钟
#define MAIN_Fosc 11059200L //定义主时钟
//#define MAIN_Fosc 5529600L //定义主时钟
//#define MAIN_Fosc 24000000L //定义主时钟
2. 针对波特率发生器,在选择定时器时,如果是STC15W408AS
只能使用2作为波特率发生器,没有定时器1,其他型号的可以在定时器1和定时器2上选择任意选择。
3. 使能的是串口1,波特率115200
/************* 串口1初始化函数 *****************/
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_Timer1; //使用波特率, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
COMx_InitStructure.UART_BaudRate = 115200ul; //波特率, 一般 110 ~ 115200
COMx_InitStructure.UART_RxEnable = ENABLE; //接收允许, ENABLE或DISABLE
COMx_InitStructure.BaudRateDouble = DISABLE; //波特率加倍, ENABLE或DISABLE
COMx_InitStructure.UART_Interrupt = ENABLE; //中断允许, ENABLE或DISABLE
COMx_InitStructure.UART_Polity = PolityLow; //中断优先级, PolityLow,PolityHigh
COMx_InitStructure.UART_P_SW = UART1_SW_P30_P31; //切换端口, UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17(必须使用内部时钟)
COMx_InitStructure.UART_RXD_TXD_Short = DISABLE; //内部短路RXD与TXD, 做中继, ENABLE,DISABLE
USART_Configuration(USART1, &COMx_InitStructure); //初始化串口1 USART1,USART2
// PrintString1("STC15W408AS UART1 Test Prgramme!\\r\\n"); //SUART1发送一个字符串
printf
函数和scanf
函数重载
- 相关函数在
USART.c
文件中。
char putchar(char c);//printf重载
char _getkey(void);//scanf
- 重载函数实现函数
char putchar(char c)
TX1_write2buff(c);
return c;
char hal_uart_getchar(void)
unsigned char i;
if(COM1.RX_TimeOut > 0) //超时计数
if(--COM1.RX_TimeOut == 0)
if(COM1.RX_Cnt > 0)
for(i=0; i<COM1.RX_Cnt; i++) TX1_write2buff(RX1_Buffer[i]); //收到的数据原样返回
COM1.RX_Cnt = 0;
return i;
char _getkey(void)
return hal_uart_getchar();
编译时出现3条警告说明
- 第一条是延时函数没使用。作为模板程序如果移植它用,可能会使用到,就将其保留下来,如果你不想要,可以自己移除掉。
- 另外两处报警是重载函数。
主程序代码
/* 使用printf和scanf进行格式化输入输出 */
#include "config.h"
#include "USART1.h"
#include "delay.h"
#include <stdio.h>//printf/scanf函数
/************* 功能说明 **************
双串口全双工中断方式收发通讯程序。
STC15W408AS只能使用定时0或2作为波特率发生器,没有定时器1
通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回.
******************************************/
/************* 本地常量声明 **************/
/************* 本地变量声明 **************/
/************* 本地函数声明 **************/
/************* 外部函数和变量声明 *****************/
/************* 串口1初始化函数 *****************/
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_Timer1; //使用波特率, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
COMx_InitStructure.UART_BaudRate = 115200ul; //波特率, 一般 110 ~ 115200
COMx_InitStructure.UART_RxEnable = ENABLE; //接收允许, ENABLE或DISABLE
COMx_InitStructure.BaudRateDouble = DISABLE; //波特率加倍, ENABLE或DISABLE
COMx_InitStructure.UART_Interrupt = ENABLE; //中断允许, ENABLE或DISABLE
COMx_InitStructure.UART_Polity = PolityLow; //中断优先级, PolityLow,PolityHigh
COMx_InitStructure.UART_P_SW = UART1_SW_P30_P31; //切换端口, UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17(必须使用内部时钟)
COMx_InitStructure.UART_RXD_TXD_Short = DISABLE; //内部短路RXD与TXD, 做中继, ENABLE,DISABLE
USART_Configuration(USART1, &COMx_InitStructure); //初始化串口1 USART1,USART2
// PrintString1("STC15W408AS UART1 Test Prgramme!\\r\\n"); //SUART1发送一个字符串
/**********************************************/
void main(void)
UART_config();
EA = 1;
printf("Perseverance51");
while (1)
程序源码
本程序实验在STC15系列使用范围内,如需在其他的型号上使用需要将其移植到对应型号库函数程序中去。而不是将生成的Hex文件烧录到其他型号的单片机上。
链接:https://pan.baidu.com/s/1GN9qnJk9Zriyy1pTaZ_I8g
提取码:cu3f
以上是关于STC15利用库函数实现printf和scanf重载示例模板的主要内容,如果未能解决你的问题,请参考以下文章