單片機(jī)-一個(gè)簡單頻率測量
單位由一個(gè)信號源的項(xiàng)目,其中由一個(gè)功能,即實(shí)現(xiàn)一個(gè)方波信號頻率的測量。實(shí)際情況中,信號的頻率一般在15-25Hz。占空比在10%-90%之間??梢哉f頻率非常低。因?yàn)閱挝皇褂肧TC89C54的時(shí)間比較長,所以單位要求使用該單片機(jī)。這個(gè)項(xiàng)目非常簡單。因?yàn)闀r(shí)間很久了,所以我稍微回憶一下。
電路圖邏輯上是這樣的:
我將信號經(jīng)過比例縮小跟隨后直接接到INT0管腳。具體想法是這樣的,設(shè)定一個(gè)10uM的定時(shí)器計(jì)時(shí)。每兩秒中作為一個(gè)測量周期。方波最會(huì)有下跳沿的,每一下跳沿作為一個(gè)周期的開始。兩秒計(jì)時(shí)結(jié)束后查看一共采集到K個(gè)下跳沿。那么該方波的周期就是T=2/K秒。頻率f=K/2。
有一個(gè)同事提供了頻率測量的思路。在三秒中時(shí)間范圍內(nèi)統(tǒng)計(jì)INT0下跳沿出現(xiàn)的個(gè)數(shù),即可統(tǒng)計(jì)出方波脈沖的頻率。因?yàn)橄绿貢?huì)觸發(fā)外部中斷,所以只需統(tǒng)計(jì)程序進(jìn)入中斷程序的次數(shù)。我們來看看代碼實(shí)現(xiàn)的方法。
/*************************************/
//定時(shí)器初始化
//每1毫秒中斷一次
/*************************************/
#define SYS_CLK 12000000L
#define TIME0_LOAD -(SYS_CLK/12/1000)
typedef struct FREQ
{
unsigned char start;
unsigned int timer;
unsigned int int_Count;
unsigned int T;
}FREQ;
FREQ freq={0,0};
void Timer0_Init( )
{
TMOD = TMOD | 0x01;
TH0 = TIME0_LOAD>>8;
TL0 = TIME0_LOAD&0x00FF;
EA =1;
ET0 =1;
TR0 =1;
}
/*************************************/
//定時(shí)器串口中斷程序
/*************************************/
void Timer0_isr( ) interrupt 1
{
[!--empirenews.page--]
TH0 = TIME0_LOAD>>8;
TL0 = TIME0_LOAD & 0x00FF;
if(freq.start)
{
freq.timer++;
}
else
{
freq.timer=0;
}
}
void exint0_init( )
{
IT0 =1; //下降沿產(chǎn)生中斷
EX0 =1; //使能外部中斷
EA =1; //使能全局中斷
}
void exint0( ) interrupt 0
{
if(freq.start)
{
freq.int_Count++; //開始統(tǒng)計(jì)下跳沿
}
else
{
freq.int_Count=0;
}
}
void main( )
{
Timer0_Init( );
exint0_init( );
freq.start=1;
while(1)
{
if(freq.timer>=3000)
{
freq.T=freq.timer/freq.int_Count;
freq.int_Count=0;
freq.timer=0;
display_freq( ); //顯示周期的值
}
}
}
以上是該項(xiàng)目部分代碼,主要可以看看定時(shí)器和外部中斷的使用方法。