|
50黑幣
//控制過程是計時開始時:OUT=0;計時過程有聲音,OUT=0;后5秒KV=0;結(jié)束前5秒KV=1; 結(jié)束時OUT=1;并一直報警。
//OUT=0;后5秒KV=0;沒整好。有不規(guī)范的地方,也請規(guī)范一下。
#include<STC15.h>
#define ulong unsigned long
char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
#define LED P1 //P1為數(shù)碼管的段選
sbit W1=P3^7; //P37為數(shù)碼管的位選
sbit W2=P3^1; //P31為數(shù)碼管的位選
sbit W3=P3^0; //P30為數(shù)碼管的位選
sbit time_shift=P3^4; //P3^4為"移位"按鍵
sbit time_set=P3^5; //P3^5為"修改"按鍵
sbit set_inc=P3^2; //P3^2為"增加"按鍵
sbit time_run=P3^3; //P3^3為"計時開始暫停"按鍵
sbit OUT=P2^4; //P5^4為MA高壓開,P24仿真。
sbit KV=P2^5; //P5^5為升壓輸出,P25仿真。
sbit KVI=P2^6; //P2^6為KV狀態(tài)檢測
sbit LI=P3^6; //P3^6為MA過流輸入
sbit WA=P2^7; //P3^7為無MA輸入
sbit GU=P1^7; //P1^7為MA過流故障燈
sbit LIGHT=P2^3; //P2^3
sbit SPEAKER=P2^7; //P2^7喇叭
unsigned char sec,min,sec_ge,sec_shi,min_ge,min_shi,t; //定義秒,分,時,秒的個位,十位,分的個位,十位
int state; //秒表狀態(tài)指示 0-計時暫停 1-正在倒計時 2-計時時間參數(shù)修改
int flag; //秒表修改數(shù)據(jù)指示 0-分鐘十位 1-分鐘個位 2-秒鐘十位 3-秒鐘個位
int blink;
//---------------------------------------------------------------------
void init();
void display_run();
void display_pause();
void delay(int);
void time_modify();
//---------------------------------------------------------------------
void main()
{
init();
state=0;
flag=0;
blink=1;
t=0;
LIGHT=1;
SPEAKER=1;
OUT=1;
KVI=1;
min=2;
sec=0;
sec_ge=0; //秒的個位和十位
sec_shi=0;
min_ge=2; //分的個位和十位
while(1)
{
if(time_set==0) //如果"調(diào)時"按鍵按下
{
delay(5); //延時去抖
if(time_set==0)
state=2;
}
if(state==0)
{
TR0=0;
TR1=0;
display_pause();
}
if(state==0)
{
OUT=1;
display_pause();
}
if(state==1)
{
TR0=1;
TR1=0;
display_run();
}
if(state==2)
{
TR1=1;
OUT=1;
time_modify();
}
if(state==1)
{
TR1=1;
OUT=0;
time_modify();
}
if(state==1)
{
OUT=0;
time_modify();
}
if(state==1)
{ if(KVI==0)
{time_set=0;
delay(5); //延時
OUT=1;
time_modify();
}
}
}
}
//---------------------------------------------------------------------
void init()
{
TMOD=0x11;
EA=1; //開總中斷
ET0=0;
ET1=0; //定義定時器0工定時器1作與方式1
TH0=0x4d; //定時器0賦初值
TL0=0xfc;
TH1=15536/256; //定時器1賦初值
TL1=15536%256;
//中斷初始化
EX0=1;
PX0=0;
IT0=1;
EX1=1;
PX1=1;
IT1=1;
}
//外中斷1
void INT_1() interrupt 2 using 0
{
if( time_run==0)//表示按鈕有按下
{
delay(20); //延時
if(time_run==0)
{
state=(state+1)%2;
LIGHT=1;
SPEAKER=1;
}
}
}
//外中斷0
void INT_0() interrupt 0 using 1
{
if( set_inc==0)//表示按鈕有按下
{
delay(20); //延時去抖
if(set_inc==0)
{
switch(flag) //分支結(jié)構(gòu),根據(jù)flag的值來判斷哪一位加1
{
case 0:
{
min=(min+1)%10+min/10*10;
break;
}
case 1:
{
sec=(sec+10)%60;
break;
}
case 2:
{
sec=(sec+1)%10+sec/10*10;
break;
}
default:break;
}
}
}
}
//--------------------------------延時子函數(shù)------------------------------------
void delay(int x)
{
int i,j;
for(i=x;i>0l;i--)
for(j=255;j>0;j--)
;
}
//-------------------------------顯示子函數(shù)---------------------------------------
void display_run()
{
if(TF0==1) //如果定時器溢出
{
TF0=0; //清中斷標(biāo)志位
t++;
if(t==20)
{
t=0;
if(min==0&&sec==0)
{
OUT=1;
}
if(sec==0)
{
sec=59;
min--;
}
else sec--;
if(state==1)
{ GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(5000); //想開機5秒后KV=0;沒整好。影響讀秒。
}
KV=0;
if(min==0&&sec<5)
{
KV=1;
SPEAKER=0;
delay(20);
SPEAKER=1;
}
if(min==0&&sec==0)
{
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
OUT=1;
state=3;
min=2;//回歸初始化
sec=0;
sec_ge=0; //秒的個位和十位
sec_shi=0;
min_ge=2; //分的個位和十位
while(1)
{
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(2);
GU=1;
SPEAKER=1;
delay(2);
GU=0;
SPEAKER=0;
delay(2);
GU=1;
SPEAKER=1;
delay(2);
GU=0;
SPEAKER=0;
delay(2);
GU=1;
SPEAKER=1;
delay(2);
GU=0;
SPEAKER=0;
delay(2);
GU=1;
SPEAKER=1;
delay(2);
GU=0;
SPEAKER=0;
delay(2);
GU=1;
SPEAKER=1;
delay(2);
GU=0;
SPEAKER=0;
delay(2);
GU=1;
SPEAKER=1;
delay(2);
GU=0;
SPEAKER=0;
delay(2);
GU=1;
SPEAKER=1;
delay(2);
GU=0;
SPEAKER=0;
delay(2);
GU=1;
SPEAKER=1;
delay(2);
GU=0;
SPEAKER=0;
delay(2);
GU=1;
SPEAKER=1;
delay(2);
GU=0;
SPEAKER=0;
delay(2);
GU=1;
SPEAKER=1;
delay(2);
GU=0;
SPEAKER=0;
delay(2);
GU=1;
SPEAKER=1;
delay(2);
GU=0;
SPEAKER=0;
delay(2);
GU=1;
SPEAKER=1;
delay(2);
GU=0;
SPEAKER=0;
delay(2);
GU=1;
SPEAKER=1;
delay(2);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0; SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(1);
GU=1;
SPEAKER=1;
delay(1);
GU=0;
SPEAKER=0;
delay(5);
GU=1;
SPEAKER=1;
delay(5);
GU=0;
SPEAKER=0;
delay(5);
GU=1;
SPEAKER=1;
delay(5);
GU=0;
SPEAKER=0;
delay(5);
GU=1;
SPEAKER=1;
delay(5);
GU=0;
delay(500);
}
}
}
}
sec_ge=sec%10; //秒的個位和十位
sec_shi=sec/10;
min_ge=min%10; //分的個位和十位
W1=0; //循環(huán)掃描
LED=tab[sec_ge];
delay(1);
W1=1;
W2=0;
LED=tab[sec_shi];
delay(1);
W2=1;
W3=0;
LED=tab[min_ge];
delay(1);
W3=1;
}
void display_pause()
{
W1=0; //循環(huán)掃描
LED=tab[sec_ge];
delay(1);
W1=1;
W2=0;
LED=tab[sec_shi];
delay(1);
W2=1;
W3=0;
LED=tab[min_ge];
delay(1);
W3=1;
}
void time_modify()
{ //修改位的閃爍狀態(tài)
if(TF1==1)
{
TF1=0;
blink=(blink+1)%2;
}
//修改具體哪個數(shù)碼管指示
if(time_shift==0)
{
delay(60);
if(time_shift==0)
flag=(flag+1)%3;
}
// 修改狀態(tài)下的數(shù)碼管顯示
switch(flag) //分支結(jié)構(gòu),根據(jù)flag的值來決定掃描狀態(tài)
{
case 0:
{
sec_ge=sec%10; //秒的個位和十位
sec_shi=sec/10;
min_ge=min%10; //分的個位和十位
min_shi=min/10;
W1=0; //循環(huán)掃描
LED=tab[sec_ge];
delay(1);
W1=1;
W2=0;
LED=tab[sec_shi];
delay(1);
W2=1;
if(blink==1)
{
W3=0;
LED=tab[min_ge];
delay(1);
W3=1;
}
break;
}
case 1:
{
sec_ge=sec%10; //秒的個位和十位
sec_shi=sec/10;
min_ge=min%10; //分的個位和十位
min_shi=min/10;
W1=0; //循環(huán)掃描
LED=tab[sec_ge];
delay(1);
W1=1;
if(blink==1)
{
W2=0;
LED=tab[sec_shi];
delay(1);
W2=1;
}
W3=0;
LED=tab[min_ge];
delay(1);
W3=1;
break;
}
case 2:
{
sec_ge=sec%10; //秒的個位和十位
sec_shi=sec/10;
min_ge=min%10; //分的個位和十位
min_shi=min/10;
if(blink==1)
{
W1=0; //循環(huán)掃描
LED=tab[sec_ge];
delay(1);
W1=1;
}
W2=0;
LED=tab[sec_shi];
delay(1);
W2=1;
W3=0;
LED=tab[min_ge];
delay(1);
W3=1;
break;
break;
}
default:break;
}
}
|
|