久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1570|回復: 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. }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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語句需要重定向否則沒法正常使用
回復

使用道具 舉報

5#
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); 換成你自己的串口輸出,前提是初始化好你的串口
回復

使用道具 舉報

6#
ID:123289 發表于 2022-9-9 09:25 | 只看該作者
樓主還沒有弄懂單片機是如何通訊的。補一下吧。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品国产三级国产aⅴ无密码 | 亚洲欧美v | 日韩中出 | 九九热精品免费 | 玖玖色在线视频 | 天天拍天天色 | 日本人做爰大片免费观看一老师 | 中文字幕在线精品 | 欧美一区二区免费电影 | 精品一区二区三区在线观看国产 | 97视频免费 | 国产高清一区二区三区 | 亚洲91视频 | 99久久婷婷| 中文字幕第九页 | 日本不卡免费新一二三区 | 国产精品特级毛片一区二区三区 | 国产成人a亚洲精品 | 欧美精品综合 | 91精品国产99 | 久久久久一区二区三区 | 理伦毛片 | 精品成人69xx.xyz | 国产精品中文在线 | 韩日一区二区三区 | 一区二区视频免费观看 | 综合久久网 | 色偷偷888欧美精品久久久 | 中文字幕视频在线观看 | 国产小视频在线 | 一级片毛片 | 黄色在线观看网址 | 一级大片免费 | 一区二区三区四区国产精品 | 日韩国产一区二区三区 | 国产精品一区二区三区久久久 | 日韩精品不卡 | 91在线精品视频 | 午夜视频在线免费观看 | 色综久久 | 日日碰碰|