基于51單片機的電子時鐘設(shè)計 程序和仿真
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (17.85 KB, 下載次數(shù): 76)
下載附件
2018-6-12 00:43 上傳
單片機源程序如下:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit duan = P1^6; //段選
- sbit wei = P1^7; //位選
- sbit S1 = P3^6; //暫停鍵
- sbit S2 = P3^5; //增加鍵
- sbit S3 = P3^4; //減少鍵
- sbit S4 = P3^1; //鬧鐘設(shè)置鍵
- sbit S5 = P3^0; //鬧鐘啟用停止鍵
- sbit BEE = P1^5;//蜂鳴器
- uchar code aaa[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- uchar temp,out = 1,qq = 0,ww = 0,H,M,S,j1,j2,k1,k2,l1,l2;
- uchar H1 = 0,M1 = 0,Sa = 0,j10,j20,k10,k20,l10,l20,SS = 0;
- uint UT;
- void delayMS(x) //延時函數(shù),單位毫秒
- {
- uint a , b;
- for(a = 0 ; a < x ; a++ )
- for(b = 0 ; b < 110 ; b++);
- }
- void play(uint h1 , uint h2 , uint m1 , uint m2 , uint s1 , uint s2) //時分秒的顯示
- {
- wei = 1; //時的十位
- P2 = 0x7f;
- wei = 0;
- duan = 1;
- P0 = aaa[h1];
- duan = 0;
- delayMS(3);
- wei = 1; //時的個位
- P2 = 0xbf;
- wei = 0;
- duan = 1;
- P0 = aaa[h2];
- duan = 0;
- delayMS(3);
- wei = 1; //分的十位
- P2 = 0xdf;
- wei = 0;
- duan = 1;
- P0 = aaa[m1];
- duan = 0;
- delayMS(3);
- wei = 1; //分的個位
- P2 = 0xef;
- wei = 0;
- duan = 1;
- P0 = aaa[m2];
- duan = 0;
- delayMS(3);
- wei = 1; //秒的十位
- P2 = 0xf7;
- wei = 0;
- duan = 1;
- P0 = aaa[s1];
- duan = 0;
- delayMS(3);
- wei = 1; //秒的個位
- P2 = 0xfb;
- wei = 0;
- duan = 1;
- P0 = aaa[s2];
- duan = 0;
- delayMS(3);
- }
- void stopfunc() //S1鍵函數(shù) 暫停
- {
- if(S1 == 0)
- {
- while(!S1);
- qq++;
- out = 0; //暫停
- TR0 = 0;
- }
- }
- void WWS4() //鬧鐘設(shè)置
- {
- if(S4 == 0)
- {
- while(!S4);
- ww++;
- }
- }
- void begin() //S5鍵 鬧鐘啟動和停止
- {
- if(S5 == 0)
- {
- while(!S5);
- SS = !SS;
- }
- }
- void ala() //鬧鐘控制蜂鳴器
- {
- if((H == H1) && (M == M1) && (SS == 1))
- {
- BEE = 0;
- }
- if((H == H1) && (M == M1+1) || (SS == 0))
- {
- BEE = 1;
- }
- }
- void buttfunc() //S2鍵、S3鍵函數(shù) 調(diào)時
- {
-
- if(qq == 1) //第一次按S1時,調(diào)秒
- {
- if(S2 == 0)
- {
- while(!S2);
- if(S < 59)
- {
- S++;
- }
- else
- {
- S = 0;
- }
- delayMS(5);
- }
- if(S3 == 0)
- {
- while(!S3);
- if(S > 0)
- {
- S--;
- }
- else
- {
- S = 59;
- }
- delayMS(5);
- }
- j1=H%10;
- j2=H/10;
- k1=M%10;
- k2=M/10;
- l1=S%10;
- l2=S/10;
- play(j2,j1,k2,k1,l2,l1);
- }
- if(qq == 2) //第二次按S1時,調(diào)分
- {
- if(S2 == 0)
- {
- while(!S2);
- if(M < 59)
- {
- M++;
- }
- else
- {
- M = 0;
- }
- delayMS(5);
- }
- if(S3 == 0)
- {
- while(!S3);
- if(M > 0)
- {
- M--;
- }
- else
- {
- M = 59;
- }
- delayMS(5);
- }
- j1=H%10;
- j2=H/10;
- k1=M%10;
- k2=M/10;
- l1=S%10;
- l2=S/10;
- play(j2,j1,k2,k1,l2,l1);
- }
- if(qq == 3) //第三次按S1時,調(diào)時
- {
- if(S2 == 0)
- {
- while(!S2);
- if(H < 23)
- {
- H++;
- }
- else
- {
- H = 0;
- }
- delayMS(5);
- }
- if(S3 == 0)
- {
- while(!S3);
- if(H > 0)
- {
- H--;
- }
- else
- {
- H = 23;
- }
- delayMS(5);
- }
- j1=H%10;
- j2=H/10;
- k1=M%10;
- k2=M/10;
- l1=S%10;
- l2=S/10;
- play(j2,j1,k2,k1,l2,l1);
- }
- if(qq == 4) //第四次 ,設(shè)鬧鐘
- {
- j10=H1%10;
- j20=H1/10;
- k10=M1%10;
- k20=M1/10;
- l10=Sa%10;
- l20=Sa/10;
- play(j20,j10,k20,k10,l20,l10);
- if(ww == 1)
- {
- if(S2 == 0)
- {
- while(!S2);
- if(M1 < 59)
- {
- M1++;
- }
- else
- {
- M1 = 0;
- }
- delayMS(5);
- }
- if(S3 == 0)
- {
- while(!S3);
- if(M1 > 1)
- {
- M1--;
- }
- else
- {
- M1 = 59;
- }
- }
- }
- if(ww == 2)
- {
- if(S2 == 0)
- {
- while(!S2);
- if(H1 < 23)
- {
- H1++;
- }
- else
- {
- H1 = 0;
- }
- delayMS(5);
- }
- if(S3 == 0)
- {
- while(!S3);
- if(H1 > 1)
- {
- H1--;
- }
- else
- {
- H1 = 23;
- }
- }
- }
- }
-
- if(qq == 5) //第五次按S1時,繼續(xù)計時
- {
- while(!S1);
- qq = 0;
- ww = 0;
- out = 1;
- }
- }
- void main()
- {
- TMOD = 0x01; //定時器0
- IE = 0x83; //中斷打開,打開外部中斷0和定時器0中斷
- TH0 = (65536 - 46080)/256; //初值:2^16=65536 11.0592*10^6 * 50*10^(-3)=46080 (晶振*中斷時間)
- TL0 = (65536 - 46080)%256;
- while(1)
- {
- stopfunc();
- begin();
- ala();
- if(out == 1)
- {
- TR0 = 1;
- if(UT == 20) //1秒鐘到了----20*50=1000ms
- {
- UT = 0;
- S++;
- if(S == 60)
- {
- S=0;
- M++;
- if(M == 60)
- {
- M = 0;
- H++;
- if(H == 24) //24小時制
- {
- H = 0;
- }
- }
- }
- }
-
- j1=H%10;
- j2=H/10;
- k1=M%10;
- k2=M/10;
- l1=S%10;
- l2=S/10;
- play(j2,j1,k2,k1,l2,l1);
-
- }
- else
- {
- WWS4();
- buttfunc();
- }
- }
- }
- void TIME() interrupt 1
- {
- TH0 = (65536 - 46080)/256; //重裝初值
- TL0 = (65536 - 46080)%256;
- UT++;
- }
-
復(fù)制代碼
0.png (42.01 KB, 下載次數(shù): 68)
下載附件
2018-6-12 00:44 上傳
所有資料51hei提供下載:
51電子時鐘.zip
(19.76 KB, 下載次數(shù): 192)
2018-6-10 23:44 上傳
點擊文件名下載附件
程序+仿真 下載積分: 黑幣 -5
|