导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→串口和定时器中断冲突

* 71363: 串口和定时器中断冲突

   slowly2004 
slowly2004发表的帖子 

 串口和定时器中断冲突
/********************初始化***********************/
void uart_init()
{
 P0=0xff;//初始化单片机
 P1=0xff;
 P2=0xff;
 P3=0xff;
 uart_count=0;
 SCON=0x50;//串口工作在模式1,8位AURT,使能接收
 TMOD=0x21;//定时器1工作在模式2,8位自动重装;定时器0工作在模式1,16位定时器
 TH1=0xfd;//波特率为9600,时钟为11.059MHZ
 TL1=0xfd;
 IE=0X96;//中断总使能,串口中断使能,外部中断1使能,定时器0中断使能
 PS=1;//串口中断高优先级
 TR1=1;//定时器0和1开始计数
 TR0=1;
 PT0=0;//定时器0低优先级
 IT1=0;//外部中断1低电古触发
 EX1=0;
}

/*******************串口接收中断*************************/
void uart_rec_inter() interrupt 4
{
 while(RI)
 {
  RI=0;
  uart_buf[uart_count]=SBUF;
  uart_count++;
  if(uart_count==1)
  {
   err_count=30;
   uart_err=1;
  };
  if(uart_count==11)
  {
   uart_ready=1;
   uart_count=0;
   uart_err=0;
  };
 }
}

/*************************向串口发送一个字节*****************/
void uart_sendone(uchar ch)
{
 SBUF=ch;
 while(TI==0);
  TI=0;
}

/**********向串口发送字符串,strlen为字符串长度***********/
void uart_sendstring(uchar *str,uint strlen)
{
 uint k;
 for(k=0;k  <strlen;k++)
 {
  uart_sendone(*(str+k));
 }
}

/************************校验和**************************/
void uart_checksum()
{
 uint check_s;//校验和时,字节计数器
 if((uart_buf[0]==0x5a)&&(uart_buf[1]==0x53))//首先校验第一和第二个字节是否正确
 {
  checksum=0;
  for(check_s=0;check_s  <10;check_s++)
  {
   checksum+=uart_buf[check_s];
  }
  if(checksum==uart_buf[10])
  {
   sum=1;
  }
 }
}

void timer0() interrupt 1
{
 uchar sen_count;//读状态计数器
 TH0=0xd8;//3ms f448 10ms d8f0 15ms c568 5ms ec78
 TL0=0xf0;
 TIME=0;
 for(sen_count=0;sen_count  <=3;sen_count++)
 {
  xc_en=0;
  sen_en=1;
  delay(5);
  xc_buf[sen_count]=P0;//读3次行程开关状态
  xc_en=1;
  sen_en=0;
  delay(5);
  sen_buf[sen_count]=P0;//读3次传感器状态
 };
 if((xc_buf[0]==xc_buf[1])&&(xc_buf[0]==xc_buf[2]))//三次状态相同
 {
  if(xc_flag!=xc_buf[2])
  {
   if(((xc_flag&0x40)==0x40)&&((xc_buf[2]&0x40)==0))//判断推杆脉冲
   {
    //push.counter++;
    if(time_run)//判断是否按时间运行
    {uart_sendone(push_count);
     if(push_count>  0)
     {
      if(--push_count  <=0)
      {
       push_stop=1;//置位推杆停止标志位
      }
     }
    }
    /*if(push_run)//判断高度角光电传感器是否有效
    {
     if(((sen_flag&0xc0)!=sen)||(push.counter>  =30))
     {
      push_run=0;
      push_stop=1;
      send_addr=0;
      uart_buf[3]='M';
      uart_buf[7]=push_str;
      uart_buf[8]=push.ch[0];
      uart_buf[9]=push.ch[1];
      push_str=0;
      push.counter=0;
      trans_r=1;
     }
    }*/
   };
   if(((xc_flag&0x80)==0x80)&&((xc_buf[2]&0x80)==0))//判断转盘脉冲
   {
    //dial.counter++;
    if(time_run)//判断是否按时间运行
    {
     if(dial_count>  0)
     {
      if(--dial_count  <=0)
      {RUN=0;       
       dial_stop=1;//置位转盘停止标志位       
      }
     }
    }
    /*if(dial_run)//判断方位角光电传感器是否有效
    {
     if(((sen_flag&0x0c)!=0x04)||(dial.counter>  =20))
     {
      dial_run=0;//清0
      dial_stop=1;//置位电机停止标志
      send_addr=0;//广播地址
      uart_buf[3]='M';//命令为M
      uart_buf[4]='R';
      uart_buf[5]=dial.ch[0];
      uart_buf[6]=dial.ch[1];
      //dial_str=0;
      dial.counter=0;
      trans_r=1;
     }  
    }*/
   };   
   xc_flag=xc_buf[2];
   if(time_run)
   {
    if((push_count|dial_count)==0)
    {
     time_run=0;
    }
   }
  }
 }
 if((sen_buf[0]==sen_buf[1])&&(sen_buf[0]==sen_buf[2]))
 {
  sen_flag=sen_buf[2];
 }
 if(uart_err)
 {
  err_count--;
  if(err_count==0)
   {   
    uart_err=0;
    uart_count=0;
    uart_ready=0;
   }
 }
 //RUN=1;
}


我用串口接收11字节数据,电机根据串口接收到的数据转动相应的脉冲。在定时器0中断中,根据电机转动时输出的脉冲数与接收到的比较,相等时就使电机停下。
但是一上电就一直处于定时器中断里,串口无法接收数据。

求高手帮忙指点下,都整2周了。

发表时间:2009年6月17日16:50:31

  
回复该帖

本主题共有 1 帖,分页:>>>>>该主题的所有内容[1]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

[上一篇帖子]:[原创]中国软件协会嵌入式分会主办---嵌入式DIY项目实战训练营  一.目标 B
[下一篇帖子]:好会通[upload=gif]uploadfile/2009-6-17_16-42-28_80.gi