找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9323|回复: 11
收起左侧

stc8f2k08s2单片机双串口同时通讯,怎么实现

[复制链接]
ID:243153 发表于 2018-6-25 21:42 | 显示全部楼层 |阅读模式
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. }
复制代码

----------------------结束-以上代码可以运行---------------------

回复

使用道具 举报

ID:243153 发表于 2018-6-26 13:09 | 显示全部楼层
没有问题了,问题解决了
回复

使用道具 举报

ID:252000 发表于 2018-8-13 01:53 | 显示全部楼层
请问怎么解决的呀?我正好也遇到  谢谢
回复

使用道具 举报

ID:183429 发表于 2018-8-15 14:51 | 显示全部楼层
怎么解决的?程序还能发上来分享一下?
回复

使用道具 举报

ID:183429 发表于 2018-8-15 14:54 | 显示全部楼层
请问怎么解决的?遇到这个问题!
回复

使用道具 举报

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. */



复制代码
回复

使用道具 举报

ID:346921 发表于 2018-8-16 09:26 | 显示全部楼层
这么多人需要,分享一下让更多的人少走弯路啊!
回复

使用道具 举报

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++;
    }
} */
回复

使用道具 举报

ID:140931 发表于 2019-9-3 21:20 | 显示全部楼层
请问是怎么实现的呢?
回复

使用道具 举报

ID:628663 发表于 2019-11-27 14:17 | 显示全部楼层
为什么我把例程刷进去发送的是11但是返回却是19 51hei浏览器截图20191127141449.png
回复

使用道具 举报

ID:650768 发表于 2019-11-27 14:23 | 显示全部楼层
请问怎么解决的,谢谢
回复

使用道具 举报

ID:650768 发表于 2019-11-27 14:24 | 显示全部楼层
这么多人需要,分享一下让更多的人少走弯路啊!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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