您的位置:首页 > 其它

51单片机自己动手写一个printf函数

2017-06-24 16:21 141 查看
今天就简单来说说怎么在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://www.runoob.com/cprogramming/c-standard-library-stdarg-h.html

#include <STC12C5A60S2.H>
#include <stdio.h>

//UART1 初始化
void Uart1Init(void)    //115200bps@11.0592MHz
{
PCON &= 0x7F;       //波特率不倍速
SCON    = 0x50;     //8位数据,可变波特率
AUXR |= 0x04;       //1T模式
BRT     = 0xFD;     //设置独立波特率发生器重装值
AUXR |=0X01;        //串口1选择独立发生器为波特率发生器
AUXR |=0X10;        //启动独立波特率发生器
ES = 1;                 //使能串口1中断
}

//UART1 发送串口数据
void UART1_SendData(char dat)
{
ES=0;           //关串口中断
SBUF=dat;
while(TI!=1);   //等待发送成功
TI=0;           //清除发送中断标志
ES=1;           //开串口中断
}

//UART1 发送字符串
void UART1_SendString(char *s)
{
while(*s)//检测字符串结束符
{
UART1_SendData(*s++);//发送当前字符
}
}

//PRINTF 输出函数
void printf(const char *fmt,...)
{
va_list ap;
char xdata string[50];
va_start(ap,fmt);
vsprintf(string,fmt,ap);//此处也可以使用sprintf函数,用法差不多,稍加修改即可,此处略去
UART1_SendString(string);
va_end(ap);
}

void main(void)
{
Uart1Init();
printf("Hello World\r\n");
printf("Hello %s\r\n","WillemObama");
printf("This num is %d\r\n",(int)123);
**//(int)此处必须强制转换,单片机会默认该类型为char类型。**
while(1)
{
}
}


打开串口把波特率调成115200bps,可以看到串口打印如下信息:

Hello World
Hello WillemObama
This num is 123
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: