打印

想问一下 为什么if会无视掉条件?

[复制链接]
3583|41
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
feng199510|  楼主 | 2016-5-18 20:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的程序是这个样子的
         if (succeed_flag==1)
         {        i=outcomeH*256+outcomeL;
                distance=(int)((i*0.034)/2);
         }
                else
                {
                distance=0;
                }
         if(distance<15)
        {
     RUN=0;
         BEEP=1;
        }
          }

相关帖子

沙发
feng199510|  楼主 | 2016-5-18 20:10 | 只看该作者
他直接无视掉(distance<15
直接往下执行了
怎么回事?

使用特权

评论回复
板凳
changle11sdo5| | 2016-5-18 21:24 | 只看该作者
i=?

使用特权

评论回复
地板
feng199510|  楼主 | 2016-5-18 21:28 | 只看该作者

i是暂时将tho thl放在里面的一个函数

使用特权

评论回复
5
ss掷弹专业| | 2016-5-18 21:39 | 只看该作者
能不能看到反汇编呢

使用特权

评论回复
6
lnulibin| | 2016-5-18 22:04 | 只看该作者
显然,最后一个花括号没有配对。

使用特权

评论回复
7
wsnsyy| | 2016-5-18 22:15 | 只看该作者
请对齐

使用特权

评论回复
8
feng199510|  楼主 | 2016-5-18 22:20 | 只看该作者
#include "reg52.h"
#include "Delay.h"
#define uchar unsigned char
#define uint  unsigned int
sbit BEEP=P2^6;          //蜂鸣器
sbit RUN=P2^5;          //直流电机
sbit Trig=P1^5;  //555使能端
sbit Echo=P1^6;  //接受端
void startset(void);
unsigned char outcomeH,outcomeL,i;
bit succeed_flag;

void main (void)
{         uint distance;
        startset(); //初始化

        while(1)
        {         EA=0;
                Trig=1;
                Delayus(20);
                Trig=0;
                while(Echo==0)
                succeed_flag=0;
                EX0=1;                   //打开外部中断
                TH0=0;                   //定时器0清零
                TL0=0;                   //定时器0清零
                TR0=1;                   //启动定时器0
                TF0=0;         
                EA=1;
               
               
         if (succeed_flag==1)
         {        i=outcomeH*256+outcomeL;
                distance=(int)((i*0.034)/2);
         }
                else
                {
                distance=0;
                }
         if(distance<15)
        {
     RUN=0;
         BEEP=1;
        }
          }



}

void startset(void)
{        TMOD=0x01;   //方式1
        TR0=1;                 //启动定时器0
        TH0=0;
        TL0=0;
        BEEP=0;                 //关蜂鸣器
        RUN=1;                 //开电机
        EA=1;                 //开启外部总中断
}



//外部中断0,用做判断回波电平         
INTO_() interrupt  0 //外部中断是0号
{
                outcomeL=TL0;//取出定时器的值
                outcomeH=TH0;
                succeed_flag=1;//至成功测量的标志
                EX0=0;//关闭外部中断          
}

  
timer0() interrupt 1 // 定时器0中断是1号     
{
        TH0=0;
        TL0=0;
}

使用特权

评论回复
9
feng199510|  楼主 | 2016-5-18 22:21 | 只看该作者
lnulibin 发表于 2016-5-18 22:04
显然,最后一个花括号没有配对。

那个只是部分的 完整的我发了 可以帮我看下哪里出错了吗

使用特权

评论回复
10
feng199510|  楼主 | 2016-5-18 22:21 | 只看该作者

那个只是部分的 已经发了完整的
可以帮我看下哪里出错了吗

使用特权

评论回复
11
feng199510|  楼主 | 2016-5-18 22:22 | 只看该作者
ss掷弹专业 发表于 2016-5-18 21:39
能不能看到反汇编呢

..不会汇编 只有刚入门的c语言水平
完整版发上去了 不知道哪里出错了

使用特权

评论回复
12
bingg| | 2016-5-19 08:40 | 只看该作者
楼上正解

使用特权

评论回复
13
Ω囿圉Ω| | 2016-5-19 09:00 | 只看该作者
肯定是值太小了,条件成立。把值打印出来就明白了。

使用特权

评论回复
14
whtwhtw| | 2016-5-19 09:53 | 只看该作者
<10,<1,<0.0001多试几个数就知道大概distance在哪个范围,肯定不是无视掉了

使用特权

评论回复
15
oayzw| | 2016-5-19 12:17 | 只看该作者
编译器比你的程序可靠性高一万倍不止,先查你的程序吧

使用特权

评论回复
16
feng199510|  楼主 | 2016-5-19 13:14 | 只看该作者
hgjinwei 发表于 2016-5-19 08:22
MAX(distance) = 255 * 0.034 / 2 = 4
if(distance < 15) 恒成立。

那应该怎么写? th0 tl0的值怎么转换出来= =
我在网上都找不出来
我是用来测量超声波距离的
大神求解!

使用特权

评论回复
17
feng199510|  楼主 | 2016-5-19 13:15 | 只看该作者

但是我想让他距离小于15cm的时候就报警
这该怎么做?

使用特权

评论回复
18
ningling_21| | 2016-5-19 13:32 | 只看该作者
feng199510 发表于 2016-5-19 13:15
但是我想让他距离小于15cm的时候就报警
这该怎么做?

i 是个 uchar  型,你让它存16位的数,不出错才怪

解决办法: uint  i;

使用特权

评论回复
19
ticomi| | 2016-5-19 13:35 | 只看该作者
oayzw 发表于 2016-5-19 12:17
编译器比你的程序可靠性高一万倍不止,先查你的程序吧

确实,出问题最先查找的就是程序问题,不要怀疑编译器。不是编译器不会出问题,而是一般让编译出的问题都是程序造成的。请先考虑自己的程序。

使用特权

评论回复
20
candysnape| | 2016-5-19 13:38 | 只看该作者

i是无符号数,最大=255
(i*0.034)/2 最大=4
所以if条件永远成立

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

41

帖子

0

粉丝