51单片机串口通信使用类似printf函数的两种办法

发布者:科技革新者最新更新时间:2016-05-18 来源: eefocus关键字:51单片机  串口通信  printf函数 手机看文章 扫描二维码
随时随地手机看文章

今天就简单来说说怎么在51单片机中使用"printf"函数:包括使用自带的printf函数和自己动手写一个printf函数,再贴代码之前先介绍几个相关的知识,主要用于自己写printf函数。

①C语言函数:vsprintf,


其原型为int vsprintf(char *string, char *format, va_list param);,作用为将param按格式format写入字符串string中,因此他可以用于将任何格式数据转化为字符串数据,比如把整数97转化为ASCII码的97的程序就像下面这样vsprintf(string,"%d",97),当然还有一点需要注意:在keil里面使用sprintf需要包含stdio.h这个头文件(当然这里也可以使用sprintf,作用完全差不多,只需要稍加修改即可,不多介绍)。说到这里,再来说说另一个函数itoa吧,其实他比vsprintf更简单,其原型为char *itoa(int value, char *string, int radix),作用为将value按radix进制写入到string字符串中,使用时需要包含头文件stdlib.h,可是在keil里面却无法使用,头文件里面不包含itoa,即使把VC里面的进来貌似还是不行,,目前不知道原因。

②可变参数函数

具体来说就是stdarg.h里面的这几个函数va_start,va_arg,va_list,va_end,这几个参数用于开辟一段内存区域,可以配合vsprintf使用,但是对内存使用较大,需要单片机具备一定的RAM,否则程序就算能编译通过也是无法运行的,用法见这里http://blog.csdn.net/googlemi/article/details/8988567

③内部拓展RAM

定义:集成在单片机内部的数据存储器,在物理上是内部,但逻辑上是外部,访问时需要使用MOVX或者xdata访问,具体可以看STC8051手册,如下所示

51单片机串口通信使用类似printf函数的两种办法
 

 

51单片机串口通信使用类似printf函数的两种办法
 

 

 

:内部RAM(256byte)包括三部分:低128byte,高128byte和特殊功能寄存器区,特别注意和51不同,他的特殊功能寄存器和高128byte地址重叠,但是物理上是分开的,所有内部可用的RAM有256byte,所以到此为止可以得到内部RAM大小总共有:256byte+1024byte=1280byte

说了这么多,下面不多说,直接上程序

《一》直接使用系统自带的printf函数:特别注意需要置位TI=1,否则是无法发送的,程序如下:

//此程序主要用于uart发送(proteus终端不能显示汉字,但串口助手可以),输入换行符\n换行
#include
//stdio.h,string.h用于printf函数原型
#include


void delay(unsigned int z);
void uart_init(void);//串行口初始化

int main(void)
{
	int a=99;
	char *string="abde";
	uart_init();
	while(1)
	{
		printf("%d  %x  %c  %s  %p\n",a,a,(char)a,string,string);
		delay(1000);
	}
	return 0;
}

void uart_init(void)
{
	TMOD=0x20;//即0010 0000,定时器/计数器1,工作方式2
	TH1=0xfd;//设置波特率为9600
	TL1=0xfd;
	TR1=1;//启动定时器/计数器1
	
	SCON=0x50; //0101 0000.串口工作方式1,允许串行控制
	PCON=0x00;//设置SMOD=0
	IE=0x90; //CPU允许中断,串行允许中断
	
	TI=1;//直接使用printf必须加入此句才能实现发送
}

void delay(unsigned int z)
{
	unsigned int x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}

《二》自己动手写一个类似printf的函数:uart_printf

但是这种情况占用RAM较多,因为需要开辟大数组,所以需要使用拓展型的51单片机,普通的AT89C51和STC89C52之类的会造成内存不够用、堆栈溢出等等问题,所以以下程序都是基于STC12C5A60S2的,因为它含有内部拓展的1024byte的RAM,可以用来存储大数组

//此程序主要用于uart发送(proteus不能仿真,但实际是可以运行的),输入换行符\n换行
#include
//stdio.h,stdarg.h用于vsprintf函数原型
#include
#include

