asd4498 发表于 2012-12-5 10:48:09

新手关于中断的一个问题

大家好,最近在学习中断,下边这个程序是用于控制继电器在一定时间内闭合和断开的。

理想中实现的过程是:P3.0高电平继电器开始反复开合→中断暂停→P3.0高电平继续开始→中断暂停 这样反复循环。

但是实际情况是:P3.0高电平继电器开始反复开合→中断暂停→P3.0高电平继续开始→中断不再暂停

代码如下,还请高手麻烦看一下,代码很挫,也希望予以指正,谢谢

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

sbit dong=P3^0;      


uchar steptime=700;
uint flag=0;

void delaynms(uchar z)                //nms延时
{
        uchar x,y;
        for(x=z;x>0;x--)
        {
                   for(y=0;y<115;y++);           //1ms基准延时
        }
}


void main(void)
{
    EX0=1;
    EA=1;
    while(1)
        {                                    
      if(dong==0 | flag==1)
          {
                  if(dong==0)
                        {
                       flag=0;
                 while(1)
                 {
                   P1=0xFF;
                   delaynms(steptime);
                   delaynms(steptime);
                   delaynms(steptime);
                         delaynms(steptime);
                         delaynms(steptime);
                         delaynms(steptime);
                         delaynms(steptime);
                         delaynms(steptime);
                         P1=0x00;
                         delaynms(steptime);
                         delaynms(steptime);
                         delaynms(steptime);
                         delaynms(steptime);
                         delaynms(steptime);
                         delaynms(steptime);
                         delaynms(steptime);
                         delaynms(steptime);
                }
                        }
          }

        }

}


void start() interrupt 0
{
    flag++;
}

xiaoyigechaos 发表于 2012-12-5 12:41:36

while(1)
               {
                     P1=0xFF;
                     delaynms(steptime);
                     delaynms(steptime);
                     delaynms(steptime);
                         delaynms(steptime);
                         delaynms(steptime);
                         delaynms(steptime);
                         delaynms(steptime);
                         delaynms(steptime);
                         P1=0x00;
                         delaynms(steptime);
                         delaynms(steptime);
                         delaynms(steptime);
                         delaynms(steptime);
                         delaynms(steptime);
                         delaynms(steptime);
                         delaynms(steptime);
                         delaynms(steptime);
                  }
程序在这   flag干啥呢

asd4498 发表于 2012-12-5 13:46:02

xiaoyigechaos 发表于 2012-12-5 12:41 static/image/common/back.gif
while(1)
               {
                     P1=0xFF;


flag是用来计数的,在中断和第一个while下,设想的是flag==1的时候,继电器运作,flag==0的时候继电器不运作。

asd4498 发表于 2012-12-5 13:48:28

目前的解决方案是回避了这样的一个算法,在中断函数下修改成软复位,添加代码如下:

unsigned char code rst[]={0xe4,0xc0,0xe0,0xc0,0xe0,0x32};// 复位代码

   (*((void (*)())(rst)))();// 执行上一行代码,将rst数组当函数调用

功能是实现了,然而还是对之前的中断问题耿耿于怀……

xiaoyigechaos 发表于 2012-12-5 22:37:56

你的死循环里面没有判断flag   还是另有玄机

asd4498 发表于 2012-12-6 11:08:56

xiaoyigechaos 发表于 2012-12-5 22:37 static/image/common/back.gif
你的死循环里面没有判断flag   还是另有玄机

死循环之前判断flag是不起效果么?回头我试试把flag放进里边好了,在低电平的情况下,可能要重置标志位,或者把中断请求信号引脚强制改变成高电平。看来之前的单片机学习的知识都是水过鸭背,实战才能牢记啊。

xiaoyigechaos 发表于 2012-12-6 12:07:52

flag是改变了但是主程序里不知道改变了因为判断flag那段只执行了一次
页: [1]
查看完整版本: 新手关于中断的一个问题