标题: STC15W4K56S2串口3 4收发问题讨论 [打印本页]

作者: tembo09    时间: 2018-6-10 21:43
标题: STC15W4K56S2串口3 4收发问题讨论
本帖最后由 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中断打开
}



作者: tembo09    时间: 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中断打开
}





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1