找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2289|回复: 15
收起左侧

请教一下单片机大神,关于温度逻辑判断怎么温度防抖,还有定时器做延迟问题?

[复制链接]
ID:282747 发表于 2020-6-30 16:40 | 显示全部楼层 |阅读模式
40黑币
请教一下大神,关于温度逻辑判断怎么温度防抖,还有定时器做延迟问题 ,用定时器可以做类似下面程序功能吗?
检测到温度界限 拉低io口持续一段时间 用定时器方法不影响主程序运作

单片机源程序如下:
if(A>=31)//温度大于31度
                 {
                  LED1=1;
                  LED2=1;
                  AR1=0;//拉低下面io口持续2s
                  AR2=0;
                  AR3=0;
                  AR4=0;
                  AR5=0;
                  AR6=0;
                  AR7=0;
                  Delay2000ms();
                    }
          else if(A<31)
                 {
                  AR1=1;
                  AR2=1;
                  AR3=1;
                  AR4=1;
                  AR5=1;
                  AR6=1;
                  AR7=1;
                  LED1=~LED1;
                  LED2=~LED2;
            }

回复

使用道具 举报

ID:592807 发表于 2020-7-1 10:33 | 显示全部楼层
基本上都市ADC采集然后ADC滤波,求得答案,
以前做adc从51下载的资料,忘了那个大佬的分享的了,希望能帮到你

十大滤波.rar

313.45 KB, 下载次数: 10

回复

使用道具 举报

ID:282747 发表于 2020-7-1 10:33 来自手机 | 显示全部楼层
会了,摸索出来了
回复

使用道具 举报

ID:452950 发表于 2020-7-1 11:00 | 显示全部楼层
while(A>=31)//温度大于31度
                 {                   delay(50);
                while(A>=31)//温度大于31度
                  {
                  LED1=1;
                  LED2=1;
                  AR1=0;//拉低下面io口持续2s
                  AR2=0;
                  AR3=0;
                  AR4=0;
                  AR5=0;
                  AR6=0;
                  AR7=0;
                    }
                if(A<31)//温度小于31度
                delay(50);
                 }
                  AR1=1;
                  AR2=1;
                  AR3=1;
                  AR4=1;
                  AR5=1;
                  AR6=1;
                  AR7=1;
                  LED1=~LED1;
                  LED2=~LED2;


回复

使用道具 举报

