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

来源:互联网 发布:天下霸唱抄袭 知乎 编辑:程序博客网 时间:2024/05/20 12:20
今天就简单来说说怎么在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 WorldHello WillemObamaThis num is 123
原创粉丝点击