////////////////////////////////// //工程名稱;外部秒基準(zhǔn),電子鐘表// //單片機(jī)型號(hào):AT98S51 // //時(shí)鐘頻率?12M? // //制作時(shí)間;2009-7-13 // //制作者;呂貝貝 // ////////////////////////////////////////////////////////////////////////////////////// #include <reg51.h> char TAB[10]={0X11,0Xbd,0X23,0X25,0X8d,0x45,0x41,0x3d,0x01,0x05};//數(shù)碼管0-9編碼 char disp[4]={0,0,0,0};//四位數(shù)碼管初始化都為零 unsigned char scan;//位數(shù)掃描寄存器 unsigned char s=0;//秒寄存器 unsigned char f=0;//分寄存器 unsigned char h=0;//時(shí)寄存器 unsigned char f1=0;//分個(gè)位寄存器 unsigned char f2=0;//分十位寄存器 unsigned char h1=0;//時(shí)個(gè)位寄存器 unsigned char h2=0;//時(shí)十位寄存器 sbit fj=P3^7;//分位加1引腳 sbit hj=P3^6;//時(shí)位加1引腳 sbit zd=P3^3;//中斷1引腳 void disp1m(int);//定義延時(shí)函數(shù) void ff(unsigned char);//定義分位分裂函數(shù) void fh(unsigned char);//定義時(shí)位分裂函數(shù) //////////////////////////////////////////////////////////////////////////////////////// main() { IE=0X85;//準(zhǔn)許INT0中斷,準(zhǔn)許int1中斷 IP=0x04;//設(shè)定INT1具有最高優(yōu)先級(jí) TCON=0X05;//INT0設(shè)置負(fù)邊緣觸發(fā),int1設(shè)置負(fù)邊緣觸發(fā)。 while(1) { char i,j; scan=1; for(i=3;i>=0;i--) { j=disp; P1=TAB[j]; P2=scan; disp1m(4); scan<<=1; } disp[0]=h2;//顯示時(shí)十位 disp[1]=h1;//顯示時(shí)個(gè)位 disp[2]=f2;//顯示分十位 disp[3]=f1;//顯示分個(gè)位 } } ////////////////////////////////////////////////////////////////////////////////////////// void my_int0(void)interrupt 0//外部中斷0,P3.2,秒脈沖輸入短,下降邊緣觸發(fā) { s++;//秒寄存器加1 if(s==60)//秒數(shù)是否到六十 { s=0;//秒數(shù)清零 f++;//分?jǐn)?shù)寄存器加1 if(f==60)//分是否到60 { f=0;//分?jǐn)?shù)清零 h++;//時(shí)寄存器加1 if(h==24)//時(shí)是否到24 { h=0; } } } ff(f);//調(diào)用分位分裂函數(shù) fh(h);//調(diào)用時(shí)位分裂函數(shù) P3=255; } /////////////////////////////////////////////////////////////////////////////////////////// void my_int1(void)interrupt 2//外部中斷1,P3.3。時(shí)間調(diào)整輸入端下降邊緣觸發(fā) { disp1m(10);//延時(shí)消除抖動(dòng) if(zd==0)//再次判斷中斷腳位是否在低電平 { if(hj==0)//判斷是時(shí)要修改 { if(h==24){h=0;}else{h++;};//時(shí)加1 } else if(fj==0)//判斷是分要修改 { if(f==60){f=0;}else{f++;}//分加1 } else {}//都不是,退出中斷, } P3=255;//P3腳位全部拉高,以便等待下一個(gè)中斷
} ////////////////////////////////////////////////////////////////////////////////////////////// void ff(unsigned char y)//分位分裂函數(shù) { f1=y%10; f2=y/10; } //-------------------------------------- void fh(unsigned char y)//時(shí)位分裂函數(shù) { h1=y%10; h2=y/10; } //////////////////////////////////////////////////////////////////////////////////////////////// void disp1m(x)//延時(shí)函數(shù) { int i,j; for(i=0;i<x;i++) for (j=1;j<=150;j++); }
|