找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 17874|回复: 20
收起左侧

单片机串口中断和定时器中断为什么不能同时使用

  [复制链接]
ID:403398 发表于 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.   }         

复制代码


回复

使用道具 举报

ID:387733 发表于 2018-10-13 20:13 | 显示全部楼层
两个中断是不会冲突的,但是while(1)这条语句不能去掉,去掉以后程序没有主循环,就会不断复位

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:403398 发表于 2018-10-14 16:34 | 显示全部楼层
sxhwdz 发表于 2018-10-13 20:13
两个中断是不会冲突的,但是while(1)这条语句不能去掉,去掉以后程序没有主循环,就会不断复位

while(1)那里是我后来去掉的,,,加上两个中断也会冲突。后来我在初始化时就把定时器中断关上,用的时候在打开,就可以实现两个同时工作。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:123289 发表于 2018-10-14 21:04 | 显示全部楼层
可以同时用,看你如何正确地处理这两个中断。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:403398 发表于 2018-10-24 18:40 | 显示全部楼层
今天忽然想起这个帖子了。这个问题我自己已经解决了。之所以不能使用串口中断,是因为我的定时器设置太小,已经等于小于机器周期。而定时器中断优先级高于串口中断,所以不能执行串口中断。解决方法1定时器时间改长一点2把串口优先级设高于定时器。

评分

参与人数 1黑币 +5 收起 理由
yousunny + 5 赞一个!

查看全部评分

回复

使用道具 举报

ID:275910 发表于 2018-10-26 20:28 | 显示全部楼层
while(1)那里是我后来去掉的,,,加上两个中断也会冲突。后来我在初始化时就把定时器中断关上,用的时候在打开,就可以实现两个
回复

使用道具 举报

ID:416027 发表于 2018-10-26 21:12 | 显示全部楼层
单片机的每一个时刻他只能做一件事。如果单片机可以同时干多件事那它就不需要中断了
回复

使用道具 举报

ID:92867 发表于 2018-10-26 22:41 | 显示全部楼层
参考一波,有帮助。。。。。。
回复

使用道具 举报

ID:416062 发表于 2018-10-27 00:21 | 显示全部楼层
定时器的中断优先级高于串口
回复

使用道具 举报

ID:244512 发表于 2018-10-27 10:57 | 显示全部楼层
中断是不可以同时用的。但可以设置优先级,让优先级高的任务先运行。
回复

使用道具 举报

ID:407305 发表于 2018-12-22 23:15 | 显示全部楼层
楼主我遇到跟你差不多的问题,我的是可以不断进入串口中断,定时器0的中断能进第一次后面就进不了了,我该怎么改啊。困扰挺久了
回复

使用道具 举报

ID:478236 发表于 2019-3-9 21:10 | 显示全部楼层
maoni99999 发表于 2018-12-22 23:15
楼主我遇到跟你差不多的问题,我的是可以不断进入串口中断,定时器0的中断能进第一次后面就进不了了,我该 ...

我的也是这种情况
回复

使用道具 举报

ID:478236 发表于 2019-3-9 21:11 | 显示全部楼层
maoni99999 发表于 2018-12-22 23:15
楼主我遇到跟你差不多的问题,我的是可以不断进入串口中断,定时器0的中断能进第一次后面就进不了了,我该 ...

我觉得可能是我们在串口中断哪里不懂关了什么,导致中断溢出后不复位或者说清零
回复

使用道具 举报

ID:234075 发表于 2019-3-10 00:46 | 显示全部楼层
        TH0=0xff;//定时1.5MS,这时舵机处于0度
        TL0=0xf6;
这样的初值设定有问题,使用的定时器0,中断优先级最高,中断触发过于频繁,程序几乎一直都在处理T0中断,其他程序(中断)几乎都无法运行了
回复

使用道具 举报

ID:471889 发表于 2019-3-10 07:31 | 显示全部楼层
应该还是程序的逻辑没理清所致

评分

参与人数 3黑币 +40 收起 理由
正规007 + 10 很给力!
刀刀见红 + 14
shuisheng60 + 16 很给力!

查看全部评分

回复

使用道具 举报

ID:104472 发表于 2019-3-10 09:18 | 显示全部楼层
可以同时使用,就是要设定好时间和优先级。
回复

使用道具 举报

ID:610753 发表于 2019-10-9 10:38 | 显示全部楼层
因为要设置优先级
回复

使用道具 举报

ID:308301 发表于 2020-5-3 19:20 | 显示全部楼层
楼主牛逼,我的问题也解决了
回复

使用道具 举报

ID:582723 发表于 2020-6-3 10:03 | 显示全部楼层
定时器TR0=1后串口不能运行了,怎么处理啊
回复

使用道具 举报

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

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

使用道具 举报

ID:625730 发表于 2022-1-29 19:13 | 显示全部楼层
15615615 发表于 2022-1-28 22:29
请问这个问题解决了吗  我也是这样  进入串口后 定时器就不工作了   进入串口前可以

把代码贴上来看看。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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