打印

主函数中if语句无法实现

[复制链接]
3255|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bingshuixichen|  楼主 | 2013-8-21 15:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大侠帮忙看看,为什么if语句无法实现呢?OUT22=1;         OUT32=1;         在延时后不能实现一直是高电平呢?void dis_dianya()
{

float res0;
uchar d0,d1,d2,d3,d4,d5,d6;
int a;
ADC_Init(ADC_PORT0);
res0=GetADCResult(ADC_CH0)*51;         
a=(int)res0        ;
d0='U';
d1='=';
d2=a/100;    //电压百位
d3=a%100/10;  //电压十位
d4=a%100%10; //电压个位
d5='.';
d6='V';

write_cmd(0x90);
  write_dat('U');   
write_dat('=');
write_dat(d2+0x30); //电压百位
write_dat(d3+0x30); //电压十位
write_dat(d4+0x30); //电压个位
write_dat('V');
delay_1ms(100);


  if((a>20))
  {   
         if((a<34)||(a>66))
                 {
                   delay_1ms(10000);   //延时5S
                  if((a<34)||(a>66))
                   {
                           OUT33=1;           //关闭进气阀
                           OUT22=0;           //打开排气阀
                           OUT32=0;           //蜂鸣器报警
                           delay_1ms(5000);         //延时5秒
                           OUT22=1;           //关闭出气阀
                           OUT32=1;           //蜂鸣器关闭
                   }
                 }
  }
}

main()
{       
lcd_init();

OUT22=1;          
  
OUT32=1;          


        while(1)
   {
   dis_dianya();
        }

  }
                          

相关帖子

