找回密码
 立即注册
查看: 572|回复: 10

请问AI8051U 串口1使用问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-12-15 17:04:39
已绑定手机

3

主题

10

回帖

39

积分

新手上路

积分
39
发表于 2025-12-5 17:35:51 | 显示全部楼层 |阅读模式
如果串口1,
P30/P31配置了USB 在线调试或者不断电下载 ,
程序又把串口1映射到P36/P37 ,
然后接RS232 与上位机通信,是否可以,有影响吗。
板子画错了 通信都搞串口1了 ,谢谢

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:260
  • 最近打卡:2025-12-19 00:46:52
已绑定手机

46

主题

218

回帖

1725

积分

金牌会员

积分
1725
发表于 2025-12-5 17:51:13 | 显示全部楼层
可以的,P3.6 P3.7。串口通信可以。3.6 3.7管脚没USB功能
8位程序---换个STC32G.h头文件,换个C251编译器就直接到STC32的高度了;
          想回到8位机,则换个STC8H.h头文件,换个C51编译器就回到8位机了.
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-12-15 17:04:39
已绑定手机

3

主题

10

回帖

39

积分

新手上路

积分
39
发表于 2025-12-5 18:03:35 | 显示全部楼层
East W*** 发表于 2025-12-5 17:51
可以的,P3.6 P3.7。串口通信可以。3.6 3.7管脚没USB功能

好的 谢谢
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:268
  • 最近打卡:2025-12-18 08:51:37

814

主题

1万

回帖

2万

积分

管理员

积分
21329
发表于 2025-12-5 18:44:39 | 显示全部楼层
截图202512051833581583.jpg

截图202512051834306394.jpg

截图202512051845371825.jpg



回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-12-15 17:04:39
已绑定手机

3

主题

10

回帖

39

积分

新手上路

积分
39
发表于 2025-12-5 21:50:47 | 显示全部楼层
大佬  我现在出现  死机状态 我都搞蒙了   不知道为什么  我刚开始用的USB在线调试下载,然后把串口1切换P36P37  ,把串口1通信写好后  下载后 要么启动不了,然后我把USB的相关程序屏蔽后还是一样,晕了
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-12-15 17:04:39
已绑定手机

3

主题

10

回帖

39

积分

新手上路

积分
39
发表于 2025-12-5 21:57:55 | 显示全部楼层
void Uart1_Isr(void) interrupt 8
{
        if (TI)                                //检测串口1发送中断
        {
                TI = 0;                        //清除串口1发送中断请求位
                B_TX1_Busy = 0;
        }
        if (RI)                                //检测串口1接收中断
        {
                RI = 0;                        //清除串口1接收中断请求位
                UR1TOCR = 0xe0;           //开启超时中断,使用系统时钟
                Rec_Dat[Rec_Num++] = SBUF;
        }

    if(UR1TOSR & 0x01)                              //串口超时中断
    {
        B_RX1_OK = 1;                               //接收完成标志位
        UR1TOSR = 0x00;                             //清除超时标志位
        UR1TOCR = 0x00;                             //关闭超时中断
    }
}void Uart1_Init(void)                        //115200bps@40.000MHz
{
        P_SW1 = (P_SW1 & ~0xc0) | 0x40;                //UART1/USART1: RxD(P3.6), TxD(P3.7)

        SCON = 0x50;                                //8位数据,可变波特率
        AUXR |= 0x40;                                //定时器时钟1T模式
        AUXR &= 0xFE;                                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                                //设置定时器模式
        TL1 = 0xA9;                                        //设置定时初始值
        TH1 = 0xFF;                                        //设置定时初始值
        ET1 = 0;                                        //禁止定时器中断
        TR1 = 1;                                        //定时器1开始计时
        ES = 1;                                                //使能串口1中断
       
    UR1TOCR = 0x00;          //关闭超时中断                              
    UR1TOTL = 0x04;                                 
    UR1TOTH = 0x3b;                              
    UR1TOTE = 0x01;   
       
        Rec_Num = 0;
        B_TX1_Busy = 0;
        B_RX1_OK = 0;       
}




