STC15利用库函数实现printf和scanf重载示例模板

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STC15利用库函数实现printf和scanf重载示例模板相关的知识,希望对你有一定的参考价值。

【STC15】利用库函数实现printf和scanf重载


  • 这里以STC15F2K60S2功能演示

-> 本实例是通过官方库函数示例修改得来,利用串口1中断来收发。

代码说明

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重载示例模板的主要内容,如果未能解决你的问题,请参考以下文章

stm32CubeMx上移植自己的printf()和scanf()函数

STC15双串口printf调试输出案例

STC15系列STC15虚拟串口输出打印示例程序

STC15F408AS重映射串口打印函数

STC15单片机软串口的使用

STC单片机不同数据类型串口打印输出示例程序