功能描述:上电工作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);
- }
|