3570|8

10

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

各位高手帮帮我吧。。 [复制链接]

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

最新回复

恩,那就是在中断中置标志位 中断外判断,然后处理 这块儿感觉自己做得也不太好 谢谢  详情 回复 发表于 2009-4-20 09:31
点赞 关注
 

回复
举报

10

帖子

0

TA的资源

一粒金砂(高级)

沙发
 

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;
}
此帖出自单片机论坛
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

板凳
 

试试别用下降沿中断

改用定时器中断,由软件/状态鸡的办法判别下降沿(带消抖处理),这两个问题估计都能解决。
此帖出自单片机论坛

赞赏

1

查看全部赞赏

 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(高级)

4
 

回复 板凳 仙猫 的帖子

请问什么叫由软件/状态鸡的办法判别下降沿?
此帖出自单片机论坛
 
 
 

回复

97

帖子

0

TA的资源

五彩晶圆(初级)

5
 

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

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

这是我的理解哈
此帖出自单片机论坛

赞赏

1

查看全部赞赏

 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(高级)

6
 

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

原来是这么回事!谢谢。
此帖出自单片机论坛
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(高级)

7
 

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

再问一下,这个判断是不是低电平的频率一般设为多少比较合适?我用的是51。
此帖出自单片机论坛
 
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

8
 

5楼兔兔说滴对

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

另外做嵌入式软件的有条铁则是:中断处理要尽可能短,不能耽搁时间,不宜在中断服务程序里加延迟——所以就需要状态机的概念了。
此帖出自单片机论坛
 
 
 

回复

97

帖子

0

TA的资源

五彩晶圆(初级)

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


恩,那就是在中断中置标志位
中断外判断,然后处理
这块儿感觉自己做得也不太好
谢谢
此帖出自单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表