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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10261|回復: 11
打印 上一主題 下一主題
收起左側

stc8f2k08s2單片機雙串口同時通訊,怎么實現

[復制鏈接]
跳轉到指定樓層
樓主
stc8f2k08s2 說明上寫著支持雙串口。我在stc-isp上看到的范例單獨串口1實現,和串口2實現。 這里需求需要 數據 通過串口1接收 ,在通過串口2發出去。

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

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. --------------------結束-以上代碼可以運行--------------------------------


  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. }
復制代碼

----------------------結束-以上代碼可以運行---------------------

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩1
回復

使用道具 舉報

沙發
ID:243153 發表于 2018-6-26 13:09 | 只看該作者
沒有問題了,問題解決了
回復

使用道具 舉報

板凳
ID:252000 發表于 2018-8-13 01:53 | 只看該作者
請問怎么解決的呀?我正好也遇到  謝謝
回復

使用道具 舉報

地板
ID:183429 發表于 2018-8-15 14:51 | 只看該作者
怎么解決的?程序還能發上來分享一下?
回復

使用道具 舉報

5#
ID:183429 發表于 2018-8-15 14:54 | 只看該作者
請問怎么解決的?遇到這個問題!
回復

使用道具 舉報

6#
ID:155507 發表于 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. //--------------------結束-以上代碼可以運行--------------------------------

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



復制代碼
回復

使用道具 舉報

7#
ID:346921 發表于 2018-8-16 09:26 | 只看該作者
這么多人需要,分享一下讓更多的人少走彎路啊!
回復

使用道具 舉報

8#
ID:183429 發表于 2018-8-21 16:26 | 只看該作者
有沒有遇到采用中斷方式每隔幾秒種發送一組數據出去之后,調試助手收到多個同樣的數據,而在串口發送后加1秒的延遲程序,收到的就只有一組數據.
#include "stc15.h"
#include "USART.h"
#include "intrins.H"




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

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

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


void Uart_Init(void)                //9600bps@11.0592MHz
{
        SCON = 0x50;                //8位數據,可變波特率
        AUXR |= 0x01;                //串口1選擇定時器2為波特率發生器
        AUXR |= 0x04;                //定時器2時鐘為Fosc,即1T
        T2L = 0xE0;                //設定定時初值
        T2H = 0xFE;                //設定定時初值
        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);//等待數據發送完成,進入中斷,將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++;
    }
} */
回復

使用道具 舉報

9#
ID:140931 發表于 2019-9-3 21:20 | 只看該作者
請問是怎么實現的呢?
回復

使用道具 舉報

10#
ID:628663 發表于 2019-11-27 14:17 | 只看該作者
為什么我把例程刷進去發送的是11但是返回卻是19
回復

使用道具 舉報

11#
ID:650768 發表于 2019-11-27 14:23 | 只看該作者
請問怎么解決的,謝謝
回復

使用道具 舉報

12#
ID:650768 發表于 2019-11-27 14:24 | 只看該作者
這么多人需要,分享一下讓更多的人少走彎路啊!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品在线播放 | 日韩一级免费看 | 欧产日产国产精品国产 | 日韩精品一区二区三区 | 亚洲色图综合 | 欧美高清视频一区 | 爱爱免费视频 | 99精品国产一区二区三区 | 久久久久久久久久久久久久久久久久久久 | 人人操日日干 | 亚洲综合视频一区 | 亚洲欧洲一区 | 狠狠狠色丁香婷婷综合久久五月 | 羞羞的视频在线观看 | 特级生活片 | 九九热免费看 | 在线免费小视频 | 日韩在线一区二区三区 | 日韩精品免费播放 | 97视频免费 | 日韩欧美视频 | 国产特级毛片 | 亚洲日韩中文字幕一区 | 欧美精品久久 | 亚洲成人毛片 | 在线播放第一页 | 黑人一级黄色大片 | 毛片免费看 | 中文字幕丁香5月 | 91精品国产91久久综合桃花 | 亚洲精品在线观 | 国产精品久久毛片av大全日韩 | 亚洲综合久久久 | 欧美一级片在线看 | 一区二区国产在线 | 亚洲欧美精品 | 国内自拍真实伦在线观看 | 91在线精品视频 | 一区二区视频在线 | 日韩福利片 | 成人亚洲 |