[工具下载] 51单片机支持printf打印

[复制链接]
 楼主| mattlincoln 发表于 2024-3-31 16:00 | 显示全部楼层 |阅读模式


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

  3. #define UART_PRINTF_EN         1

  4. /*
  5. ********************************************
  6. * 函数名称 : bsp_uart1_init
  7. * 函数说明 : bsp_uart1_init
  8. * 备    注 :
  9. **********************************************/
  10. void bsp_uart1_init(void)
  11. {
  12.         P16_PushPull_Mode;        //TX引脚
  13.         P02_Quasi_Mode;                //RX引脚
  14.        
  15.        
  16.         SCON_1=0x50;//设置串口1工作在模式1(8位数据,不带奇偶校验)

  17.         clr_TR3;        //停止定时器3
  18.        
  19.         RH3=0xFF;
  20.         RL3=0x94;        //9600
  21.        
  22.         set_TR3;        //使能定时器3
  23.         set_ES_1;        //使能串口1中断
  24.        
  25.         RS485_UART1_REVC;       
  26.         uart1_busy = 0;       
  27.        
  28. }

  29. /*********************************************
  30. * 函数名称 : uart_char
  31. * 函数说明 : id 0:串口0, 1:串口1, ch:要发送的字符
  32. * 备    注 :
  33. **********************************************/
  34. void uart_char(u8 id,u8 ch)
  35. {
  36.                 switch (id)
  37.                 {
  38.                         case 0:
  39. //                                            RS485_UART0_SEND;//使能485发送                       
  40. //                                                        uart0_busy = 1;
  41. //                                                        SBUF=ch;
  42. //                                                        while(uart0_busy);
  43. //                                                        RS485_UART0_REVC;//使能485接收
  44.                        
  45.                                 break;
  46.                         case 1:
  47. //                                                        RS485_UART1_SEND;
  48.                                                         uart1_busy = 1;
  49.                                                         SBUF_1=ch;
  50.                                                         while(uart1_busy);       
  51. //                                                        RS485_UART1_REVC;               
  52.                                 break;
  53.                        
  54.                        
  55.                         default:
  56.                                 break;
  57.                 }
  58. }

  59. /*********************************************
  60. * 函数名称 : uart_string
  61. * 函数说明 : id 0:串口0, 1:串口1, str:要发送的字符串
  62. * 备    注 :
  63. **********************************************/
  64. void uart_string(u8 id,u8 * str)
  65. {
  66.         while(*str){
  67.                 uart_char(id,*str++);
  68.         }       
  69. }

  70. #ifdef        UART_PRINTF_EN

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

  87. /*********************************************
  88. * 函数名称 : Uart1_ISR
  89. * 函数说明 : 串口1中断处理
  90. * 备    注 :
  91. **********************************************/
  92. void Uart1_ISR(void) interrupt 15
  93. {
  94.         if(RI_1)
  95.         {
  96.                 RI_1=0;
  97. //                uart1_receive_callback();
  98.         }
  99.        
  100.         if(TI_1)
  101.         {
  102.                 uart1_busy = 0;
  103.                 TI_1=0;
  104.         }
  105. }


tpgf 发表于 2024-4-1 09:27 | 显示全部楼层
这种打印方式真的需要连接打印机吗
晓伍 发表于 2024-4-1 10:17 | 显示全部楼层
这种打印并不是真的用打印机打印出来而是一种数据传输是吗
guanjiaer 发表于 2024-4-1 11:54 | 显示全部楼层
如果不使用这个函数 是不是也能实现这个功能呢
观海 发表于 2024-4-1 22:53 | 显示全部楼层
这个是直连打印机的吗?还是说发送给上位机的呢
八层楼 发表于 2024-4-1 23:24 | 显示全部楼层
如果不使用串口进行打印 还有其他的打印方式吗
磨砂 发表于 2024-4-1 23:55 | 显示全部楼层
这个使用的是普通的串口是吧
burgessmaggie 发表于 2024-4-7 08:03 | 显示全部楼层
它本身不直接支持C语言中的printf函数。
everyrobin 发表于 2024-4-7 10:38 | 显示全部楼层
由于51单片机的硬件限制,使用printf进行输出时,通常需要将数据发送到串口,然后通过串口助手或其他终端软件在PC上查看输出结果。
uiint 发表于 2024-4-7 15:54 | 显示全部楼层
需要使用支持printf函数的编译器,如Keil C51 等。
minzisc 发表于 2024-4-7 19:10 | 显示全部楼层
51单片机本身不支持printf函数
lzbf 发表于 2024-4-7 21:03 | 显示全部楼层
可以使用printf函数的一个变种,这个变种会调用putchar函数来发送字符到串口。
uptown 发表于 2024-4-7 22:56 | 显示全部楼层
printf在51单片机上的实现可能与标准C库中的实现有所不同,因此在格式字符串和参数的使用上可能需要特别注意。
chenqianqian 发表于 2024-4-8 07:50 来自手机 | 显示全部楼层
直接用C语言标准库的格式化字符串函数就可以实现
louliana 发表于 2024-4-8 11:24 | 显示全部楼层
printf是C语言标准库中的一个函数,用于在控制台输出格式化的字符串
i1mcu 发表于 2024-4-8 13:38 | 显示全部楼层
依赖于操作系统的标准库和相应的硬件接口。
everyrobin 发表于 2024-4-8 15:41 | 显示全部楼层
通过改写putchar函数,使其调用这个UART发送函数,从而实现类似于printf的输出效果。
zerorobert 发表于 2024-4-8 20:09 | 显示全部楼层
涉及到使用51单片机内部的UART(通用异步收发传输器)或者其他串行通信模块来发送数据到串行端口。
claretttt 发表于 2024-4-9 11:25 | 显示全部楼层
Keil C51这样的编译器为51单片机提供了轻量级的C库实现,其中包括了printf函数。
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!"); // 发送字符串
        // 使用延时或其他方法来控制发送节奏
    }
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

1575

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部