|
#include <REG52.H>
#include<intrins.h>
#define uint unsigned char
uint time = 100; //定時時間
uint time1;
uint num = 0; //計時達(dá)1s標(biāo)志位
bit state = 0; //工作狀態(tài)標(biāo)志位
unsigned char LED7Code[]={
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F, // 9
0x77, // A
0x7C, // B
0x39, // C
0x5E, // D
0x79, // E
0x71 // F
};
sbit RELAY = P3^6; //繼電器,高電平有效
sbit BUZY = P3^6; //蜂鳴器,高電平有效
//按鍵聲明
sbit KeyFunction = P3^2; //功能按鍵,開始/暫停
sbit KeyAdd = P3^3; //按鍵加
sbit KeyMinus = P3^4; //按鍵減
//數(shù)碼管位聲明 ----段選為P2口
sbit duan1 = P1^0; //從左往右,第一位
sbit duan2 = P1^1; //從左往右,第二位
sbit duan3 = P1^2; //從左往右,第三位
sbit duan4 = P1^3; //從左往右,第四位
//子函數(shù)聲明
void display(void); //數(shù)碼管掃描函數(shù)
void Delay2ms(void); //@12.000MHz,延時5ms
void Delay10ms(void); //@12.000MHz,延時10ms
void Delay150ms(void); //@12.000MHz,延時150ms
void Delay200ms(void); //@12.000MHz,延時200ms
void testKey(); //按鍵檢測
void main()
{
//中斷寄存器操作
TMOD = 0x01; //設(shè)置定時器0工作方式(M1,M0為0,1)
TH0 = (65536-45872)/256; //裝初值
TL0 = (65536-45872)%256; //裝初值
EA = 1; //開總中斷
ET0 = 1; //開定時器0中斷
//開機(jī)音效
BUZY = 1;
Delay200ms(); ;
BUZY = 0;
Delay200ms();
BUZY = 1;
Delay200ms();
BUZY = 0;
while(1)
{
time1 = time;
display();//數(shù)碼管顯示
testKey(); //按鍵檢測
//進(jìn)入計時模式
if(state)
{
time1 = time;
TR0 = 1; //開啟定時器0
RELAY = 1; //打開繼電器
while(state)
{
testKey();
display();
//判斷計時是否完成
if(time1 == 0)
{
TR0 = 0; //關(guān)閉定時器
state = 0;
//蜂鳴器響三聲,表示計時結(jié)束
BUZY = 1;
Delay200ms();Delay200ms();
BUZY = 0;
Delay200ms();Delay200ms();
BUZY = 1;
Delay200ms();Delay200ms();
BUZY = 0;
Delay200ms();Delay200ms();
BUZY = 1;
Delay200ms();Delay200ms();
BUZY = 0;
}
}
RELAY = 0;
}
}
}
void display(void)
{
uint j, ge, shi, bai;
// 個位 十位 百位
ge = time1%10;
shi = time1%100/10;
bai = time1/100;
//數(shù)碼管動態(tài)掃描
for(j=0;j<4;j++)
{
switch(j)
{
//個位顯示
case 0:
duan1 = 0;
duan2 = 0;
duan3 = 0;
duan4 = 1;
P2 = LED7Code[ge];
break;
//十位顯示
case 1:
duan1 = 0;
duan2 = 0;
duan3 = 1;
duan4 = 0;
P2 = LED7Code[shi];
break;
//百位顯示
case 2:
duan1 = 0;
duan2 = 1;
duan3 = 0;
duan4 = 0;
P2 = LED7Code[bai];
break;
//第四位顯示
case 3:
//設(shè)置模式顯示C
if(state)
{
duan1 = 1;
duan2 = 0;
duan3 = 0;
duan4 = 0;
P2 = LED7Code[14];
}
//計時模式顯示E
else
{
duan1 = 1;
duan2 = 0;
duan3 = 0;
duan4 = 0;
P2 = LED7Code[12];
}
break;
}
Delay2ms(); //@12.000MHz ,延時5ms
P2 = 0x00;
duan1 = 0;
duan2 = 0;
duan3 = 0;
duan4 = 0;
}
}
//按鍵檢測函數(shù)
void testKey()
{
//功能鍵檢測
if(~KeyFunction)
{
Delay10ms();
if(~KeyFunction)
{
state = ~state;
BUZY = 0;
}
while(~KeyFunction);
}
//按鍵加檢測
if(~KeyAdd)
{
Delay10ms();
if(~KeyAdd)
{
if(~state && time<999)
{
time++;
}
Delay10ms();
if(~KeyAdd)
Delay150ms();
}
}
//按鍵減檢測
if(~KeyMinus)
{
Delay2ms();
if(~KeyMinus)
{
if(~state && time>0)
{
time--;
}
Delay10ms();
if(~KeyMinus)
Delay150ms();
}
}
}
void Delay2ms() //@12.000MHz
{
unsigned char i, j;
_nop_();
i = 32;
j = 40;
do
{
while (--j);
} while (--i);
}
void Delay10ms() //@12.000MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 156;
j = 213;
do
{
while (--j);
} while (--i);
}
void Delay150ms() //@12.000MHz
{
unsigned char i, j, k;
i = 10;
j = 34;
k = 160;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay200ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 13;
j = 45;
k = 214;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
//中斷函數(shù)
void T0time() interrupt 1
{
TH0 = (65536-45872)/256; //裝初值
TL0 = (65536-45872)%256; //裝初值
//5毫秒一次中斷,滿20次表示1秒已到
num++;
if(num == 20)
{
num = 0;
time1--;
}
} |
|