[讨论] 各位高手帮帮我吧。。

kiko_seu   2009-4-18 21:36 楼主
刚学单片机,主要实现这样的功能,
给一个下降沿,输出一系列脉冲。在硬件上,这个下降沿由红外传感器给出。
现在存在的问题是,一通电,单片机立刻就输出一个脉冲。
之后在运行时大部分时间是正常的,但是偶尔会出现只给一个下降沿却输出两个脉冲的情况
请问各位这是怎么回事?

回复评论 (8)

Re: [求助] 各位高手帮帮我吧。。

另外,这是程序
#include
#include
sbit SDA=P1^0;
sbit SDB=P1^1;   
int TurnFlag=1;              //标志位
void delay(int cnt)                //延时函数
{
        int i,j;
        for(i=0;i         {
        j=20;
        while (j--) ;
        }       
       
}
void f()                                                  //输出TTL波形          (时间较短)
{
int flag=200;  //控制输出波形的周期数
while(flag--){
SDA=~SDA;
delay(11);
}
}  
void f1()                                                        //输出TTL波形         (时间较长)
{
int flag1=600;  //控制输出波形的周期数
while(flag1--){
SDA=~SDA;
delay(11);
}
}



void main()
{        
EA=1;                                      //寄存器初始化  开总中断                                  // 设定触发方式 为边沿触发
EX0=1;                                          //开0中断
SDA=0;
IT0=1;                                         //输出初始化                                                                                                                                                                    
SDB=1;        
while(1);
}
void int0_int(void) interrupt 0
{
        EX0=0;                                  
        TurnFlag--;           //TurnFlag初始化为0    每次进入中断先+1
           if(TurnFlag!=0)
    {
     f();       
         delay(2200);                                                                                                                                                                                                                                                                                                                  
     }         // TurnFlag为1 2 3 时 调用函数f
        else
        {
        SDB=0;
        f1();
        TurnFlag=4;
        delay(6600);
        }          //  TurnFlag为4时调用函数f1  并将TurnFlag置零
    SDB=1;
        EX0=1;
}
点赞  2009-4-18 21:37

试试别用下降沿中断

改用定时器中断,由软件/状态鸡的办法判别下降沿(带消抖处理),这两个问题估计都能解决。
点赞  2009-4-18 23:05

回复 板凳 仙猫 的帖子

请问什么叫由软件/状态鸡的办法判别下降沿?
点赞  2009-4-19 14:03

我感觉,仙猫的意思好像是

不用外部触发中断的方式
用定时器定时,每隔一段时间中断一次,
进入中断后检测端口是否为低电平
如果是,再等一等(消抖),
然后再判断端口,如果还是保持低电平,
那就真的是低电平了
这是就可以响应了

这是我的理解哈
点赞  2009-4-19 16:36

Re: [求助] 各位高手帮帮我吧。。

原来是这么回事!谢谢。
点赞  2009-4-19 17:23

Re: [求助] 各位高手帮帮我吧。。

再问一下,这个判断是不是低电平的频率一般设为多少比较合适?我用的是51。
点赞  2009-4-19 17:30

5楼兔兔说滴对

用外部信号的跃变沿触发中断,要求信号十分干净,否则有抖动就不好办。
用定时器中断方法做,定时长度要根据信号的性质,或者说系统设计的输入响应要求来定。
举个按键输入的例子,一般采用10ms消抖,即:检测出按键之后先不做判断,等10ms之后再看,如仍检出则承认这次按键。
事实上用软件做还能做得再地道些,比如设置1ms定时中断,连续8次读到的键值一样时才承认这个结果,否则认为是抖动丢掉。

另外做嵌入式软件的有条铁则是:中断处理要尽可能短,不能耽搁时间,不宜在中断服务程序里加延迟——所以就需要状态机的概念了。
点赞  2009-4-19 18:44
引用: 原帖由 仙猫 于 2009-4-19 18:44 发表
另外做嵌入式软件的有条铁则是:中断处理要尽可能短,不能耽搁时间,不宜在中断服务程序里加延迟——所以就需要状态机的概念了


恩,那就是在中断中置标志位
中断外判断,然后处理
这块儿感觉自己做得也不太好
谢谢
点赞  2009-4-20 09:31
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复