打印
[51单片机]

实时性的探讨-------基于51单片机的外部中断

[复制链接]
766|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
无超~吞立吉|  楼主 | 2017-3-24 15:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在进入实验2时,要求如下:
(1)开机后控制四个发光管循环点亮,规律如下图所示:
O X X X
X O X X
X X O X
X X X O   
循环运行,间隔一秒变化一次,显示出闪烁效果。
当有中断信号(INT0)出现时(用手按一下负脉冲发生器的按键),停止闪烁,四个发光管的状态分别受四个开关的控制,对应的开关推上去时发光管亮,对应的开关推下来时发光管灭。
(2)使得上述两种工作状态在每按一次按中断键后发生一次变化。
程序设想:封装函数1实现四个发光二极管循环点亮,封装函数2实现四个开关控制四个发光二极管。在中断中设置标志位flag,在主函数中判断flag的状态,若为1,则进入函数1,若为0则进入函数2。
实际效果:实时性差,每次触发中断的时候不能立即的在函数1与函数2之间切换。
原因:进入中断前,主函数while(1)大循环中正在执行函数1或函数2,在中断服务函数中只是进行flag标志位的翻转,然后又接着返回主函数继续执行函数1或函数2,使得从外界看来不能立即进行功能的翻转,表现为宏观上的实时性差
如何修改程序,可以在中断的每次触发立即进行功能上的翻转?

相关帖子

沙发
无超~吞立吉|  楼主 | 2017-3-24 15:09 | 只看该作者
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar temp,count;
bit flag=1;
sbit LED0=P1^0;
sbit LED1=P1^1;
sbit LED2=P1^2;
sbit LED3=P1^3;

sbit KEY0=P1^4;
sbit KEY1=P1^5;
sbit KEY2=P1^6;
sbit KEY3=P1^7;
void Delay(unsigned int z)
{
        unsigned int x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}

void main()
{
  EA=1;
  EX0=1;
  IT0=1;
  P1=0xff;
  temp=0xfe;
  while(1)
  {
    if(flag)
    {
      for(count = 0;count < 4;count ++ )
      {
        P1=temp;
        Delay(300);
        P1=0xff;
        Delay(300);
        temp=_crol_(temp,1);
        if(count==3)
        {
          temp = 0xfe;
        }
      }
    }
    else
    {
         if(KEY0 == 0)
        {
          Delay(5);
          if(KEY0 == 0)
          LED0=0;
          while(!KEY0);
          LED0=1;
        }
        if(KEY1 == 0)
        {
          Delay(5);
          if(KEY1 == 0)
          LED1=0;
          while(!KEY1);
          LED1=1;
        }
        if(KEY2 == 0)
        {
          Delay(5);
          if(KEY2 == 0)
          LED2=0;
          while(!KEY2);
          LED2=1;
        }
        if(KEY3 == 0)
        {
          Delay(5);
          if(KEY3 == 0)
          LED3=0;
          while(!KEY3);
          LED3=1;
        }
     }
  }
}

void int0() interrupt 0
{
  EX0=0;
  flag=~flag;
  EX0=1;
}

使用特权

评论回复
板凳
NE5532| | 2017-3-24 15:56 | 只看该作者
停止闪烁和每个灯受1个开关独立控制,这两句话矛盾么?

使用特权

评论回复
地板
lnulibin| | 2017-3-25 17:37 | 只看该作者
提高实时性,要避免在程序中的某一处死等.像你的程序中的DELAY(300)这样的语句,尽量不要用.
因为在执行这个函数的过程中,MCU不再进行其它任务的处理了.
实时性自然很差.
试试设置一个TICKS变量吧.
通过查询它的大小来实现延时,避免死等.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

14

帖子

0

粉丝