找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1626|回复: 5
收起左侧

这边写程序,最后想把ICC通信接收到的打印出来,但是51单片机里面不能用printf语句?

[复制链接]
ID:1043477 发表于 2022-9-8 13:54 | 显示全部楼层 |阅读模式
想把接收到的程序用串口打印出来,咋写类,大佬们指点一下

单片机源程序如下:
  1. ****************************************************************************
  2. * @file    main.h
  3. * @author  
  4. * @version V1.0
  5. * @brief  IIC Slave Mode Test
  6. ****************************************************************************
  7. *#include "RX8F103.h"

  8. #define        STCON         MSCON
  9. #define        SRXBUF        MSRXBUF
  10. #define        STXBUF        MSTXBUF
  11. #define        SSTAT0        MSSTAT0
  12. #define        SSTAT1        MSSTAT1
  13. #define        SIEN0                MSIEN0
  14. #define        SIEN1                MSIEN1
  15. #define        SSADDR        MSADDR

  16. //I2C主机多字节,单字节读写
  17. //I2C Master 和 I2C Slave通信协议
  18. /*
  19. S + DevAdd(Read)  + BayteN + Stop
  20. S + DevAdd(Write) + BayteN + Stop
  21. */

  22. //I2C从机地址  7位地址
  23. #define I2C_SLAVE_ADD   0x50

  24. #define BUFF_MAX 128
  25. unsigned char xdata DataBuf[BUFF_MAX];

  26. unsigned char DataTxIndex = 0;
  27. unsigned char DataRxIndex = 0;
  28. unsigned char InterruptIndex = 0;
  29. unsigned char WrtieTxBufFlag = 0;

  30. void EUart0_SendOneChar(char c)
  31. {
  32.         ES0=0;                                //发送数据时关串口中断
  33.         TI0=0;                                //清TI位
  34.         S0BUF = c;                //将待发送字符放入串口数据缓冲寄存器,并开始传输。
  35.         while(!TI0);        //等待传送结束。当字符发送结束后由硬件置位请求中断,
  36.                                                                 //此时while循环结束,而串口中断处理函数需等到ES重新置1后才可能响应。
  37.         TI0=0;                                //软件清TI位,亦可在中断处理函数中清0
  38.         ES0 = 1;                        //开串口中断
  39. }

  40. void EUart0_SendString(char *st)
  41. {
  42.         while(*st)
  43.         {
  44.                 EUart0_SendOneChar(*st++);
  45.         }
  46. }

  47. void Uart0_init(void)
  48. {        
  49.         UART0PORTEN = 1;        //串口端口使能
  50.         S0CON = 0x50;                        //SCON: Mode 1, 8-bit UART, Enable Rcvr
  51.         S0RELH = 0x03;                //S0RELH + S0RELL  构成波特率设置S0REL[9:0]
  52.         S0RELL = 0xF7;                //Baud rate  = SYSCK/(16×(1024-S0REL))  SYSCK跟CLKDIV寄存器有关  波特率为115200
  53.         ES0 = 1;                                        //允许串口中断位
  54.         EUart0_SendString("RX8F103 UART0 Init OK!\r\n");
  55. }

  56. void I2c_Init(void)
  57. {
  58.         I2CPORTEN = 1;                                //IIC PORT口使能
  59.         
  60.         TOPCON = 0x00;                                //IIC Slave        
  61.         
  62.         SSADDR = I2C_SLAVE_ADD;//IIC 从机地址寄存器
  63.         
  64.         SIEN0 = 0x01;                                        //正常结束中断
  65.         
  66.         SIEN1 = 0x21;                                        //使能接收区满中断
  67.         
  68.         STCON = 0x40;                                        //使能I2C                                
  69. }

  70. void I2c_TxBuf_Reset(void)
  71. {
  72.         TOPCON |= 0x02;
  73.         TOPCON &= 0xFD;        
  74.         
  75.         I2c_Init();
  76. }

  77. void main(void)
  78. {
  79.         unsigned char i;
  80.         
  81.         CLKCON |= 0x1F;                                //默认所有时钟打开
  82.         RSTPORTEN = 1;                                //使能复位功能
  83.         
  84.         Uart0_init();

  85.         //初始化数组
  86.         for (i=0; i<BUFF_MAX; i++)
  87.         {
  88.                 DataBuf[i] = 0x10+i;
  89.         }
  90.         
  91.         I2c_Init();
  92.         
  93.         EI2CFIFO = 1;                                        //开IIC FIFO 中断
  94.         EI2CRXTX = 1;                                        //开IIC TXRX 中断
  95.         EA = 1;                                                                //使能总中断
  96.         
  97.         while(1);
  98. }

  99. /*
  100. GC
  101. SUNF
  102. SOVF
  103. SNE
  104. 以上任意一个或多个事件发送,均为产生EI2CRXTX中断
  105. */
  106. void I2C_Slave_TRX_ISR(void) interrupt EI2CRXTX_VECTOR                //TRX中断
  107. {
  108.         unsigned char ReadData;
  109.                
  110.         //Transmitted Data Byte not ready
  111.         if (0x04 == (SSTAT0 & 0x04))        
  112.         {        
  113.                 //清中断标志位
  114.                 SSTAT0 &= 0xFB;                                                               
  115.         }               
  116.         
  117.         //Receive Overflow
  118.         if (0x02 == (SSTAT0 & 0x02))        
  119.         {
  120.                 ReadData = SRXBUF;
  121.                
  122.                 //清中断标志位
  123.                 SSTAT0 &= 0xFD;                                                                        
  124.         }

  125.         //Normal End
  126.         if (0x01 == (SSTAT0 & 0x01))        
  127.         {                                
  128.                 InterruptIndex = 0;
  129.                 WrtieTxBufFlag = 0;
  130.                                 
  131.                 I2c_TxBuf_Reset();
  132.                
  133.                 //清中断标志位
  134.                 SSTAT0 &= 0xFE;                                                                                
  135.         }               
  136. }

  137. /*
  138. STBE
  139. STBF
  140. SRBE
  141. SRBF
  142. 以上任意一个或多个事件发送,均为产生EI2CFIFO中断
  143. */
  144. void I2C_Slave_FIFO_ISR(void) interrupt EI2CFIFO_VECTOR                //FIFO中断
  145. {
  146.         unsigned char ReadData;
  147.         
  148.         //Transmission buffer is empty
  149.         if (0x20 == (SSTAT1 & 0x20))                                                                        
  150.         {
  151.                 if ((DataTxIndex < BUFF_MAX) && (1 == WrtieTxBufFlag))
  152.                 {
  153.                         STXBUF = DataBuf[DataTxIndex];
  154.                         DataTxIndex++;        
  155.                 }
  156.                                        
  157.                 SSTAT1 &= 0xDF;
  158.         }
  159.         
  160.         // Reception buffer is full
  161.         if (0x01 == (SSTAT1 & 0x01))                                                                        
  162.         {
  163.                 ReadData = SRXBUF;
  164.         
  165.                 if (0 == InterruptIndex)
  166.                 {
  167.                         //收到Sub地址
  168.                         if (ReadData < BUFF_MAX)
  169.                         {
  170.                                 DataTxIndex = ReadData;               
  171.                                 DataRxIndex = ReadData;        
  172.                                 
  173.                                 WrtieTxBufFlag = 1;
  174.                         }
  175.                 }
  176.                 else
  177.                 {
  178.                         WrtieTxBufFlag = 0;
  179.                         
  180.                         if (DataRxIndex < BUFF_MAX)
  181.                         {
  182.                                 DataBuf[DataRxIndex] = ReadData;                                       
  183.                                 DataRxIndex++;
  184.                         }                                       
  185.                 }               
  186.                 InterruptIndex++;
  187.                                        
  188.                 SSTAT1 &= 0xFE;
  189.         }        
  190. }

  191. /*---------------------------------EUART0 ISR--------------------------------------------*/
  192. void EUART0ISR(void) interrupt EUART0_VECTOR //using 2
  193. {
  194.         if(S0CON & RI0)                                                                                  //接收中断
  195.         {

  196.         }
  197.         RI0 = 0;                                                                                                                //清中断标志位
  198. }
复制代码
回复

使用道具 举报

ID:1034262 发表于 2022-9-8 15:51 | 显示全部楼层
printf语句是编译器提供的,只要你的编译器支持,就没有问题,剩下的就是你程序的问题了。
串口初始化好了,printf语句就可以使用。
回复

使用道具 举报

ID:1043477 发表于 2022-9-8 15:59 | 显示全部楼层
编译器里面不支持printf语句,我试了一下田间了stdio.h“文件,编译不成功
回复

使用道具 举报

ID:696448 发表于 2022-9-8 16:39 | 显示全部楼层
printf语句需要重定向否则没法正常使用
回复

使用道具 举报

ID:298123 发表于 2022-9-8 21:28 | 显示全部楼层
#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */


/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */

#if 1

PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART */
  PortIO_SendChar((uint8_t) ch);

  return ch;
}

你需要重新定向你的输出  PortIO_SendChar((uint8_t) ch); 换成你自己的串口输出,前提是初始化好你的串口
回复

使用道具 举报

ID:123289 发表于 2022-9-9 09:25 | 显示全部楼层
楼主还没有弄懂单片机是如何通讯的。补一下吧。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表