找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4244|回复: 1
收起左侧

STC15W4K56S2串口3 4收发问题讨论

[复制链接]
ID:349045 发表于 2018-6-10 21:43 | 显示全部楼层 |阅读模式
本帖最后由 tembo09 于 2018-6-10 21:45 编辑

现在STC15W4K56S2串口3 串口4都能发数据,就是接收中断不响应,求解,有例程借鉴下。谢谢

void Uart1234_Init(void)
{       
    P_SW1=0X00;          //选择P30 P31为串口1
        P_SW2=0X00;          //选择P10 P11为串口2,选择P00 P01为串口3,选择P02 P03为串口4
       
        //串口1配置        9600bps@11.0592MHz
        SCON = 0x50;                 //8位数据,可变波特率
        AUXR |= 0x40;                 //定时器1时钟为Fosc,即1T
        AUXR &= 0xFE;                 //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                 //设定定时器1为16位自动重装方式
        TL1 = 0xE0;                         //设定定时初值
        TH1 = 0xFE;                         //设定定时初值
        ET1 = 0;                         //禁止定时器1中断
        TR1 = 1;                         //启动定时器1
       
        //串口2配置        115200bps@11.0592MHz
        S2CON = 0x50;                 //串口2的8位数据,可变波特率       
    //串口3配置        115200bps@11.0592MHz
        S3CON |= 0x10;                 //串口3启动串行接收器
        S3CON &= 0xBF;                 //串口3选择定时器2为波特率发生器,8位数据,可变波特率
       
        AUXR |= 0x04;                 //定时器2时钟为Fosc,即1T
        T2L = 0xE8;                     //设定定时初值0xE0
        T2H = 0xFF;          //设定定时初值0xFE
        AUXR |= 0x10;        //启动定时器2
       
        //串口4配置        9600bps@11.0592MHz       
        S4CON = 0x10;                 //8位数据,可变波特率
        S4CON |= 0x40;                 //串口4选择定时器4为波特率发生器
        T4T3M |= 0x20;                 //定时器4时钟为Fosc,即1T
        T4L = 0xE0;                         //设定定时初值
        T4H = 0xFE;                         //设定定时初值
        T4T3M |= 0x80;                 //启动定时器4

        ES = 1;              // 串口1中断打开                              
          IE2 |= 0x01;         // 串口2中断打开
        IE2 |= 0x08;         // 串口3中断打开
    IE2 |= 0x10;         // 串口4中断打开
}


void Uart4() interrupt 18        using 1   
{                       
    IE2 &= 0xEF;                                                           // 串口4中断关闭  
        if(S4CON & S4RI)                                            //串行接收到停止位的中间时刻时,该位置1
        {
                S4CON &= ~S4RI;                                          //清除S4CON寄存器对应S4RI位(该位必须软件清零)
                uart_count=0;
                rev_buff4[uart_count] = S4BUF;     //把串口4缓存SBUF寄存器数据依次存放到数组Rec_Buf4中
                uart_count++;               
            if(uart_count>buff_max)            //接收数大于定义接收数组最大个数时,覆盖接收数组之前值
                {
                                uart_count = 0;
                }
        }
        if(S4CON & S4TI)             //在停止位开始发送时,该位置1
        {
                S4CON &= ~S4TI;          //清除S4CON寄存器对应S4TI位(该位必须软件清零)
        }
         IE2 |= 0x10;                // 串口4中断打开
}


回复

使用道具 举报

ID:349045 发表于 2018-6-10 21:44 | 显示全部楼层
void Uart1234_Init(void)
{       
    P_SW1=0X00;          //选择P30 P31为串口1
        P_SW2=0X00;          //选择P10 P11为串口2,选择P00 P01为串口3,选择P02 P03为串口4
       
        //串口1配置        9600bps@11.0592MHz
        SCON = 0x50;                 //8位数据,可变波特率
        AUXR |= 0x40;                 //定时器1时钟为Fosc,即1T
        AUXR &= 0xFE;                 //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                 //设定定时器1为16位自动重装方式
        TL1 = 0xE0;                         //设定定时初值
        TH1 = 0xFE;                         //设定定时初值
        ET1 = 0;                         //禁止定时器1中断
        TR1 = 1;                         //启动定时器1
       
        //串口2配置        115200bps@11.0592MHz
        S2CON = 0x50;                 //串口2的8位数据,可变波特率       
    //串口3配置        115200bps@11.0592MHz
        S3CON |= 0x10;                 //串口3启动串行接收器
        S3CON &= 0xBF;                 //串口3选择定时器2为波特率发生器,8位数据,可变波特率
       
        AUXR |= 0x04;                 //定时器2时钟为Fosc,即1T
        T2L = 0xE8;                     //设定定时初值0xE0
        T2H = 0xFF;          //设定定时初值0xFE
        AUXR |= 0x10;        //启动定时器2
       
        //串口4配置        9600bps@11.0592MHz       
        S4CON = 0x10;                 //8位数据,可变波特率
        S4CON |= 0x40;                 //串口4选择定时器4为波特率发生器
        T4T3M |= 0x20;                 //定时器4时钟为Fosc,即1T
        T4L = 0xE0;                         //设定定时初值
        T4H = 0xFE;                         //设定定时初值
        T4T3M |= 0x80;                 //启动定时器4

        ES = 1;              // 串口1中断打开                              
          IE2 |= 0x01;         // 串口2中断打开
        IE2 |= 0x08;         // 串口3中断打开
    IE2 |= 0x10;         // 串口4中断打开
}


void Uart4() interrupt 18        using 1   
{                       
    IE2 &= 0xEF;                                                           // 串口4中断关闭  
        if(S4CON & S4RI)                                            //串行接收到停止位的中间时刻时,该位置1
        {
                S4CON &= ~S4RI;                                          //清除S4CON寄存器对应S4RI位(该位必须软件清零)
                uart_count=0;
                rev_buff4[uart_count] = S4BUF;     //把串口4缓存SBUF寄存器数据依次存放到数组Rec_Buf4中
                uart_count++;               
            if(uart_count>buff_max)            //接收数大于定义接收数组最大个数时,覆盖接收数组之前值
                {
                                uart_count = 0;
                }
        }
        if(S4CON & S4TI)             //在停止位开始发送时,该位置1
        {
                S4CON &= ~S4TI;          //清除S4CON寄存器对应S4TI位(该位必须软件清零)
        }
         IE2 |= 0x10;                // 串口4中断打开
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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