//---------函數聲明,變量定義(yi) --------------------------
#include <reg51.h>
sbit GATE=P3^0; //預製門限
sbit CLR =P3^1; //請零
sbit RGATE=P3^2; //實際門限
sbit SEL0=P3^4; //數據選擇位0
sbit SEL1=P3^5; //數據選擇位1
sbit SEL2=P3^6; //數據選擇位2
#define data_in P1
unsigned char Nx[4]; //待測頻率計數值
unsigned char Ns[4]; //標準頻率計數值
unsigned char GATE_time=1; //門限時間,預定義(yi) 為(wei) 1S
unsigned char time_count;
bit PRE_judge=1;
//-----------------------變量聲明---------------------------------------------------------------------
void system_init(void ); //初始化,設置定時器0的工作方式,供主程序調用
void TIMER0_SCANkey(); //定時器0中斷處理函數
//--------------------------------------------------------------------------------------------------
// 函數名稱: system_init()
// 函數功能: 初始化設置
// 設定INT0的工作方式
//--------------------------------------------------------------------------------------------------
void system_init(void )
{
TMOD=0x01; //定時器0工作在方式1
ET0=1; //定時器0中斷允許
TH0=-5000/256; //12M時鍾時,定時0.01秒
TL0=-5000%256;
TR0=1; //定時器0開始計數
EA=1; //係統中斷允許
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: read_result
// 函數功能: 將計數值讀出到Nx、Ns
//--------------------------------------------------------------------------------------------------
void read_result()
{
GATE=0;
while(RGATE); //等待實際門限的結束
SEL0=0;
SEL1=0;
SEL2=0;
Nx[0]=data_in; //SEL=000
SEL0=1;
Nx[1]=data_in; //001
SEL1=1;
Nx[3]=data_in; //011
SEL0=0;
Nx[2]=data_in; //010
SEL0=0;
SEL1=0;
SEL2=1;
Ns[0]=data_in; //100
SEL0=1;
Ns[1]=data_in; //101
SEL1=1;
Ns[3]=data_in; //111
SEL0=0;
Ns[2]=data_in; //110
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: judge_Prage
// 函數功能: 判斷頻率範圍,
// 大於(yu) 1M 即Nx>0x00 0F 42 40, GATE=1
// 小於(yu) 1M大於(yu) 1k即0x00 00 03 E8<Nx<0x00 0F 42 40,GATE=5
// 小於(yu) 1k 即 Nx<0x00 00 03 E8, GATE=10
//--------------------------------------------------------------------------------------------------
void judge_Prage()
{
if((Nx[3]==0)&&(Nx[2]==0))
if((Nx[1]<3)||((Nx[1]==3)&&(Nx[0]<0xE8)))
GATE_time=10;
else GATE_time=5;
else if((Nx[3]==0)&&(Nx[2]<0x0f))
GATE_time=5;
else if((Nx[3]==0)&&(Nx[2]==0x0f))
if(Nx[1]<0x42)
GATE_time=5;
else if((Nx[1]==0x42)&&(Nx[0]<0x40))
GATE_time=5;
else
GATE_time=1;
else GATE_time=1;
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: calcu_Fx
// 函數功能: 計算頻率,根據Fx=(Nx/Ns)Fs 計算結果
//--------------------------------------------------------------------------------------------------
void calcu_Fx()
{
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: TIMER0_intrupt
// 函數功能: 定時器0中斷處理程序
//--------------------------------------------------------------------------------------------------
void TIMER0_intrupt() interrupt 1 using 1
{
EA=0; //係統中斷禁止
GATE=1;
TH0=-5000/256; //12M時鍾時,定時0.01秒
TL0=-5000%256;
time_count++;
if(++time_count==100) GATE_time--;
while(GATE_time==0)
{
GATE=0;
read_result();
if(PRE_judge) //預測,判斷頻率範圍
{
judge_Prage();
PRE_judge=0;
if(GATE_time) //如果頻率大於(yu) 1M,直接計算,無須再測
calcu_Fx();
}
else
calcu_Fx(); //不是預測,直接計算結果
}
EA=1;
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: main
// 函數功能: 主函數
//--------------------------------------------------------------------------------------------------
void main()
{
CLR=0;
GATE=1;
system_init();
}