找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC15W204S单片机如何调用串口2来接收或发送资料?

[复制链接]
ID:457181 发表于 2019-1-31 15:06 | 显示全部楼层 |阅读模式
如题,我是成功用串口1来接收或发送资料,现在要从串口1换去串口2来做接收或发送。

串口1的设定单片机代码
  1.         EA = 1;
  2.         ES = 1;

  3. //    38400
  4.                 SCON = 0x50;                 
  5.                 AUXR |= 0x01;               
  6.                 AUXR |= 0x04;               
  7.                 T2L = 0xB8;               
  8.                 T2H = 0xFF;               
  9.                 AUXR |= 0x10;
复制代码

请问如何设定串口2呢?
回复

使用道具 举报

ID:94031 发表于 2019-1-31 17:06 | 显示全部楼层
UART2_config(2);        // 选择波特率, 2: 使用Timer2做波特率, 其它值: 无效.
EA = 1;        //允许全局中断

void        SetTimer2Baudraye(u16 dat)        // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
{
        AUXR &= ~(1<<4);        //Timer stop
        AUXR &= ~(1<<3);        //Timer2 set As Timer
        AUXR |=  (1<<2);        //Timer2 set as 1T mode
        TH2 = dat / 256;
        TL2 = dat % 256;
        IE2  &= ~(1<<2);        //禁止中断
        AUXR |=  (1<<4);        //Timer run enable
}

void        UART2_config(u8 brt)        // 选择波特率, 2: 使用Timer2做波特率, 其它值: 无效.
{
        /*********** 波特率固定使用定时器2 *****************/
        if(brt == 2)
        {
                SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / Baudrate2);

                S2CON &= ~(1<<7);        // 8位数据, 1位起始位, 1位停止位, 无校验
                IE2   |= 1;                        //允许中断
                S2CON |= (1<<4);        //允许接收
                P_SW2 &= ~0x01;       
                P_SW2 |= 1;                        //UART2 switch to: 0: P1.0 P1.1,  1: P4.6 P4.7

                B_TX2_Busy = 0;
                TX2_Cnt = 0;
                RX2_Cnt = 0;
        }
}

void UART2_int (void) interrupt UART2_VECTOR
{
        if((S2CON & 1) != 0)
        {
                S2CON &= ~1;        //Clear Rx flag
                RX2_Buffer[RX2_Cnt] = S2BUF;
                if(++RX2_Cnt >= UART2_BUF_LENGTH)        RX2_Cnt = 0;
        }

        if((S2CON & 2) != 0)
        {
                S2CON &= ~2;        //Clear Tx flag
                B_TX2_Busy = 0;
        }

}

回复

使用道具 举报

ID:463187 发表于 2019-1-31 18:39 | 显示全部楼层
void UartInit(void)                //9600bps@11.0592MHz
{
        S2CON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x04;                //定时器2时钟为Fosc,即1T
        T2L = 0xE0;                //设定定时初值
        T2H = 0xFE;                //设定定时初值
        AUXR |= 0x10;                //启动定时器2
}
回复

使用道具 举报

ID:155507 发表于 2019-1-31 19:15 | 显示全部楼层
你确定STC15W204S单片机有串口2吗?



STC15W204S单片机

STC15W204S单片机
回复

使用道具 举报

ID:457181 发表于 2019-2-1 08:47 | 显示全部楼层
angmall 发表于 2019-1-31 19:15
你确定STC15W204S单片机有串口2吗?

有啊!在P3.6和P3.7
回复

使用道具 举报

ID:47286 发表于 2019-2-1 10:18 | 显示全部楼层
jeffphoon 发表于 2019-2-1 08:47
有啊!在P3.6和P3.7

没有两个 只有一个串口 人家手册上写的是 一组异步串行口 可以在两组管脚间切换 分时复用可当两组串口用 明白么 就是一组串口干两组串口的事 但不能同时
回复

使用道具 举报

