运用89C51单片机实现对数码管和喇叭的控制,运用按键设置单片机的实时时间和响铃时间。
#include#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 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; } } }