void Uart1_SendStr( u8 *puts )                //串口数据发送函数
{
    for (; *puts != 0;  puts++)     //遇到停止符0结束
    {
        SBUF = *puts;
        B_TX1_Busy = 1;
        while(B_TX1_Busy);
    }       
}    卡死发送了 照例子来的

点评

串口1的中断号是4,不是8 [attachimg]123555[/attachimg]  详情 回复 发表于 2025-12-7 20:09
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-12-15 17:04:39
已绑定手机

3

主题

10

回帖

39

积分

新手上路

积分
39
发表于 2025-12-5 22:10:11 | 显示全部楼层

一执行 串口发送就死机  怪怪
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:268
  • 最近打卡:2025-12-18 08:51:37

814

主题

1万

回帖

2万

积分

管理员

积分
21329
发表于 2025-12-5 22:22:35 | 显示全部楼层
截图202512052222216143.jpg



#include <AI8051U.H>                        //包含AI8051U的头文件

#include "intrins.h"                        //使用_nop_()函数所必须要包含的头文件,
                                                                //否则延时函数中调用的_nop_()函数没有被头文件引用过来,
                                                                //会导致编译器找不到这个而函数而报错。

unsigned char uart1_txflag = 0;        //定义1个位变量,UART1事件位变量标志,记录UART1已产生发送中断
// 供主循环查询UART1是否已产生发送中断,在主循环中处理UART1的中断事件任务,不堵塞其他中断
unsigned char uart1_rxflag = 0;        //定义1个位变量,UART1事件位变量标志,记录UART1已产生接收中断
// 供主循环查询UART1是否已产生接收中断,在主循环中处理UART1的中断事件任务,不堵塞其他中断
unsigned char uart2_txflag = 0;        //定义1个位变量,UART2事件位变量标志,记录UART2已产生发送中断
// 供主循环查询UART2是否已产生发送中断,在主循环中处理UART2的中断事件任务,不堵塞其他中断
unsigned char uart2_rxflag = 0;        //定义1个位变量,UART2事件位变量标志,记录UART2已产生接收中断
// 供主循环查询UART2是否已产生接收中断,在主循环中处理UART2的中断事件任务,不堵塞其他中断
unsigned char uart3_txflag = 0;        //定义1个位变量,UART3事件位变量标志,记录UART3已产生发送中断
// 供主循环查询UART3是否已产生发送中断,在主循环中处理UART3的中断事件任务,不堵塞其他中断
unsigned char uart3_rxflag = 0;        //定义1个位变量,UART3事件位变量标志,记录UART3已产生接收中断
// 供主循环查询UART3是否已产生接收中断,在主循环中处理UART3的中断事件任务,不堵塞其他中断
unsigned char uart4_txflag = 0;        //定义1个位变量,UART4事件位变量标志,记录UART4已产生发送中断
// 供主循环查询UART4是否已产生发送中断,在主循环中处理UART1的中断事件任务,不堵塞其他中断
unsigned char uart4_rxflag = 0;        //定义1个位变量,UART4事件位变量标志,记录UART4已产生接收中断
// 供主循环查询UART4是否已产生接收中断,在主循环中处理UART4的中断事件任务,不堵塞其他中断

void Uart1_Init(void)                        //115200bps@40.000MHz
{
        SCON = 0x50;                                //8位数据,可变波特率
        AUXR |= 0x40;                                //定时器时钟1T模式
        AUXR &= 0xFE;                                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                                //设置定时器模式
        TL1 = 0xA9;                                        //设置定时初始值
        TH1 = 0xFF;                                        //设置定时初始值
        ET1 = 0;                                        //禁止定时器中断
        TR1 = 1;                                        //定时器1开始计时
        ES = 1;                                                //使能串口1中断
}

void Uart2_Init(void)                        //115200bps@40.000MHz
{
        S2CON = 0x50;                                //8位数据,可变波特率
        AUXR |= 0x04;                                //定时器时钟1T模式
        T2L = 0xA9;                                        //设置定时初始值
        T2H = 0xFF;                                        //设置定时初始值
        AUXR |= 0x10;                                //定时器2开始计时
        IE2 |= 0x01;                                //使能串口2中断
}

