|
數(shù)字鐘仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機(jī)源程序如下:
- #include<reg51.h> //包含51單片機(jī)的頭文件
- unsigned char code teble[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//包含數(shù)碼位碼
- unsigned char code table[10]={0Xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0Xf8,0X80,0X90};//數(shù)碼管斷碼
- unsigned char shijian[6]={0,0,0,0,0,0};//時(shí)間顯示
- unsigned char shijian2[6]={0,0,0,0,0,0};//星期顯示
- unsigned char nyr[6]={0,0,0,0,0,0}; //年月日顯示
- unsigned char nyr1[6]={0,0,0,0,0,0};
- void zh(); //狀態(tài)函數(shù)
- void display(); //顯示函數(shù)
- void week();//星期顯示
- void miaobiao();//秒表顯示
- unsigned char keysc();//按鍵模塊
- void mDelay(unsigned int Delay); //延遲函數(shù)
- unsigned char hour,sec,minute;//定義小時(shí),分鐘,秒
- unsigned char day=22,month=05,year=18; //定義day month ,year
- unsigned char i,w,year1,j,se,fe,mi; //定義i,w,year1,j,se,fe,mi.
- sbit k1=P1^4;//按鍵k1=P1.0;
- sbit k2=P1^1;//按鍵k1=P1.1;
- sbit k3=P1^2; //按鍵k1=P1.21;
- sbit k4=P1^3;//按鍵k1=P1.3;
- unsigned char display_state=0;
-
- unsigned char keysc() //按鍵模塊
- {if(!k1) //判斷按鍵按下
- {mDelay(5); //延時(shí)消抖
- if(!k1)
- while(!k1) display(); //判斷按鍵是否按下返回,因?yàn)榘聪聲r(shí)k1=0即!k1=1,display是消閃爍,一起來(lái)控制按下按鍵為一次的變量
- return 1;
- }
- if(!k2) //判斷按鍵按下
- {mDelay(5); //延時(shí)消抖
- if(!k2)
- while(!k2) display(); //判斷按鍵是否按下返回,因?yàn)榘聪聲r(shí)k1=0即!k1=1,display是消閃爍,一起來(lái)控制按下按鍵為一次的變量
- return 2;
- }
- if(!k3)
- {mDelay(5);
- if(!k3)
- while(!k3) display(); //同上所示
- return 3;
- }
- if(!k4)
- {mDelay(5);
- if(!k4)
- while(!k4) display(); //如上所示
- return 4;
- }
- return 0;
- }
- void display() //顯示模塊
- {unsigned char k; //定義k
- unsigned char y; //定義y
- unsigned char data1; //定義data1
- if(display_state==0)
- {
- for(k=0;k<6;k++) //使得k等于0到6
- {y=0x00;
- if(k==2||k==4) y=0x80;
- P2=0X00;
- data1=shijian[k];
- P0=table[data1]-y;
- P2=teble[k];
- mDelay(2);
- }
- }
- if(display_state==1)
- {
- for(k=0;k<6;k++)
- {y=0x00;
- if(k==2||k==4) y=0x80;
- P2=0X00;
- data1=nyr[k];
- P0=table[data1]-y;
- P2=teble[k];
- mDelay(2);
- }
- }
- if(display_state==2)
- {for(k=0;k<6;k++)
- {y=0x00;
- if(k==2||k==4) y=0x80;
- P2=0X00;
- data1=nyr1[k];
- P0=table[data1]-y;
- P2=teble[k];
- mDelay(2);
- }
- }
- if(display_state==3)
- {for(k=0;k<6;k++)
- {y=0x00;
- if(k==2||k==4) y=0x80;
- P2=0X00;
- data1=shijian2[k];
- P0=table[data1]-y;
- P2=teble[k];
- mDelay(2);
- }
- }
- }
- void mDelay(unsigned int Delay)
- {unsigned int k;
- for(;Delay>0;Delay--)
- {for(k=0;k<54;k++);
- }
- }
- void t0() interrupt 1 //外部中斷0
- {
- TH0=55536/256;
- TL0=55536%256;
- i++;
- }
- void t1() interrupt 3 //定時(shí)器中斷1
- {TH0=55536/256;
- TL0=55536%256;
- j++;
- }
- void zh() //轉(zhuǎn)換模塊
- {
- if(i==100)
- { i=0;sec++;
- if(sec==60) {sec=0;minute++;}
- if(minute==60) {minute=0;hour++;}
- if(hour==24) {hour=0;day++;}
- if(day==31) {day=0;month++;}
- if(month==12) {month=0;year++;}
- if(year==99) {year=0;}
-
-
- if(month==1||month==5||month==7||month==8||month==10||month==12)
- if(day==31){day=0;month++;}
- if(month==3||month==4||month==6||month==9||month==11)
- if(day==30){day=0;month++;}
- if(month==12){month=0;year++;}
- if(year/4==0)if(month==2)if(day==29)
- {day=0;month++;}
- else if(month==2)if(day==28)
- {day=0;month++;}
-
-
-
- }
- if(display_state==0)
-
- shijian[0]=sec%10;
- shijian[1]=sec/10;
- shijian[2]=minute%10;
- shijian[3]=minute/10;
- shijian[4]=hour%10;
- shijian[5]=hour/10;
-
- if(display_state==1)
- nyr[0]=day%10;
- nyr[1]=day/10;
- nyr[2]=month%10;
- nyr[3]=month/10;
- nyr[4]=year%10;
- nyr[5]=year/10;
- if(display_state==3)
- shijian2[0]=j%10;
- shijian2[1]=j/10;
- shijian2[2]=se%10;
- shijian2[3]=se/10;
- shijian2[4]=fe%10;
- shijian2[5]=fe/10;
-
- }
- void week() //星期顯示模塊
- {if(month==1||month==2)
- {month+=12;
- year--;
- }
- year1=year+2000;
- if(month==1||month==2) {month+=12; year1--;}
- w=(day+2*month+3*(month+1)/5+year1+year1/4-year1/100+year1/400)%7;
- nyr1[0]=w+2;
- }
- void miaobiao()
- { if(j==100)
- {se++;j=0; j=0; }
- if(se==60){ fe++;se=0;
- }
- shijian2[0]=j%10;
- shijian2[1]=j/10;
- shijian2[2]=se%10;
- shijian2[3]=se/10;
- shijian2[4]=fe%10;
- shijian2[5]=fe/10;
- }
-
- void main()
- {
- unsigned char key; //定義key
- unsigned char mun=0;//定義mun
- TMOD=0X01;
- TH0=55536/256;
- TL0=55536%256;
- TR0=1;
- EA=1;
- ET0=1; //采用定時(shí)器0的方式0;
- TMOD=0X11;
- TH0=55536/256;
- TL0=55536%256;
- TR1=0;
- EA=1;
- ET1=1; //采用定時(shí)器1的方式工作方式1
- while(1) //循環(huán)
- {
- week(); //星期顯示
- zh(); //狀態(tài)庫(kù)
- display(); //顯示模塊
- miaobiao(); //秒表顯示
- key=keysc(); //使得key等于按鍵的值
- zh(); //狀態(tài)顯示
- display(); //顯示
- switch(key)
- {
- case 1:if(display_state==0)//如果display_state==0等于0
- {TR0=0;mun++;if(mun>3) {mun=0;TR0=1;}}//讓定時(shí)器0停止工作如果mun大于3那么定時(shí)器從新開(kāi)始;
- if(display_state==1) //如果display_state==0等于1那么執(zhí)行以下代碼
- {TR0=0;mun++;if(mun>3) {mun=0;TR0=1;}} break;
- case 2:if(display_state==0) //如果display_state==0等于0
- {
- if(mun==1) {sec++; if(sec==60) sec=00;} //如果mun等于1,秒加加,當(dāng)秒加到60的時(shí)候秒等于0
- if(mun==2) {minute++; if(minute==60) minute=00;} //如果mun等于1,。分加加,當(dāng)分加到60的時(shí)候分等于0
- if(mun==3) {hour++; if(hour==24) hour=00;} //如果hour等于1,shi加加,當(dāng)shi加到60的時(shí)候秒等于0
- }
- if(display_state==1)
- {
- if(mun==1) {day++; if(day==32)day=00;}
- if(mun==2) {month++; if(month==12) month=00;}
- if(mun==3) {year++; if(year==99) year=00;}
- }
- if(display_state==2) //display_state等于2的時(shí)候
- {
- if(mun==1) {w++; if(w==7)day=01;} //并且mun等于1的時(shí)候w++,當(dāng)w等于
- }
- if(display_state==3)
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
新建文件夾 (2).rar
(57.66 KB, 下載次數(shù): 29)
2018-7-2 17:50 上傳
點(diǎn)擊文件名下載附件
數(shù)字鐘
|
|