*********************************************** **************入門級(jí)頻率計(jì)設(shè)計(jì)****************** ***************精度低,希望各位初學(xué)者在此基礎(chǔ)上修改為精度更高的程序********************* 本程序使用了,動(dòng)態(tài)掃描,中斷定時(shí)/計(jì)數(shù)等資源,電路圖如上設(shè)計(jì)者:liujy 日期:2010/03/25*******************************/ #include <reg52.h> #define uchar unsigned char sbit w1=P2^0; sbit w2=P2^1; sbit w3=P2^2; sbit w4=P2^3;//位控 sbit w5=P2^4; sbit w6=P2^5; sbit s=P3^7;//啟動(dòng)鍵 bit flag;//標(biāo)簽 uchar ss,sg,fs,fg,ms,mg, shu=1;//顯示位變量,由數(shù)字鐘變來(lái) uchar t0,t1,t2,a; unsigned long num,x,y; unsigned char code table1[]={0xc0,0xf9,0xa4,0xb0, //0-f 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e}; void delay(int z)//延時(shí)子程序 { int h,t; for(h=z;h>0;h--) for(t=110;t>0;t--); } void iint()//初始化函數(shù) { flag=0; TMOD=0x15;//t1為定時(shí)器,t0為計(jì)數(shù)器模式 TH1=(65536-4000)/256;//設(shè)初值 TL1=(65536-4000)%256; TH0=0; TL0=0; EA=1; //開總中斷 ET0=1;//開中斷允許 ET1=1;//開中斷允許 TR1=1;//開中斷控制 TR0=1;//開中斷控制 } void main() { loop: if(s==0)//按鍵啟動(dòng) { while(s!=0);//等按鍵松手 a++;//功能變量 } if(a==1) { iint(); //while(1) // { while(1) { if(t1==250) { t1=0; EA=0;//關(guān)中斷 TR0=0;//開中斷控制,可省 flag=1;//標(biāo)簽標(biāo)志置位 } y=TH0*256+TL0;//賦值部分 x=t0*65536; num=x+y; ss=num/100000; num=num%100000;//賦值部分 sg=num/10000; num=num%10000; fs=num/1000; num=num%1000; fg=num/100;//賦值部分 num=num%100; ms=num/10; num=num%10; mg=num%10; if(flag==1)//動(dòng)態(tài)掃描顯示 { P2=0;//數(shù)據(jù)口 w1=1; P0=table1[ss]; delay(shu); P2=0; w2=1; P0=table1[sg]; delay(shu); P2=0; w3=1; P0=table1[fs]; delay(shu); P2=0; w4=1; P0=table1[fg]; delay(shu); P2=0; w5=1; P0=table1[ms]; delay(shu); P2=0; w6=1; P0=table1[mg]; delay(shu); //num=0; if(s==0){ while(s!=0);a++;} if(a==2) { a=0; goto loop; } } } // } } } void timer0() interrupt 1 { TH0=0; TL0=0; t0++; } void timer1() interrupt 3 { TH1=(65536-4000)/256; TL1=(65536-4000)%256; t1++; }