打印

急!!!C8051单片机不能进入串口中断

[复制链接]
5618|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fancyland|  楼主 | 2011-10-26 15:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大侠,我用的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;
}

相关帖子

沙发
ayb_ice| | 2011-10-26 16:36 | 只看该作者
我看到程序中有下面这句话
SBUF1 = buf[i];
UART发送了一个字节,但中断程序中居然没有判断清除相应的TI1标志
UART0也上一样的
不知道是用查询还是中断处理
整个程序逻辑混乱

使用特权

评论回复
板凳
fancyland|  楼主 | 2011-10-26 17:00 | 只看该作者
发送用查询方式,接收采用中断方式

使用特权

评论回复
地板
ayb_ice| | 2011-10-26 17:05 | 只看该作者
发送用查询方式,接收采用中断方式
fancyland 发表于 2011-10-26 17:00

查询方式我没有看到你关相关的中断啊

使用特权

评论回复
5
fancyland|  楼主 | 2011-10-26 17:12 | 只看该作者
while(TI0 == 0);
这个就是等待中断

使用特权

评论回复
6
fancyland|  楼主 | 2011-10-26 17:14 | 只看该作者
我测试了下,是由于串口中断优先级引起的,我采用默认串口优先级,所以串口0正常,串口1不能产生中断,如果我把串口1优先级提高,则串口1正常,串口0 不能接收

使用特权

评论回复
7
zgm3933zhuzhu| | 2011-10-26 17:15 | 只看该作者
~~~~~

使用特权

评论回复
8
fancyland|  楼主 | 2011-10-26 17:21 | 只看该作者
各位大侠有啥好的办法处理这种情况不?

使用特权

评论回复
9
ayb_ice| | 2011-10-27 08:28 | 只看该作者
好好看书吧

使用特权

评论回复
10
joblook| | 2011-10-27 09:39 | 只看该作者
程序太长,没看。
这个有在线仿真功能,看看那一步有问题;
还有交叉开关开了没。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

7

帖子

0

粉丝