void Uart3_Init(void)                        //115200bps@40.000MHz
{
        S3CON = 0x10;                                //8位数据,可变波特率
        S3CON |= 0x40;                                //串口3选择定时器3为波特率发生器
        T4T3M |= 0x02;                                //定时器时钟1T模式
        T3L = 0xA9;                                        //设置定时初始值
        T3H = 0xFF;                                        //设置定时初始值
        T4T3M |= 0x08;                                //定时器3开始计时
        IE2 |= 0x08;                                //使能串口3中断
}

void Uart4_Init(void)                        //115200bps@40.000MHz
{
        S4CON = 0x10;                                //8位数据,可变波特率
        S4CON |= 0x40;                                //串口4选择定时器4为波特率发生器
        T4T3M |= 0x20;                                //定时器时钟1T模式
        T4L = 0xA9;                                        //设置定时初始值
        T4H = 0xFF;                                        //设置定时初始值
        T4T3M |= 0x80;                                //定时器4开始计时
        IE2 |= 0x10;                                //使能串口4中断
}

void main (void)
{
        EAXFR = 1;                                        //允许访问扩展的特殊寄存器,XFR
        WTST = 0;                                        //设置取程序代码等待时间,赋值为0表示不等待,程序以最快速度运行
        CKCON = 0;                                        //设置访问片内的xdata速度,赋值为0表示用最快速度访问,不增加额外的等待时间

        P0M0 = 0x00; P0M1 = 0x00;         //设置 P0 口为准双向口模式
        P1M0 = 0x00; P1M1 = 0x00;         //设置 P1 口为准双向口模式
        P2M0 = 0x00; P2M1 = 0x00;         //设置 P2 口为准双向口模式
        P3M0 = 0x00; P3M1 = 0x00;        //设置 P3 口为准双向口模式
        P3M0 = 0x00; P3M1 = 0x0c;         //P32、P33设置为高阻输入(需要同步开启上拉电阻)
        P4M0 = 0x00; P4M1 = 0x00;         //设置 P4 口为准双向口模式
        P5M0 = 0x00; P5M1 = 0x00;         //设置 P5 口为准双向口模式
        P6M0 = 0x00; P6M1 = 0x00;         //设置 P6 口为准双向口模式
        P7M0 = 0x00; P7M1 = 0x00;         //设置 P7 口为准双向口模式

        uart1_txflag = 0;                        //初始化用户标志位
        uart1_rxflag = 0;                        //初始化用户标志位
        uart2_txflag = 0;                        //初始化用户标志位
        uart2_rxflag = 0;                        //初始化用户标志位
        uart3_txflag = 0;                        //初始化用户标志位
        uart3_rxflag = 0;                        //初始化用户标志位
        uart4_txflag = 0;                        //初始化用户标志位
        uart4_rxflag = 0;                        //初始化用户标志位

        Uart1_Init();                                //调用UART1初始化函数
        Uart2_Init();                                //调用UART2初始化函数
        Uart3_Init();                                //调用UART3初始化函数
        Uart4_Init();                                //调用UART4初始化函数

        EA = 1;                                                //总中断允许位打开
        P40 = 0;                                         //打开LED灯供电
        while(1)                                         //主循环中查询需要处理的各种事件
        {
                /*  本演示程序中,主循环查询各中断有无需要继续处理的事件的次序,
                依次是 UART/UART2/UART3/UART4, 用户可以自己根据实际情况,
                调整查询各中断有无需要继续处理的事件的优先次序  */

                if(uart1_txflag)                //主循环中查询,UART1是否已产生发送中断,是否有需要处理的UART1发送事件
                {
                        uart1_txflag = 0;        //清0,UART1发送事件位变量标志
                        _nop_();                        //用户在此添加需要处理的事件
                        _nop_();
                }

                if(uart1_rxflag)                //主循环中查询,UART1是否已产生接收中断,是否有需要处理的UART1接收事件
                {
                        uart1_rxflag = 0;        //清0,UART1接收事件位变量标志
                        _nop_();                        //用户在此添加需要处理的事件
                        _nop_();
                }

                if(uart2_txflag)                //主循环中查询,UART2是否已产生发送中断,是否有需要处理的UART2发送事件
                {
                        uart2_txflag = 0;        //清0,UART2发送事件位变量标志
                        _nop_();                        //用户在此添加需要处理的事件
                        _nop_();
                }

                if(uart2_rxflag)                //主循环中查询,UART2是否已产生接收中断,是否有需要处理的UART2接收事件
                {
                        uart2_rxflag = 0;        //清0,UART2接收事件位变量标志
                        _nop_();                        //用户在此添加需要处理的事件
                        _nop_();
                }

                if(uart3_txflag)                //主循环中查询,UART3是否已产生发送中断,是否有需要处理的UART3发送事件
                {
                        uart3_txflag = 0;        //清0,UART3发送事件位变量标志
                        _nop_();                        //用户在此添加需要处理的事件
                        _nop_();
                }

                if(uart3_rxflag)                //主循环中查询,UART3是否已产生接收中断,是否有需要处理的UART3接收事件
                {
                        uart3_rxflag = 0;        //清0,UART3接收事件位变量标志
                        _nop_();                        //用户在此添加需要处理的事件
                        _nop_();
                }

                if(uart4_txflag)                //主循环中查询,UART4是否已产生发送中断,是否有需要处理的UART4发送事件
                {
                        uart4_txflag = 0;        //清0,UART4发送事件位变量标志
                        _nop_();                        //用户在此添加需要处理的事件
                        _nop_();
                }

                if(uart4_rxflag)                //主循环中查询,UART4是否已产生接收中断,是否有需要处理的UART4接收事件
                {
                        uart4_rxflag = 0;        //清0,UART4接收事件位变量标志
                        _nop_();                        //用户在此添加需要处理的事件
                        _nop_();
                }
        }
}