void delay(unsigned int z);
void uart_init(void);//串行口初始化
void sendbyte(unsigned char c);
void sendstring(unsigned char *string);
void uart_printf(const char *fmt,...);

int main(void)
{
	int a=99;
	uart_init();
	while(1)
	{
		uart_printf("10进制:%d  16进制:%x  字符格式:%c\n",a,a,a);
		delay(1000);
	}
	return 0;
}

void uart_init(void)
{
	TMOD=0x20;//即0010 0000,定时器/计数器1,工作方式2
	TH1=0xf3;//设置波特率为2400
	TL1=0xf3;
	TR1=1;//启动定时器/计数器1
	
	SCON=0x50; //0101 0000.串口工作方式1,允许串行控制
	PCON=0x00;//设置SMOD=0
	IE=0x00; //由于是查询方式,故需要禁止中断,CPU不允许中断,串行不允许中断
	
}

void delay(unsigned int z)
{
	unsigned int x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}

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 sendstring(unsigned char *string)//此处*string相当于数组
{
	while(*string!='\0')//判断是否到字符串末尾
	{
		sendbyte(*string);
		string++;
	}
}

void uart_printf(const char *fmt,...)
{
	va_list ap;
	char xdata string[1024];//访问内部拓展RAM,非访问外部RAM,不能超过内部拓展RAM大小(此处为1024)
	
	va_start(ap,fmt);
	vsprintf(string,fmt,ap);//此处也可以使用sprintf函数,用法差不多,稍加修改即可,此处略去
	sendstring(string);
	va_end(ap);
}

最后简单总结 :其中第一种方法用于中断方式工作会有问题,因为其底层是调用putchar函数实现的,工作方式为中断,但是比较简单,可以通过proteus仿真;第二种方法更完善,不过程序比较复杂,不能使用proteus仿真,但实际是可以工作的。

关键字:51单片机  串口通信  printf函数 引用地址:51单片机串口通信使用类似printf函数的两种办法

上一篇:51单片机串口通信的注记
下一篇:Flex与51单片机socket通信 策略问题

推荐阅读最新更新时间:2024-03-16 14:54

