打印
[工具下载]

51单片机支持printf打印

[复制链接]
2920|38
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mattlincoln|  楼主 | 2024-3-31 16:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


#include "stdio.h"      //sprintf相关函数支持的头文件。 
#include <STDARG.H>     //多参数函数支持的头文件。

#define UART_PRINTF_EN         1

/*
********************************************
* 函数名称 : bsp_uart1_init
* 函数说明 : bsp_uart1_init
* 备    注 :
**********************************************/
void bsp_uart1_init(void)
{
        P16_PushPull_Mode;        //TX引脚
        P02_Quasi_Mode;                //RX引脚
       
       
        SCON_1=0x50;//设置串口1工作在模式1(8位数据,不带奇偶校验)

        clr_TR3;        //停止定时器3
       
        RH3=0xFF;
        RL3=0x94;        //9600
       
        set_TR3;        //使能定时器3
        set_ES_1;        //使能串口1中断
       
        RS485_UART1_REVC;       
        uart1_busy = 0;       
       
}

/*********************************************
* 函数名称 : uart_char
* 函数说明 : id 0:串口0, 1:串口1, ch:要发送的字符
* 备    注 :
**********************************************/
void uart_char(u8 id,u8 ch)
{
                switch (id)
                {
                        case 0:
//                                            RS485_UART0_SEND;//使能485发送                       
//                                                        uart0_busy = 1;
//                                                        SBUF=ch;
//                                                        while(uart0_busy);
//                                                        RS485_UART0_REVC;//使能485接收
                       
                                break;
                        case 1:
//                                                        RS485_UART1_SEND;
                                                        uart1_busy = 1;
                                                        SBUF_1=ch;
                                                        while(uart1_busy);       
//                                                        RS485_UART1_REVC;               
                                break;
                       
                       
                        default:
                                break;
                }
}

/*********************************************
* 函数名称 : uart_string
* 函数说明 : id 0:串口0, 1:串口1, str:要发送的字符串
* 备    注 :
**********************************************/
void uart_string(u8 id,u8 * str)
{
        while(*str){
                uart_char(id,*str++);
        }       
}

#ifdef        UART_PRINTF_EN

/*********************************************
* 函数名称 : uart_string 串口打印函数。
* 函数说明 : id 0:串口0, 1:串口1, str:要发送的格式化字符串
* 备    注 :
**********************************************/
void uart_printf(u8 id,const char * str,...)
{
        char xdata buf[32];        //注意数组缓存的大小,打印字符超过数组大小会导致出现死机或者其它问题
        va_list vp;
    va_start(vp, str);
       
    vsprintf(buf,str,vp);
    va_end(vp);
        uart_string(id,buf);
}
#endif

/*********************************************
* 函数名称 : Uart1_ISR
* 函数说明 : 串口1中断处理
* 备    注 :
**********************************************/
void Uart1_ISR(void) interrupt 15
{
        if(RI_1)
        {
                RI_1=0;
//                uart1_receive_callback();
        }
       
        if(TI_1)
        {
                uart1_busy = 0;
                TI_1=0;
        }
}


使用特权

评论回复
沙发
tpgf| | 2024-4-1 09:27 | 只看该作者
这种打印方式真的需要连接打印机吗

使用特权

评论回复
板凳
晓伍| | 2024-4-1 10:17 | 只看该作者
这种打印并不是真的用打印机打印出来而是一种数据传输是吗

使用特权

评论回复
地板
guanjiaer| | 2024-4-1 11:54 | 只看该作者
如果不使用这个函数 是不是也能实现这个功能呢

使用特权

评论回复
5
观海| | 2024-4-1 22:53 | 只看该作者
这个是直连打印机的吗?还是说发送给上位机的呢

使用特权

评论回复
6
八层楼| | 2024-4-1 23:24 | 只看该作者
如果不使用串口进行打印 还有其他的打印方式吗

使用特权

评论回复
7
磨砂| | 2024-4-1 23:55 | 只看该作者
这个使用的是普通的串口是吧

使用特权

评论回复
8
burgessmaggie| | 2024-4-7 08:03 | 只看该作者
它本身不直接支持C语言中的printf函数。

使用特权

评论回复
9
everyrobin| | 2024-4-7 10:38 | 只看该作者
由于51单片机的硬件限制,使用printf进行输出时,通常需要将数据发送到串口,然后通过串口助手或其他终端软件在PC上查看输出结果。

使用特权

评论回复
10
uiint| | 2024-4-7 15:54 | 只看该作者
需要使用支持printf函数的编译器,如Keil C51 等。

使用特权

评论回复
11
minzisc| | 2024-4-7 19:10 | 只看该作者
51单片机本身不支持printf函数

使用特权

评论回复
12
lzbf| | 2024-4-7 21:03 | 只看该作者
可以使用printf函数的一个变种,这个变种会调用putchar函数来发送字符到串口。

使用特权

评论回复
13
uptown| | 2024-4-7 22:56 | 只看该作者
printf在51单片机上的实现可能与标准C库中的实现有所不同,因此在格式字符串和参数的使用上可能需要特别注意。

使用特权

评论回复
14
chenqianqian| | 2024-4-8 07:50 | 只看该作者
直接用C语言标准库的格式化字符串函数就可以实现

使用特权

评论回复
15
louliana| | 2024-4-8 11:24 | 只看该作者
printf是C语言标准库中的一个函数,用于在控制台输出格式化的字符串

使用特权

评论回复
16
i1mcu| | 2024-4-8 13:38 | 只看该作者
依赖于操作系统的标准库和相应的硬件接口。

使用特权

评论回复
17
everyrobin| | 2024-4-8 15:41 | 只看该作者
通过改写putchar函数,使其调用这个UART发送函数,从而实现类似于printf的输出效果。

使用特权

评论回复
18
zerorobert| | 2024-4-8 20:09 | 只看该作者
涉及到使用51单片机内部的UART(通用异步收发传输器)或者其他串行通信模块来发送数据到串行端口。

使用特权

评论回复
19
claretttt| | 2024-4-9 11:25 | 只看该作者
Keil C51这样的编译器为51单片机提供了轻量级的C库实现,其中包括了printf函数。

使用特权

评论回复
20
burgessmaggie| | 2024-4-9 13:25 | 只看该作者
#include <reg51.h> // 包含51单片机寄存器定义的头文件

#define UART_BAUD_RATE 9600 // 定义串口波特率

// 假设使用8051的串行端口1
sbit TX = P1^0; // 定义发送引脚
sbit RX = P1^1; // 定义接收引脚

void SerialInit() {
    // 初始化串口寄存器
    SCON = 0x50; // 设置为模式1,8位数据,可变波特率
    TMOD |= 0x20; // 设置定时器1为模式2,8位自动重装
    TH1 = (65536 - (UART_BAUD_RATE * 12)) / 2; // 设置波特率
    TR1 = 1; // 启动定时器1
    TI = 1; // 设置TI,准备发送第一个字符
    EA = 1; // 开启全局中断
    ES = 1; // 开启串口中断
}

void SendChar(unsigned char data) {
    SBUF = data; // 将数据放入到SBUF寄存器
    while (!TI); // 等待发送完成
    TI = 0; // 清除发送完成标志
}

void SendString(unsigned char *str) {
    while (*str) {
        SendChar(*str);
        str++;
    }
}

// 在 main 函数或其他适当位置调用这些函数来初始化串口并发送数据

int main() {
    SerialInit(); // 初始化串口
    while (1) {
        SendString("Hello, world!"); // 发送字符串
        // 使用延时或其他方法来控制发送节奏
    }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

1312

帖子

2

粉丝