导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→串口中断与定时中断同时开存在的问题,请教大侠[boysen]

 *第19931篇: 串口中断与定时中断同时开存在的问题,请教大侠

  
楼 主:boysen 2004年3月9日17:33
 串口中断与定时中断同时开存在的问题,请教大侠
串口中断与定时中断同时开存在的问题,请教大侠 

我通过AD转化采集外部信号值并显示在LCD上,每1ms采集一次,采用定时中断
1;同时需要显示串行口发来的数据,采用9600波特率(无多机通信)。结果是定时中断1显示正常,串行数据却接收不到。程序如下,请大侠们帮忙看看指正,我实在不知道原因了,只好贴出编的一段程序来请各位指教:
初始化:
IE=0x92;          
TMOD=0x21; 
TH1=0xf4;    
TL1=0XF4;//6时钟单片机,9600bps      
SCON=0x50;          
TCON=0x50;                   
TH0=0xf1;          
TL0=0x9a;//定时中断1ms
IP=0x00;    

定时中断
void disp(void) interrupt 1{//定时中断1
    TH0=0xf1;
    TL0=0x9a;    //重新赋值,定时1ms
    StaticShow(LineNo);//将数据送LCD显示,运行时间约0.1ms
    LineNo++;    //全局变量,计算定时中断次数
    if (LineNo==16)LineNo=0;
    }
串口中断:
void receive(void) interrupt 4{        
  uchar i,j;
  RI=0;
  if (SBUF!=0XCC)return;//侦头字节
  RI=0;
  if (_getkey!=0x55)return;//侦头字节
  if (_getkey!=0x01)return;//类型
  ES=0;//这里可考虑去掉,但是效果一样
  for (i=0;i  <128;i++){
      Buffer[i]=_getkey();//接收128字节数据
  }
ES=1;//重新开中断
}
语法没任何问题(手输入错误除外),串形中断单独使用也没有问题,现在情况是定时中断正常,不进入串行中断,搞了两天了,没有结果,郁闷中。。。。。。请大侠救命,谢谢
 
 

  
2楼:dongxiaohai 2004年3月9日19:44
 请改用52芯片的T2资源!
想必你一定是用的51芯片,或是你未用T2来发生串口波特率。
晕!你用了串口,就不能在用T1中断了,因为T1此时是用来发生串口波特率的!你一定要用,就要改用52的芯片,它可以另用T2定时器来发生波特率!详细设置请查阅有关资料!
  
3楼:shliujun 2004年3月9日21:34
 我看你先把定时中断理的显示函数去掉,再执行,看串口是不是好的。
因为我估计跟你的函数的运行时间有关系,可能他
t1中断没有被触发,可能定时中断运行的时间太长了。
这只是建议,您可以试试。
  
4楼:guest 2004年3月12日11:50
 应该是显示运行时间太长的缘故
2 方法:
(1)将串行中断优先级设成高于T1
(2)如果不是非要1ms刷新一次显示的话(事实上1ms就刷新显示对人眼来看说没必要),提高显示刷新周期,需要刷新的时候,在中断中做一个标记,在主循环中来执行显示刷新
  
5楼:boysen 2004年3月10日08:16
 T1中断运行正常,结果是引不起串口中断
不过我觉得你说的T1中断运行时间太长有点道理,但是这是没办法的事,必须这么久(0.1ms)才能运行完。定时1ms应该相对不是很长啊。
  
6楼:kuolongfei 2004年3月10日14:12
 在串行中断里面关掉ES,还怎么接收数据?
  
7楼:boysen 2004年3月11日09:15
 在串行中断里关掉串行中断只是为了在中断过程中不在引发新的中断,但是接受照样
  
8楼:kuolongfei 2004年3月10日14:14
 还有,你在中断里调用了子函数,你把该函数所有内容放到中断里再试!?
还有,你在中断里调用了子函数,你把该函数所有内容放到中断里再试!?
  
9楼:guest 2004年3月10日16:13
 这样试一试:
void disp(void) interrupt 1 using 2和void receive(void) interrupt 4 using 4
  
10楼:guest 2004年3月10日17:00
 在51单片机中(非52),如果你使用了串
在51单片机中(非52),如果你使用了串行口,则定时器1就作为它的波特率发生器。很显然,在你的应用中产生了冲突。
  
11楼:guest 2004年3月10日18:04
 void receive(void) i
void receive(void) interrupt 4
{        
  uchar i,j;
  ES=0;
  RI=0;
  if (SBUF!=0XCC)return;//侦头字节
  while(!RI);
  RI=0;
  if (SBUF!=0x55)return;//侦头字节
  while(RI);
  RI=0;
  if SBUF!=0x01)return;//类型
  for (i=0;i  <128;i++)
{
     while(!RI);
     RI=0;
      Buffer[i]=SBUF;//接收128字节数据
  }
ES=1;//重新开中断
}
  
12楼:shliujun 2004年3月10日22:34
 你将串口改为高优先级看看,。
可能是你的定时中断的时间太长了,串口接收不到正确的字节,所以没有办法触发中断。
  
13楼:boysen 2004年3月11日09:16
 谢谢各位大侠的热心
  
14楼:shliujun 2004年3月13日09:01
 调好了没?调好了说一声,让我们也知道是什么原因。

>>>>>>对该主题发表你的看法

本主题贴数14,分页: [第1页]


[上一篇主题]:求Adobe Acrobat软件。

[下一篇主题]:8251芯片可以用于多机通信吗?