重温51的printf

太久没用51了很多都细节都忘记了 下面来重温一下
我现在知道想要在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);//结束函数
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值