ID:457181 发表于 2019-2-1 10:57 | 显示全部楼层
dzbj 发表于 2019-2-1 10:18
没有两个 只有一个串口 人家手册上写的是 一组异步串行口 可以在两组管脚间切换 分时复用可当两组串口用  ...

明白了,谢谢哦!如何要调用P3.6和P3.7为接收和发送,要怎样写呢?
我的代码还是不能收
  1. void UartInit(void)
  2. {

  3.                 EA = 1;
  4.                 ES = 1;
  5.        
  6. //            38400
  7.                 S2CON = 0x50;               
  8.                 AUXR |= 0x04;               
  9.                 T2L = 0xB8;               
  10.                 T2H = 0xFF;               
  11.                 AUXR |= 0x10;               
  12. }

  13. void Delay100us()                //@11.0592MHz
  14. {
  15.         unsigned char i, j;

  16.         _nop_();
  17.         _nop_();
  18.         i = 2;
  19.         j = 15;
  20.         do
  21.         {
  22.                 while (--j);
  23.         } while (--i);
  24. }

  25. void main()
  26. {
  27.         UartInit();
  28.         while(1)
  29.         {
  30.                 if(flag==1)
  31.                 {
  32.                         ES=0;
  33.                         flag=0;
  34.                         S2BUF=a;
  35.                        
  36.                         while(!TI);
  37.                                 TI=0;
  38.                                 ES=1;
  39.                         Delay100us();
  40.                 }
  41.         }
  42. }

  43. void ser() interrupt 4
  44. {
  45.         RI=0;
  46.         a=S2BUF;
  47.         flag=1;
  48. }
复制代码
回复

使用道具 举报

ID:94031 发表于 2019-2-1 16:03 | 显示全部楼层
jeffphoon 发表于 2019-2-1 10:57
明白了,谢谢哦!如何要调用P3.6和P3.7为接收和发送,要怎样写呢?
我的代码还是不能收

#define                S1_USE_P36P37()                P_SW1 = (P_SW1 & ~0xc0) | 0x40        //UART1 使用P36 P37口
回复

使用道具 举报

ID:474217 发表于 2019-2-1 23:01 来自手机 | 显示全部楼层
第一次接触proteus 8这个软件,
求大佬解释一下这个是为什么?
该怎样解决啊?
15490331691370.5000705698561064.jpg
回复

使用道具 举报

ID:123289 发表于 2019-2-2 23:26 | 显示全部楼层
需要习惯并学会看手册
回复

使用道具 举报

ID:457181 发表于 2019-2-14 12:26 | 显示全部楼层
本帖最后由 jeffphoon 于 2019-2-14 13:59 编辑
xuyaqi 发表于 2019-2-1 16:03
define                S1_USE_P36P37()                P_SW1 = (P_SW1 & ~0xc0) | 0x40        //UART1 使用P36 P37口

请问要如何调用呢?我加了,但还是不能
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. unsigned char        a,flag;        
  4. #define S1_USE_P36P37() P_SW1 = (P_SW1 & ~0xc0) | 0x40
  5. void UartInit(void)
  6. {
  7.         EA = 1; //′ò¿a×üÖD¶Ï
  8.         ES = 1; //′ò¿a′®¿úÖD¶Ï
  9.         
  10. //  9600
  11. //        SCON = 0x50;
  12. //        AUXR |= 0x01;
  13. //        AUXR |= 0x04;
  14. //        T2L = 0xE0;
  15. //        T2H = 0xFE;
  16. //        AUXR |= 0x10;
  17.         
  18. //    38400
  19.                 SCON = 0x50;    // SCON: Ä£ê½ 1, 8-bit UART, ê1Äü½óêÕ               
  20.                 AUXR |= 0x01;               
  21.                 AUXR |= 0x04;               
  22.                 T2L = 0xB8;               
  23.                 T2H = 0xFF;               
  24.                 AUXR |= 0x10;   

  25. //    57600
  26. //                SCON = 0x50;               
  27. //                AUXR |= 0x01;               
  28. //                AUXR |= 0x04;               
  29. //                T2L = 0xD0;               
  30. //                T2H = 0xFF;               
  31. //                AUXR |= 0x10;   

  32. }


  33. void Delay100us()                //@11.0592MHz
  34. {
  35.         unsigned char i, j;

  36.         _nop_();
  37.         _nop_();
  38.         i = 2;
  39.         j = 15;
  40.         do
  41.         {
  42.                 while (--j);
  43.         } while (--i);
  44. }

  45. void main()
  46. {
  47.         UartInit();
  48.         while(1)
  49.         {
  50.                 if(flag==1)
  51.                 {
  52.                         ES=0;
  53.                         flag=0;
  54.                         SBUF=a;
  55.                         
  56.                         while(!TI);
  57.                                 TI=0;
  58.                                 ES=1;
  59.                         Delay100us();
  60.                 }
  61.         }
  62. }

  63. void ser() interrupt 4
  64. {
  65.         RI=0;
  66.         a=SBUF;
  67.         flag=1;
  68. }




