打印

一个一键多功能的矛盾问题

[复制链接]
829|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LKC134|  楼主 | 2019-9-10 16:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
功能描述:上电工作10分钟停止输出,无操作后到20分钟关机。当工作在10分钟内有按键按下则停止输出,如没按键按下计时到20分钟关机,如有按键按下则重新计时到10分钟停止输出,这样不断循环。现在的问题是当重新计时归零会出现关机状态。如取消关机则没问题,但达不到功能要求。也尝试用按键计数然后用switch语句选择,但会出现不计数会进入关机状态,后来直接在定时器2函内判断按键数执行功能,但当按第2次按键时则不计数进入关机。以下是部分程序:请各大神帮看下那里不对,谢谢!
#include "STC15.H"
#include"intrins.h"
#define uchar unsigned char
#define uint  unsigned int
uchar a=0,b=0,h=0,G=0;
bit ti_flag=0,Led_new_flag=0;
uint time_te_flag=0,count=0;Cont=0,v=0,T=0;
uint T_PCA2;
uint s1=0,s2=0,j=0,d=0;
sbit LED=P3^3;
sbit Power=P1^4; //开机/关机
sbit PINT=P5^4;//检测
sbit NTC_IN=P1^0;
sbit key=P1^3;         //按键
sbit PM_out=P3^6;
/***********定时器初始化***************/
void Init(void)
{
//        AUXR=0x7f;               //定时器时钟12T模式
//        TMOD&=0xf0;
        TMOD|=0x01;                //设置定时器模式
        TL0=0x30;                    //设置定时初值2mS
        TH0=0xF8;                   //设置定时初值
        PT0=1;           //高优先级
        TF0=0;           //清除TF0标志
        ET0=1;
        EA=1;                       
        TR0=1;
    AUXR&=~0x04;
    T2L=0x18;                //设置定时初值         1ms
        T2H=0xfc;                //设置定时初值
        AUXR|=0x10;        //定时器2开始计时
        IE2|=0x04;
       
   }
/****************IO初始化*****************/
void IO_Init(void)
{       
        P1M0=0X10;
    P1M1=0X2f;
    P3M0=0X48;
    P3M1=0X00;
    P5M0=0X00;
    P5M1=0X10;
        }
/***************PCA初始货******************/
void pca2_Init()
{
  CCON=0;
  CL=0;
  CH=0;
  CMOD=0x00;
  T_PCA2=50000;
  CCAP2L=T_PCA2;
  CCAP2H=T_PCA2>>8;
  T_PCA2+=50000;
  CCAPM2=0x49;
  CR=1;
  EA=1;
  }
void pca2_isr() interrupt 7
{
   CCF2=0;
   CCAP2L=T_PCA2;
   CCAP2H=T_PCA2>>8;
   T_PCA2+=50000;
   Cnt++;
   if(Cnt==12000)
   {
     Cnt=0;
         TR0=0;
         fen++;
         }
   if(fen==2)
   {
     fen=0;
     Power=0;
         }
   }
/***************定时器0****************/
void timer0(void) interrupt 1  
{
TL0=0x30;                //设置定时初值2ms
TH0=0xF8;                //设置定时初值
   num++;   
  if(num>=100)
   num=0;
  if(num<ZKB)
  PM_out=1;
  else
  PM_out=0;
  }
/**************定时器2***************/
void t2int(void) interrupt 12          //1ms定时
{
    ti_flag=1;
    keyScan();       
        if((a==1)&&(TR0==0))
        {
          TR0=1;
          CR=0;
          j++;
    if(j==1000) //1秒
   
            j=0;
         s1++;
         
    if(s1==600)//10分钟后停止输出
          {
     s1=0;
         s2++;
         TR0=0;
     PM_out=0;   
    }
        if(s2==2)//20分钟后关机
       s2=0;       
          Power=0;
        }
  if((a==2)&&(TR0==1))
   {
          TR0=0;
          PM_out=0;       
          CR=1;
          }
        if((a==3)&&(TR0==0))
        {
           TR0=1;
           v++;
          if(v==60000)//10分钟到停止输出
            v=0;
           TR0=0;
           PM_out=0;
           h++;
          if(h==2)    //20分钟到关机
           Power=0;
           }                           
            }       
        if((b==1)&&(TR0==1))
    {
      TR0=0;
          PM_out=0;
//          CR=1;
          }
  else
  if((b==2)&&(TR0==0))
     {
           TR0=1;
           CR=0;
           T++;
          if(T==60000)
            T=0;
            TR0=0;           //停止输出
                PM_out=0;
                G++;
          if(G==2)
            G=0;
                Power=0;   //关机
                }
  else
        if((b==3)&&(TR0==1))
    {
             TR0=0;
                 PM_out=0;          //停止输出
                 CR=1;
                 }
           }

/*************按键扫描及处理***************/
void keyScan()
{

  static bit key1_lock=0;
  static uchar count1=0;
             
        if(0==key)
        {

   if((count1++>=25)&&(key1_lock==0)&&(PINT==1))//延时滤波25ms
          {
            key1_lock=1;
       
            a++;
            b++;
         if(a>3)
            a=1;
         if(b>3)
            b=1;
         
          }       
         }
  else
    {
         key1_lock=0;//按键自锁标志清0
     count1=0; //消抖计数清0
          }
   if(PINT==0)
    {
         Power=0;
        
           }  
        }