ID:490426 发表于 2020-7-1 11:23 | 显示全部楼层
xxpp2011 发表于 2020-7-1 11:00
while(A>=31)//温度大于31度
                 {                   delay(50);
                while(A ...

你这程序写的下面应该进不去吧,编译器没报警
回复

使用道具 举报

ID:490426 发表于 2020-7-1 11:24 | 显示全部楼层
xxpp2011 发表于 2020-7-1 11:00
while(A>=31)//温度大于31度
                 {                   delay(50);
                while(A ...

就是if(A<31)根本进不去
回复

使用道具 举报

ID:282747 发表于 2020-7-1 11:24 来自手机 | 显示全部楼层
xxpp2011 发表于 2020-7-1 11:00
while(A>=31)//温度大于31度
                 {                   delay(50);
                while(A ...

不要延迟函数,会拉低单片机处理速度
回复

使用道具 举报

ID:490426 发表于 2020-7-1 11:27 | 显示全部楼层
定时器里面加一个计数标志,等到计数到2秒给主循环一个标志位,再拉低或者拉高引脚,就可以了。温度防抖是不是采样会有误差,可以加个电容滤波,然后定时器延时采样一下,不建议在主函数里面加延时。
回复

使用道具 举报

ID:452950 发表于 2020-7-1 11:41 | 显示全部楼层

if只是防抖,如果50ms后仍然低于31度就会跳出上面的while语句,执行下面的LED状态还原
回复

使用道具 举报

ID:282747 发表于 2020-7-1 11:50 | 显示全部楼层
自己想了一下搞定了
if((((AB[M]-N)>TM[4])&&((AB[M+1]-N)>TM[4]))||(((AB[M]-N)>TM[4])&&((AB[M-1]-N)>TM[4]))||(((AB[M]-N)>TM[4])&&((AB[M+2]-N)>TM[4]))||(((AB[M]-N)>TM[4])&&((AB[M-2]-N)>TM[4])))        //判断检测数据
          {
           HAD=1;
           WM=1;
           GM=1;
          }
        else                   //延迟切换时间
        {
          if(GM==0)
                   {
                  HAD=0;
                }
         }
}
void IO_handle()   //LED IO口处理
{
                if(HAD==1)
                {
                  LED1=1;
                  LED2=1;
                  AR1=0;
                  AR2=0;
                  AR3=0;
                  AR4=0;
                  AR5=0;
                  AR6=0;
                  AR7=0;
                    }
          else if(HAD==0)
                 {
                  AR1=1;
                  AR2=1;
                  AR3=1;
                  AR4=1;
                  AR5=1;
                  AR6=1;
                  AR7=1;
                 if(HAV==1)
                   {
                         HAV=0;
                        LED1=~LED1;
                    LED2=~LED2;
               }
            }
}

void Timer0Init(void)                //50毫秒@11.0592MHz
{
        AUXR &= 0x7F;                //定时器时钟12T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0x00;                //设置定时初值
        TH0 = 0x4C;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
        EA = 1;                        //开总中断
        ET0 = 1;           //开定时器T0中断
}

void Timer0(void) interrupt 1
  {
    TL0 = 0x00;                //设置定时初值
        TH0 = 0x4C;                //设置定时初值
        tewp++;
   if(tewp>=20)                 //LED灯闪时间处理
         {
          tewp=0;
          HAV=1;
         }
        if(WM==1)                        //开关延迟10s
          {
           temp++;
           if(temp>=20)
                  {
                  temp=0;
                  time++;
                  if(time>=10)
                         {
                          time=0;
                           WM=0;
                       GM=0;
                         }
                   }
           }

}
回复

使用道具 举报

ID:760185 发表于 2020-7-1 12:10 | 显示全部楼层
延时判断,这是比较简单的办法
回复

使用道具 举报

ID:319023 发表于 2020-7-1 12:20 | 显示全部楼层
温度  应该要设置一个窗口值,升温后报警  降到一定温度值后再解除报警  就是有一个温度范围。 定时也要的,定义一个时间相关的变量, 降温后 需要定时时间到了才解除报警
回复

使用道具 举报

ID:282747 发表于 2020-7-1 12:30 | 显示全部楼层
xujiabin 发表于 2020-7-1 11:27
定时器里面加一个计数标志,等到计数到2秒给主循环一个标志位,再拉低或者拉高引脚,就可以了。温度防抖是 ...

你这个是定时去处理 我想要的是定时器直接做延迟
回复

使用道具 举报

ID:636538 发表于 2020-7-1 13:34 | 显示全部楼层
shijie240 发表于 2020-7-1 12:30
你这个是定时去处理 我想要的是定时器直接做延迟

那你就在想要延时的下面做个标志位,标志位为1,定时器给标志位里面的变量累计加一,到了你想要延时的时间在做一个标志位这个标志位为1,说明,延时时间到了
回复

使用道具 举报

ID:466730 发表于 2020-7-1 18:07 | 显示全部楼层
不能在AD转温度时候作么,比如AD转换后取平均值,然后作个定时标记,多少时间内刷新一次温度值.剩下的温度控制程序就完全可以直接一次性判断了
if(ADCokF&&Flag2s)
{
    ADCokF=0;
   Flag2s=0;
    //温度转换;
   A=温度;
}

控制程序直接去掉延时等待
if(A>=31)//温度大于31度
                 {
                  LED1=1;
                  LED2=1;
                  AR1=0;//拉低下面io口持续2s
                  AR2=0;
                  AR3=0;
                  AR4=0;
                  AR5=0;
                  AR6=0;
                  AR7=0;
                    }
          else if(A<31)
                 {
                  AR1=1;
                  AR2=1;
                  AR3=1;
                  AR4=1;
                  AR5=1;
                  AR6=1;
                  AR7=1;
                  LED1=~LED1;
                  LED2=~LED2;
            }

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:7209 发表于 2020-7-1 19:06 | 显示全部楼层
你应该想实现的是,温度自动控制 !
    最长见的就是  “恒温电烙铁”  
这个需要PID 来实现。
    如果用继电器 是不行的,因为在接近温度值得时候开关频繁。
    如果加热水的话,还需要考虑水量减少时,这个开时间加热的判断。
    希望能帮到
   
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表