找回密码
 立即注册
楼主: xie2101

关于ai8051u 的串口1切换引脚到 P3.6 P3.7 后 出现的异常| 已经解决 ,见20楼

[复制链接]

27

主题

152

回帖

1085

积分

金牌会员

积分
1085
发表于 2026-8-24 09:37:40 | 显示全部楼层
xie2*** 发表于 2026-8-23 23:57
我之前只 打印的时候,这样写是可以的:

void Uart1Init()

你是不是 P3.6 P3.7 IO模式没有设置?至少要设置成 标准IO,默认的不行
回复

使用道具 举报 送花

已绑定手机

121

主题

5082

回帖

1万

积分

超级版主

无情的代码机器

积分
11220
发表于 2026-8-24 09:38:29 | 显示全部楼层

截图202608240937404323.jpg


代码屏蔽那一行就行了。再检查硬件?还不行给板载串口模块刷新下固件
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

54

主题

397

回帖

862

积分

高级会员

积分
862
 楼主| 发表于 2026-8-24 11:17:18 | 显示全部楼层
erci*** 发表于 2026-8-24 09:38
代码屏蔽那一行就行了。再检查硬件?还不行给板载串口模块刷新下固件
...

大佬,你的那个 正常的hex文件可以上传一下吗?
回复

使用道具 举报 送花

已绑定手机

121

主题

5082

回帖

1万

积分

超级版主

无情的代码机器

积分
11220
发表于 2026-8-24 11:23:25 | 显示全部楼层
xie2*** 发表于 2026-8-24 11:17
大佬,你的那个 正常的hex文件可以上传一下吗?

sample.hex (9.91 KB, 下载次数: 26)

点评

大佬感谢你的帮忙,这个问题有答案了。在20楼,是link1d惹的祸。  发表于 2026-8-24 21:24
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

54

主题

397

回帖

862

积分

高级会员

积分
862
 楼主| 发表于 2026-8-24 12:04:49 | 显示全部楼层

截图202608241204033049.jpg


看来是我的硬件有问题啊,直接用你的hex 还是不对。
回复

使用道具 举报 送花

54

主题

397

回帖

862

积分

高级会员

积分
862
 楼主| 发表于 2026-8-24 12:31:18 | 显示全部楼层

突然想起来我之前焊接过一个板子,在我焊接的板子上,用你给的hex,效果是随机的,有时候对,有时候错。

把我都给整不会了。

截图202608241230012469.jpg


截图202608241231138199.jpg
回复

使用道具 举报 送花

54

主题

397

回帖

862

积分

高级会员

积分
862
 楼主| 发表于 2026-8-24 16:35:57 | 显示全部楼层
zh*** 发表于 2026-8-24 09:37
你是不是 P3.6 P3.7 IO模式没有设置?至少要设置成 标准IO,默认的不行

你说的这个,我刚开始就试过了。

这里有个类似的问题:
https://www.stcaimcu.com/forum.p ... =1&extra=#pid120022

但我试过了没有效果。

我让14楼的大佬把它编出来的hex文件发出来了。

我用他的hex文件试过了,也是一样的。

难道是烧写软件 上有什么配置选项,我没选?

应该就只需要选个时钟频率的,对吧。
回复

使用道具 举报 送花

54

主题

397

回帖

862

积分

高级会员

积分
862
 楼主| 发表于 2026-8-24 17:04:53 | 显示全部楼层

我让ai 助手 又重新写了一个。  目前来看还是不够准确。


我要用 p3.6 p3.7 能正常收,能正常发 就可以

AI
您需要使用串口1在P3.6/P3.7引脚上正常收发数据。让我确认一下官方的示例程序和寄存器配置方式。

根据手册 「19 2组USART-LIN/SPI,同步/异步串口通信,硬件奇偶校验」 章节中官方给出的串口1使用定时器1做波特率发生器的示例程序,结合 「6 功能脚切换」 章节的P_SW1配置,以及 「14 I/O口」 章节中对P3.6/P3.7引脚模式的设置要求,我来为您整理一个可以正常收发的完整示例代码。

串口1使用 P3.6/P3.7 正常收发代码
根据手册要求,切换到P3.6/P3.7引脚需要:

设置 P_SW1 的 S1_S[1:0]=01(对应RxD=P3.6, TxD=P3.7)
配置 P3M0/P3M1 设置P3.6/P3.7的I/O模式(除P3.0/P3.1外,其他引脚上电默认高阻输入,必须设置I/O模式)
//=========================================================
// 串口1 使用 P3.6(RxD) / P3.7(TxD) 正常收发示例
// 适用芯片:Ai8051U系列
// 编译环境:Keil C251
// 系统时钟:11.0592MHz,波特率:115200
// 波特率发生器:定时器1(16位自动重载,1T模式)
//=========================================================
#include "Ai8051U.H"
#include "intrins.h"

#define FOSC 11059200UL
#define BRT (65536 - (FOSC / 115200 + 2) / 4)

void UartInit()
{
    // 1. 串口1功能脚切换到 P3.6(P33.8... 实际是 P3.6 RxD) / P3.7(TxD)
    P_SW1 |= 0x40;      // S1_S[1:0]=01, 选择P3.6/P3.7作为串口1引脚
   
    // 2. 设置P3.6/P3.7的I/O模式(必须!除P3.0/P3.1外上电默认高阻输入)
    //    P3.6 作为 RxD 输入,设为准双向口
    //    P3.7 作为 TxD 输出,设为推挽输出或准双向口
    P3M0 &= ~0xC0;      // P3.6/P3.7 M0位清零
    P3M1 &= ~0xC0;      // P3.6/P3.7 M1位清零 -> 准双向口模式
   
    // 3. 串口控制寄存器配置
    SCON = 0x50;        // SM0=0, SM1=1(模式1), REN=1(允许接收), SM2=0
   
    // 4. 定时器1作为波特率发生器
    S1BRT = 0;          // 串口1选择定时器1为波特率发生器
    TMOD &= ~0xF0;      // 定时器1模式0(16位自动重载)
    TMOD |= 0x00;
    TL1 = BRT;          // 波特率重载值低8位
    TH1 = BRT >> 8;     // 波特率重载值高8位
    T1x12 = 1;          // 定时器1时钟1T模式
    TR1 = 1;            // 启动定时器1
}

