找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1242|回复: 11
打印 上一主题 下一主题
收起左侧

51单片机定时器中断和外部中断同时使用为什么一定要设置优先级

[复制链接]
跳转到指定楼层
楼主
ID:1091094 发表于 2023-9-11 08:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在使用普中51单片机开发板,设置了定时器10us执行一次PWM,还有外部中断0的程序,不设置外部中断为高优先级的时候,
程序是按键没有反应的。 加上优先级就可以了按键控制三个挡位了,为什么?
不应该是即使没有优先级也可以执行外部中断的吗?

14、按键换挡模仿产品控制板.rar

32.03 KB, 下载次数: 7

程序文件

普中-2&普中-3&普中-4开发板原理图.pdf

151.73 KB, 下载次数: 3

原理图

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:404160 发表于 2023-9-11 21:22 | 只看该作者
由于处理中断的运算器只有一个,同一时间只能运行一段程序,当中断同时到达时,你说先处理(运算)哪个中断程序?所有需要优先级。由于你PWM中断“太快”,抢占了按键中断需求,所以,一直来不及响应按键

评分

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

查看全部评分

回复

使用道具 举报

板凳
ID:213173 发表于 2023-9-12 11:48 | 只看该作者
你这不是中断优先级的问题,是程序结构的问题,给你改了,你试试。
  1. #include <reg52.h>

  2. #define u8 unsigned char
  3. #define u16 unsigned int

  4. sbit PWM  = P2^1;
  5. sbit KEY4 = P3^3;
  6. sbit led1 = P2^5;
  7. sbit led2 = P2^6;
  8. sbit led3 = P2^7;


  9. u8 mode = 0;
  10. u8 gduty;

  11. void InitTimer0(void)
  12. {
  13.         TMOD = 0x01;
  14.         TH0 = 0xFC;
  15.         TL0 = 0x18;
  16.         EA = 1;
  17.         ET0 = 1;
  18.         TR0 = 1;
  19. }

  20. void Delay_ms(u16 t)
  21. {
  22.         u16 i,j;
  23.         for(i=t;i>0;i--)
  24.                 for(j=110;j>0;j--);
  25. }


  26. void main()
  27. {
  28.         InitTimer0();
  29.         while(1)
  30.         {       
  31.                 if(!KEY4)
  32.                 {
  33.                         Delay_ms(10);
  34.                         if(!KEY4)
  35.                         {
  36.                                 mode = ++mode%4;
  37.                                 switch(mode)
  38.                                 {
  39.                                         case 0: led1=1;led2=1;led3=1;gduty=0;break;//占空比%100
  40.                                         case 1: led1=0;led2=0;led3=0;gduty=2;break;//占空比%50
  41.                                         case 2: led1=0;led2=0;led3=1;gduty=3;break;//占空比%25
  42.                                         case 3: led1=0;led2=1;led3=1;gduty=4;break;//占空比%0
  43.                                 }
  44.                                 while(!KEY4);
  45.                         }
  46.                 }
  47.         }
  48. }

  49. void Timer0Interrupt(void) interrupt 1
  50. {
  51.         static u8 time = 0;
  52.         TH0 = 0xFC;
  53.         TL0 = 0x18;
  54.         time++;
  55.         if(time >= 4)
  56.                 time = 0;
  57.         if(time >= gduty)  //占空比
  58.                 PWM = 0;
  59.         else
  60.                 PWM = 1;
  61. }       
复制代码
回复

使用道具 举报

地板
ID:1034262 发表于 2023-9-12 15:18 | 只看该作者
合理安排中断程序,一般不需要用优先级(更没听说一定要设置优先级),有些项目程序用了10来个中断,没那么多中断优先级。
回复

使用道具 举报

5#
ID:1091094 发表于 2023-9-14 22:15 | 只看该作者
飞云居士 发表于 2023-9-11 21:22
由于处理中断的运算器只有一个,同一时间只能运行一段程序,当中断同时到达时,你说先处理(运算)哪个中断 ...

但是不应该是有中断申请,应该执行完正在执行的中断程序后,再回过来执行外部中断吗?
我试过了,确实PWM太快了,把定时器中断的时间调长一点就可以了
回复

使用道具 举报

6#
ID:1091094 发表于 2023-9-14 22:24 | 只看该作者
wulin 发表于 2023-9-12 11:48
你这不是中断优先级的问题,是程序结构的问题,给你改了,你试试。

你这个是没有用外部中断了,直接while(1)循环里面,检测按键。
我是想看看用外部中断和定时器中断来实现会不会有什么问题。
确实是定时器中断不能太快,要不然外部中断就没反应了,但是不知道具体原因。
回复

使用道具 举报

7#
ID:647261 发表于 2023-9-15 09:04 | 只看该作者
3038838599 发表于 2023-9-14 22:24
你这个是没有用外部中断了,直接while(1)循环里面,检测按键。
我是想看看用外部中断和定时器中断来实现 ...

我记得好像回过这个贴子,详细说明了原因,但是不知道是不是给论坛吃掉了贴了。。。。。。
回复

使用道具 举报

8#
ID:647261 发表于 2023-9-15 09:06 | 只看该作者
3038838599 发表于 2023-9-14 22:24
你这个是没有用外部中断了,直接while(1)循环里面,检测按键。
我是想看看用外部中断和定时器中断来实现 ...

查看了回帖记录,原来是你发了两个一样的帖子,我把内容复制过来了


51单片机的中断规则:
不设置优先级时,中断源都是一个优先级,规则如下:
1.哪个中断先到,就先执行哪个中断。
2.中断执行过程中,不能被其他中断打断。
3.多个中断同时到来时,按查询号顺序执行。
查询号顺序:外部中断0(P3.2脚)-> 定时器 0 -> 外部中断1(P3.3脚) -> 定时器 1 -> 串口

假如按键是P3.2脚,定时器10us
要实现按键功能,就必须在10us的间隙中,完成按键下降沿的触发动作,才能进入外部中断
假如按键是P3.3脚,定时器是T0的话,难度就更大了,这个触发动作还不能刚好和10us时间同时产生

当设置了优先级后,中断就分成了高优先级和低优先级两种了,这时,规则多了一样:
低优先级的中断执行过程中,高优先级中断产生,可以打断低优先级中断,实现中断嵌套。
回复

使用道具 举报

9#
ID:1092335 发表于 2023-9-20 16:56 | 只看该作者
因为CPU只能同时处理一个中断
回复

使用道具 举报

10#
ID:811253 发表于 2023-9-21 23:28 | 只看该作者
外部中断0应该是默认优先级最高的吧
回复

使用道具 举报

11#
ID:647261 发表于 2023-9-22 09:11 | 只看该作者
青草麦田 发表于 2023-9-21 23:28
外部中断0应该是默认优先级最高的吧

不是的,默认是同一优先级,只是查询顺序最高
意思是,几个中断在同一时间触发,外部中断0先进中断
如果其他中断刚好比外部中断快那么一丁点,外部中断0就只能等其他中断完成后,再看中断触发还在不在,不在的话也是不能进的
回复

使用道具 举报

12#
ID:1097455 发表于 2023-10-27 13:48 | 只看该作者
程序里肯定有进程很高的程序模块是不能让其它外设影响的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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