/***************主程序****************/   
void main(void)
{
Init();
IO_Init();
pca2_Init();
while(1);
}                  


使用特权

评论回复

相关帖子

沙发
LKC134|  楼主 | 2019-9-10 17:28 | 只看该作者
如按秒表这样设置行不通,不知各位有那些方法实现?

使用特权

评论回复
板凳
LKC134|  楼主 | 2019-9-11 07:57 | 只看该作者
看来很多大神提前放中秋假了,先顶下。

使用特权

评论回复
地板
tianxj01| | 2019-9-11 08:41 | 只看该作者
LKC134 发表于 2019-9-11 07:57
看来很多大神提前放中秋假了,先顶下。


你的描述过程,逻辑有点不清楚

分析一下,按键其实只是一种状态,只是时间段不同操作目标不同而已,一个是停止输出,一个是重新启动。
因此我们把时间分成2段,
前10分钟  有按键则 停止输出  无按键,连续输出到10分钟结束。
后10分钟(还是20分钟?) 有按键,则回到前10分钟开始部分  如无按键  则到10分钟 关机
因为你描述有点问题,不知道我这样理解是不是准确,就按照这样情况分析怎么弄程序吧。
那么很清楚了,只需要建立一个定时器,区别出时间段,然后,根据时间段确定操作标的就可以了,用不着你贴的这么复杂吧。
弄这种程序,你先不是考虑怎么弄,而是先要明确,对应条件(比如这里是时间),按键动作目标,画出一个逻辑图,也就是先在目标行为上,通过正确的逻辑表达出来。再通过程序去实现该逻辑就非常简单了。

使用特权

评论回复
5
LKC134|  楼主 | 2019-9-11 09:22 | 只看该作者
tianxj01 发表于 2019-9-11 08:41
你的描述过程,逻辑有点不清楚

分析一下,按键其实只是一种状态,只是时间段不同操作目标不同而已,一个 ...

在 停止时当按键按下就重新计时工作,如在工作其间有按键动作就停止,再按重新计时,问题是这时间是一直计时,需要复位归零才能重新计时。

使用特权

评论回复
6
LKC134|  楼主 | 2019-9-11 09:30 | 只看该作者
LKC134 发表于 2019-9-11 09:22
在 停止时当按键按下就重新计时工作,如在工作其间有按键动作就停止,再按重新计时,问题是这时间是一直 ...

可能是我想的太复杂,对这逻辑分析有点乱,我重新整下思路。多谢了!

使用特权

评论回复
7
tianxj01| | 2019-9-11 09:42 | 只看该作者
本帖最后由 tianxj01 于 2019-9-11 09:44 编辑
LKC134 发表于 2019-9-11 09:30
可能是我想的太复杂,对这逻辑分析有点乱,我重新整下思路。多谢了!


对的,你动作要求,虽然描述的不准确,但是,做逻辑图时候,自己总可以明确动作要求吧?
而作为最重要的条件,你这里就是时间轴,这启动--前10分钟-后10分钟 3个阶段 准确定义好时间轴上按钮的执行标的,而按钮标的无非就包括在是下面几种里面了:
1、移动到时间轴的一个点
2、暂停、等待时间或者再次按钮恢复
3、停止输出
4、恢复输出
不是说你需要上面所有的执行动作,而是只需要上面部分动作。明确了上面这些,程序应该很简单来着。

使用特权

评论回复
8
LKC134|  楼主 | 2019-9-11 10:11 | 只看该作者
tianxj01 发表于 2019-9-11 09:42
对的,你动作要求,虽然描述的不准确,但是,做逻辑图时候,自己总可以明确动作要求吧?
而作为最重要的 ...

之前尝试过在按键作标志执行,发现当执行重新计时会没作用,直接关机。因为只使用一个按键,它的作用就是1.停止输出 ,2.重新计时恢复输出这样循环。

使用特权

评论回复
9
LKC134|  楼主 | 2019-9-11 10:17 | 只看该作者
当移动到时间轴一个点重新开始计时,但之前的计时时间不暂停或取消,时间一到也会停止输出。

使用特权

评论回复
10
LKC134|  楼主 | 2019-9-11 10:37 | 只看该作者
本来功能是简单的,开始工作10分钟,到20分钟后自动关机,按键时停止输出和恢复输出。后来要求在按键时恢复输出重新计时10分钟。

使用特权

评论回复
11
LKC134|  楼主 | 2019-9-11 10:44 | 只看该作者
问题是在重新计时需设置时间归零,但是一归零就会使停止输出和关机这两个功能起作用。

使用特权

评论回复
12
LKC134|  楼主 | 2019-9-11 10:49 | 只看该作者
加个简单的功能就变复杂了,逻辑一时想不通,本人的水平有限,特来这里向各位大神和前辈请教下。

使用特权

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

本版积分规则

42

主题

339

帖子

6

粉丝