51单片机的串行通信口原理解析
MCS-51单片机内部有一个全双工的串行通信口,即串行接收和发送缓冲器(SBUF),这两个在物理上独立的接收发送器,既可以接收数据也可以发送数据。但接收缓冲器只能读出不能写入,而发送缓冲器则只能写入不能读出,它们的地址为99H。这个通信口既可以用于网络通信,亦可实现串行异步通信,还可以构成同步移位寄存器使用。如果在传行口的输入输出引脚上加上电平转换器,就可方便地构成标准的RS-232接口。下面我们分别介绍。 [1]。 基本概念 数据通信的传输方式 常用于数据通信的传输方式有单工、半双工、全双工和多工方式。 单工方式:数据仅按一个固定方向传送。因而这种传输方式的用途有限,常用于串行口的打印数据传输与简单系统间的数据采集。 半双工
[单片机]
<font color='red'>51单片机</font>的串行通信口原理解析
利用89c51单片机编写可调万年历
最近需要编写我学单片机一个星期以来最大的一个项目,目前感觉相当有挑战性,题目如下: 1)项目一(远程时钟控制系统) 项目背景:时间对于每个人都很重要,特别是对于高速发展的今天。每个城市都有中央LED显示,上面一般包含有时间,天气相应的信息。说近一点,比如我们学校体育馆的LED屏。对于这些显示系统,我不可能每次调整信息都爬到那么高的位置去调节。为此,我们需要设计一个远程时钟控制系统。 项目要求: 1,能够在开发板上的液晶1602上设计出电子钟万年历。 2,设计串口通信协议。 3,通过串口协议,能够通过串口将时钟信息发送到PC机上。 4,通过串口协议,设置的时钟的年,月,日,时,分,秒。 5,通过串口协
[单片机]
基于51单片机的贪吃蛇小程序(8*8LED点阵实现)
一直很想写一个贪吃蛇的小程序,这两天终于抽空完成了,这里把我的思路分享给大家,仅供参考! 代码如下: 先放段主函数压压惊 void main() { x_s = 2; //初始化三个点 y_s = 3; x_s = 3; y_s = 3; x_s = 4; y_s = 3; Timer0Init(); suijishu(); while(1) { appear(); if(flag_a) //蛇身移动位 { if(!flag_s) //蛇身死亡位 { auto_move(); HC_595(0x00); //消隐 P0 = 0xFF; //消隐
[单片机]
51单片机PCF8591四路AD数值LCD1602屏显示源码
单片机源程序: /**********************BST-V51实验开发板例程************************ * 平台:BST-V51 + Keil U3 + STC89C52 * 名称:四路AD数值LCD1602屏显示 * 公司:深圳市亚博软件开发有限公司 * 晶振:11.0592MHZ ******************************************************************/ /*----------------------------------------------- 名称:IIC协议 PCF8591ADDA转换 显示有4个,注意
[单片机]
51单片机复习003
1、AT89S52单片机 串行通信 概念性部分 2、AT89S52单片机 串行通信配置时用到的寄存器 串行通信的基础配置: 配置1:串行口控制寄存器 SCON (98H) SCON : SM0 SM1 SM2 REN TB8 RB8 TI RI ------------------------------------------------------------------------------------------------------------------- SM0 SM1 0 0 : 方式0 : 8位移位寄存器。 波特率固定为: fos
[单片机]
<font color='red'>51单片机</font>复习003
TI 54xx DSP与51单片机的接口技术
1 硬件设计    1.1 时序匹配     HPI8总共有18根信号线。其中数据线8根(HD0~HD7),其余10根都是控制线,如表1所列 ①HAS:在数据线和地址复用的MCU中,与ALE信号连接,在下降沿锁存HBIL、HCNTL0/1、HR/W,因数这些信号通常与地址线连接。如果MCU的数据线和地址线没有复用,则应该接高电平。    ②HDS1、HDS2:数据传输的时序控制。时序见图1,即下降沿传输开始,上升沿传输结束。另外如果不使用HAS(即接高电平),也可以配合HCS对HBIL、HCNTL0/1、HR/W进行锁存。    ③HCNTL0/:选择HPI内部寄
[单片机]
TI 54xx DSP与<font color='red'>51单片机</font>的接口技术
MCS-51单片机最小系统的组成部分及电路图介绍
  MCS-51单片机概述   MCS-51单片机是一种集成的电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。   51系列单片机的特点   -8位cpu   -片内带振荡器,频率范围为1.2MHz~12MHz   -片内带128B的数据存储器   -片内带4KB的程序存储器   -程序存储器的寻址空间为64KB   -片外数据存储器的寻址空间为64KB   -128个用户位寻址空间   -21个字节特殊功
[单片机]
MCS-<font color='red'>51单片机</font>最小系统的组成部分及电路图介绍
基于MCS-51单片机的智能机器人迷宫车设计
摘要:机器人在军事侦察、扫雷排险、防核化污染等危险与恶劣环境中以及工业自动化生产的物料搬运上应用很广,随着任务复杂性的增加,对移动机器人的要求也越来越智能化。然而,功能较完备的路径跟踪控制方法普遍具有计算复杂,不易实现等特点。主要针对移动机器人即智能小车的行走系统进行设计,以MCS-51单片机为控制核心的智能小车利用单光束反射取样红外传感器,探测正前方及左右两侧障碍物,利用控制算法寻找行进路线,在无人控制的情况下自主地走出迷宫。设计采用了轮式移动机构,使机器人能直线行走、左右转弯、主要针对路径跟踪算法优化问题,提出一种有效可行的方法,该法比以往算法更简单易行。 关键词:智能小车;迷宫;控制算法;避障 机器人应当具有几个特征:移动
[工业控制]
基于MCS-<font color='red'>51单片机</font>的智能机器人迷宫车设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved