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虚拟串口输出打印示例程序的主要内容,如果未能解决你的问题,请参考以下文章