找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3925|回复: 7
收起左侧

STC15W401AS单片机串口1切换到P3^6 P3^7 无法切换

[复制链接]
ID:168926 发表于 2020-7-4 13:13 | 显示全部楼层 |阅读模式
STC15W401AS串口1切换到P3^6 P3^7 无法切换 ,在烧写软件上设置  了也没有效果,按照范例程序 进行设置 串口输出还是在P3^0,P3^1上面输出
//sfr P_SW1   = 0xA2;             //外设功能切换寄存器2

#define S1_S0 0X04             //P_SW1.6
#define S1_S1 0X08              //P_SW1.7


void main(void)
{

                Timer0Init();
                ET0 = 1;                        //使能定时器0中断
          UartInit();
          EA=1;

        
        
        ACC = P_SW1;
  ACC &= ~(S1_S0 | S1_S1);    //S1_S0=1 S1_S1=0
  ACC |= S1_S0;               //(P3.6/RxD_2, P3.7/TxD_2)
  P_SW1 = ACC;




回复

使用道具 举报

ID:213173 发表于 2020-7-4 17:25 | 显示全部楼层
AUXR1寄存器官方没有明确是否支持位操作,S1_S1、S1_S0在AUXR1寄存器的高2位,另外15W401AS没有定时器1,要用定时器2作波特率发生器。
无标题1.jpg

无标题.jpg

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:718536 发表于 2020-12-31 17:32 | 显示全部楼层
大佬,你问题解决了吗?我也是遇到这个问题了。按照STC例程
sfr P_SW1   = 0xA2;             //外设功能切换寄存器1

#define S1_S0 0x40              //P_SW1.6
#define S1_S1 0x80              //P_SW1.7
void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
    P6M0 = 0x00;
    P6M1 = 0x00;
    P7M0 = 0x00;
    P7M1 = 0x00;
   
ACC = P_SW1;
ACC &= ~(S1_S0 | S1_S1);    //S1_S0=1 S1_S1=0
ACC |= S1_S0;               //(P3.6/RxD_2, P3.7/TxD_2)
P_SW1 = ACC;  


3.6 3.7没有输出的......真坑啊

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:866258 发表于 2021-1-12 11:18 | 显示全部楼层
第一个是把例程抄都能抄错,明明是
#define S1_S0 0x40              //P_SW1.6
#define S1_S1 0x80              //P_SW1.7,自己都不注意看,第二个的回答倒是把例程抄了,但是连串口1初始化都没有,怎么可能在3.6/3.7监测到数据发送呢
回复

使用道具 举报

ID:168926 发表于 2021-4-21 23:01 | 显示全部楼层
飘零111 发表于 2021-1-12 11:18
第一个是把例程抄都能抄错,明明是
#define S1_S0 0x40              //P_SW1.6
#define S1_S1 0x80      ...

感谢指出
回复

使用道具 举报

ID:168926 发表于 2021-4-21 23:03 | 显示全部楼层
suqianfu 发表于 2020-12-31 17:32
大佬,你问题解决了吗?我也是遇到这个问题了。按照STC例程
sfr P_SW1   = 0xA2;             //外设功能 ...

解决了 联系的stc工程师 使用stc15fxxxx.h   

//========================================================================
// 函数: void        UART1_config(u32 brt, u8 timer, u8 io)
// 描述: UART1初始化函数。
// 参数:   brt: 通信波特率.
//       timer: 波特率使用的定时器, timer=2: 波特率使用定时器2, 其它值: 使用Timer1做波特率.
//          io: 串口1切换到的IO,  io=1: 串口1切换到P3.0 P3.1,  =1: 切换到P3.6 P3.7,  =2: 切换到P1.6 P1.7,  =3: 切换到P4.3 P4.4.
//========================================================================
void        UART1_config(u32 brt, u8 timer, u8 io)        // brt: 通信波特率,  timer=2: 使用定时器2做波特率发生器, 其余值: 使用定时器1做波特率发生器
                                                                                                //                      io=0: 串口切换到P3.0 P3.1,   1: 串口切换到P3.6 P3.7,  2: 串口切换到P1.6 P1.7
{
        brt = 65536UL - (MAIN_Fosc / 4) / brt;

        if(timer == 2)        //波特率使用定时器2
        {
                AUXR |= 0x01;                //S1 BRT Use Timer2;
                SetTimer2Baudraye((u16)brt);
        }

        else                //波特率使用定时器1
        {
                TR1 = 0;
                AUXR &= ~0x01;                //S1 BRT Use Timer1;
                AUXR |=  (1<<6);        //Timer1 set as 1T mode
                TMOD &= ~(1<<6);        //Timer1 set As Timer
                TMOD &= ~0x30;                //Timer1_16bitAutoReload;
                TH1 = (u8)(brt >> 8);
                TL1 = (u8)brt;
                ET1 = 0;                        // 禁止Timer1中断
                INT_CLKO &= ~0x02;        // Timer1不输出高速时钟
                TR1  = 1;                        // 运行Timer1
        }

        S1_8bit();                //头文件的宏定义,  8位数据, 1位起始位, 1位停止位, 无校验
                 if(io == 1)        {        S1_USE_P36P37();        P3n_standard(0xc0);        }        //UART1 使用P36 P37口
        else if(io == 2)        {        S1_USE_P16P17();        P1n_standard(0xc0);        }        //UART1 使用P16 P17口
        else                                {        S1_USE_P30P31();        P3n_standard(0x03);        }        //UART1 使用P30 P31口

        REN = 1;        //允许接收
        ES  = 1;        //允许中断
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:956022 发表于 2021-8-8 15:02 | 显示全部楼层
搞那么复杂干什么。直接给P_SW寄存器赋值0x40不就行了
回复

使用道具 举报

ID:718536 发表于 2021-8-27 01:51 | 显示全部楼层
loner1994 发表于 2021-8-8 15:02
搞那么复杂干什么。直接给P_SW寄存器赋值0x40不就行了

后来看了别的大佬的例程才知道原来这么简单啊。不过现在都转8G 8A 8H系列。15系列估计以后越来越难买到了
8系列更快,功能更齐全。估计是新工艺加持了。好棒。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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