复制代码
回复

使用道具 举报

ID:457181 发表于 2019-2-14 14:19 | 显示全部楼层
本帖最后由 jeffphoon 于 2019-2-15 09:45 编辑

我成功调用串口了!!
以下分享给需要的朋友
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. unsigned char        a,flag;       
  4. sfr P_SW1   = 0xA2;            
  5. #define S1_S0 0x40              //P_SW1.6
  6. #define S1_S1 0x80              //P_SW1.7

  7. void UartInit(void)
  8. {
  9.        
  10. //         ACC = P_SW1;
  11. //   ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=0
  12. //   P_SW1 = ACC;                //(P3.0/RxD, P3.1/TxD)
  13.    
  14.   ACC = P_SW1;
  15.   ACC &= ~(S1_S0 | S1_S1);    //S1_S0=1 S1_S1=0
  16.   ACC |= S1_S0;               //(P3.6/RxD_2, P3.7/TxD_2)
  17.   P_SW1 = ACC;  
  18.        
  19.         EA = 1; //′ò¿a×üÖD¶Ï
  20.         ES = 1; //′ò¿a′®¿úÖD¶Ï
  21.        
  22. //  9600
  23. //        SCON = 0x50;
  24. //        AUXR |= 0x01;
  25. //        AUXR |= 0x04;
  26. //        T2L = 0xE0;
  27. //        T2H = 0xFE;
  28. //        AUXR |= 0x10;
  29.        
  30. //    38400
  31.                 SCON = 0x50;    // SCON: Ä£ê½ 1, 8-bit UART, ê1Äü½óêÕ               
  32.                 AUXR |= 0x01;               
  33.                 AUXR |= 0x04;               
  34.                 T2L = 0xB8;               
  35.                 T2H = 0xFF;               
  36.                 AUXR |= 0x10;   

  37. //    57600
  38. //                SCON = 0x50;               
  39. //                AUXR |= 0x01;               
  40. //                AUXR |= 0x04;               
  41. //                T2L = 0xD0;               
  42. //                T2H = 0xFF;               
  43. //                AUXR |= 0x10;   

  44. }


  45. void Delay100us()                //@11.0592MHz
  46. {
  47.         unsigned char i, j;

  48.         _nop_();
  49.         _nop_();
  50.         i = 2;
  51.         j = 15;
  52.         do
  53.         {
  54.                 while (--j);
  55.         } while (--i);
  56. }

  57. void main()
  58. {
  59.         UartInit();
  60.         while(1)
  61.         {
  62.                 if(flag==1)
  63.                 {
  64.                         ES=0;
  65.                         flag=0;
  66.                         SBUF=a;
  67.                        
  68.                         while(!TI);
  69.                                 TI=0;
  70.                                 ES=1;
  71.                         Delay100us();
  72.                 }
  73.         }
  74. }

  75. void ser() interrupt 4
  76. {
  77.         RI=0;
  78.         a=SBUF;
  79.         flag=1;
  80. }
复制代码

谢谢大家之前的回复!!

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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