搜索
bottom↓
回复: 3

C8051F340 UART0中断接收问题

[复制链接]

出0入0汤圆

发表于 2012-8-18 12:16:00 | 显示全部楼层 |阅读模式
本帖最后由 mTouch 于 2012-8-18 12:22 编辑

    C8051F340定义 UART0允许中断(ES0=1)接收, 且设置在定时器Timer2的中断中 发送数据时,
Timer2不能正常动作.
   如果关掉UART0中断允许(ES0=0),Timer2能正常动作.

   出现这样的情况,是什么原因造成的,有知道的吗?
   难道UART0与Timer2之间相互有约束?

void UART0Senddata(unsigned char ch)
{
  SBUF0 = ch;
  while(SCON0&0x02==0); //wait for TI0=1;
   SCON0 = SCON0&0xfd;//TI0=0;
}

main()
{
....
  设置UART0,
  设置Timer2;
....
  ET2 = 1;
  ES0 =1;
  EA=1;
  while(1)
{

}
}

void UART0_Interrupt(void) interrupt 4
{
   if (SCON0&0x01)
  {
      SCON0&=0xFE;              // 清接收中断标志RI0
      .....
  }
}

void Timer2_ISR(void) interrupt 5
{
     TF2H = 0;  
     UART0Senddata('A');
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-8-18 15:11:47 | 显示全部楼层
貌似串口中断优先级要高些,不知这里面有没有清TI。
如果串口中断把TI清了 UART0Senddata 里wait for TI0=1; 就等不到了。

出0入0汤圆

发表于 2012-8-19 10:18:02 | 显示全部楼层
好像是你的设置问题,我的设置是这样:/***********************************************************************************
* 函数名称:Uart1_Init;
*
* 函数功能描述:Uart1初始化;
*              
* 输入参数:unsigned char类型,发送数据波特率;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void Uart1_Init (void)                      //Uart1初始化                             
{   
   char SFRPAGE_SAVE = SFRPAGE;             // Save Current SFR page
   SFRPAGE = UART1_PAGE;
   SCON1 = 0x10;                            // UART1设置为8位模式, 允许接收
  // TI1 = 1;                                       // 开启发送
   SFRPAGE = TIMER01_PAGE;
   TMOD   &= ~0xF0;                            // 定时器1设置为8为重载模式
   TMOD   |=  0x20;                    
      TH1 = 0xa0;
      CKCON &= ~0x13;                       // Clear all T1 related bits
    // CKCON |=  0x10;                       // T1M = 0; SCA1:0 = 10
   TL1 = TH1;                               // 定时器1 计数值初始化
   TR1 = 1;                                 // 打开定时器1
   EIE2 &= ~0x40;                           // 关闭Uart1中断
   EIP2 &= ~0x40;                           // 关闭Uart1中断优先级
   SFRPAGE = SFRPAGE_SAVE;                  // Restore SFR page   
  }
可参考,。

出0入0汤圆

 楼主| 发表于 2012-8-20 18:50:38 | 显示全部楼层
   自己解决了!
    方法如下:
void UART0Senddata(unsigned char ch)
{
   SBUF0 = ch;
   while(SCON0&0x02==0); //wait for TI0=1;
    SCON0 = SCON0&0xfd;//TI0=0;
}

main()
{
....
   设置UART0,
   设置Timer2;
....
   ET2 = 1;
   ES0 =1;
   EA=1;
   while(1)
{
       if (read_flag)              //如果接收完毕标志已置位,就将读到的数从串口发出
    {
          read_flag= 0 ;         //接收完毕标志清0  
      UART0_Send_data(Byte);  // 回送接收到的数据
     }
   }
}

void UART0_Interrupt(void) interrupt 4
{
    if (SCON0&0x01)
   {
       SCON0&=0xFE;              // 清接收中断标志RI0
      .....
   }
    if (TI0 == 1)                   // Check if transmit flag is set
    {
       TI0 = 0;                           // Clear interrupt flag
   }


}

void Timer2_ISR(void) interrupt 5
{
      TF2H = 0;  
      UART0Senddata('A');
}
一组:
  二块板子,相互发送与接收,连续工作了24小时,还是稳定,
正确发送与接收数据!
另一组:
    板子与PC通过串口进行发送与接收,连续工作了24小时,还是稳定,
正确发送与接收数据!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 22:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表