标题: 单片机串口中断和定时器中断为什么不能同时使用 [打印本页]

作者: 小小白白1号    时间: 2018-10-13 15:09
标题: 单片机串口中断和定时器中断为什么不能同时使用
单片机源程序如下:
  1. #include <reg51.h>

  2. //typedef unsigned char uint8;
  3. typedef unsigned int  uint16;
  4. //typedef unsigned int u16;          //对数据类型进行声明定义
  5. typedef unsigned char u8;
  6. //unsigned char timer6;

  7. //sbit IRIN=P3^2;
  8. //sbit IN1=P1^0;
  9. //sbit IN2=P1^1;
  10. //sbit ENA=P1^2;
  11. sbit pwm=P2^1;//输出PWM信号
  12. //sbit k1=P3^3;
  13. sbit led=P2^0;

  14.     u8 a,b,c;

  15. void uart_init()
  16. {
  17.   TMOD|=0x20;
  18.   PCON =0x00;
  19.   SCON = 0x50;
  20.   TH1 = 0xFd;  //设置波特率 9600
  21.   TL1 = 0xFd;
  22.   TR1 = 1;     //启动定时器1
  23.   ES = 1;      //开串口中断
  24.   EA = 1;      //开总中断
  25. }

  26. void uart() interrupt 4
  27. {
  28.         if(RI==1)
  29.         RI=0;
  30.         a=SBUF;
  31. }

  32. void InitTimer()
  33. {
  34.         TMOD|=0x01;//开定时器0,1
  35.         TH0=0xff;//定时1.5MS,这时舵机处于0度
  36.         TL0=0xf6;
  37.         EA=1;//开总断
  38.         TR0=1;//开定时器0
  39.         ET0=1;
  40. }
  41. void timer0() interrupt 1//定时器0中断函数
  42. {
  43.         TH0=0xff;//定时1.5MS,这时舵机处于0度
  44.         TL0=0xf6;
  45.                 b++;
  46.             if(b==1) pwm=0;
  47.                 else if(b==2) pwm=1;
  48.                 else if(b==c) b=0;

  49. }

  50. void main()      
  51. {
  52.      InitTimer();
  53.          uart_init();
  54.   //   while(1)
  55.         {
  56.              if(a==0x01)
  57.                 {
  58.                 c=28;
  59.                 led=1;
  60.                 }       //左转 28 2
  61.         else if(a==0x02)
  62.         {
  63.         c=62;         //右转        62 2
  64.         led=0;
  65.         }
  66.         else if(a==0x00) c=51;   //中  51 2
  67.       
  68.         }
  69.   }         

复制代码



作者: sxhwdz    时间: 2018-10-13 20:13
两个中断是不会冲突的,但是while(1)这条语句不能去掉,去掉以后程序没有主循环,就会不断复位
作者: 小小白白1号    时间: 2018-10-14 16:34
sxhwdz 发表于 2018-10-13 20:13
两个中断是不会冲突的,但是while(1)这条语句不能去掉,去掉以后程序没有主循环,就会不断复位

while(1)那里是我后来去掉的,,,加上两个中断也会冲突。后来我在初始化时就把定时器中断关上,用的时候在打开,就可以实现两个同时工作。
作者: yzwzfyz    时间: 2018-10-14 21:04
可以同时用,看你如何正确地处理这两个中断。
作者: 小小白白1号    时间: 2018-10-24 18:40
今天忽然想起这个帖子了。这个问题我自己已经解决了。之所以不能使用串口中断,是因为我的定时器设置太小,已经等于小于机器周期。而定时器中断优先级高于串口中断,所以不能执行串口中断。解决方法1定时器时间改长一点2把串口优先级设高于定时器。
作者: 1987856545    时间: 2018-10-26 20:28
while(1)那里是我后来去掉的,,,加上两个中断也会冲突。后来我在初始化时就把定时器中断关上,用的时候在打开,就可以实现两个
作者: m3c    时间: 2018-10-26 21:12
单片机的每一个时刻他只能做一件事。如果单片机可以同时干多件事那它就不需要中断了
作者: 422582774    时间: 2018-10-26 22:41
参考一波,有帮助。。。。。。
作者: XIERENJIE    时间: 2018-10-27 00:21
定时器的中断优先级高于串口
作者: luohongguan    时间: 2018-10-27 10:57
中断是不可以同时用的。但可以设置优先级,让优先级高的任务先运行。
作者: maoni99999    时间: 2018-12-22 23:15
楼主我遇到跟你差不多的问题,我的是可以不断进入串口中断,定时器0的中断能进第一次后面就进不了了,我该怎么改啊。困扰挺久了
作者: 菜用鸡    时间: 2019-3-9 21:10
maoni99999 发表于 2018-12-22 23:15
楼主我遇到跟你差不多的问题,我的是可以不断进入串口中断,定时器0的中断能进第一次后面就进不了了,我该 ...

我的也是这种情况

作者: 菜用鸡    时间: 2019-3-9 21:11
maoni99999 发表于 2018-12-22 23:15
楼主我遇到跟你差不多的问题,我的是可以不断进入串口中断,定时器0的中断能进第一次后面就进不了了,我该 ...

我觉得可能是我们在串口中断哪里不懂关了什么,导致中断溢出后不复位或者说清零
作者: zhb2004xp    时间: 2019-3-10 00:46
        TH0=0xff;//定时1.5MS,这时舵机处于0度
        TL0=0xf6;
这样的初值设定有问题,使用的定时器0,中断优先级最高,中断触发过于频繁,程序几乎一直都在处理T0中断,其他程序(中断)几乎都无法运行了
作者: 找人PK    时间: 2019-3-10 07:31
应该还是程序的逻辑没理清所致
作者: jiajuntao    时间: 2019-3-10 09:18
可以同时使用,就是要设定好时间和优先级。
作者: 林宏伟    时间: 2019-10-9 10:38
因为要设置优先级
作者: AIYLE520    时间: 2020-5-3 19:20
楼主牛逼,我的问题也解决了

作者: huhuhu123    时间: 2020-6-3 10:03
定时器TR0=1后串口不能运行了,怎么处理啊

作者: 15615615    时间: 2022-1-28 22:29
maoni99999 发表于 2018-12-22 23:15
楼主我遇到跟你差不多的问题,我的是可以不断进入串口中断,定时器0的中断能进第一次后面就进不了了,我该 ...

请问这个问题解决了吗  我也是这样  进入串口后 定时器就不工作了   进入串口前可以

作者: TEC    时间: 2022-1-29 19:13
15615615 发表于 2022-1-28 22:29
请问这个问题解决了吗  我也是这样  进入串口后 定时器就不工作了   进入串口前可以

把代码贴上来看看。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1