[求助] c8051单片机不能进入串口中断

fancyland   2011-10-26 15:32 楼主
我用的C8051单片机,现在串口0能正常收发,但串口1能发数据但不能进入接收中断,下面是软件代码,麻烦各位前辈帮我看看。
void UARTInit(void)
{
        PCON = 0x90;              // SMOD0 = 1禁止波特率/2
                              // PCON.0     IDLE   等待方式选择
                                                          // PCON.1     STOP   停机方式选择
                                                          // PCON.2     保留   必须写入0
                                                          // PCON.3     SSTAT1 UART1增强状态方式选择
                                                          // PCON.4     SMOD1  UART1波特率加倍允许
                                                      // PCON.5            保留   必须写入0
                                  // PCON.6            SSTAT0 UART0增强状态方式选择
                                  // PCON.7            SMOD0  UART0波特率加倍允许
        SCON0 = 0x52;             //UART0方式1,8位UART,可变波特率,接收允许         
                                  // SCON0.0     RI0     接收中断标志
                                                                                                          // SCON0.1     TI0     发送中断标志
                                                                                                          // SCON0.2     RB80    第九位接送位
                                                                                                          // SCON0.3     TB80    第九位发送位
                                                                                                          // SCON0.4     REN0    接收允许
                                                                                                          // SCON0.5           SM20    多处理器通信允许
                                  // SCON0.7-6         SM00:SM01   串口通信方式选择
        ES0 = 1;                  // 允许UART0中断               
        ET2 = 1;                                  //允许定时2溢出
        TR2 = 1;                  // 启动定时2
        SCON1 = 0xD2;             //UART1方式3,9位UART,可变波特率,接收允许
                                  // SCON1.0     RI1     接收中断标志
                                                                                                          // SCON1.1     TI1     发送中断标志
                                                                                                          // SCON1.2     RB81    第九位发送位
                                                                                                          // SCON1.3     TB81    第九位发送位
                                                                                                          // SCON1.4     REN1    接收允许
                                                                                                          // SCON1.5           SM21    多处理器通信允许
                                  // SCON1.7-6         SM01:SM11   串口通信方式选择
        T4CON |= 0x04;            // 启动定时4
        EIE2 |= 0x44;                          // 允许UART1中断,定时器4溢出
              
        IP = 0x00;                // 采用默认中断优先级

}


/*****************************
Function: UART0接收中断
输入参数:无
输出参数:无
/*****************************/
void UART0_ISR() interrupt 4
{
        BYTE recvdata;
        if (RI0)
        {
                RI0=0;               
                recvdata = SBUF0;
                ComRecvTime = 0        ;               
                if (Recv0Len+1>=RECVBUF0LEN)
                Recv0Len=0;
                else
                Recv0Buf[Recv0Len++] = recvdata;               
        }
}

/*****************************
Function: UART1接收中断
输入参数:无
输出参数:无
/*****************************/
void UART1_ISR() interrupt 20
{
//        BYTE recvdata;
        if ((SCON1 & 0x01) == 0x01)   //接收中断
        {
                SCON1 &= ~0x01;
                ACC = SBUF1;
                if(SCON1^2 == P)       
                {
                        if (Recv1Len+1>=RECVBUF1LEN)
                        Recv1Len=0;
                        else
                        Recv1Buf[Recv1Len++] = SBUF1;
            }

        }

}

/*****************************
Function: UART0字节发送函数
输入参数:UART0串口发送数据、数据长度
输出参数:无
/*****************************/
void UART0SendData(BYTE* buf, UINT len)
{
        UINT i=0;
        for (i=0; i         {
                while(TI0 == 0);
                TI0 = 0;               
                SBUF0 = buf;
        }
        LedOpen();
}
/*****************************
Function: UART0字符串发送函数
输入参数:UART0串口需发送字符串
输出参数:无
/*****************************/
void UART0SendStr(char *str)   
{   
    while(*str != '\0')   
    {   
        UART0SendData(str,1);   
        str++;   
    }   
}   

/*****************************
Function: UART1发送函数
输入参数:UART1串口发送数据、数据长度
输出参数:无
/*****************************/
void UART1SendData(BYTE* buf, UINT len)
{
        UINT i=0;

        for(i = 0;i < len;i++)
        {
                while((SCON1 & 0x02) == 0x00);    //等待串口前一次数据发送完成
                SCON1 &= ~0x02;               
                ACC = buf;
                if(P==1)
                SCON1 |= 0x08;
                else   
                SCON1 &= ~0x08;
        UART1_SEND = 1;                
                SBUF1 = buf;
        }
        Delayms(100);
        UART1_SEND = 0;

}

回复评论 (2)

没用过C8051,不清楚

弱弱的问句,开总中断是哪个

点赞  2011-10-26 22:55

我是用c的  EA=1,ES=1,TI=0,这三条你写了吗

点赞  2011-10-27 07:48
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复