找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 10403|回復: 11
收起左側(cè)

stc8f2k08s2單片機雙串口同時通訊,怎么實現(xiàn)

[復制鏈接]
ID:243153 發(fā)表于 2018-6-25 21:42 | 顯示全部樓層 |閱讀模式
stc8f2k08s2 說明上寫著支持雙串口。我在stc-isp上看到的范例單獨串口1實現(xiàn),和串口2實現(xiàn)。 這里需求需要 數(shù)據(jù) 通過串口1接收 ,在通過串口2發(fā)出去。

我想把下面的的共能和在一起,同時支持串口1的收發(fā),串口2的收發(fā)。 上面的兩段代碼 就 AUXR 的值不同。合在一起AUXR沖突。
向大家請教。   雙串口功能同時實現(xiàn),代碼怎么寫

stc-isp上串口1代碼:
----------------------------
  1. #include "reg51.h"
  2. #include "intrins.h"

  3. #define FOSC            11059200UL
  4. #define BRT             (65536 - FOSC / 9600 / 4)

  5. sfr     AUXR        =   0x8e;
  6. sfr     T2H         =   0xd6;
  7. sfr     T2L         =   0xd7;
  8. sfr     S2CON       =   0x9a;
  9. sfr     S2BUF       =   0x9b;
  10. sfr     IE2         =   0xaf;

  11. bit busy;
  12. char wptr;
  13. char rptr;
  14. char buffer[16];

  15. void Uart2Isr() interrupt 8 using 1
  16. {
  17.     if (S2CON & 0x02)
  18.     {
  19.         S2CON &= ~0x02;
  20.         busy = 0;
  21.     }
  22.     if (S2CON & 0x01)
  23.     {
  24.         S2CON &= ~0x01;
  25.         buffer[wptr++] = S2BUF;
  26.         wptr &= 0x0f;
  27.     }
  28. }

  29. void Uart2Init()
  30. {
  31.     S2CON = 0x50;
  32.     T2L = BRT;
  33.     T2H = BRT >> 8;
  34.     AUXR = 0x14;
  35.     wptr = 0x00;
  36.     rptr = 0x00;
  37.     busy = 0;
  38. }

  39. void Uart2Send(char dat)
  40. {
  41.     while (busy);
  42.     busy = 1;
  43.     S2BUF = dat;
  44. }

  45. void Uart2SendStr(char *p)
  46. {
  47.     while (*p)
  48.     {
  49.         Uart2Send(*p++);
  50.     }
  51. }

  52. void main()
  53. {
  54.     Uart2Init();
  55.     IE2 = 0x01;
  56.     EA = 1;
  57.     Uart2SendStr("Uart Test !\r\n");

  58.     while (1)
  59.     {
  60.         if (rptr != wptr)
  61.         {
  62.             Uart2Send(buffer[rptr++]);
  63.             rptr &= 0x0f;
  64.         }
  65.     }
  66. }
  67. --------------------結(jié)束-以上代碼可以運行--------------------------------


  68. stc-isp上串口2代碼:
  69. #include "reg51.h"
  70. #include "intrins.h"

  71. #define FOSC            11059200UL
  72. #define BRT             (65536 - FOSC / 115200 / 4)

  73. sfr     AUXR        =   0x8e;

  74. bit busy;
  75. char wptr;
  76. char rptr;
  77. char buffer[16];

  78. void UartIsr() interrupt 4 using 1
  79. {
  80.     if (TI)
  81.     {
  82.         TI = 0;
  83.         busy = 0;
  84.     }
  85.     if (RI)
  86.     {
  87.         RI = 0;
  88.         buffer[wptr++] = SBUF;
  89.         wptr &= 0x0f;
  90.     }
  91. }

  92. void UartInit()
  93. {
  94.     SCON = 0x50;
  95.     TMOD = 0x00;
  96.     TL1 = BRT;
  97.     TH1 = BRT >> 8;
  98.     TR1 = 1;
  99.     AUXR = 0x40;
  100.     wptr = 0x00;
  101.     rptr = 0x00;
  102.     busy = 0;
  103. }

  104. void UartSend(char dat)
  105. {
  106.     while (busy);
  107.     busy = 1;
  108.     SBUF = dat;
  109. }

  110. void UartSendStr(char *p)
  111. {
  112.     while (*p)
  113.     {
  114.         UartSend(*p++);
  115.     }
  116. }

  117. void main()
  118. {
  119.     UartInit();
  120.     ES = 1;
  121.     EA = 1;
  122.     UartSendStr("Uart Test !\r\n");

  123.     while (1)
  124.     {
  125.         if (rptr != wptr)
  126.         {
  127.             UartSend(buffer[rptr++]);
  128.             rptr &= 0x0f;
  129.         }
  130.     }
  131. }
