运用89C51单片机实现对数码管和喇叭的控制,运用按键设置单片机的实时时间和响铃时间。
仿真视频:
https://www.bilibili.com/video/BV1nY4y1B7wu/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit sounder=P3^6;
bit sound_time=0;
uchar sec,min,hour;
uchar sec_xg,min_xg,hour_xg;
uchar sec_change,min_change,hour_change;
uint code digi[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
uchar code guan[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar bell_hour[]={8,8,8,9,10,10,11,11,14,14,14,15,16,16,17,17};
uchar bell_min[]={0,45,55,40,10,55,5,50,0,40,55,40,10,55,5,50};
uchar temp=0;
uint time_con=0;
uchar w,w1=0;
uchar flag1,flag2,flag3,flag=0,flag4=1;
uchar findflag=0,xgflag=0;
uchar key;
uchar change;
uchar t,t1;
uchar a=0,b=0;
void delay(uint t1)
{ uchar i,j;
for(i=0;i<t1;i++)
for(j=0;j<30;j++);
}
void play()
{
if(w>=1)
{
w1=0;
flag=1;
}
else
{ if(flag==1&&flag4==1)
w=0;
if(flag==1&&flag4==1&&a==1)
{ w1=1;
}
}
P0=guan[0];
P2=digi[sec%10];
if(w1==1)delay(7);
else delay(40);
P0=guan[1];
P2=digi[sec/10];
if(w==1)delay(7);
else delay(40);
P0=guan[2];
P2=digi[10];
delay(40);
P0=guan[3];
P2=digi[min%10];
if(w==3) delay(7);
else delay(40);
P0=guan[4];
P2=digi[min/10];
if(w==4)delay(7);
else delay(40);
P0=guan[5];
P2=digi[10];
delay(40);
P0=guan[6];
P2=digi[hour%10];
if(w==6)delay(7);
else delay(40);
P0=guan[7];
P2=digi[hour/10];
if(w==7) delay(7);
else delay(40);
}
void belltime()interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
sounder=!sounder;
time_con++;
if(time_con==9760)
{
time_con=0;
sound_time=0;
}
}
void time()interrupt 1
{
uchar i;
flag1=0;
flag2=0;
flag3=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(temp>19)
{
temp=0;
sec++;
if(sec>59)
{
sec=0;
min++;
if(min>59)
{ min=0;
hour++;
if(hour>23)
hour=0;
}
}
}
else temp++;
if(sec==0)
flag1=1;
if(t==0)
{
for(i=t;i<23;i++)
{
if(min==bell_min[i])
flag2=1;
if(hour==bell_hour[i])
flag3=1;
if(flag2==1&&flag3==1)
{ break;}
}
}
if(t>0)
{ if(bell_min[t]==0&&bell_hour[t]==0)
{ b=1;}
if(min==bell_min[t])
flag2=1;
if(hour==bell_hour[t])
flag3=1;
}
if(flag1==1&&flag2==1&&flag3==1&&b==0)
{ t++;
sound_time=1;
flag1=0;
flag2=0;
flag3=0;
}
if(b==1)
t=0;
}
void xiugai()
{
TR0=0;
w1=1;
sec_xg=sec;
min_xg=min;
hour_xg=hour;
}
void find()
{ TR0=0;
sec_change=sec;
min_change=min;
hour_change=hour;
hour=bell_hour[change];
min=bell_min[change];
sec=0;
}
void jia()
{
if(xgflag>0)
{ if(w==0)
{ sec++;
if(sec>=60)
sec=0;
}
if(w==1)
{ sec=sec+10;
if(sec>=60)
sec=0;
}
if(w==3)
{ min++;
if(min>=60)
min=0;
}
if(w==4)
{min=min+10;
if(min>=60)
min=0;
}
if(w==6)
{ hour++;
if(hour>=24)
hour=0;
}
if(w==7)
{ hour=hour+10;
if(hour>=24)
hour=0;
}
}
}
void jian()
{ if(xgflag>0)
{ if(w==0)
{ sec--;
if(sec<0)
sec=0;
}
if(w==1)
{ sec=sec-10;
if(sec<0)
sec=0;
}
if(w==3)
{ min--;
if(min<0)
min=0;
}
if(w==4)
{ min=min-10;
if(min<0)
min=0;
}
if(w==6)
{ hour--;
if(hour<0)
hour=0;
}
if(w==7)
{ hour=hour-10;
if(hour<0)
hour=0;
}
}
}
void save()
{
TR0=0;
if(xgflag>0)
{w1=0;
w=0;
flag4=0;
}
if(t1>0)
{ bell_hour[change]=hour;
bell_min[change]=min;
sec=sec_change;
min=min_change;
hour=hour_change;
}
}
void cancel()
{ TR0=1;
if(xgflag>0)
{ if((sec_xg!=sec)||(min_xg!=min)||(hour_xg!=hour))
{ sec=sec_xg;
min=min_xg;
hour=hour_xg;
}
w1=0;
w=0;
flag4=0;
}
if(t1>0)
{ sec=sec_change;
min=min_change;
hour=hour_change;
}
}
void main()
{ uchar i;
P0=0x00;
P2=0x3f;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
ET1=1;
sec=55;
min=59;
hour=7;
flag1=0;
flag2=0;
flag3=0;
t=0;
key=P1;
w=0;
change=1;
t1=0;
while(1)
{ play();
if(sound_time)
TR1=1;
else TR1=0;
P1=0xff;
key=P1;
if(key!=0xff)
for(i=0;i<30;i++)
play();
switch(key)
{
case 0xfe:xgflag++;findflag=0;w=0;xiugai();break;
case 0xfd:jia();break;
case 0xfb:jian();break;
case 0xf7:if(xgflag>0)
{ w++;
if(w>7)
w=0;
}
if(findflag>0)
{ change++;
hour=bell_hour[change];
min=bell_min[change];
sec=0;
if(change>23)
change=0;
}break;
case 0xef: if(xgflag>0)
{ w--;
if(w<0) w=7;}
if(findflag>0)
{ change--;
hour=bell_hour[change];
min=bell_min[change];
sec=0;
if(change<0)
change=23;}break;
case 0xdf: cancel();xgflag=0;findflag=0;t1=0;break;
case 0xbf: save();xgflag=0;findflag=0;t1=0;break;
case 0x7f: findflag++;w=0;t1=1;find();break;
}
}
}