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