本帖最后由 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 ( ) interrupt 1
{
TR0=0;
ET0=0;
}
/* CTC1中断服务程序,12.5us 中断一次,用于发射 */
void CTC1_INT ( ) interrupt 3
{
VOLCK=~VOLCK;
cshu++;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>