专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

51单片机之printf

作者:佚名   来源:本站原创   点击数:  更新时间:2014年04月26日   【字体:

 typedef char *va_list;

 
我先在知道想要在51单片机使用printf有两种办法,一种是用库自己的printf,一种是写自己的printf,不过都很简单,我先介绍一下库的printf吧。
 
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!='\0')   //判断是否到字符串的尾端
 {
  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的语言,那么如果片子的栈是向上生长的,函数的形参入栈的方向是从左向右,如果片子的栈是向下生长的,那么函数的形参是从右向左。
关闭窗口

相关文章