void main()
{
    // 32位模式下允许访问扩展寄存器
    EAXFR = 1;
   
    UartInit();
   
    // 允许串口1中断
    ES = 1;
    EA = 1;
   
    SBUF = 'A';         // 发送测试数据
    while (TI == 0);    // 等待发送完成
    TI = 0;             // 清除发送标志
   
    while (1)
    {
        if (RI)         // 收到数据
        {
            RI = 0;     // 清除接收标志
            SBUF = SBUF; // 回显收到的数据(示例)
            while (TI == 0);
            TI = 0;
        }
    }
}
📋
关键点说明:

配置项        值        作用
P_SW1 |= 0x40        S1_S[1:0]=01        串口1切换到 P3.6/P3.7
P3M0 &= ~0xC0        P3.6/P3.7 M0=0        设置准双向口
P3M1 &= ~0xC0        P3.6/P3.7 M1=0        设置准双向口
SCON = 0x50        模式1, REN=1        允许收发
S1BRT = 0        选定时器1        波特率发生器
T1x12 = 1        定时器1 1T模式        提高波特率
如果您想要中断接收的更完整示例(避免轮询阻塞),也可以参考以下方式:

#include "Ai8051U.H"
#include "intrins.h"

#define FOSC 11059200UL
#define BRT (65536 - (FOSC / 115200 + 2) / 4)

bit busy;
char wptr;
char rptr;
char buffer[16];

void UartIsr() interrupt 4
{
    if (TI)
    {
        TI = 0;
        busy = 0;
    }
    if (RI)
    {
        RI = 0;
        buffer[wptr++] = SBUF;
        wptr &= 0x0f;
    }
}

void UartInit()
{
    P_SW1 |= 0x40;          // 串口1切换到P3.6/P3.7
    P3M0 &= ~0xC0;          // P3.6/P3.7设为准双向口
    P3M1 &= ~0xC0;
    SCON = 0x50;            // 模式1, REN=1
    S1BRT = 0;              // 选定时器1做波特率发生器
    TMOD &= ~0xF0;
    TL1 = BRT;
    TH1 = BRT >> 8;
    T1x12 = 1;
    TR1 = 1;
    wptr = 0;
    rptr = 0;
    busy = 0;
}

void UartSend(char dat)
{
    while (busy);
    busy = 1;
    SBUF = dat;
}

void UartSendStr(char *p)
{
    while (*p)
    {
        UartSend(*p++);
    }
}

void main()
{
    EAXFR = 1;              // 允许访问扩展寄存器(32位模式)
    UartInit();
    ES = 1;                 // 允许串口1中断
    EA = 1;                 // 打开总中断
   
    UartSendStr("Uart Test !\r\n");
   
    while (1)
    {
        if (rptr != wptr)   // 有数据待处理
        {
            UartSend(buffer[rptr++]);
            rptr &= 0x0f;
        }
    }
}

----------------------------------------



截图202608241708585854.jpg


最后一次借助  ai 助手,      


下一步 准备 自己 重新 从头到尾  写一个试试。

点评

AI 助手写的这种简单程序大致还是对的。 主要问题应该是硬件上的问题  详情 回复 发表于 2026-8-24 20:58
回复

使用道具 举报 送花

54

主题

397

回帖

862

积分

高级会员

积分
862
 楼主| 发表于 2026-8-24 20:23:42 | 显示全部楼层
这个问题 目前无解 .

我后来  自己从头写了一个,  还是不对。 可能是我 对手册理解不够?   

我拿 例程 改出来的  和 我自己根据手册一行一行敲出来的  现象竟然一模一样。

点评

我觉得可能要借助示波器查看一下 我对比了一下它的二进制码,这种看起来像是上拉能力不足导致的。 我认为你可以进行这样尝试,也就是在串口通讯的引脚上接一个额外的上拉电阻到 MCU VCC。 以及如果你使用了 Link 1D  详情 回复 发表于 2026-8-24 20:58
回复

使用道具 举报 送花

已绑定手机
已实名认证

146

主题

4038

回帖

1万

积分

超级版主

积分
10652
发表于 2026-8-24 20:58:17 | 显示全部楼层
xie2*** 发表于 2026-8-24 20:23
这个问题 目前无解 .

我后来  自己从头写了一个,  还是不对。 可能是我 对手册理解不够?   

我觉得可能要借助示波器查看一下
我对比了一下它的二进制码,这种看起来像是上拉能力不足导致的。
我认为你可以进行这样尝试,也就是在串口通讯的引脚上接一个额外的上拉电阻到 MCU VCC。
以及如果你使用了 Link 1D 的 cdc2,我记得早些版本有可能 cdc2 的上拉配置有问题?和 cdc 1 的一些配置混合了,也就是同时用正常,单独用 cdc2 可能不大正常,可以通过给 Link 1D 更新一下程序试试。

点评

大佬真厉害啊。。。。。这问题都被你发现了。 竟然是是link1D 在捣乱啊。。。。。哈哈哈 我刚刚换到 把 link1d 换到p3.0 和p3.1 上 ,立马正常了。。  发表于 2026-8-24 21:17
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-9-22 12:34 , Processed in 0.075762 second(s), 96 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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