#define uchar unsigned char //定義一下方便使用 #define uint unsigned int #define ulong unsigned long #include <reg52.h> //包括一個52標準內核的頭文件 uchar code zixing[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar code ziwei[]={0x10,0x20,0x40,0x80}; uchar *h,*m; uchar hour=12,min=0,sec=0,h_ding,m_ding,count=0,ms_50,ms_10,miaobiao_sec; sbit dp=P0^7; sbit k1=P3^2; sbit k2=P3^3; sbit k3=P3^4; sbit sound=P2^3; sfr ZIXING=0x80; //p0口輸出字形 sfr ZIWEI=0xa0; //P2口輸出字位 typedef enum //枚舉類型:4種狀態// { CLOCK, SET_RING1, SET_RING2, MIAOBIAO_RUN, }STATE; STATE status; typedef struct //定時時間的數據結構// { uchar hour; uchar min; }DINGSHI_TIME; DINGSHI_TIME dingshi_time[2]; #define NO_KEY -1 //定義一下方便使用 #define KEY_1 1 #define KEY_2 2 #define KEY_3 3 bit show_on_flag; //#######定時器T0中斷服務程序########// Timer0() interrupt 1 { TH0=0x3c;TL0=0xb4; //50ms ms_50++; if(ms_50==20) {sec++;ms_50=0;} if(sec==60) {sec=0;min++;} if(min==60) {min=0;hour++;} if(hour==24) {hour=0;} } //#######定時器T1中斷服務程序########// Timer1() interrupt 3 { TH1=0xd8;TL1=0xf4; //10ms ms_10++; if(ms_10==100) { miaobiao_sec++; ms_10=0; } if(miaobiao_sec==60) miaobiao_sec=0; } //##############數碼管顯示#####################// show(uchar time_high,uchar time_low) { uchar m; uint n,k; k=time_high*1000/10+time_low; for(m=0;m<4;m++) { ZIXING=zixing[k%10]; if(ms_50<10) dp=0; ZIWEI=~ziwei[m]; for(n=0;n<500;n++); ZIXING=0xff; for(n=0;n<100;n++); k=k/10; } } //顯示 on 定時編號// show_on(uchar id) //id:定時編號// { uchar m; uint n; for(m=0;m<2;m++) { ZIXING=zixing[id%10]; dp=0; ZIWEI=~ziwei[m]; for(n=0;n<500;n++); ZIXING=0xff; for(n=0;n<80;n++); id=id/10; } ZIXING=0xc8; //字母n// ZIWEI=~ziwei[2]; for(n=0;n<500;n++); ZIXING=0xff; for(n=0;n<200;n++); ZIXING=0xc0; //字母0// ZIWEI=~ziwei[3]; for(n=0;n<500;n++); ZIXING=0xff; for(n=0;n<200;n++); } /*************啟動秒表***************/ void run_miaobiao() { ms_10=0; miaobiao_sec=0; TH1=0xd8; //標準是0xd8e4 TL1=0xf4; // TR1=1; //啟動定時器1 } /*************顯示秒表***************/ void show_miaobiao() { show(miaobiao_sec,ms_10); } /*********** 檢測按鍵動作函數 *************/ int get_key() { uchar d; if(!k1) { for(d=0;d<50;d++); if(!k1) { while(!k1); return(KEY_1); } } if(!k2) { for(d=0;d<50;d++); if(!k2) { while(!k2); return(KEY_2); } } if(!k3) { for(d=0;d<50;d++); if(!k3) { while(!k3); return(KEY_3); } } else return NO_KEY; } /***************************************** 各狀態下按鍵處理函數 ******************************************/ void key_process_clock() // 處理時鐘狀態下的按鍵和顯示// { switch(get_key()) { case KEY_1: status=SET_RING1; ;//切換狀態 show_on_flag=1; show_on(1); break; case KEY_2: hour++; if(hour==24) hour=0; show(hour,min); break; case KEY_3: min++; if(min==60) min=0; show(hour,min); break; case NO_KEY: //沒有按鍵操作// show(hour,min); break; } } /****************設定時1或2狀態下的按鍵處理及顯示*****************/ void key_process_set_dingshi() { switch(get_key()) { case KEY_1: if(status==SET_RING1) { status=SET_RING2; //切換設第二段定時狀態 show_on_flag=1; show_on(2); } else if(status==SET_RING2) { status=MIAOBIAO_RUN; //切換到秒表運行狀態 run_miaobiao(); show_miaobiao(); } break; case KEY_2: dingshi_time[status-1].hour++; if(dingshi_time[status-1].hour==24) dingshi_time[status-1].hour=0; show(dingshi_time[status-1].hour,dingshi_time[status-1].min); show_on_flag=0; break; case KEY_3: dingshi_time[status-1].min++; if(dingshi_time[status-1].min==60) dingshi_time[status-1].min=0; show(dingshi_time[status-1].hour,dingshi_time[status-1].min); show_on_flag=0; break; case NO_KEY: //沒有按鍵操作// if(show_on_flag) show_on(status); else show(dingshi_time[status-1].hour,dingshi_time[status-1].min); break; } } /********秒表運行狀態按鍵處理及顯示*********/ void key_process_miaobiao_run() { switch(get_key()) { case KEY_1: TR1=0; status=CLOCK; //回到時鐘顯示狀態 break; case KEY_2: TR1=!TR1; //定時器1暫停、繼續 break; case KEY_3: TR1=0; //秒表復位 miaobiao_sec=0; ms_10=0; break; case NO_KEY: //無按鍵操作// show_miaobiao(); break; } } //############主程序#######################// void main(void) { sound=1; TH0=0x3c; TL0=0xb4; TMOD=0x11; TR0=1; ET0=1; TR1=0; ET1=1; EA=1; status=CLOCK; dingshi_time[0].hour=0; dingshi_time[0].min=0; dingshi_time[1].hour=0; dingshi_time[1].min=0; while(1) //程序循環 { switch(status) { case CLOCK: key_process_clock(); // 處理時鐘狀態下的按鍵和顯示// break; case SET_RING1: case SET_RING2: key_process_set_dingshi(); //處理設置定時狀態下的按鍵和顯示// break; case MIAOBIAO_RUN: key_process_miaobiao_run(); //處理秒表狀態下的按鍵和顯示// break; } if( ((hour==dingshi_time[0].hour) //定時響鈴// &&(min==dingshi_time[0].min) &&(sec<5)) || ((hour==dingshi_time[1].hour) //定時響鈴// &&(min==dingshi_time[1].min) &&(sec<5)) ) sound=0; else sound=1; } } |