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