各位大侠,我用的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 <len; i++)
{
while(TI0 == 0);
TI0 = 0;
SBUF0 = buf[i];
}
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[i];
if(P==1)
SCON1 |= 0x08;
else
SCON1 &= ~0x08;
UART1_SEND = 1;
SBUF1 = buf[i];
}
Delayms(100);
UART1_SEND = 0;
} |