高级真钱打牌游戏886655员

Rank: 5Rank: 5

积分
741

涓涓之细流以坛为家真钱打牌游戏886655奇才奖章

在线时间
289 小时
精华
0
注册时间
2007-6-1
最后登录
2019-11-1
专家等级
结帖率
88%
LKC134
跳转到指定楼层
楼主
功能描述:上电工作10分钟停止输出,无操作后到20分钟关机。当工作在10分钟内有按键按下则停止输出,如没按键按下计时到20分钟关机,如有按键按下则重新计时到10分钟停止输出,这样不断循环。现在的问题是当重新计时归零会出现关机状态。如取消关机则没问题,但达不到功能要求。也尝试用按键计数然后用switch语句选择,但会出现不计数会进入关机状态,后来直接在定时器2函内判断按键数执行功能,但当按第2次按键时则不计数进入关机。以下是部分程序:请各大神帮看下那里不对,谢谢!
  1. #include "STC15.H"
  2. #include"intrins.h"
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. uchar a=0,b=0,h=0,G=0;
  6. bit ti_flag=0,Led_new_flag=0;
  7. uint time_te_flag=0,count=0;Cont=0,v=0,T=0;
  8. uint T_PCA2;
  9. uint s1=0,s2=0,j=0,d=0;
  10. sbit LED=P3^3;
  11. sbit Power=P1^4; //开机/关机
  12. sbit PINT=P5^4;//检测
  13. sbit NTC_IN=P1^0;
  14. sbit key=P1^3;         //按键
  15. sbit PM_out=P3^6;
  16. /***********定时器初始化***************/
  17. void Init(void)
  18. {
  19. //        AUXR=0x7f;               //定时器时钟12T模式
  20. //        TMOD&=0xf0;
  21.         TMOD|=0x01;                //设置定时器模式
  22.         TL0=0x30;                    //设置定时初值2mS
  23.         TH0=0xF8;                   //设置定时初值
  24.         PT0=1;           //高优先级
  25.         TF0=0;           //清除TF0标志
  26.         ET0=1;
  27.         EA=1;                       
  28.         TR0=1;
  29.     AUXR&=~0x04;
  30.     T2L=0x18;                //设置定时初值         1ms
  31.         T2H=0xfc;                //设置定时初值
  32.         AUXR|=0x10;        //定时器2开始计时
  33.         IE2|=0x04;
  34.        
  35.    }
  36. /****************IO初始化*****************/
  37. void IO_Init(void)
  38. {       
  39.         P1M0=0X10;
  40.     P1M1=0X2f;
  41.     P3M0=0X48;
  42.     P3M1=0X00;
  43.     P5M0=0X00;
  44.     P5M1=0X10;
  45.         }
  46. /***************PCA初始货******************/
  47. void pca2_Init()
  48. {
  49.   CCON=0;
  50.   CL=0;
  51.   CH=0;
  52.   CMOD=0x00;
  53.   T_PCA2=50000;
  54.   CCAP2L=T_PCA2;
  55.   CCAP2H=T_PCA2>>8;
  56.   T_PCA2+=50000;
  57.   CCAPM2=0x49;
  58.   CR=1;
  59.   EA=1;
  60.   }
  61. void pca2_isr() interrupt 7
  62. {
  63.    CCF2=0;
  64.    CCAP2L=T_PCA2;
  65.    CCAP2H=T_PCA2>>8;
  66.    T_PCA2+=50000;
  67.    Cnt++;
  68.    if(Cnt==12000)
  69.    {
  70.      Cnt=0;
  71.          TR0=0;
  72.          fen++;
  73.          }
  74.    if(fen==2)
  75.    {
  76.      fen=0;
  77.      Power=0;
  78.          }
  79.    }
  80. /***************定时器0****************/
  81. void timer0(void) interrupt 1  
  82. {
  83. TL0=0x30;                //设置定时初值2ms
  84. TH0=0xF8;                //设置定时初值
  85.    num++;   
  86.   if(num>=100)
  87.    num=0;
  88.   if(num<ZKB)
  89.   PM_out=1;
  90.   else
  91.   PM_out=0;
  92.   }
  93. /**************定时器2***************/
  94. void t2int(void) interrupt 12          //1ms定时
  95. {
  96.     ti_flag=1;
  97.     keyScan();       
  98.         if((a==1)&&(TR0==0))
  99.         {
  100.           TR0=1;
  101.           CR=0;
  102.           j++;
  103.     if(j==1000) //1秒
  104.    
  105.             j=0;
  106.          s1++;
  107.          
  108.     if(s1==600)//10分钟后停止输出
  109.           {
  110.      s1=0;
  111.          s2++;
  112.          TR0=0;
  113.      PM_out=0;   
  114.     }
  115.         if(s2==2)//20分钟后关机
  116.        s2=0;       
  117.           Power=0;
  118.         }
  119.   if((a==2)&&(TR0==1))
  120.    {
  121.           TR0=0;
  122.           PM_out=0;       
  123.           CR=1;
  124.           }
  125.         if((a==3)&&(TR0==0))
  126.         {
  127.            TR0=1;
  128.            v++;
  129.           if(v==60000)//10分钟到停止输出
  130.             v=0;
  131.            TR0=0;
  132.            PM_out=0;
  133.            h++;
  134.           if(h==2)    //20分钟到关机
  135.            Power=0;
  136.            }                           
  137.             }       
  138.         if((b==1)&&(TR0==1))
  139.     {
  140.       TR0=0;
  141.           PM_out=0;
  142. //          CR=1;
  143.           }
  144.   else
  145.   if((b==2)&&(TR0==0))
  146.      {
  147.            TR0=1;
  148.            CR=0;
  149.            T++;
  150.           if(T==60000)
  151.             T=0;
  152.             TR0=0;           //停止输出
  153.                 PM_out=0;
  154.                 G++;
  155.           if(G==2)
  156.             G=0;
  157.                 Power=0;   //关机
  158.                 }
  159.   else
  160.         if((b==3)&&(TR0==1))
  161.     {
  162.              TR0=0;
  163.                  PM_out=0;          //停止输出
  164.                  CR=1;
  165.                  }
  166.            }

  167. /*************按键扫描及处理***************/
  168. void keyScan()
  169. {

  170.   static bit key1_lock=0;
  171.   static uchar count1=0;
  172.              
  173.         if(0==key)
  174.         {

  175.    if((count1++>=25)&&(key1_lock==0)&&(PINT==1))//延时滤波25ms
  176.           {
  177.             key1_lock=1;
  178.        
  179.             a++;
  180.             b++;
  181.          if(a>3)
  182.             a=1;
  183.          if(b>3)
  184.             b=1;
  185.          
  186.           }       
  187.          }
  188.   else
  189.     {
  190.          key1_lock=0;//按键自锁标志清0
  191.      count1=0; //消抖计数清0
  192.           }
  193.    if(PINT==0)
  194.     {
  195.          Power=0;
  196.         
  197.            }  
  198.         }
  199. /***************主程序****************/   
  200. void main(void)
  201. {
  202. Init();
  203. IO_Init();
  204. pca2_Init();
  205. while(1);
  206. }                  
复制代码


使用特权

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

使用特权

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

使用特权

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


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

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

使用特权

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

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

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

使用特权

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

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

使用特权

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

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

评论回复
扫描二维码,随时随地手机跟帖
返回列表 发新帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

金贝棋牌捕鱼官网下载热帖

关闭

41183399云顶

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