*********************************************** **************入門級頻率計設(shè)計****************** ***************精度低,希望各位初學者在此基礎(chǔ)上修改為精度更高的程序********************* 本程序使用了,動態(tài)掃描,中斷定時/計數(shù)等資源,電路圖如上設(shè)計者: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;//啟動鍵 bit flag;//標簽 uchar ss,sg,fs,fg,ms,mg, shu=1;//顯示位變量,由數(shù)字鐘變來 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)//延時子程序 { int h,t; for(h=z;h>0;h--) for(t=110;t>0;t--); } void iint()//初始化函數(shù) { flag=0; TMOD=0x15;//t1為定時器,t0為計數(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)//按鍵啟動 { 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;//標簽標志置位 } 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)//動態(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++; }