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

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STC15系列STC15虚拟串口输出打印示例程序相关的知识,希望对你有一定的参考价值。

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


  • 演示效果

本例程是使用STC15系列MCU做的模拟串口。用户根据自己的时钟和波特率自行设置后编译下载。我定义的是P2.1作为模拟串口发送端,可以格局个人需求切换到任意IO引脚。通过P3.0串口下载程序,使用P2.1虚拟串口,作为串口数据打印输出。

对串口打印函数进行了 重映射,采用printf格式打印输出

  • 如果不需要使用可以使用原函数
//重写putchar函数
 char putchar(unsigned char c)

 TxSend(c);
	return c;

  • 在不需要printf打印函数时,可以使用保留字符串打印函数
void PrintString(unsigned char code *puts)

    for (; *puts != 0;	puts++)  TxSend(*puts);

  • 位时间函数

这个 位时间函数中的参数如果改变会,出现异常,我在使用官方提供的《STC15系列库函数与例程测试版V2.0》中的38-比较器做ADC-C语言-模拟串口调试过程中发现,该函数中的104参数必须是80才行,如果是104就是乱码输出。

//========================================================================
// 函数: void	BitTime(void)
// 描述: 位时间函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注: 
//========================================================================
void	BitTime(void)

	u16 i;
	i = ((MAIN_Fosc / 100) * 104) / 130000L - 1;		//根据主时钟来计算位时间	104
	while(--i);

  • 定时器配置函数
/************************ 定时器配置 ****************************/

void	Timer_config(void)

	TIM_InitTypeDef		TIM_InitStructure;					//结构定义
	TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;	//指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
	TIM_InitStructure.TIM_Polity    = PolityHigh;			//指定中断优先级, PolityHigh,PolityLow
	TIM_InitStructure.TIM_Interrupt = ENABLE;				//中断是否允许,   ENABLE或DISABLE
	TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;			//指定时钟源:TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
	TIM_InitStructure.TIM_ClkOut    = ENABLE;				//是否输出高速脉冲, ENABLE或DISABLE
//	TIM_InitStructure.TIM_Value     = (65536 - (MAIN_Fosc/4/BAUD));	//初值,
	TIM_InitStructure.TIM_Value     = 65536 - MAIN_Fosc / 100000UL;	//初值,同上
	TIM_InitStructure.TIM_Run       = ENABLE;				//是否初始化后启动定时器, ENABLE或DISABLE
	Timer_Inilize(Timer0,&TIM_InitStructure);				//初始化Timer0	  Timer0,Timer1,Timer2

上面代码中TIM_InitStructure.TIM_Value = (65536 - (MAIN_Fosc/4/BAUD)); //初值, TIM_InitStructure.TIM_Value = 65536 - MAIN_Fosc / 100000UL; //初值,同上,任意一个配置都行。但是在《STC15系列库函数与例程测试版V2.0》中的38-比较器做ADC-C语言-模拟串口实例中必须使用TIM_InitStructure.TIM_Value = (65536 - (MAIN_Fosc/4/BAUD)); //初值,按照原配置不该动的话,则虚拟串口输出的是乱码,不要问为什么我知道这一点,这是我采坑调试出来的。源代码并没有人和说明该函数的参数是怎么配置来的。希望后面的人不要踩这个坑了。

主程序

/*---------------------------------------------------------------------*/
/* --- STC MCU International Limited ----------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.GXWMCU.com --------------------------------------------*/
/* --- QQ:  800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了宏晶科技的资料及程序   */
/*---------------------------------------------------------------------*/
#include "stdio.h"
#include	"config.h"
#include	"timer.h"
#include	"GPIO.h"

/*************  外部函数和变量声明 *****************/


/*************	本地常量声明	**************/


/*************	本地变量声明	**************/
#define MAIN_Fosc		11059200L	//定义主时钟
#define BAUD 9600               //串口波特率

sbit	P_TXD = P2^1;	//定义模拟串口发送端,可以是任意IO

void	TxSend(u8 dat);
void 	PrintString(unsigned char code *puts);
 char putchar(unsigned char c);
/*************	本地函数声明	**************/
//========================================================================
// 函数: void  delay_ms(unsigned char ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数,  自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注: 
//========================================================================
void  delay_ms(unsigned int ms)

     unsigned int i;
	 do
	      i = MAIN_Fosc / 13000;
		  while(--i)	;   //14T per loop
     while(--ms);




