刚学单片机,主要实现这样的功能,
给一个下降沿,输出一系列脉冲。在硬件上,这个下降沿由红外传感器给出。
现在存在的问题是,一通电,单片机立刻就输出一个脉冲。
之后在运行时大部分时间是正常的,但是偶尔会出现只给一个下降沿却输出两个脉冲的情况
请问各位这是怎么回事?
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;
}
试试别用下降沿中断
改用定时器中断,由软件/状态鸡的办法判别下降沿(带消抖处理),这两个问题估计都能解决。
回复 板凳 仙猫 的帖子
请问什么叫由软件/状态鸡的办法判别下降沿?
我感觉,仙猫的意思好像是
不用外部触发中断的方式
用定时器定时,每隔一段时间中断一次,
进入中断后检测端口是否为低电平
如果是,再等一等(消抖),
然后再判断端口,如果还是保持低电平,
那就真的是低电平了
这是就可以响应了
这是我的理解哈
Re: [求助] 各位高手帮帮我吧。。
原来是这么回事!谢谢。
Re: [求助] 各位高手帮帮我吧。。
再问一下,这个判断是不是低电平的频率一般设为多少比较合适?我用的是51。
5楼兔兔说滴对
用外部信号的跃变沿触发中断,要求信号十分干净,否则有抖动就不好办。
用定时器中断方法做,定时长度要根据信号的性质,或者说系统设计的输入响应要求来定。
举个按键输入的例子,一般采用10ms消抖,即:检测出按键之后先不做判断,等10ms之后再看,如仍检出则承认这次按键。
事实上用软件做还能做得再地道些,比如设置1ms定时中断,连续8次读到的键值一样时才承认这个结果,否则认为是抖动丢掉。
另外做嵌入式软件的有条铁则是:中断处理要尽可能短,不能耽搁时间,不宜在中断服务程序里加延迟——所以就需要状态机的概念了。