微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 我拼起来的一个程序,流水灯中断执行蜂鸣器但是实现不了我要的效果

我拼起来的一个程序,流水灯中断执行蜂鸣器但是实现不了我要的效果

时间:10-02 整理:3721RD 点击:
我想在流水一个周期就进入中段然后蜂鸣器响一次,但是做出来却乱响。以下是我代码;求大神解决
#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;

sbit beep=P1^5;
#define  LED  P2
void delay(u16 c)
{
     while (c--);
}
void int0() interrupt 0
         {
                 u8 h;
                 
                 for (h=0;h<200;h++)
                 {
                  
                  beep=~beep;
                   delay (10);
                 }
   }
         
          void intint0 ()
{
    IT0=1;
          EA=1;
          EX0=1;
  }
       
void liusuiden ()
{
  u8 i=0;
        LED=0xfe;
        delay(5000);
       
       
        while(1)
        {
                        for(i=0;i<7;i++)
                        {
                                LED=_crol_(LED,1);
                               
                                delay(50000);  
                               
                        }
                        intint0 ();
                         for(i=0;i<7;i++)
                        {
                                LED=_cror_(LED,1);
                                delay(50000);
               
                        }
                               
                       
                }
  }
       
        void main()
        {
       
                liusuiden ();
       
   }
       
         
         

外部中断不是这么用的,需要外部触发信号,已舍弃中断。
#include <reg52.h>
#include <intrins.h>
#define  LED  P2
typedef unsigned char u8;
typedef unsigned int u16;
sbit beep=P1^5;
void delay(u16 c)
{
     while (c--);
}
void main()
{       
        u16 i;
        LED=0xfe;
        delay(5000);
        while(1)
        {
                for(i=0;i<7;i++)
                {
                        LED=_crol_(LED,1);       
                        delay(50000);         
                }
                for (i=0;i<400;i++)
                {       
                        beep=~beep;
                        delay (20);
                }       
                for(i=0;i<7;i++)
                {
                        LED=_cror_(LED,1);
                        delay(50000);       
                }
                for (i=0;i<400;i++)
                {       
                        beep=~beep;
                        delay (20);
                }       
        }
}

顶楼上

恩,谢了

恩,谢了

其实很简单,主函数里做你的流水循环,配置一个标志位Flag,一次流水结束了配置Flag为1;
主函数中加一个函数。检测Flag的标志位,为1了就拉响一段时间的蜂鸣器,然后清除Flag。
上面这种方法就是效果可以实现,但是效率会比较低一些。高效的方法就要去掉delay,合理分配任务了,就不细说了~

我其实是想玩一下中断,不过也谢谢你给我其他的思路

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top