在51单片机中使用printf和sprintf出现问题

2020-02-05 09:11发布

之前一直用的是avr单片机,最近帮同学做毕业设计,用了51单片机,在使用C语言标准中的输入输出出现了问题
1.在atmage16上使用printf函数完全好用,在51出现错误
2.sprintf(*a,b,c);参数a在51单片机中不能是函数名,在avr单片机中我用过函数名,完全可以;
3.sprintf(*a,"%d%d%d",b,c,d);格式话输出的参数在51单片机中最多只能有两个,但在AVR上曾经用过4个好用。
上面的问题期待大虾回答
下面分享一些资料
printf.h文件
#ifndef __PRINTF_H
#define __PRINTF_H

#include <stdio.h>

void printf_init(void);

#endif
#include "printf.h"
#include "Qinux_io.h"
printf.c文件                         //重定向标准输出流
static int z_putc(char c, FILE *stream);

static FILE z_stdout = FDEV_SETUP_STREAM(z_putc, NULL, _FDEV_SETUP_WRITE);
void printf_init(void)
{
        stdout = &z_stdout;
}

static int z_putc(char c, FILE *stream)
{
        Z_PUTC(c);
        return 0;
}
Qinux_io.h文件
#ifndef __PRINTF_HD
#define __PRINTF_HD

#include "../usart/usart.h"               //包含有硬件输出的文件,比如说串口,usart_tx_char(char c),

#define Z_PUTC(c) usart_tx_char(c)    //只要将usart_tx_char(c)改一下就可以用了,比如说lcd1602

#endif
以上三个文件在是一起的,在atmega16上好用,改动之后放在51上不能用了。
使用printf函数需要重定向标准输出流,



使用sprintf的话就不需要了
只需要sprintf(usart_tx_char,"b=%d,c=%f,d=%ld",b,c,d);     //在atmega16上好用,在51上不好用


在51上要变化一些
char date[32];
sprintf(date,"b=%d,c=%f,d=%ld",b,c,d)        //在51上测试发现只能有两个,例如,b,c输出正确,d输出就不正确了
usart_tx_sting(date);                                   //3句话的printf完成


求人指点,我是这个论坛的新人,慕名而来
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
qinpenglai
1楼-- · 2020-02-05 10:35
忘了说一件事,在51单片机里面无法调用fprintf函数
chinabn
2楼-- · 2020-02-05 14:50
本帖最后由 chinabn 于 2012-6-1 09:05 编辑

编译器不一样!
语法需要做变更!

printf 参考 Keil 下的范例。

http://www.ourdev.cn/forum.php?m ... 6orderby%3Ddateline
qinpenglai
3楼-- · 2020-02-05 18:53
看了你的帖子,你的方法和51单片机带的例程中的hello.c方法相似,但是不能通用,比如说不能再在液晶屏(lcd1602)上用printf函数
qinpenglai
4楼-- · 2020-02-06 00:18
新手,求照顾,阿莫大哥别给我删了
welcome_cool
5楼-- · 2020-02-06 00:22
 精彩回答 2  元偷偷看……
qinpenglai
6楼-- · 2020-02-06 01:33
把所有的问题详细的解释一下吧,谢谢了

一周热门 更多>