void Uart1_Isr(void) interrupt UART1_VECTOR
{
        if (TI)                                                //检测串口1发送中断
        {
                TI = 0;                                        //清除串口1发送中断请求位
                _nop_();                                //特急处理
                //以上程序代表部分需特急处理的中断事件,可在中断服务程序中直接处理
                //但时间不要太长,否则会影响其他中断事件的实时响应速度
                uart1_txflag = 1;                // uart1_txflag置1是通知主循环处理部分串口1发送中断事件不需要特急处理的任务
                                                                //置1,记录UART1已产生发送中断,供主循环查询判断有无需处理的UART1发送任务
        }
        if (RI)                                                //检测串口1接收中断
        {
                RI = 0;                                        //清除串口1接收中断请求位
                _nop_();                                //特急处理
                //以上程序代表部分需特急处理的中断事件,可在中断服务程序中直接处理
                //但时间不要太长,否则会影响其他中断事件的实时响应速度
                uart1_rxflag = 1;                // uart1_rxflag置1是通知主循环处理部分串口1接收中断事件不需要特急处理的任务
                                                                //置1,记录UART1已产生接收中断,供主循环查询判断有无需处理的UART1接收任务
        }
}
//UART1中断服务程序,UART1_VECTOR在AI8051U.H头文件中已宏定义为4

void Uart2_Isr(void) interrupt UART2_VECTOR
{
        if (S2CON & 0x02)        //检测串口2发送中断
        {
                S2CON &= ~0x02;        //清除串口2发送中断请求位
                _nop_();                                //特急处理
                //以上程序代表部分需特急处理的中断事件,可在中断服务程序中直接处理
                //但时间不要太长,否则会影响其他中断事件的实时响应速度
                uart2_txflag = 1;                // uart2_txflag置1是通知主循环处理部分串口2发送中断事件不需要特急处理的任务
                                                                //置1,记录UART2已产生发送中断,供主循环查询判断有无需处理的UART2发送任务
        }
        if (S2CON & 0x01)        //检测串口2接收中断
        {
                S2CON &= ~0x01;        //清除串口2接收中断请求位
                _nop_();                                //特急处理
                //以上程序代表部分需特急处理的中断事件,可在中断服务程序中直接处理
                //但时间不要太长,否则会影响其他中断事件的实时响应速度
                uart2_rxflag = 1;                // uart2_rxflag置1是通知主循环处理部分串口2接收中断事件不需要特急处理的任务
                                                                //置1,记录UART2已产生接收中断,供主循环查询判断有无需处理的UART2接收任务
        }
}
//UART2中断服务程序,UART2_VECTOR在AI8051U.H头文件中已宏定义为8

