“彼岸之光”倒計(jì)時(shí)牌設(shè)計(jì)書(shū)
一.設(shè)計(jì)構(gòu)想 ⒈設(shè)計(jì)一個(gè)倒計(jì)時(shí)牌。 ⒉倒計(jì)時(shí)牌由九個(gè)數(shù)碼管分別顯示“天”、“時(shí)”、“分”、“秒”,其中“天”為三位,“時(shí)”、“分”、“秒”各兩位。 ⒊倒計(jì)時(shí)牌設(shè)置兩個(gè)按鍵:select/start鍵和set鍵,用來(lái)設(shè)置計(jì)時(shí)時(shí)間(只能設(shè)置整天)。當(dāng)按select/start鍵時(shí),“天”的百位、十位、個(gè)位依次閃爍,閃爍位表明當(dāng)前位被選中,此時(shí)按set鍵進(jìn)行調(diào)整。三位調(diào)整完畢再按下select/start鍵,倒計(jì)時(shí)開(kāi)始。 二.實(shí)現(xiàn)方法 ⒈定時(shí)器0工作在方式1(16位)下定時(shí)一秒,每秒觸發(fā)依次,使“秒”變量減一,相當(dāng)于秒針。 ⒉兩個(gè)按鍵:select/start鍵和set鍵分別使用兩個(gè)外部中斷INT0和INT1(設(shè)置下降沿有效)。當(dāng)相應(yīng)的按鍵按下時(shí),觸發(fā)相應(yīng)的中斷子程序。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

單片機(jī)源程序如下:
- #include <reg51.h>
- #include <stdio.h>
- void timer0_init(); //定時(shí)器0初始化
- void delay(int); //延時(shí)程序
- void trans_led(int,int,int,int); //數(shù)碼管顯示傳送函數(shù)
- sbit P10=0x90; //管腳定義
- sbit P30=0xB0;
- sbit P20=0xA0;
- int day=0,hour=0,min=0,sec=0; //定義時(shí)間變量
- unsigned int state=0; //運(yùn)行狀態(tài)標(biāo)志
- unsigned int asec=0; //記錄定時(shí)器0中斷次數(shù),當(dāng)asec=20時(shí)計(jì)時(shí)為1s
- unsigned int check_b=0,check_s=0,check_g=0; //記錄set鍵的按下次數(shù)
- char table[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //定義表格
- main(){
- timer0_init();
- EX0=1;
- EX1=1;
- IT0=1;
- IT1=1;
- EA=1;
- TR0=1;
- while(1){
- switch(state){
- case(1):trans_led(100,5,10,10); //"天"的百位閃爍
- break;
- case(2):trans_led(10,100,5,10); //"天"的十位閃爍
- break;
- case(3):trans_led(10,10,100,5); //"天"的個(gè)位閃爍
- break;
- default:trans_led(0,20,20,20); //正常運(yùn)行
- break;
-
- }
- }
- }
- void timer0_init(){
- TMOD=0x21;
- TH0=0x3C;
- TL0=0xB0;
- ET0=1;
- TF0=0;
- }
- void Timer0_overflow() interrupt 1 using 0{
- TH0=0x3C;
- TL0=0xB0;
- asec++;
- if(asec==20){ //定時(shí)一秒
- asec=0;
- if(sec==0){
- sec+=60;
- min--;
- }
- if(min<0){
- min+=60;
- hour--;
- }
- if(hour<0){
- hour+=24;
- day--;
- }
- if(day>=0){ //計(jì)時(shí)時(shí)間未完,秒減一
- sec--;
- }
- else{
- day=hour=min=sec=0; //計(jì)時(shí)結(jié)束
- TR0=0;
- }
- }
- }
- void Int0() interrupt 0 using 0{ //set鍵
- if(state>4)
- state=1;
- else
- state++;
- if(state==4){
- state=0;
- TR0=1;
- }
- }
- void Int1() interrupt 2 using 0{ //select/start鍵
-
- if(state>=1&&state<=3){
- TR0=0;
- hour=min=sec=0;
- timer0_init();
- }
- switch(state){
- case(1):day+=100;
- check_b++;
- break;
- case(2):day+=10;
- check_s++;
- break;
- case(3):day++;
- check_g++;
- break;
- default:break;
- }
-
- if(check_b>9) //計(jì)時(shí)范圍限制
- day-=1000;
- if(check_s>9){
- day-=100;
- }
- if(check_g>9){
- day-=10;
- }
-
- }
- void delay(int time){
- int i,j;
- for(i=0;i<=time;i++){
- for(j=0;j<=10;j++);
- }
- }
- void trans_led(int a,int b,int c,int d){
- //顯示秒
- P2=0xFE;
- P1=table[sec%10];
- delay(20);
- P2=0xFF;
-
- P2=0xFD;
- P1=table[sec/10];
- delay(20);
- P2=0xFF;
-
- //顯示分
- P2=0xFB;
- P1=table[min%10];
- delay(20);
- P2=0xFF;
-
- P2=0xF7;
- P1=table[min/10];
- delay(20);
- P2=0xFF;
-
-
- //顯示時(shí)
- P2=0xEF;
- P1=table[hour%10];
- delay(20);
- P2=0xFF;
-
- P2=0xDF;
- P1=table[hour/10];
- delay(20);
-
-
-
- //顯示天
- delay(a);
- P2=0xFF;
- P30=0;
- check_b=day/100;
- P1=table[check_b];
- delay(b);
- P2=0xFF;
-
-
- P30=1;
- P2=0x7F;
- check_s=(day/10)%10;
- P1=table[check_s];
- delay(c);
- P2=0xFF;
-
- P2=0xBF;
- check_g=day%10;
- P1=table[check_g];
- delay(d);
- P2=0xFF;
-
-
-
- }
復(fù)制代碼 全部資料51hei下載地址:
倒計(jì)時(shí)牌.zip
(540.18 KB, 下載次數(shù): 137)
2019-3-10 15:42 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|