#include <reg52.h>
#include <stdio.h>
#include <stdarg.h> //调用打印函数的一些声明
typedef unsigned char uchar; //重命名,方便写
typedef unsigned short uint;
bit busy; //串口发送完成标志
xdata char string[100]; //存放重定向的临时字符串,声明为全局是怕栈溢出
//xdata为相对于RAM的外部存储器,因为100个单元,RAM中data内存不够,所以存放到xdata
void init(void); //参数初始化
void SendData(uchar); //串口发送字符
void SendString(uchar*); //串口发送字符串
void Print(char *fmt,...); //重新编写打印函数
void init()
{
TMOD = 0x20; //定时器1 工作方式1
TH1 = 0xfd; //定时器1作为串口波特率发生器,8位计数器,波特率9600,SMOD=0不加倍,
TL1 = 0xfd; //根据公式算的初始值为253即0xfd
SM0 = 1; //串行工作方式1
SM1 = 1; //同上
TR1 = 1; //启动定时器1
REN = 1; //允许串行口接收数据
EA = 1; //开总中断
ES = 1; //开串行口中断
}
void main()
{
int a=10;
float b=3.14;
char* s="Manager!\n";
init();
Print("Hello %s",s);
Print("a=%d b=%.3f\n",a,b);
while(1)
{
}
}
void Ser_uart() interrupt 4
{
uchar temp;
if(RI) //接收中断标志位
{
RI = 0; //清除接收中断标志位
temp = SBUF; //获取串口缓冲寄存器的值
}
if(TI) //发送中断标志位
{
TI = 0;
busy = 0; //发送完成标志
}
}
void SendData(uchar dat) //串口发送字符
{
while(busy); //等待上一次数据发送完成
busy = 1;
SBUF = dat; //发送当前数据
}
void SendString(uchar *str) //串口发送字符串
{
while(*str)
{
SendData(*str++);
}
}
void Print(char *fmt,...) //许多函数存放在stdarg.h中
{
char * ap; //typedef char *va_list; va_list是char型的指针
va_start(ap,fmt); //这个函数的功能是,找到第一个可变形参的地址,并把地址赋给ap
vsprintf(string,fmt,ap); //将fmt和ap格式化字符串,存放到string
SendString(string); //这个函数就是发送字符串函数,通过上一个函数,就把该提取的东西都提取了
va_end(ap); //结束函数
}
【单片机】重写打印函数printf
最新推荐文章于 2024-06-04 12:46:49 发布