永发信息网

单片机超声波c语言求解!

答案:2  悬赏:0  手机版
解决时间 2021-12-01 00:16
  • 提问者网友:佞臣
  • 2021-11-30 13:25
单片机超声波c语言求解!
最佳答案
  • 五星知识达人网友:duile
  • 2021-11-30 13:43
sbit Trig  = P1^0; //产生脉冲引脚
sbit Echo  = P3^2; //回波引脚
    
    while(1)  {       //程序循环
      EA=0;
      Trig=1;  delay_20us();   Trig=0;   //产生一个20us的脉冲,在Trig引脚  
      while(Echo==0); //等待Echo回波引脚变高电平!当Echo的值为0的时候,程序停在这里,不再向下执行。

(这里改成while(!Echo);可以吗?
while(Echo==0);和while(!Echo);有什么区别?)
--可以。
--两者,没有区别。

      succeed_flag=0; //清测量成功标志
      EX0=1;          //打开外部中断 
(这里进入开外部中断不是马上把定时器1的数值取出了吗?定时器还没有打开数值不是零吗?)
--是有些早。
--不过,也不要紧。因为,EA,还没有打开。

TH1=0;          //定时器1清零
      TL1=0;          //定时器1清零
      TF1=0;          //计数溢出标志    
(这里为什么要清零,每次循环定时器1不是清零了吗?)
--是的,这句,多余了。
……追问外部中断打开后,马上打开定时器了,这里还要while(TH1 < 30);//等待测量的结果。数据在等待测量已经读走了。但是为什么还可以读取完整的数据?我用逻辑分析仪测量发现外部中断从高电平进入中断低电平退出中断读走数据。追答外部中断打开后,马上打开定时器了,

--不是马上打开定时器。
--是设定初值(零)后,再打开的。

………
………
EX0 = 1; //打开外部中断
(这里进入开外部中断不是马上把定时器1的数值取出了吗?

--马上?
--怎么会?
--回波,能马上就回来吗?

……
……

定时器还没有打开数值不是零吗?)

--执行下面两句,才是零。
TH1 = 0; //定时器1清零
TL1 = 0; //定时器1清零
TF1 = 0; //计数溢出标志(多余了)
TR1 = 1; //启动定时器1

EA = 1;--这时,才允许回波读取T1的数据

while(TH1 < 30); //等待测量的结果

--回波,要是总也不回来,也不能老等,
--超过 30,就往下执行:

TR1 = 0; //关闭定时器1
EX0 = 0; //关闭外部中断

……
……
全部回答
  • 1楼网友:走死在岁月里
  • 2021-11-30 14:27
注释都有了,你还要解什么追问我不明白的这些
while(Echo==0);和while(!Echo);有什么区别?
TF1=0; //计数溢出标志 (这里为什么要清零,每次循环定时器1不是清零了吗?)
EX0=1; //打开外部中断 (开外部中断在定时器启动前测量的结果还没有完整,马上把定时器1的数值读出不是零吗? )
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