[AVR单片机] 继电器反复开合的程序处理问题,求分析

[复制链接]
3697|6
 楼主| yangbo_hover 发表于 2010-12-1 11:30 | 显示全部楼层 |阅读模式
MCU:M16
定时器:100MS
程序流程:
水箱液位处理控制部分程序,水箱有三个设定值,当液位达到设定值时,相应继电器会动作,定时100MS,三秒送一次AD值在屏幕上显示,同时液位在设定值附近波动时,做个标志位,AD采集10次30秒内,液位都在设定值以上或者以下,标志位就做相应处理,在主程序中,标志位开启或者关闭,对应继电器的开合
问题:
做一个设定值时,程序正常,做三个设定值时,程序跑飞,不按正常流程走了,而且显示也会延缓,不知道问题出在哪里?
void ad_chuli(void)
{
if(flag_ad!=ad_flag)
  {
    flag_ad=ad_flag;
  if((ad_flag%3)==0)    //3S送一次AD值
                adc();
              if(yewei>=yewei1_setting)
               {
                     time_count++;
                     count_time=0;
               }
               if(yewei<yewei1_setting)  count_time++;
               if(count_time>10)  //低于设定值 采集10*3=30S防抖动
                 {
                     time_count=1;
                     yewei_flag1=0xaa;
                     count_time=11;
               }
               if(time_count>10)    //高于设定值采集10*3=30s防抖动
                   {                           
                      yewei_flag1=0x55;
                      time_count=1;
                      time_count=11;
                   }
   }
}
void main(void)
{
while(1)
       {
       if((SPSR&0X80)!=0)        
      {
     adc();
       }
      ad_chuli();
       sys_control();
       }
}
 楼主| yangbo_hover 发表于 2010-12-1 11:32 | 显示全部楼层
坐等,热心人
zhaoyu2005 发表于 2010-12-2 16:37 | 显示全部楼层
别等热心人了,自己好好整理思路,这个估计是逻辑问题
POINTRTOS 发表于 2010-12-3 15:38 | 显示全部楼层
呵呵,有点混乱.建议楼主先将time_count与count_time处理好.
老鱼探戈 发表于 2011-1-10 13:26 | 显示全部楼层
LZ的函数和变量定义很混乱,我想你自己有时候都会误看的。
把完整的变量定义贴出来看看
例如 ad_flag; 是什么类型的变量。按你的写法应该是一个uchar型的。

水位平均消抖也可行,不过最好用软件家施密特。
weibestww 发表于 2011-9-1 22:41 | 显示全部楼层
LZ写程序最好不要用汉语拼音,用常用的英文单词最好!
lisijun100 发表于 2011-9-2 03:39 | 显示全部楼层
:lol 没有看懂?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

7

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部