1、首先添加头文件#include
2、配置一下串口,但是在串口初始化的时候TI必须为1,否则无法发送。
3、也可以使用中断接收,但是不要再中断里有TI=0;这条语句,否则也发送不成功。
就这么简单,你就可以使用printf(“”,x,x,x)了,嘎嘎!
#include
#include
#define FOSC 11059200L//系统时钟频率
#define BAUD 9600 //串口波特率
void USART_Init();
void Delay100us() //@11.0592MHz
{
unsigned char i, j;
i = 2;
j = 15;
do
{
while (--j);
} while (--i);
}
void main()
{
unsigned int a=99;//定义的数不能是char 或者 unsigned char
char table[]="abc";
char *abc=table;
USART_Init();
Delay100us();
while(1)
{
printf("%d %c %x %s",a,(char)a,a,table);//必须(char)a强制转换一下
Delay100us();Delay100us();Delay100us();Delay100us();Delay100us();Delay100us();Delay100us();Delay100us();
}
}
void USART_Init(void)
{
AUXR=0x40;//定时器1的速度是传统的8051的12倍 不分频 不可以位寻址
TMOD=0x00;//设置定时器1为16位自动重装寄存器 不可以位寻址
SCON=0x50;//设置为8位波特率可变 并允许串口接收使能
PCON=0x00;//用定时器1模式0时于PCON无关了
TL1=(65536-(FOSC/4/BAUD));
TH1=(65536-(FOSC/4/BAUD))>>8;
TI=1;//用系统自带的printf函数,TI必须等于1,否则无法发送,不能
TR1=1;//使能定时器1
ES=1; //串口中断使能
EA=1; //全局中断使能
}
void Uart() interrupt 4 using 1
{
static unsigned char RI_date=0;
if(RI)//接收成功RI置位
{
RI_date=SBUF;
RI=0;
}
if(TI)//发送成功TI置位
{
//TI=0;//用系统的printf的时候,如果又用到中断的话,那么这句话就得屏蔽,否则无法发送
}
}
还有一种就是自己写printf。
void sendstring(unsigned char *string)//这个是字符串发送函数
{
while(*string!=' ') //判断是否到字符串的尾端
{
sendbyte(*string);
string++;
}
}
void uart_printf(char *fmt,...)//这个是我们的printf函数
{
va_list ap;//typedef char *va_list; va_list是char型的指针
char xdata string[1024];//访问外部RAM 两字节对齐
va_start(ap,fmt);//这个函数的功能是,找到第一个可变形参的地址,并把地址赋给ap
vsprintf(string,fmt,ap);//其实这个函数才是核心函数,没研究。。。
sendstring(string);//这个函数就是发送字符串函数,通过上一个函数,就把该提取的东西都提取了
va_end(ap);//结束函数
}
如果不懂得就参考网址:
http://blog.csdn.net/googlemi/article/details/8988567#1536434-tsina-1-80220-66a1f5d8f89e9ad52626f6f40fdeadaa
http://blog.csdn.net/googlemi/article/details/8988567#1536434-tsina-1-98185-66a1f5d8f89e9ad52626f6f40fdeadaa
http://blog.csdn.net/googlemi/article/details/8996605#1536434-tsina-1-96011-66a1f5d8f89e9ad52626f6f40fdeadaa
只要是支持printf的语言,那么如果片子的栈是向上生长的,函数的形参入栈的方向是从左向右,如果片子的栈是向下生长的,那么函数的形参是从右向左。