復制代碼

----------------------結(jié)束-以上代碼可以運行---------------------

回復

使用道具 舉報

ID:243153 發(fā)表于 2018-6-26 13:09 | 顯示全部樓層
沒有問題了,問題解決了
回復

使用道具 舉報

ID:252000 發(fā)表于 2018-8-13 01:53 | 顯示全部樓層
請問怎么解決的呀?我正好也遇到  謝謝
回復

使用道具 舉報

ID:183429 發(fā)表于 2018-8-15 14:51 | 顯示全部樓層
怎么解決的?程序還能發(fā)上來分享一下?
回復

使用道具 舉報

ID:183429 發(fā)表于 2018-8-15 14:54 | 顯示全部樓層
請問怎么解決的?遇到這個問題!
回復

使用道具 舉報

ID:155507 發(fā)表于 2018-8-15 18:52 | 顯示全部樓層
給你改了一下試試。

  1. #include "reg51.h"
  2. #include "intrins.h"

  3. #define FOSC            11059200UL
  4. #define BRT             (65536 - FOSC / 115200 / 4)
  5. #define BRT2            (65536 - FOSC / 9600 / 4)

  6. sfr     AUXR        =   0x8e;
  7. sfr     T2H         =   0xd6;
  8. sfr     T2L         =   0xd7;
  9. sfr     S2CON       =   0x9a;
  10. sfr     S2BUF       =   0x9b;
  11. sfr     IE2         =   0xaf;

  12. bit busy;
  13. char wptr;
  14. char rptr;
  15. char buffer[16];
  16. bit busy2;
  17. char wptr2;
  18. char rptr2;
  19. char buffer2[16];

  20. void UartIsr() interrupt 4 using 1
  21. {
  22.     if (TI)
  23.     {
  24.         TI = 0;
  25.         busy = 0;
  26.     }
  27.     if (RI)
  28.     {
  29.         RI = 0;
  30.         buffer2[wptr2++] = SBUF;
  31.         wptr2 &= 0x0f;
  32.     }
  33. }

  34. void Uart2Isr() interrupt 8 using 1
  35. {
  36.     if (S2CON & 0x02)
  37.     {
  38.         S2CON &= ~0x02;
  39.         busy2 = 0;
  40.     }
  41.     if (S2CON & 0x01)
  42.     {
  43.         S2CON &= ~0x01;
  44.         buffer[wptr++] = S2BUF;
  45.         wptr &= 0x0f;
  46.     }
  47. }

  48. void UartInit()
  49. {
  50.     SCON = 0x50;
  51.     TMOD = 0x00;
  52.     TL1 = BRT;
  53.     TH1 = BRT >> 8;
  54.     TR1 = 1;
  55.     AUXR |= 0x40;
  56.     wptr = 0x00;
  57.     rptr = 0x00;
  58.     busy = 0;
  59. }

  60. void Uart2Init()
  61. {
  62.     S2CON = 0x50;
  63.     T2L = BRT2;
  64.     T2H = BRT2 >> 8;
  65.     AUXR |= 0x14;
  66.     wptr2 = 0x00;
  67.     rptr2 = 0x00;
  68.     busy2 = 0;
  69. }

  70. void UartSend(char dat)
  71. {
  72.     while (busy);
  73.     busy = 1;
  74.     SBUF = dat;
  75. }

  76. void Uart2Send(char dat)
  77. {
  78.     while (busy);
  79.     busy2 = 1;
  80.     S2BUF = dat;
  81. }

  82. void UartSendStr(char *p)
  83. {
  84.     while (*p)
  85.     {
  86.         UartSend(*p++);
  87.     }
  88. }

  89. void Uart2SendStr(char *p)
  90. {
  91.     while (*p)
  92.     {
  93.         Uart2Send(*p++);
  94.     }
  95. }

  96. void main()
  97. {
  98.     UartInit();       
  99.     Uart2Init();
  100.     IE2 = 0x01;
  101.     ES = 1;       
  102.     EA = 1;       
  103.     UartSendStr("Uart Test !\r\n");
  104.     Uart2SendStr("Uart2 Test !\r\n");

  105.     while (1)
  106.     {
  107.         if (rptr != wptr)
  108.         {
  109.             UartSend(buffer[rptr++]);
  110.             rptr &= 0x0f;
  111.         }
  112.         if (rptr2 != wptr2)
  113.         {
  114.             Uart2Send(buffer2[rptr2++]);
  115.             rptr2 &= 0x0f;
  116.         }       
  117.     }
  118. }

  119. //--------------------結(jié)束-以上代碼可以運行--------------------------------

  120. /*
  121. void main()
  122. {
  123.     while (1)
  124.     {
  125.     }
  126. }
  127. */



