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://www.runoob.com/cprogramming/c-standard-library-stdarg-h.html

#include 
#include 

//UART1 初始化
void Uart1Init(void)    //[email protected]
{
    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

你可能感兴趣的:(单片机c语言)