IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STC单片机使用Printf -> 正文阅读

[嵌入式]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,即1T
	AUXR &= 0xFE;																//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;																//设定定时器1为16位自动重装方式
    TL1 = kUart1_BRT;
    TH1 = kUart1_BRT >> 8;
	ET1 = 0;																	//禁止定时器1中断
	TR1 = 1;																	//启动定时器1
	Uart1_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); //调试输出

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-26 10:20:39  更:2021-09-26 10:21:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:53:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码