|
基于51單片機(jī)的數(shù)字鐘設(shè)計(jì),功能如下:1.正常走時 2.整點(diǎn)報(bào)時 3.鬧鐘設(shè)置 4.設(shè)置時數(shù)字高亮
(缺點(diǎn):PCB蜂鳴器正負(fù)需要反一下,自行改)
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
單片機(jī)源程序如下:
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define K_1 1
- #define K_2 2
- #define K_3 3
- #define K_4 4
- sbit K1=P3^1; //功能鍵,按一次調(diào)節(jié)時間,按兩次設(shè)置鬧鐘,按三次確定
- sbit K2=P3^0; //移位鍵
- sbit K3=P3^2; //調(diào)時加鍵
- sbit K4=P3^3; //調(diào)時減鍵
- uint w,s,f,m; //時分秒
- uint s1=0,f1=0,m1=0; //鬧鐘的時分秒
- uint b=0,a=0; //記錄K1,K2的鍵值
- uint j,i=0; //j空循環(huán),i是標(biāo)志,避免開機(jī)鬧鐘響
- uint temp=0; //判斷掃描標(biāo)志位
- uint clock[3]; //記錄鬧鐘設(shè)置的時間
- uint shi=0,fen=0,miao=0;//使對應(yīng)位高亮的標(biāo)志
- static int key=0; //按鍵掃描的鍵值標(biāo)志
- sbit speak=P1^5; //蜂鳴器
- uchar led1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- void delay(unsigned int i) //延遲函數(shù)
- {
- while(i--);
- }
- void scan(uchar h,uchar m,uchar s) //輸入時分秒
- {
- uchar led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- P0=0X00;
- P0=led[s%10]; //秒個位
- P2=0x01; //第一位
- for(j=0;j<50;j++);
- P0=0X00;
- P0=led[s/10]; //秒十位
- P2=0x04; //第二位
- for(j=0;j<50;j++);
- P0=0X00;
- P0=led[m%10]; //分個位
- P2=0x08; //第三位
- for(j=0;j<50;j++);
-
- P0=0X00;
- P0=led[m/10]; //分十位
- P2=0x0C; //第四位
- for(j=0;j<50;j++);
- P0=0X00;
- P0=led[h%10]; //時個位
- P2=0x10; //第五位
- for(j=0;j<50;j++);
- P0=0X00;
- P0=led[h/10]; //時十位
- P2=0x14; //第六位
- for(j=0;j<50;j++);
- }
- void zoushi() interrupt 1 //走時中斷
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- w++;
- if(w==20) //機(jī)器周期計(jì)數(shù)
- {
- m++;
- w=0;
- if(m==60)
- {
- f++;
- m=0;
- if(f==60)
- {
- s++;
- f=0;
- if(s==24)
- s=0;
- }
- }
- }
- }
- uint KEY_Scan() //按鍵掃描
- {
-
- if(K1==0||K2==0||K3==0||K4==0)
- {
- for(j=0;j<10;j++);
- key=0;
- if(K1==0)
- {
- return K_1;
- }
- else if(K2==0)
- {
- return K_2;
- }
- else if(K3==0)
- {
- return K_3;
- }
- else if(K4==0)
- {
- return K_4;
- }
- else
- return 0;
- }
- }
- void xiaoshi() //調(diào)節(jié)
- {
- // temp=1;
- key=KEY_Scan();
- if(key==K_1)
- {
- a++;
- a%=3;
- while(!K1);
- // temp=1;//scan(s,f,m);
- }
- if(key==K_2)
- {
- b++;
- b%=3;
- while(!K2);
- // temp=1;//scan(s,f,m);
- }
-
- if(a==1)
- {
- P0=0X00;
- P0=0X06;
- P2=0X1c;
- for(j=0;j<10;j++);
- temp=1;
- if(b==0)
- {
- P0=0X00;
- P0=0X06;
- P2=0X18;
- for(j=0;j<10;j++);
- miao=1;
- if(key==K_3)
- {
- if(m==59)
- m=0;
- else
- m++;
- while(!K3);
- // temp=1;//scan(s,f,m);
- }
- if(key==K_4)
- {
- if(m==0)
- m=59;
- else
- m--;
- while(!K4);
- // temp=1;//scan(s,f,m);
- }
- }
- else if(b==1)
- {
- P0=0X00;
- P0=0X5B;
- P2=0X18;
- for(j=0;j<10;j++);
- fen=1;
- if(key==K_3)
- {
- if(f==59)
- f=0;
- else
- f++;
-
- while(!K3);
- // temp=1;//scan(s,f,m);
- }
- if(key==K_4)
- {
- if(f==0)
- f=59;
- else
- f--;
-
- while(!K4);
- // temp=1;//scan(s,f,m);
- }
- }
- else
- {
- P0=0X00;
- P0=0X4F;
- P2=0X18;
- for(j=0;j<10;j++);
- shi=1;
- if(key==K_3)
- {
- if(s==23)
- s=0;
- else
- s++;
- while(!K3);
- // temp=1;//scan(s,f,m);
- }
- if(key==K_4)
- {
- if(s==0)
- s=23;
- else
- s--;
- while(!K4);
- // temp=1;//scan(s,f,m);
- }
- }
- }
- else if(a==2)
- {
- i=1;
- P0=0X00;
- P0=0X5b;
- P2=0X1c;
- for(j=0;j<10;j++);
- temp=2;
- if(b==0)
- {
- P0=0X00;
- P0=0X06;
- P2=0X18;
- for(j=0;j<10;j++);
- miao=1;
- if(key==K_3)
- {
- if(m1==59)
- m1=0;
- else
- m1++;
- clock[0]=m1;
- while(!K3);
- // temp=1;//scan(s1,f1,m1);
- }
- if(key==K_4)
- {
- if(m1==0)
- m1=59;
- else
- m1--;
- clock[0]=m1;
- while(!K4);
- // temp=1;//scan(s1,f1,m1);
- }
- // miao=0;
- }
-
- else if(b==1)
- {
- P0=0X00;
- P0=0X5B;
- P2=0X18;
- for(j=0;j<10;j++);
- fen=1;
- if(key==K_3)
- {
- if(f1==59)
- f1=0;
- else
- f1++;
- clock[1]=f1;
- while(!K3);
- // temp=1;//scan(s1,f1,m1);
- }
- if(key==K_4)
- {
- if(f1==0)
- f1=59;
- else
- f1--;
- clock[1]=f1;
- while(!K4);
- // temp=1;//scan(s1,f1,m1);
- }
- // fen=0;
- }
-
- else
- {
- P0=0X00;
- P0=0X4F;
- P2=0X18;
- for(j=0;j<10;j++);
- shi=1;
- if(key==K_3)
- {
- if(s1==23)
- s1=0;
- else
- s1++;
- clock[2]=s1;
- while(!K3);
- // temp=1;//scan(s1,f1,m1);
- }
- if(key==K_4)
- {
- if(s1==0)
- s1=23;
- else
- s1--;
- clock[2]=s1;
- while(!K4);
- // temp=1;//scan(s1,f1,m1);
- }
- // shi=0;
- }
-
- }
- else
- {
- temp=0;
- }
- }
- void nao() //鬧鐘
- {
- if(i==1)
- {
- if((m==clock[0])&&(f==clock[1])&&(s==clock[2]))
- {
- speak=1;
- delay(10);
- speak=0;
- delay(10);
- }
- }
-
- }
- //void zhengdian() //整點(diǎn)報(bào)時
- //{
- // if((f==0)&&((m>=0)&&(m<=3)))
- // {
- // speak=1;
- // delay(10);
- // speak=0;
- // delay(10);
- // }
- //}
- void test()
- {
- if(temp==0)
- scan(s,f,m);
- else if(temp==1)
- {
-
- if(miao==1)
- {
- scan(s,f,m);
- P0=led1[m%10];
- P2=0X01;
- delay(500);
- P0=led1[m/10];
- P2=0X04;
- delay(500);
- miao=0;
- }
- else if(fen==1)
- {
- scan(s,f,m);
- P0=led1[f%10];
- P2=0X08;
- delay(500);
- P0=led1[f/10];
- P2=0X0C;
- delay(500);
- fen=0;
- }
- else if(shi==1)
- {
- scan(s,f,m);
- P0=led1[s%10];
- P2=0X10;
- delay(500);
- P0=led1[s/10];
- P2=0X14;
- delay(500);
- shi=0;
- }
- }
- else
- {
-
- if(miao==1)
- {
- scan(s1,f1,m1);
- P0=led1[m1%10];
- P2=0X01;
- delay(500);
- P0=led1[m1/10];
- P2=0X04;
- delay(500);
- miao=0;
- }
- else if(fen==1)
- {
- scan(s1,f1,m1);
- P0=led1[f1%10];
- P2=0X08;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
基于51的數(shù)字鐘設(shè)計(jì).7z
(739.09 KB, 下載次數(shù): 216)
2020-6-11 18:16 上傳
點(diǎn)擊文件名下載附件
代碼,原理圖,PCB
|
評分
-
查看全部評分
|