STC单片机使用Printf
#include "STC8Axx.h"
#include "Uart1.h"
#include "Sys.h"#include <intrins.h>
#include <stdio.h> //用于printf
#include <stdarg.h> //用于vsprintf函数原型 bit bUart1Busy;bit bUart1ReceiveFinish = 0; //串口1接收完成标志 (1: 表示是 0: 表示否)
bit bIsUart1ReceiveCommandHead = 0; //是否接收到命令头 (1: 表示是 0: 表示否)
unsigned char Uart1CurrentReceiveLength = 0; //串口1当前接收数据的长度
unsigned char Uart1ReceiveDataBuf[kUart1ReceiveMaxLength]; //串口1接收到的数据[串口1接收数据最大长度]
unsigned char Uart1SendDataBuf[kUart1SendMaxLength]={0xAA,0x00,0x00,0xBB}; //串口1发送数据[串口1接收数据最大长度]//------------------------------------------------------------------------------
//读取串口1中断处理数据(字符串)(判断命令头,命令尾)
//------------------------------------------------------------------------------
void Uart1_ReadInterruptDataManage()
{Sys_CheckIAP(SBUF); //系统_检测是否需要进入下载模式if(bIsUart1ReceiveCommandHead == 0) //是否接收到命令头 (1: 表示是 0: 表示否){if(SBUF == 0xCC){bIsUart1ReceiveCommandHead = 1; //是否接收到命令头 (1: 表示是 0: 表示否)Uart1CurrentReceiveLength = 0; ///串口1当前接收数据的长度Uart1ReceiveDataBuf[Uart1CurrentReceiveLength] = SBUF; //串口1接收到的数据[串口1当前接收数据的长度]Uart1CurrentReceiveLength ++; //串口1当前接收数据的长度} }else{Uart1ReceiveDataBuf[Uart1CurrentReceiveLength] = SBUF; //串口1接收到的数据[串口1当前接收数据的长度]Uart1CurrentReceiveLength ++; //串口1当前接收数据的长度if(SBUF == 0xDD) { bIsUart1ReceiveCommandHead = 0; //是否接收到命令头 (1: 表示是 0: 表示否)bUart1ReceiveFinish = 1; //串口1接收完成标志 (1: 表示是 0: 表示否)} if(Uart1CurrentReceiveLength >= kUart1ReceiveMaxLength) //串口1当前接收数据的长度 >= {bIsUart1ReceiveCommandHead = 0; //是否接收到命令头 (1: 表示是 0: 表示否)bUart1ReceiveFinish = 0; //串口1接收完成标志 (1: 表示是 0: 表示否)}}
} ------------------------------------------------------------------------------
读取串口1中断处理数据(字符串)(判断命令头,命令尾,长度,有校验)
------------------------------------------------------------------------------
//void Uart1_ReadInterruptDataManage2()
//{
// if(bIsUart1ReceiveCommandHead == 0) //是否接收到命令头 (1: 表示是 0: 表示否)
// {
// if(SBUF == kUart1CommandStart)
// {
// bIsUart1ReceiveCommandHead = 1; //是否接收到命令头 (1: 表示是 0: 表示否)
// Uart1CurrentReceiveLength = 0; ///串口1当前接收数据的长度
// Uart1ReceiveDataBuf[Uart1CurrentReceiveLength] = SBUF; //串口1接收到的数据[串口1当前接收数据的长度]
// Uart1CurrentReceiveLength ++; //串口1当前接收数据的长度
// }
// }
// else
// {
// Uart1ReceiveDataBuf[Uart1CurrentReceiveLength] = SBUF; //串口1接收到的数据[串口1当前接收数据的长度]
// Uart1CurrentReceiveLength ++; //串口1当前接收数据的长度
// if((Uart1CurrentReceiveLength > 2) && (Uart1CurrentReceiveLength >= Uart1ReceiveDataBuf[1]))
// {
// if(Uart1ReceiveDataBuf[Uart1CurrentReceiveLength-1] == kUart1CommandEnd)
// {
// bIsUart1ReceiveCommandHead = 0; //是否接收到命令头 (1: 表示是 0: 表示否)
// bUart1ReceiveFinish = 1; //串口1接收完成标志 (1: 表示是 0: 表示否)
// }
// else
// {
// bIsUart1ReceiveCommandHead = 0; //是否接收到命令头 (1: 表示是 0: 表示否)
// bUart1ReceiveFinish = 0; //串口1接收完成标志 (1: 表示是 0: 表示否)
// }
// }
// if(Uart1CurrentReceiveLength >= kUart1ReceiveMaxLength) //串口1当前接收数据的长度 >=
// {
// bIsUart1ReceiveCommandHead = 0; //是否接收到命令头 (1: 表示是 0: 表示否)
// bUart1ReceiveFinish = 0; //串口1接收完成标志 (1: 表示是 0: 表示否)
// }
// }
//}
//
------------------------------------------------------------------------------
读取串口1中断处理数据(字符串)
------------------------------------------------------------------------------
//void Uart1_ReadInterruptDataManage()
//{
// if(bIsUart1ReceiveCommandHead == 0) //是否接收到命令头 (1: 表示是 0: 表示否)
// {
// if(SBUF == '[')
// {
// bIsUart1ReceiveCommandHead = 1; //是否接收到命令头 (1: 表示是 0: 表示否)
// Uart1CurrentReceiveLength = 0; ///串口1当前接收数据的长度
// Uart1ReceiveDataBuf[Uart1CurrentReceiveLength] = SBUF; //串口1接收到的数据[串口1当前接收数据的长度]
// Uart1CurrentReceiveLength ++; //串口1当前接收数据的长度
// }
// }
// else
// {
// Uart1ReceiveDataBuf[Uart1CurrentReceiveLength] = SBUF; //串口1接收到的数据[串口1当前接收数据的长度]
// Uart1CurrentReceiveLength ++; //串口1当前接收数据的长度
// if(SBUF == ']')
// {
// bIsUart1ReceiveCommandHead = 0; //是否接收到命令头 (1: 表示是 0: 表示否)
// bUart1ReceiveFinish = 1; //串口1接收完成标志 (1: 表示是 0: 表示否)
// }
// if(Uart1CurrentReceiveLength >= kUart1ReceiveMaxLength) //串口1当前接收数据的长度 >=
// {
// bIsUart1ReceiveCommandHead = 0; //是否接收到命令头 (1: 表示是 0: 表示否)
// bUart1ReceiveFinish = 0; //串口1接收完成标志 (1: 表示是 0: 表示否)
// }
// }
//} //------------------------------------------------------------------------------
//串口1中断函数
//------------------------------------------------------------------------------
void Uart1_Isr() interrupt 4 using 1
{if (TI){TI = 0;bUart1Busy = 0;}if (RI){RI = 0;Uart1_ReadInterruptDataManage(); //读取串口1中断处理数据}
}//------------------------------------------------------------------------------
//串口1_切换
//------------------------------------------------------------------------------
void Uart1_Swap()
{P_SW1 = 0x00; //RXD/P3.0, TXD/P3.1
// P_SW1 = 0x40; //RXD_2/P3.6, TXD_2/P3.7
// P_SW1 = 0x80; //RXD_3/P1.6, TXD_3/P1.7
// P_SW1 = 0xc0; //RXD_4/P4.3, TXD_4/P4.4
}//------------------------------------------------------------------------------
//串口1_初始化
//------------------------------------------------------------------------------
void Uart1_Init()
{SCON = 0x50; //8位数据,可变波特率AUXR |= 0x40; //定时器1时钟为Fosc,即1TAUXR &= 0xFE; //串口1选择定时器1为波特率发生器TMOD &= 0x0F; //设定定时器1为16位自动重装方式TL1 = kUart1_BRT;TH1 = kUart1_BRT >> 8;ET1 = 0; //禁止定时器1中断TR1 = 1; //启动定时器1Uart1_Swap(); //串口1_切换ES = 1; //打开串口1中断bUart1Busy = 0;
}------------------------------------------------------------------------------
串口1_发送一个字符
------------------------------------------------------------------------------
//void Uart1_SendChar(unsigned char dat)
//{
// while (bUart1Busy);
// bUart1Busy = 1;
// SBUF = dat;
//}------------------------------------------------------------------------------
串口1_发送字符串
------------------------------------------------------------------------------
//void Uart1_SendString(unsigned char *p)
//{
// while (*p)
// {
// Uart1_SendChar(*p++);
// }
//}///**********************************************************************************// * @brief 串口1发送函数
// * @param arr:被发送数据的地址
// * @param len:被发送数据的长度
// * @retval 发送结果// **********************************************************************************/
//void Uart1_Sendarray(u8* arr,u8 len)//串口1发送数组
//{
// u8 i=0;
// for(i=0;i<len;i++)
// {
// Uart1_SendChar(arr[i]);
// }
//}/*------------------------------------------------发送一个字节
------------------------------------------------*/
void SendByte(unsigned char c)
{ if(c=='\n')//如果遇到\n就换行 { //发送CR(carriage return) SBUF=0x0D; while(!TI);//等待发送完成 TI=0; //发送 LF(NL line feed,new line) SBUF=0x0A; while(!TI);//等待发送完成 TI=0; } else { SBUF=c; while(!TI);//等待发送完成 TI=0; }
}
/*------------------------------------------------发送一个字符串
------------------------------------------------*/
void SendStr(unsigned char *s)
{while(*s!='\0')// \0 表示字符串结束标志,通过检测是否字符串末尾{SendByte(*s);s++;}
}
/*------------------------------------------------发送一个指定类型数据
------------------------------------------------*/
void Uart1_printf(const char *fmt,...)
{va_list ap;char xdata string[50];//访问内部拓展RAM,非访问外部RAM,不能超过内部拓展RAM大小(此处为1024) va_start(ap,fmt);vsprintf(string,fmt,ap);//此处也可以使用sprintf函数,用法差不多,稍加修改即可,此处略去 SendStr(string);va_end(ap);
}
使用方法:
Uart1_printf("OK!\r\n");
Uart1_printf("开始命令%bd\r\n",char); //调试输出
Uart1_printf("开始命令%d\r\n",int); //调试输出
Uart1_printf("开始命令%ld\r\n",long); //调试输出
STC单片机使用Printf相关推荐
- stc单片机使用printf()函数打印
串口波特率初始化: 利用stc-isp工具生成初始化代码, 在串口初始化函数中添加 **TI=1;**如下图,否则printf()无法输出. void UartInit(void) //9600bps ...
- STC单片机不同数据类型串口打印输出示例程序
STC单片机不同数据类型串口打印输出示例程序 串口监视器打印 程序代码 #include "STC15W4K.H" #include <stdio.h> // 为使用K ...
- STC单片机波特率计算
正在做STC系列单片机的串口实验, 可是上网没找到适合的波特率计算软件,总不能每次都用脑袋算吧, 干脆花了点时间写了个小程序,粗糙了些,但将就着用呗,呵呵 程序: #include <stdio ...
- STC单片机获取红外解码从串口输出
STC单片机获取红外解码从串口输出 串口数据演示 所使用的红外接收头VS1838 VS1838引脚定义 电气特性 所使用的红外按键板 红外遥控接收模块 VS/HX1838 相关的资料: https:/ ...
- stc51单片机怎么学, 先掌握STC单片机程序烧录方法
大家好,我是无际的搭档徐明. 今天我在这里和大家探讨一下关于51单片机怎么学这个话题. 08年我在大学里学习单片机课程的时候,学习内容主要包括单片机的发展历史,单片机的框架,单片机的寄存器,以及单片机 ...
- STC单片机功率控制下载板
作者:卓晴博士,清华大学自动化系 更新时间:2020-09-06 Sunday 01为什么制作下载功率板? 在调试中,使用 STC8单片机下载电路 调试电路开发板的时候,如果电路板的功率比较大,直接使 ...
- STC单片机高速下载电路改进
01改进的思路 在2020年5月20日,收到了来自STC公司发送过来更新后的STC8H技术手册,其中对于原来连接在UART-TTL转换RS232芯片与STC8H下载端口的二极管和电阻可以去掉了. 这两 ...
- 制作新版STC单片机WiFi下载器
简 介: 基于WiFi的STC单片机下载器可以方便对STC的8A,8G,8H,15系列的单片机完成程序下载,方便了程序的开发与调试.特别适应于需要强磁隔离.运动平台的单片机开发,做到程序的快速更新与测 ...
- 通过WiFi对STC单片机程序下载和调试
简 介: 设计了基于WiFi-UART的STC单片机下载调试模块,这样便于对嵌入式系统进行远程调试开发,特别是在一些具有移动功能的平台,强电平台以及需要实时监视和修改程序的应用场合. 关键词: STC ...
最新文章
- Java核心技术卷1——笔记(1)
- CentOS-文件操作
- hibernate中@Entity和@Table的区别
- android listview下拉刷新动画,ListView下拉刷新实现方式详解和改造(上)
- 基于sqlite数据库的C语言编程
- JavaMail 发送邮件的实例
- Android Studio 字体大小设置
- 轻量通用型互联网应用架构
- rocketmq 双主双从同步写安装部署
- 微信小程序云开发教程-微信小程序的API入门-API的类型和语法结构
- 详细介绍各种常见的分布
- 01-SQL基本语句
- Nexus下载构件失败
- 三星530换固态硬盘_韩国三星网红固态硬盘PM981系列惨遭黑苹果和INTEL10代主板嫌弃...
- 新颖的自我介绍_三句有创意的自我介绍
- 【示波器专题】示波器探头的原理深入——有源探头之电流探头
- wav音乐里面竟然有病毒?
- ARP协议格式和实例分析
- Linux操作系统基础知识命令参数详解
- Roman to Integer/Integer to Roman
热门文章
- 获取当天早上8点 - 明天早上8点时间
- sheng的学习笔记-ConcurrentHashMap(JDK1.7和16)源码分析
- jsp页面链接下载文件
- vue mysql 电商_mei-shopone: nuxt(vue)+node(egg.js)+mysql晒点风格极简商城,电商系统。适合入门全栈开发,槑先森工作室。...
- 用小米平板,如何看小度路由器所连接的移动硬盘上的视频
- TensorFlow之设备(device)详解
- 在windows系统上安装双系统
- Restful 是什么? 怎么使用Restful
- 河北省2018计算机一级考试试题,2018年3月计算机一级考试MSOffice模拟试题1
- PHP应用-一揽子解决方案