/************************ IO口配置 ****************************/
void	GPIO_config(void)

	GPIO_InitTypeDef	GPIO_InitStructure;				//结构定义
	GPIO_InitStructure.Pin  = GPIO_Pin_0;				//指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
	GPIO_InitStructure.Mode = GPIO_OUT_PP;				//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
	GPIO_Inilize(GPIO_P1,&GPIO_InitStructure);			//初始化

	GPIO_InitStructure.Pin  = GPIO_Pin_1;				//指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
	GPIO_InitStructure.Mode = GPIO_OUT_PP;				//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
	GPIO_Inilize(GPIO_P2,&GPIO_InitStructure);			//初始化


/************************ 定时器配置 ****************************/

void	Timer_config(void)

	TIM_InitTypeDef		TIM_InitStructure;					//结构定义
	TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;	//指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
	TIM_InitStructure.TIM_Polity    = PolityHigh;			//指定中断优先级, PolityHigh,PolityLow
	TIM_InitStructure.TIM_Interrupt = ENABLE;				//中断是否允许,   ENABLE或DISABLE
	TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;			//指定时钟源:TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
	TIM_InitStructure.TIM_ClkOut    = ENABLE;				//是否输出高速脉冲, ENABLE或DISABLE
//	TIM_InitStructure.TIM_Value     = (65536 - (MAIN_Fosc/4/BAUD));	//初值,
	TIM_InitStructure.TIM_Value     = 65536 - MAIN_Fosc / 100000UL;	//初值,同上
	TIM_InitStructure.TIM_Run       = ENABLE;				//是否初始化后启动定时器, ENABLE或DISABLE
	Timer_Inilize(Timer0,&TIM_InitStructure);				//初始化Timer0	  Timer0,Timer1,Timer2



/******************** task A **************************/
void main(void)


//将P2.1口设置为推挽输出模式
//    P2M1=0x00;
//    P2M0=0x02;
	P10 = 0;
	GPIO_config();
	Timer_config();
	EA = 1;
	printf("\\t STC15F2K60S2\\r\\n");

	while (1)
	

		printf("\\t Perseverance520 \\r\\n");
		P10 = ~P10;
		delay_ms(500);
	



//========================================================================
// 函数: void	BitTime(void)
// 描述: 位时间函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注: 
//========================================================================
void	BitTime(void)

	u16 i;
	i = ((MAIN_Fosc / 100) * 104) / 130000L - 1;		//根据主时钟来计算位时间	104
	while(--i);


//========================================================================
// 函数: void	TxSend(uchar dat)
// 描述: 模拟串口发送一个字节。9600,N,8,1
// 参数: dat: 要发送的数据字节.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注: 
//========================================================================
void	TxSend(u8 dat)

	u8	i;
	EA = 0;
	P_TXD = 0;
	BitTime();
	for(i=0; i<8; i++)
	
		if(dat & 1)		P_TXD = 1;
		else			P_TXD = 0;
		dat >>= 1;
		BitTime();
	
	P_TXD = 1;
	EA = 1;
	BitTime();
	BitTime();


//========================================================================
// 函数: void PrintString(unsigned char code *puts)
// 描述: 模拟串口发送一串字符串。9600,N,8,1
// 参数: *puts: 要发送的字符指针.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注: 
//========================================================================
void PrintString(unsigned char code *puts)

    for (; *puts != 0;	puts++)  TxSend(*puts);


//重写putchar函数
 char putchar(unsigned char c)

 TxSend(c);
	return c;



程序源码

链接:https://pan.baidu.com/s/1DokConGCqAHSgGAeTzJJ0Q 
提取码:pk08

以上是关于STC15系列STC15虚拟串口输出打印示例程序的主要内容,如果未能解决你的问题,请参考以下文章

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

STC单片机通过ADC外部输入调节PWM占空比输出并串口打印当前脉冲值

STC15系列串口1全双工中断方式收发通讯程序

STC单片机3路PWM波形输出并串口打印当前脉冲值

STC15F408AS重映射串口打印函数

STC15F408AS跑STC官方示例串口输出乱码问题解决方案