void Uart3_Isr(void) interrupt UART3_VECTOR
{
        if (S3CON & 0x02)        //检测串口3发送中断
        {
                S3CON &= ~0x02;        //清除串口3发送中断请求位
                _nop_();                                //特急处理
                //以上程序代表部分需特急处理的中断事件,可在中断服务程序中直接处理
                //但时间不要太长,否则会影响其他中断事件的实时响应速度
                uart3_txflag = 1;                // uart3_txflag置1是通知主循环处理部分串口3发送中断事件不需要特急处理的任务
                                                                //置1,记录UART3已产生发送中断,供主循环查询判断有无需处理的UART3发送任务
        }
        if (S3CON & 0x01)        //检测串口3接收中断
        {
                S3CON &= ~0x01;        //清除串口3接收中断请求位
                _nop_();                                //特急处理
                //以上程序代表部分需特急处理的中断事件,可在中断服务程序中直接处理
                //但时间不要太长,否则会影响其他中断事件的实时响应速度
                uart3_rxflag = 1;                // uart3_rxflag置1是通知主循环处理部分串口3接收中断事件不需要特急处理的任务
                                                                //置1,记录UART3已产生接收中断,供主循环查询判断有无需处理的UART3接收任务
        }
}
//UART3中断服务程序,UART3_VECTOR在AI8051U.H头文件中已宏定义为17

void Uart4_Isr(void) interrupt UART4_VECTOR
{
        if (S4CON & 0x02)        //检测串口4发送中断
        {
                S4CON &= ~0x02;        //清除串口4发送中断请求位
                _nop_();                                //特急处理
                //以上程序代表部分需特急处理的中断事件,可在中断服务程序中直接处理
                //但时间不要太长,否则会影响其他中断事件的实时响应速度
                uart4_txflag = 1;                // uart4_txflag置1是通知主循环处理部分串口4发送中断事件不需要特急处理的任务
                                                                //置1,记录UART4已产生发送中断,供主循环查询判断有无需处理的UART4发送任务
        }
        if (S4CON & 0x01)        //检测串口4接收中断
        {
                S4CON &= ~0x01;        //清除串口4接收中断请求位
                _nop_();                                //特急处理
                //以上程序代表部分需特急处理的中断事件,可在中断服务程序中直接处理
                //但时间不要太长,否则会影响其他中断事件的实时响应速度
                uart4_rxflag = 1;                // uart4_rxflag置1是通知主循环处理部分串口4接收中断事件不需要特急处理的任务
                                                                //置1,记录UART4已产生接收中断,供主循环查询判断有无需处理的UART4接收任务
        }
}
//UART4中断服务程序,UART4_VECTOR在AI8051U.H头文件中已宏定义为18


回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:686
  • 最近打卡:2025-12-18 12:03:16

15

主题

70

回帖

3362

积分

论坛元老

积分
3362
发表于 2025-12-6 12:07:57 | 显示全部楼层
void Uart1_Isr(void) interrupt    8 ?   4?
{
        if (TI)                                //检测串口1  ? 发送中断
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-12-15 17:04:39
已绑定手机

3

主题

10

回帖

39

积分

新手上路

积分
39
发表于 2025-12-6 19:54:27 | 显示全部楼层
wjhh*** 发表于 2025-12-6 12:07
void Uart1_Isr(void) interrupt    8 ?   4?
{
        if (TI)                                //检测 ...

恩  这里有问题
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-12-19 01:32 , Processed in 0.132052 second(s), 94 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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