#include <REG52.H>
#include<intrins.h>
#define uint unsigned char
uint time = 100; //定时时间
uint time1;
uint num = 0; //计时达1s标志位
bit state = 0; //工作状态标志位
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; //按键减
//数码管位声明 ----段选为P2口
sbit duan1 = P1^0; //从左往右,第一位
sbit duan2 = P1^1; //从左往右,第二位
sbit duan3 = P1^2; //从左往右,第三位
sbit duan4 = P1^3; //从左往右,第四位
//子函数声明
void display(void); //数码管扫描函数
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; //设置定时器0工作方式(M1,M0为0,1)
TH0 = (65536-45872)/256; //装初值
TL0 = (65536-45872)%256; //装初值
EA = 1; //开总中断
ET0 = 1; //开定时器0中断
//开机音效
BUZY = 1;
Delay200ms(); ;
BUZY = 0;
Delay200ms();
BUZY = 1;
Delay200ms();
BUZY = 0;
while(1)
{
time1 = time;
display();//数码管显示
testKey(); //按键检测
//进入计时模式
if(state)
{
time1 = time;
TR0 = 1; //开启定时器0
RELAY = 1; //打开继电器
while(state)
{
testKey();
display();
//判断计时是否完成
if(time1 == 0)
{
TR0 = 0; //关闭定时器
state = 0;
//蜂鸣器响三声,表示计时结束
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;
//数码管动态扫描
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:
//设置模式显示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;
}
}
//按键检测函数
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);
}
//中断函数
void T0time() interrupt 1
{
TH0 = (65536-45872)/256; //装初值
TL0 = (65536-45872)%256; //装初值
//5毫秒一次中断,满20次表示1秒已到
num++;
if(num == 20)
{
num = 0;
time1--;
}
} |