沙发
ayb_ice| | 2013-8-21 15:42 | 只看该作者
        if((a<34)||(a>66))
                 {
                   delay_1ms(10000);   //延时5S
                  if((a<34)||(a>66))
                   {
这逻辑有点问题

使用特权

评论回复
板凳
bingshuixichen|  楼主 | 2013-8-21 15:55 | 只看该作者
ayb_ice 发表于 2013-8-21 15:42
if((a66))
                 {
                   delay_1ms(10000);   //延时5S

我的意思是        先判断a的范围,延时一段时间,在判断a的范围,如果还在那个范围之内,就执行下面的语句!

使用特权

评论回复
地板
w522930954| | 2013-8-21 16:07 | 只看该作者
那就必须是严格的5S,时间长了短了都进不去判断

使用特权

评论回复
5
bingshuixichen|  楼主 | 2013-8-21 16:15 | 只看该作者
因为在        while(1)
   {
      out=1;
     delay(1000)
     out=0;       
   }      
单片机在执行中,out一直是高电平,没有出现低电平,上面的程序是不是因为同样的原因呢?例如在这个while中,我想让out=1后延时一段时间,一直为0,但是不是这样的,应该怎么解决呢?

使用特权

评论回复
6
ning@2013| | 2013-8-21 16:38 | 只看该作者
bingshuixichen 发表于 2013-8-21 16:15  因为在 while(1)  {  out=1;

没有在你1楼的程序里看到你这个例程。上面可能是第一次符合,第二次就不再符合了,然后就进不去,改不了状态。

ls没看到电平变化的原因:
while(1)
{out=1;
延时;
out=0;//这里执行完立即返回上面的=1,只运行几个指令周期,没有明显变化。

使用特权

评论回复
7
ning@2013| | 2013-8-21 16:41 | 只看该作者
把这些东西提出循环就可以一直拉低了,当然,程序跑飞或者其它语句更改了也有可能重新拉高

使用特权

评论回复
8
joyme| | 2013-8-21 16:42 | 只看该作者
delay_1ms(10000);   
你应该研究一下delay_1ms函数的实现,是否使能看门狗,溢出时间是多长

使用特权

评论回复
9
bingshuixichen|  楼主 | 2013-8-21 17:16 | 只看该作者
ning@2013 发表于 2013-8-21 16:38
没有在你1楼的程序里看到你这个例程。上面可能是第一次符合,第二次就不再符合了,然后就进不去,改不了 ...

我在程序中,把a始终大于66 ,能够进取。我把dis_dianya()函数放在while中,是不是和你说的一样在延时后,只是运行几个指令周期?如果是应该怎么解决呢?又不可以把dis_dianya()提出循环,应为电压一直要采集啊

使用特权

评论回复
10
bingshuixichen|  楼主 | 2013-8-21 17:17 | 只看该作者
ning@2013 发表于 2013-8-21 16:41
把这些东西提出循环就可以一直拉低了,当然,程序跑飞或者其它语句更改了也有可能重新拉高 ...

不可以把dis_dianya()提出循环,因为电压一直要采集啊?还有没有其他办法?

使用特权

评论回复
11
bingshuixichen|  楼主 | 2013-8-21 17:22 | 只看该作者
ning@2013 发表于 2013-8-21 16:38
没有在你1楼的程序里看到你这个例程。上面可能是第一次符合,第二次就不再符合了,然后就进不去,改不了 ...

而且我需要延时之后的状态一直保持,

使用特权

评论回复
12
freelife80| | 2013-8-21 17:51 | 只看该作者
if((a<34)||(a>66))
                   {
                           OUT33=1;           //关闭进气阀
                           OUT22=0;           //打开排气阀
                           OUT32=0;           //蜂鸣器报警
                           delay_1ms(5000);         //延时5秒
                           OUT22=1;           //关闭出气阀
                           OUT32=1;           //蜂鸣器关闭
                           while((a<34)||(a>66));/////////////////////////////l加这个就可以了

                   }

使用特权

评论回复
13
longquanboy| | 2013-8-21 23:18 | 只看该作者
bingshuixichen 发表于 2013-8-21 15:55
我的意思是        先判断a的范围,延时一段时间,在判断a的范围,如果还在那个范围之内,就执行下面的语句! ...

你延时一段时间后,a的值又没有被重新计算过,还是你延时之前的值,所以这个逻辑上就是个问题,除非你延时5秒后在重新去计算一下a后,在进行判断才是正确的

使用特权

评论回复
14
longquanboy| | 2013-8-21 23:20 | 只看该作者
freelife80 发表于 2013-8-21 17:51
if((a66))
                   {
                           OUT33=1;           //关闭进气阀

a值在没有被重新计算过,无论你延时多久,都是这个值

使用特权

评论回复
15
longquanboy| | 2013-8-21 23:25 | 只看该作者
改成如下试试看:
         if((a<34)||(a>66))
                 {
                   delay_1ms(10000);   //延时5S
                   ADC_Init(ADC_PORT0);
                   res0=GetADCResult(ADC_CH0)*51;         
                   a=(int)res0        ;//重新在去读一次AD值用于判断

                  if((a<34)||(a>66))
                   {
                           OUT33=1;           //关闭进气阀
                           OUT22=0;           //打开排气阀
                           OUT32=0;           //蜂鸣器报警
                           delay_1ms(5000);         //延时5秒
                           OUT22=1;           //关闭出气阀
                           OUT32=1;           //蜂鸣器关闭
                   }
                 }

使用特权

评论回复
16
sedatefire| | 2013-8-22 00:43 | 只看该作者
为何总有延时呢,唉

使用特权

评论回复
17
haitian5002| | 2013-8-22 08:30 | 只看该作者
你先测下a的值,是不是能进你的IF语句

使用特权

评论回复
18
52xiaoer| | 2013-8-22 10:12 | 只看该作者
if((a<34)||(a>66))
                   {
                           OUT33=1;           //关闭进气阀
                           OUT22=0;           //打开排气阀
                           OUT32=0;           //蜂鸣器报警
                           delay_1ms(5000);         //延时5秒
                           OUT22=1;           //关闭出气阀
                           OUT32=1;           //蜂鸣器关闭
                   }
在OUT22和OUT32=1后加个延时试试!!!

使用特权

评论回复
19
mark301600| | 2013-8-22 11:37 | 只看该作者
bingshuixichen 发表于 2013-8-21 16:15
因为在        while(1)
   {
      out=1;

out=0;
后面没有延迟,自然一直为高电平了

使用特权

评论回复
20
tergy2012| | 2013-8-22 11:56 | 只看该作者
路过学习的

使用特权

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

本版积分规则

7

主题

27

帖子

1

粉丝