【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)
/**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软串口输出打印示例程序相关推荐
- 【STC15】STC15单片机获取红外解码从软串口输出
[STC15]STC15单片机获取红外解码从软串口输出 单片机型号:STC15F2K60S2 采用外部晶振,频率:11.0592MHz 红外接收头,数据引脚接P3.2 这里软串口实现主要是位处理时间一 ...
- STC15系列单片机通过串口多字节数据读写EEPROM操作
STC15系列单片机通过串口多字节数据读写EEPROM操作
- Caysn打印机安卓平台开发包接口说明文档及打印示例程序_20170609
Caysn打印机打印开发包接口说明文档中文版:PrinterLibs_For_Android_zh_CN_20170630 Caysn打印机打印开发包接口说明文档英文版:PrinterLibs_For ...
- CaysnPrinter安卓平台开发包接口说明文档及打印示例程序 - 20160926
接口说明文档下载地址: CaysnPrinter安卓平台开发包接口说明文档 - PrinterLibs For Android_20160926 打印示例程序下载地址: Caysn打印机安卓打印示例代 ...
- CaysnPrinter开发包接口说明文档及打印示例程序 - 20160715
接口说明文档下载地址:CaysnPrinter开发包接口说明文档 - PrinterLibs For Android_20160715 打印示例程序下载地址:Caysn打印机安卓打印示例代码 - Sa ...
- CaysnPrinter - Windows平台开发包打印示例程序及接口说明文档 - 20170531
CaysnPrinter打印示例程序:CaysnPrinter打印机开发包示例程序_20170531 CaysnPrinter打印示例程序C#版:CaysnPrinter打印机开发包示例程序_Samp ...
- STC15系列的UART串口基础
现在对串口的理解很浅,仅仅停留在会用的地步-- 梳理一下大致用法 首先是串口的控制寄存器 可以看到该寄存器是可以进行位寻址的 我们主要操作的有SM0.SM1(控制串口的工作方式) 一般都采用方式1,并 ...
- 基于STC15系列单片机的串口中断例程
#include <STC15F2K60S2.H>#define FOSC 12000000 //晶振频率 #define BAUD 9600 //设置波特率unsigned char r ...
- Linux串口输出启动信息,linux开发板启动过程串口打印信息
满意答案 板子软件分三部分: 1.uboot (负责初始化基本硬件,如串口,网卡,usb口等,然后引导系统运行) 2.linux系统 (真正的操作系统) 3.你的应用程序 (基于操作系统的软件应用) ...
- Caysn打印机IOS平台打印开发包、接口说明文档及示例程序_20170717
打印机开发包,接口说明文档,打印示例程序下载地址:Caysn打印机IOS开发包.接口说明文档.打印示例程序_20170717 Framework版本要求:IOS8 Framework架构:armv7 ...
最新文章
- SQL标准结构化语言练习,SQL增删查改,SQL实现对bank数据的操作
- Codeforces 494D Upgrading Array
- 为什么说Python是伟大的入门语言
- 我在定制office 2007时遇到的问题
- goahead content-length为0时的问题
- 快速理解Spark Dataset
- mysql两者之间_Django和MySQL - 两者之间的数据是不同的
- SKYLINE UVALive - 4108
- 减速箱箱体尺寸是怎样计算的_减速箱的结构和工作原理
- 全国主要城市经纬度SQL脚本
- 创建LV报错/dev/vgdata/data: not found: device not cleared Aborting. Failed to wipe start of new LV.
- 计算机上瘾英语对话,对手机上瘾的英语作文(精选5篇)
- web IDE theia-ide安装
- 优化DNS,加快DNS的解析速度
- 常成员函数函数和返回值为常量的函数
- Android App签名(证书)校验过程源码分析
- MySQL多表查询之纵向合并
- 孙青椒排版八法 和 黄金分割0.618法则和构图法
- php代码加密tp5,TP5.1写接口用来加密解密的方法
- 超全开源 Python 爬虫工具箱,走到哪里爬到哪里