|
http://v.youku.com/v_show/id_XMjQ1MzE0MTY4.html
在倒数0和20秒处触发继电器动作,同时20秒时发出告警,10秒时发出急促告警
定时时间修改 由按键完成
/********************宏定义*****************************/
#include <AT89X52.H>
#define K1 P0_7
#define K2 P0_6
#define K3 P0_5
#define DATA P1
#define SLE P3
#define L0 P3_4
#define L1 P3_3
#define L2 P3_2
#define L3 P3_1
#define L4 P3_7
#define L5 P3_5
#define L6 P3_6
#define L7 P3_0
#define BEEP P2_0
#define ON 0
#define OFF 1
#define KM0 P2_1
#define KM1 P2_2
#define time_hour0 0
#define time_hour1 0
#define time_min0 0
#define time_min1 0
#define time_sec0 21
#define time_sec1 11
#define MEU_NUM 5 //功能键功能总数
/*******************函数声明********************************/
void sys_int (void);
void beep (void);
void delpy (unsigned char );
unsigned char key(void);
void display (unsigned char );
void table (unsigned char x) ;
unsigned char code led_data[]={0x05,0xdd,0x46,0x54,0x9c,0x34,0x24,0x5d,0x04,0x14,0xfb}; //“0--9,. ”字码
unsigned char code led_sle[]={0x10,0x08,0x04,0x02,0x80,0x20,0x40,0x01}; //自右向左0-7位
unsigned char hour,min,sec,QQ,ID; //时,分,秒,0.1秒级变量 ,定时器状态控制允许标志
static bit LED_K; //产生0.5秒周期闪烁参变量
/********************************************************************
函数名称:按键检测
**********************************************************************/
unsigned char key(void)
{
static unsigned char key_id; //功能键ID
unsigned char m;
if( K1==0 && K2!=0 && K3!=0 ) //当功能键时
{
beep();
if ( K1==0 && K2!=0 && K3!=0 )
++key_id;
if (key_id>MEU_NUM ) key_id=0; //功能值超值返回
}
if( K1!=0 && K2==0 && K3!=0 )//当按加键时
{
beep();
if ( K1!=0 && K2==0 && K3!=0 )
{
if(key_id==1) hour++;
if(key_id==2) min++;
if(key_id==3) sec++;
}
}
if( K1!=0 && K2!=0 && K3==0 )//当按减键时
{
beep();
if ( K1!=0 && K2!=0 && K3==0 )
{
if(key_id==1) hour--;
if(key_id==2) min--;
if(key_id==3) sec--;
}
}
if (key_id==5) ID=0x01; //当功能键为5时,修改定时器计时允许标志
else ID=0x00 ; //禁止
if (key_id==0) sys_int();//数据初始化
if(key_id<5)
{
if( (hour<1||hour>99) && (min <1||min>59) && (sec<1||sec>59) ) //防止时间为负
{
hour=0;
min=0;
sec=0;
}
}
return (m=key_id);
}
/********************************************************************
函数名称:延时
**********************************************************************/
void delpy(unsigned char x)
{
unsigned char j;
for(;x>0;x--)
for (j=255;j>0;j--);
}
/******************************************************************
函数名称:LED数码管显示
*********************************************************************/
void display (unsigned char k)
{
unsigned char h0,h1,m0,m1,s0,s1,x; //拆字码用
h1=hour /10 ;
h0=hour%10;
m1=min /10 ;
m0=min%10;
s1=sec /10 ;
s0=sec%10;
x=QQ; // 1/10秒
DATA=led_data[h1];//时
if( (k==1)||(k==4) )
{
SLE=0x00;
L7= LED_K; //0.5秒闪烁
}
else
{
SLE=led_sle[7]; //常态
}
delpy(2);
DATA=led_data[h0];
if( (k==1)||(k==4) )
{
SLE=0x00;
L6= LED_K;
}
else
{
SLE=led_sle[6];
}
delpy(2);
DATA=led_data[m1]; //分
if( (k==2)||(k==4) )
{
SLE=0x00;
L5= LED_K;
}
else
{
SLE=led_sle[5];
}
delpy(2);
DATA=led_data[m0];
if( (k==2)||(k==4) )
{
SLE=0x00;
L4= LED_K;
}
else
{
SLE=led_sle[4];
}
delpy(2);
DATA=led_data[s1]; //秒
if( (k==3)||(k==4) )
{
SLE=0x00;
L3= LED_K;
}
else
{
SLE=led_sle[3];
}
delpy(2);
DATA=led_data[s0];
if( (k==3)||(k==4) )
{
SLE=0x00;
L2= LED_K;
}
else
{
SLE=led_sle[2];
}
delpy(2);
DATA=led_data[x]; // 1/10秒
SLE=led_sle[0];
delpy(2);
DATA=led_data[10]; //时-分小数点
SLE=led_sle[6];
delpy(2);
DATA=led_data[10]; // 分-秒小数点
SLE=led_sle[4];
delpy(2);
}
/***********************************************
函数名称:蜂鸣音
备注:内插显示函数
***********************************************/
void beep (void)
{
BEEP=ON;
display(0); display(0);//display(0);display(0);display(0);
BEEP=OFF;
}
/*********************************************
函数名称:告警及控制动作
********************************************/
void table (unsigned char x)
{
if(x==5)
{
if(hour==time_hour0 && min==time_min0 && sec<time_sec0 )
{
KM0=ON; //继电器接通
if(sec>time_sec1)
{BEEP=ON;
display(0); display(0);display(0); //慢告警音
BEEP=OFF;
BEEP=ON;
display(0); display(0);display(0);
BEEP=OFF;
}
}
else KM0=OFF;
if(hour==time_hour1 && min==time_min1 && sec<time_sec1 )
{
KM1=ON;
BEEP=ON;
display(0);//急速告警音
BEEP=OFF;
KM1=ON;
BEEP=ON;
display(0);
BEEP=OFF;
}
else KM1=OFF;
if (hour==0 && min==0 && sec<1 ) BEEP=ON;
}
else
{ KM0=OFF;
KM1=OFF;
}
}
/**********************************************
函数名称:系统初始化
******************************************/
void sys_int(void)
{
P0=0xfe;
hour=00;
min=00;
sec=00;
QQ=0;
TMOD=0X01;
ET0=1;
TH0=0x3c; //重装定时初值
TL0=0xb0; // TL0=TL0+0xb3;
EA =1 ;
TR0 =1 ;
}
/*****************************************
函数名称:定时中断服务
****************************************/
void time_server(void) interrupt 1 using 1 //周期50ms中断函数
{ static unsigned char x0,x1,x2,a;//1000ms ,100ms,500ms 时基,临时变量
TH0=0x4B; //重装定时初值
TL0=0XFF;
x0++;
x1++;
x2++;
if(x1==2) //100ms时基产生
{
x1=0;
if((ID!=0)&&( sec>0 ))
{
a++;
QQ=10-a; //产生9--->0 1/10倒计时
if(QQ==0)
a=0;
}
}
if(x2==10)//500ms时基产生
{
x2=0;
LED_K=!LED_K;//闪烁标志
//P2_0=!P2_0;
}
if(x0==20)//1000ms时基产生
{
x0=0;
if(ID==0x01)//当允许计时时计数
{
if( hour==0 &&min==0 &&sec<1)
{
ID=0;
}
else if(sec>0) { sec--;} //秒倒计时
if(sec==0)
{
if(min!=0)
{ --min;
sec=59;
}
}
else if(min==0)
{
if(hour!=0)
{--hour;
min=59;
}
}
}
}
}
/*************************************************
函数名称:主调函数
****************************************************/
main()
{
unsigned char x,y;
sys_int();//初始化
while(1)
{
table(y);
y= key();
for(x=25;x>0;x--)
{
display(y);
}
// if(hour==0 && min==0 && sec==0 ) y=4;
}
}
[ 本帖最后由 yangcheng84 于 2011-2-20 23:35 编辑 ] |
|