51單片機做的數(shù)字時鐘pcb及原理圖:
數(shù)字時鐘.7z
(45.39 KB, 下載次數(shù): 323)
2023-5-14 15:40 上傳
點擊文件名下載附件
數(shù)字時鐘
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
下面是源代碼:
- #include <reg51.h>
- unsigned char led[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00}; //用一維數(shù)組定義0-9、橫杠、全滅
- unsigned char num[10]={2,0,0,8,0,1,1,6,6,8} ;
- unsigned char a[8];
- unsigned char second=0,minute=0,hour=0;
- unsigned char minute1=0,hour1=0;
- unsigned char b[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //掃描
- unsigned char k=0;
- unsigned int temp; // 記錄1000毫秒為1秒的變量
- unsigned char M,S_flag; //M是模式,更新時間的4種模式加上正常模式 S_flag閃爍標志
- sbit K1=P3^0;
- sbit K2=P3^1;
- sbit K3=P3^2;
- sbit BEEP=P3^3;
- void delay(unsigned n) //0.2毫秒
- {
- int x,y;
- for(x=0;x<n;x++)
- for(y=0;y<24;y++);
- }
-
- void init()
- {
- M=0;
- S_flag=0; //閃爍標志位
- TMOD=0x10; //定時器1以方式1定時
- TH1=0xfc;
- TL1=0x18;
- EA=1; //打開總中斷
- ET1=1; //允許定時器1中斷
- TR1=1; //開啟定時器1 (開始定時計數(shù))
-
- }
- void display_led()
- {
- int x;
- char l,a,m;
- for(a=0;a<26;a++)
- {
- x=a-8;
- for(l=0;l<50;l++)
- {
- for(m=0;m<8;m++)
- {
- P2=b[m];
- if(x>=0&&x<10) P1=led[num[x]];
- else P1=led[11];
-
- delay(10);
- x++;
- }
- x-=8;
- }
- }
- }
- void time1() interrupt 3 //定時器1中斷函數(shù)
- {
- TH1=0xfc; //定時1ms
- TL1=0x18;
- temp++;
- if(temp==1000) //配合定時器定時1s
- { temp=0;
- second++;
- }
- if(second==59)
- { second=0;
- if(minute<59)
- minute++;
- else { minute=0;
- hour++;
- hour%=24;
- }
- }
- if(hour1==hour&&minute1==minute&&second<10) //鬧鐘時間到
- {
- BEEP=!BEEP;
-
- }
- if(temp%250==0) //每250ms
- S_flag=!S_flag; //閃爍標志位取反
-
-
-
-
- if(k==8) k=0;
- P1=a[k];
- P2=b[k++];
- delay(1);
- P2=0xff;
- }
- void display()
- {
- switch(M)
- {
- case 0:
- {
- a[0]=led[hour/10];
- a[1]=led[hour%10];
- a[2]=led[10];
- a[3]=led[minute/10];
- a[4]=led[minute%10];
- a[5]=led[10];
- a[6]=led[second/10];
- a[7]=led[second%10];
- }break;
- case 1:
- {
- if(S_flag==1)
- {
- a[0]=led[hour/10];
- a[1]=led[hour%10];
- }
- else
- {
- a[0]=led[11];
- a[1]=led[11];
- }
- a[2]=led[10];
- a[3]=led[minute/10];
- a[4]=led[minute%10];
- a[5]=led[10];
- a[6]=led[second/10];
- a[7]=led[second%10];
- }break;
- case 2:
- {
- a[0]=led[hour/10];
- a[1]=led[hour%10];
- a[2]=led[10];
- if(S_flag==1)
- {
- a[3]=led[minute/10];
- a[4]=led[minute%10];
- }
- else
- {
- a[3]=led[11];
- a[4]=led[11];
- }
- a[5]=led[10];
- a[6]=led[second/10];
- a[7]=led[second%10];
- }break;
- case 3:
- {
- if(S_flag==1)
- {
- a[0]=led[hour1/10];
- a[1]=led[hour1%10];
- }
- else
- {
- a[0]=led[11];
- a[1]=led[11];
- }
- a[2]=led[10];
- a[3]=led[minute1/10];
- a[4]=led[minute1%10];
- a[5]=led[10];
- a[6]=led[11];
- a[7]=led[11];
- }break;
- case 4:
- {
- a[0]=led[hour1/10];
- a[1]=led[hour1%10];
- a[2]=led[10];
- if(S_flag==1)
- {
- a[3]=led[minute1/10];
- a[4]=led[minute1%10];
- }
- else
- {
- a[3]=led[11];
- a[4]=led[11];
- }
- a[5]=led[10];
- a[6]=led[11];
- a[7]=led[11];
- }
- }
- }
- void key_prc()
- {
-
- if(K1==0)
- {
- delay(10); //延時去抖
- if(K1==0) //按K1進行模式切換
- { M++;
- if(M==5)
- M=0;
- }
- while(!K1);//等待按鍵釋放
- }
-
- if(M!=0)
- {
- switch(M)
- {
- case 1: //模式1——調(diào)時
- {
- if(K2==0)
- {
- delay(10); //延時去抖
- if(K2==0) //加鍵按下
- {
- if(hour<23) hour++;
- else hour=0;
- }
- while(!K2); //等待按鍵釋放
- }
-
- if(K3==0)
- {
- delay(10);
- if(K3==0)
- {
- if(hour> 0) hour--;
- else hour=23;
- }
- while(!K3);
- }
- } break;
-
- case 2: //模式2——調(diào)分
- {
- if(K2==0)
- {
- delay(10);
- if(K2==0)
- {
- if(minute<59) minute++;
- else minute=0;
- }
- while(!K2);
- }
-
- if(K3==0)
- {
- delay(10);
- if(K3==0)
- {
- if(minute>0) minute--;
- else minute=59;
- }
- while(!K3);
- }
- } break;
-
- case 3: //模式3——鬧鐘調(diào)時
- {
- if(K2==0)
- {
- delay(10);
- if(K2==0)
- {
- if(hour1<23)
- hour1++;
- else hour1=0;
- }
- while(!K2);
- }
-
- if(K3==0)
- {
- delay(10);
- if(K3==0)
- { if(hour1>0)
- hour1--;
- else hour1=23;
- }
- while(!K3);
- }
- } break;
-
- case 4: //模式4——鬧鐘調(diào)分
- {
- if(K2==0)
- {
- delay(10);
- if(K2==0)
- {
- if(minute1<59)
- minute1++;
- else minute1=0;
- }
- while(!K2);
- }
-
- if(K3==0)
- {
- delay(10); //延時去抖
- if(K3==0) //減鍵按下
- { if(minute1>0)
- minute1--;
- else minute1=59;
- }
- while(!K3);
- }
- } break;
- }
- }
- }
- void main()
- {
- display_led();
- init();
- while(1)
- {
- key_prc();
- display();
- }
- }
復制代碼
|