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⾥⾯的复制进来貌似还是不⾏,呵呵,⽬前不知道原因。
#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);
printf怎么输出字符}
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 is123

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。