【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)
/**1 个起始位,8 个数据位,0 个校验位,1 个停止位,* :8,N,1;8 个数据位,一个停止位,无校验位。* 波特率:9600,位宽度:8,停止位:1* 传输一个字节(8 位)的数据,在总线上产生 10 个电平变换,也就是串行总线上,需要 10 位,才能发送 1 个字节数据* 1 秒可以发送 9600 位,那么用 9600/10 ,就是1秒可以发送 960 个字节数据,* 则每发送一个字节需要的时间就是:1/960 ~= 0.00104166…s ~= 1.0416667 ms。
*/
//========================================================================
void    BitTime(void)
{u16 i;i = ((MAIN_Fosc / 100) * 104) / 130000L - 1;        //根据主时钟来计算位时间   104while(--i);
}
  • 定时器配置函数(非必须内容)
/************************ 定时器配置 ****************************/void    Timer_config(void)
{TIM_InitTypeDef        TIM_InitStructure;                  //结构定义TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;   //指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMaskTIM_InitStructure.TIM_Polity    = PolityHigh;            //指定中断优先级, PolityHigh,PolityLowTIM_InitStructure.TIM_Interrupt = ENABLE;               //中断是否允许,   ENABLE或DISABLETIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;          //指定时钟源:TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_ExtTIM_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或DISABLETimer_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;  //定义模拟串口发送端,可以是任意IOvoid 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_PPGPIO_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_PPGPIO_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_16BitAutoReloadNoMaskTIM_InitStructure.TIM_Polity    = PolityHigh;            //指定中断优先级, PolityHigh,PolityLowTIM_InitStructure.TIM_Interrupt = ENABLE;               //中断是否允许,   ENABLE或DISABLETIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;          //指定时钟源:TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_ExtTIM_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或DISABLETimer_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;        //根据主时钟来计算位时间   104while(--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软串口输出打印示例程序相关推荐

  1. 【STC15】STC15单片机获取红外解码从软串口输出

    [STC15]STC15单片机获取红外解码从软串口输出 单片机型号:STC15F2K60S2 采用外部晶振,频率:11.0592MHz 红外接收头,数据引脚接P3.2 这里软串口实现主要是位处理时间一 ...

  2. STC15系列单片机通过串口多字节数据读写EEPROM操作

    STC15系列单片机通过串口多字节数据读写EEPROM操作

  3. Caysn打印机安卓平台开发包接口说明文档及打印示例程序_20170609

    Caysn打印机打印开发包接口说明文档中文版:PrinterLibs_For_Android_zh_CN_20170630 Caysn打印机打印开发包接口说明文档英文版:PrinterLibs_For ...

  4. CaysnPrinter安卓平台开发包接口说明文档及打印示例程序 - 20160926

    接口说明文档下载地址: CaysnPrinter安卓平台开发包接口说明文档 - PrinterLibs For Android_20160926 打印示例程序下载地址: Caysn打印机安卓打印示例代 ...

  5. CaysnPrinter开发包接口说明文档及打印示例程序 - 20160715

    接口说明文档下载地址:CaysnPrinter开发包接口说明文档 - PrinterLibs For Android_20160715 打印示例程序下载地址:Caysn打印机安卓打印示例代码 - Sa ...

  6. CaysnPrinter - Windows平台开发包打印示例程序及接口说明文档 - 20170531

    CaysnPrinter打印示例程序:CaysnPrinter打印机开发包示例程序_20170531 CaysnPrinter打印示例程序C#版:CaysnPrinter打印机开发包示例程序_Samp ...

  7. STC15系列的UART串口基础

    现在对串口的理解很浅,仅仅停留在会用的地步-- 梳理一下大致用法 首先是串口的控制寄存器 可以看到该寄存器是可以进行位寻址的 我们主要操作的有SM0.SM1(控制串口的工作方式) 一般都采用方式1,并 ...

  8. 基于STC15系列单片机的串口中断例程

    #include <STC15F2K60S2.H>#define FOSC 12000000 //晶振频率 #define BAUD 9600 //设置波特率unsigned char r ...

  9. Linux串口输出启动信息,linux开发板启动过程串口打印信息

    满意答案 板子软件分三部分: 1.uboot (负责初始化基本硬件,如串口,网卡,usb口等,然后引导系统运行) 2.linux系统 (真正的操作系统) 3.你的应用程序 (基于操作系统的软件应用) ...

  10. Caysn打印机IOS平台打印开发包、接口说明文档及示例程序_20170717

    打印机开发包,接口说明文档,打印示例程序下载地址:Caysn打印机IOS开发包.接口说明文档.打印示例程序_20170717 Framework版本要求:IOS8  Framework架构:armv7 ...

最新文章

  1. SQL标准结构化语言练习,SQL增删查改,SQL实现对bank数据的操作
  2. Codeforces 494D Upgrading Array
  3. 为什么说Python是伟大的入门语言
  4. 我在定制office 2007时遇到的问题
  5. goahead content-length为0时的问题
  6. 快速理解Spark Dataset
  7. mysql两者之间_Django和MySQL - 两者之间的数据是不同的
  8. SKYLINE UVALive - 4108
  9. 减速箱箱体尺寸是怎样计算的_减速箱的结构和工作原理
  10. 全国主要城市经纬度SQL脚本
  11. 创建LV报错/dev/vgdata/data: not found: device not cleared Aborting. Failed to wipe start of new LV.
  12. 计算机上瘾英语对话,对手机上瘾的英语作文(精选5篇)
  13. web IDE theia-ide安装
  14. 优化DNS,加快DNS的解析速度
  15. 常成员函数函数和返回值为常量的函数
  16. Android App签名(证书)校验过程源码分析
  17. MySQL多表查询之纵向合并
  18. 孙青椒排版八法 和 黄金分割0.618法则和构图法
  19. php代码加密tp5,TP5.1写接口用来加密解密的方法
  20. 超全开源 Python 爬虫工具箱,走到哪里爬到哪里

热门文章

  1. linux使用grep查找文件内容,linux如何使用grep命令查找文件内容
  2. Java 枚举类转换List
  3. 文件同步工具CwRsync的使用教程
  4. 区块链技术视频资料下载(不断更新中)
  5. df -h无响应问题解决
  6. 苹果屏幕镜像_苹果屏幕镜像一直在转,秒懂投屏帮你解决
  7. 彻底删除双系统的解决办法(UEFI启动)
  8. word外部表不是预期的格式_word使用邮件合并提示外部表不是预期的格式怎么解决...
  9. mac如何设置默认输入法
  10. 郑州市暂住证(居住证)、迁户口办理-2018年