|
電子時(shí)鐘、秒表及鬧鐘仿真圖及程序
- /************************************************/
- /**設(shè)計(jì)題目:數(shù)字電子鐘**/
- /**設(shè)計(jì)要求:能顯示時(shí),分,秒,能對(duì)時(shí),分進(jìn)行調(diào)節(jié),有秒表功能.**/
- /**設(shè)計(jì)人: 史亞林 (西安科技大學(xué))于2011年5月 QQ:598241556**/
- /************************************************/
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit qingling=P1^0; //清零
- sbit tiaofen=P1^1; //調(diào)分
- sbit tiaoshi=P1^2; //調(diào)時(shí)
- sbit sounder=P1^7; //naozhong
- uint a,b;
- uchar hour,minu,sec, //時(shí)鐘
- hour0,minu0,sec0,//秒表
- hour1,minu1,sec1;
- h1,h2,m1,m2,s1,s2,//顯示位
- k,s;//狀態(tài)轉(zhuǎn)換標(biāo)志
-
- uchar code select[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
- uchar code table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- /*****************函數(shù)聲明***********************/
- void keyscan();
- void init();
- void delay(uchar z);
- void display(uchar,uchar,uchar);
- void sounde();
- /*****************主函數(shù)*************************/
- void main()
- {
- init();
- while(1)
- {
- while(TR1)
- {
-
- keyscan(); //掃描函數(shù)
- while(s==1) ///////////////s是狀態(tài)標(biāo)志,當(dāng)s=0時(shí),鬧鐘取消。s=1時(shí),設(shè)定鬧鐘時(shí)間(也是通過調(diào)時(shí),調(diào)分函數(shù));
- { //s=2時(shí),鬧鐘工作,時(shí)間與設(shè)定時(shí)刻一致時(shí),鬧鐘響(一分鐘后自動(dòng)關(guān)閉,可手動(dòng)關(guān)閉)。再次切換,s=0.
- keyscan(); //s狀態(tài)切換(0-》1-》2-》0)通過外部中斷1實(shí)現(xiàn)。
- display(hour1,minu1,sec1); //鬧鐘時(shí)刻顯示
- }
- display(hour0,minu0,sec0);//時(shí)鐘表顯示
-
- while(k) /*k是秒表狀態(tài)(0-》1-》2-》0)通過外部中斷0實(shí)現(xiàn)。0秒表關(guān);1秒表從零計(jì)時(shí);2秒表停,顯示計(jì)時(shí)時(shí)間*/
- {
- display(hour,minu,sec); //秒表顯示
- }
-
- }
- }
- }
- /*****************初始化函數(shù)***********************/
- void init()
- {
- a=0;
- b=0;
- k=0;
- s=0;
- hour0=0;
- minu0=0;
- sec0=0;
- hour=0;
- minu=0;
- sec=0;
- hour1=0;
- minu1=0;
- sec1=0;
- TMOD=0x11; //定時(shí)器0,1工作于方式1;賦初值
- TH0=(65536-5000)/256;
- TL0=(65536-5000)%256;
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
-
- EA=1;
- EX0=1; //秒表中斷
- EX1=1; //鬧鐘設(shè)定中斷
- ET0=1;
- ET1=1;
- IT0=1; //邊沿觸發(fā)方式
- IT1=1;
- PX0=1;
- PX1=1;
-
- TR0=0; //初始,秒表不工作
- TR1=1; //時(shí)鐘一開始工作
- }
- /*****************定時(shí)器0中斷*************/
- void timer0_int() interrupt 1 //秒表
- {
- TH0=(65536-5000)/256;
- TL0=(65536-5000)%256;
- a++;
- if(a==2)
- {
- a=0;
- sec++;
- if(sec==100)
- {
- sec=0; //毫秒級(jí)
- minu++;
- if(minu==60)
- {
- minu=0; //秒
- hour++;
- if(hour==60) //分
- {
- hour=0;
- }
- }
- }
- }
-
- }
- /*************外部中斷0中斷函數(shù)************/
- void ex0_int() interrupt 0
- {
- k++;
- if(k==3)
- k=0;
- if(k==1)
- {
- TR0=~TR0;
- if(TR0==1)
- {
- hour=0;
- minu=0;
- sec=0;
- }
- }
- if(k==2)
- {
- TR0=~TR0;
- }
- }
- /*************外部中斷1中斷函數(shù)************/
- void ex1_int() interrupt 2
- {
- s++;
- if(s==3)
- s=0;
- }
- /*************定時(shí)器1中斷****************/
- void timer1_int() interrupt 3 //控制時(shí)鐘工作
- {
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- if(s==2)
- {
- if(hour1==hour0 && minu0==minu1)
- sounde();
- }
- b++;
- if(b==20)
- {
- b=0;
- sec0++;
- if(sec0==60)
- {
- sec0=0;
- minu0++;
- if(minu0==60)
- {
- minu0=0;
- hour0++;
- if(hour0==24)
- hour0=0;
-
- }
- }
-
- }
-
- }
- /*************鍵盤掃描****************/
- void keyscan()
- {
-
- if(s==1)
- {
- if(qingling==0)
- {
- delay(10);
- if(qingling==0)
- {
- sec1=0;
- minu1=0;
- hour1=0;
- }
- }
- if(tiaofen==0)
- {
- delay(10);
- if(tiaofen==0)
- {
- minu1++;
- if(minu1==60)
- {
- minu1=0;
- }
- while(!tiaofen);
-
- }
- }
- if(tiaoshi==0)
- {
- hour1++;
- if(hour1==24)
- {
- hour1=0;
- }
- while(!tiaoshi);
-
- }
- }
- else //調(diào)整時(shí)鐘時(shí)間
- {
- if(qingling==0)
- {
- delay(10);
- if(qingling==0)
- {
- sec0=0;
- minu0=0;
- hour0=0;
- }
- }
- if(tiaofen==0)
- {
- delay(10);
- if(tiaofen==0)
- {
- minu0++;
- if(minu0==60)
- {
- minu0=0;
- }
- while(!tiaofen);
-
- }
- }
- if(tiaoshi==0)
- {
- hour0++;
- if(hour0==24)
- {
- hour0=0;
- }
- while(!tiaoshi);
-
- }
- }
- }
- /*************顯示函數(shù)****************/
- void display(uchar hour,uchar minu,uchar sec)
- {
- h1=hour/10;
- h2=hour%10;
- m1=minu/10;
- m2=minu%10;
- s1=sec/10;
- s2=sec%10;
- P0=0xff;
- P2=table[h1];
- P0=select[7];
- delay(5);
- P0=0xff;
- P2=table[h2];
- P0=select[6];
- delay(5);
- P0=0xff;
- P2=0x40;;
- P0=select[5];
- delay(5);
- P0=0xff;
- P2=table[m1];
- P0=select[4];
- delay(5);
- P0=0xff;
- P2=table[m2];
- P0=select[3];
- delay(5);
- P0=0xff;
- P2=0x40;
- P0=select[2];
- delay(5);
- P0=0xff;
- P2=table[s1];
- P0=select[1];
- delay(5);
- P0=0xff;
- P2=table[s2];
- P0=select[0];
- delay(5);
- }
- /*************鬧鐘函數(shù)****************/
- void sounde()
- {
- sounder=~sounder;
- }
- /*************延時(shí)函數(shù)****************/
- void delay(uchar z)
- {
- int x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
復(fù)制代碼
|
-
-
時(shí)鐘秒表.rar
2016-10-27 19:19 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
20.15 KB, 下載次數(shù): 91, 下載積分: 黑幣 -5
畢業(yè)設(shè)計(jì)
|