其硬件之利用到了一個38譯碼器,其他的看引腳定義即可推斷出
實現的按鍵調節定時時間,啓動後進行倒計時,當倒計時完成後,蜂鳴器報警
#include<reg52.h>
#include<intrins.h>
//引腳定義,使用情況四個按鍵,三個譯碼器端口連接
sbit beep = P1^5;
sbit key1 = P1^1;
sbit key2 = P1^2;
sbit key3 = P1^3;
sbit key4 = P1^4;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit AD = P3^2;
unsigned char code duanma[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char temp[8];
char hour; minute; second, num, t, i;
void delay(unsigned int t);
void initial();
void delay20ms();
void keyscan();
void caifen();
void display();
void main()
{
initial();
while(1)
{
keyscan();
caifen();
display();
if((hour==0)&&(minute==0)&&(second ==0))
{TR0=0;
beep =1; //此處蜂鳴器並沒有正常,可能是電流問題?
delay(10);
}
}
}
//對定時器進行配置初始化
void initial()
{
TMOD = 0x01;
TH0 = (65536 - 2000)/256;
TL0 = (65536 - 2000)%256;
EA = 1;
TR0 = 1;
ET0 = 1;
hour = 1;
minute = 0;
second = 1;
beep = 0;
}
//時間的標準定義
void time0(void) interrupt 1
{
TH0 = (65536 - 2000)/256;
TL0 = (65536 - 2000)%256;
num ++;
if (num == 500)
{
num = 0;
second --;
if (second == -1)
{
second = 9;
minute --;
if (minute == -1)
{
minute = 9;
hour --;
if (hour == -1)
{
hour = 0;
}
}
}
}
}
//接收按鍵的掃描
void keyscan()
{
if(key1 == 0)
{
delay20ms();
while(key1 == 0);
TR0 = 0;
t ++;
}
switch(t)
{
case 1:
if(key2 == 0)
{
delay20ms();
if(key2 == 0)
{
while(key2 == 0);
hour ++;
if(hour == 10)
{
hour = 0;
}
}
}
if(key3 == 0)
{
delay20ms();
if(key3 == 0)
{
while(key3 == 0);
hour --;
if(hour == -1)
{
hour =9;
}
}
}
break;
case 2:
if(key2 == 0)
{
delay20ms();
if(key2 == 0)
{
while(key2 == 0);
minute ++;
if(minute == 10)
{
minute = 0;
}
}
}
if(key3 == 0)
{
delay20ms();
if(key3 == 0)
{
while(key3 == 0);
minute --;
if(minute == -1)
{
minute = 9;
}
}
}
break;
case 3:
TR0 = 1;
t = 0;
break;
default:
break;
}
}
//對數據進行簡單的處理
void caifen()
{
temp[0]=duanma[hour%10];
temp[1]=duanma[minute%10];
temp[2]=duanma[second%10];
}
//數碼管進行顯示
void display()
{
unsigned int i;
for(i=0;i<3;i++)
{
switch(i)
{
case(0):
LSA=0;LSB=0;LSC=0; break;
case(1):
LSA=1;LSB=0;LSC=0; break;
case(2):
LSA=0;LSB=1;LSC=0; break;
default: break;
}
P0=temp[i];
delay(100);
P0=0x00;
}
}
//20ms
void delay20ms(void)
{
unsigned char a,b;
for(b=215;b>0;b--)
for(a=45;a>0;a--);
_nop_;
_nop_;
}
void delay(unsigned int i)
{
while (i --);
}
譯碼器