復制代碼
回復

使用道具 舉報

ID:346921 發(fā)表于 2018-8-16 09:26 | 顯示全部樓層
這么多人需要,分享一下讓更多的人少走彎路��!
回復

使用道具 舉報

ID:183429 發(fā)表于 2018-8-21 16:26 | 顯示全部樓層
有沒有遇到采用中斷方式每隔幾秒種發(fā)送一組數(shù)據(jù)出去之后,調(diào)試助手收到多個同樣的數(shù)據(jù),而在串口發(fā)送后加1秒的延遲程序,收到的就只有一組數(shù)據(jù).
#include "stc15.h"
#include "USART.h"
#include "intrins.H"




unsigned char TxBusy = 0;        //發(fā)送忙檢測
unsigned char rxBuff[rxLength]={0};  //接收緩沖區(qū),長度50
unsigned char txBuff[txLength]={0};  //發(fā)送緩沖區(qū),長度50
unsigned char rxcnt = 0;                          //接收計數(shù)

/* void Uart_Init(void)                //115200bps@11.0592MHz
{
        SCON = 0x50;                //8位數(shù)據(jù),可變波特率
        AUXR |= 0x01;                //串口1選擇定時器2為波特率發(fā)生器
        AUXR |= 0x04;                //定時器2時鐘為Fosc,即1T
        T2L = 0xE8;                //設(shè)定定時初值
        T2H = 0xFF;                //設(shè)定定時初值
        AUXR |= 0x10;                //啟動定時器2

    ES = 1;     //使能串口中斷
    EA = 1;     //開總中斷
}*/


void Uart_Init(void)                //9600bps@11.0592MHz
{
        SCON = 0x50;                //8位數(shù)據(jù),可變波特率
        AUXR |= 0x01;                //串口1選擇定時器2為波特率發(fā)生器
        AUXR |= 0x04;                //定時器2時鐘為Fosc,即1T
        T2L = 0xE0;                //設(shè)定定時初值
        T2H = 0xFE;                //設(shè)定定時初值
        AUXR |= 0x10;                //啟動定時器2

    ES = 1;     //使能串口中斷
    EA = 1;     //開總中斷
}


/*
void Uart1_SendByte(unsigned char dat)
{
   //unsigned int OutTime = 10000;
   //TI = 0;
   //while((TxBusy)&&(OutTime--));
   while(TxBusy);
   SBUF = dat;
   TxBusy = 1;
}*/


void Uart1_SendByte(unsigned char dat)
{

   while(TxBusy);//等待數(shù)據(jù)發(fā)送完成,進入中斷,將TI、TxBusy清0
   TxBusy = 1;   
   SBUF = dat;
}  


void Uart1_SendByte_N(unsigned char *dat,unsigned char N)
{
    while(N--)
    {
        Uart1_SendByte(*dat) ;
        dat++;
    }
}

void Uart1_IT_Handle(void) interrupt 4 using 1
{
    unsigned char temp;
    if(RI)
    {
        RI = 0;       //清RI
      
        if(rxcnt<rxLength)
        {
           rxBuff[rxcnt++]=  SBUF;
        
        }
        else
        {
              temp =SBUF;   //讀BUFF
        }
    }
    if(TI)
    {
       TI = 0 ;      //清TI
       TxBusy = 0 ;    //清BUSY
    }
}

/*void Uart_SendStr(const char* str)
{
    while(*str)
    {
      Uart1_SendByte(*str);
      str++;
    }
} */
回復

使用道具 舉報

ID:140931 發(fā)表于 2019-9-3 21:20 | 顯示全部樓層
請問是怎么實現(xiàn)的呢?
回復

使用道具 舉報

ID:628663 發(fā)表于 2019-11-27 14:17 | 顯示全部樓層
為什么我把例程刷進去發(fā)送的是11但是返回卻是19 51hei瀏覽器截圖20191127141449.png
回復

使用道具 舉報

ID:650768 發(fā)表于 2019-11-27 14:23 | 顯示全部樓層
請問怎么解決的,謝謝
回復

使用道具 舉報

ID:650768 發(fā)表于 2019-11-27 14:24 | 顯示全部樓層
這么多人需要,分享一下讓更多的人少走彎路��!
回復

使用道具 舉報

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

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表