为什么边沿触发的外部中断一打开就触发了?
本帖最后由 haohouse 于 2012-5-23 08:16 编辑传统的非门+CX20106A做超声测距,CX20106A第7脚接STC89C52外部中断0,边沿触发方式,为什么每次一打开外部中断就会触发呢?
网上有人说IE0要清零我也做了啊。
电路图按照经典方法接的,就不贴了。
主要程序如下,22.1184M的晶振,T0用于测距计时,T1用于发射40KHZ方波,外部中断用于检测CX20106A的下降沿输出
void main()
{
TL1=234 TH1=234;
TMOD = 0x21; /*设CTC1工作于模式2 */
ET0 = 0; /* 不允许CTC0中断*/
EX0 = 0;
IP=0x01; /*置外部中断INT0优先级为高 */
TCON=0; /*设置外部中断0的中断方式为电平触发*/
IT0 = 1; // 设置为边沿触发
CLflag=1; /* 测量标志 */
cshu=0; /*传数 */
delay(200); /*延时*/
IE=0x80; /* 开中断*/
ET1=1; ET0=1;
TR1=0; TR0=0;
while(1)
{
CLflag=0;
cshu=0;
EX0=0;
TL1=234;
TH1=234;
TL0 = 0;
TH0 = 0; /*定时器0的初始时间 */
VOLCK=0;// 发射端置低电平
TR1=1; /*启动定时器1,发送信号*/
while(cshu<8); // 发射4个周期,占空比50%
TR1=0;
TR0=1; /*启动定时器0,开始记时*/
delay(100);// 等待一段时间再开外部中断0,结果EX0一开就触发了,测到的时间就是这个等待时间,求解啊
IE0 = 0;//标志清零了再开中断,也没用
EX0 = 1;
}
}
void serve_INT0( ) interrupt 0
{
/*外部中断0,用于检测接收信号*/
TR0=0; /*关闭定时器0 */
EX0=0; /* 关中断*/
time=(long)TL0;
time+=(long)TH0*256;
CLflag=1;
TH0=0;
TL0=0;
}
void CTC0_INT () interrupt1
{
TR0=0;
ET0=0;
}
/*CTC1中断服务程序,12.5us 中断一次,用于发射*/
void CTC1_INT () interrupt3
{
VOLCK=~VOLCK;
cshu++;
}
初始化开始前关中断 void main()
{
TL1=234 TH1=234;
TMOD = 0x21; /*设CTC1工作于模式2 */
ET0 = 0; /* 不允许CTC0中断*/
EX0 = 0;
谢谢楼上,可是这已经很靠前了吧
看看脚上的波形啊 没示波器啊悲剧,虚拟示波器行不?接声卡的那种。 最新进展,问题基本解决了,现在可以做一些近距离探测(40CM以内),中间各种改程序和改电路,个人认为主要起作用的2个地方:
1. delay(100)放在开外部中断之后
2. 接收探头正极接的C104不要接地,直接串在正极和CX20106的1脚
但是现在干扰还是很大,而且要T, R 2个探头面对面才比较准,障碍物反射方式干扰很多,测出来的结果很乱,打算调一下CX20106增益看看效果如何。
页:
[1]