目录
频道首页
单片机不支持printf函数,实现几个常用串口打印函数
收藏
0
EndlessCodeEndlessBug 最近修改于 2023-03-28 10:18:51

keil C51或者iar for c8051编译器下:

一、int 占两个字节 范围:-32768~+32767

二、long占四个字节 范围:-2147483648~+2147483647

三、float占四个字节 范围:3.40E+38 ~ +3.40E+38

四、double占8个字节 范围:-1.79E+308 ~ +1.79E+308

51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最广泛的8位单片机之一。


在单机开发中经常使用串口调试或者收集实时各种数据类型不同的数据少不了使用printf()函数重定向,\ 但是对于资源紧缺的单片机使用printf(),性能不佳。为了以后工作方便,把几个常用的打印函数记录下来。

非递归实现见另一个博客http://www.cnblogs.com/02xiaoma/archive/2012/06/22/2558618.html

不过该博客里的void printflt(double flt) 不能正确打印 如,1.000123,1.01 1.001,1.0001等小数点后紧跟0的格式

非递归

整数打印

void printInterger(int integer)\ {\     unsigned char isnegative = 0,len = 0, intstr[10]={'\0'};\     if(integer < 0)\     {\         isnegative = 1;\         integer = 0 - integer;\     }\     if (integer == 0)\         intstr[len++] = '0';\     while (integer)\     {\         intstr[len++] = (integer % 10) + '0';\         integer = integer / 10;\     }\     if(isnegative)\         intstr[len++] = '-';\     //注意这个k的数据类型  使用k >= 0;为结束条件,k是有符号类型,若是无符号类型,k值回滚到最大值\     for(len = len; len > 0; len--)\     {\         //printf("%c", intstr[len-1]);\         UartSend(UART1,\&intstr[len-1],1);\ }}

浮点数

void printFlt(float flt,int len)\ {\     int integer;\     integer = (int)flt;\     printHex(integer);\     //printf(".");\     UartSend(UART1,".",1);\  \     flt = flt - integer;\     //while(flt&&(len--))\     while(flt)\     {\         flt = flt*10;\         integer = (int)flt + '0';\         flt = flt - integer;\         //printf("%c",integer);\         UartSend(UART1,\&integer,1);\     }\ }

————————————————

最近有同学在51单片机的学习过程中困扰如何使用单片机串口在上位机串口助手上输出显示的问题,其实很多开发环境都支持使用C语言里面最常用的printf函数,Keil中也不例外,不仅仅是最常用的STC89C52、keil下其他51系列单片机如STC12、STC15等同样适用。具体步骤如下:

在Keil中建立一个空的工程,加入一个源文件,如main.c 粘贴以下代码,编译生成hex文件,下载到单片机即可。

        需要注意的是:1、需要包含stdio.h头文件 2、串口初试化函数中需要有 TI = 1;

        废话少说,直接上代码:

#include \\ #include \\  \ void InitUART(void)//使用定时器1作为串口波特率发生器\ {\     TH1 = 0xFD;     //晶振11.0592mhz 波特率设为9600\     TL1 = TH1;\     TMOD |= 0x20;     //定时器1方式2\     SCON = 0x50;     //串口接收使能\     ES = 1;             //串口中断使能\     TR1 = 1;         //定时器1使能\     TI = 1;             //发送中断标记位,必须设置\ }\ //毫秒延时函数\ void delay_ms(unsigned int t)\ {\     unsigned char a,b;\     while(t--)\     {\       for(b=102;b>0;b--)\       for(a=3;a>0;a--);\     }\ }\  \ void main()\ {\     InitUART();    //初始化串口\     EA = 1;          //开总中断\     while(1)\     {\         delay_ms(500);\         printf("Hello World!\n");//串口打印结果\     }\ }

————————————————

内容大纲
批注笔记
单片机不支持printf函数,实现几个常用串口打印函数
ArticleBot
z
z
z
z
主页
会议室
Git管理
文章
云文档
看板