機(jī)電之家資源網(wǎng)
單片機(jī)首頁(yè)|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
單片機(jī)編程入門白金教程系列之七
單片機(jī)編程入門白金教程系列之七
 更新時(shí)間:2008-8-19 13:45:54  點(diǎn)擊數(shù):66
【字體: 字體顏色
  實(shí)例目的:學(xué)時(shí)定時(shí)器、計(jì)數(shù)器、中斷應(yīng)用

  說明:選用24MHz的晶體,主頻可達(dá)2MHz。用T1產(chǎn)生100us的時(shí)標(biāo),T0作信號(hào)脈沖計(jì)數(shù)器。假設(shè)晶體頻率沒有誤差,而且穩(wěn)定不變(實(shí)際上可達(dá)萬分之一);被測(cè)信號(hào)是周期性矩形波(正負(fù)脈沖寬度都不能小于0.5us),頻率小于1MHz,大于1Hz。要求測(cè)量時(shí)標(biāo)1S,測(cè)量精度為0.1%。

  解:從測(cè)量精度要求來看,當(dāng)頻率超過1KHz時(shí),可采用1S時(shí)標(biāo)內(nèi)計(jì)數(shù)信號(hào)脈沖個(gè)數(shù)來測(cè)量信號(hào)頻,而信號(hào)頻率低于1KHz時(shí),可以通過測(cè)量信號(hào)的周期來求出信號(hào)頻率。兩種方法自動(dòng)轉(zhuǎn)換。

  對(duì)于低于1KHz的信號(hào),信號(hào)周期最小為1ms,也就是說超過1000us,而我們用的定時(shí)器計(jì)時(shí)脈沖周期為0.5us,如果定時(shí)多計(jì)或少計(jì)一個(gè)脈沖,誤差為1us,所以相對(duì)誤差為1us/1000us=0.1%。信號(hào)周期越大,即信號(hào)頻率越低,相對(duì)誤差就越小。 

  從上面描述來看,當(dāng)信號(hào)頻率超過1KHz后,信號(hào)周期就少于1000us,顯然采用上面的測(cè)量方法,不能達(dá)到測(cè)量精度要求,這時(shí)我們采用1S單位時(shí)間計(jì)數(shù)信號(hào)的脈沖個(gè)數(shù),最少能計(jì)到1000個(gè)脈沖,由于信號(hào)頻率不超過1MHz,而我們定時(shí)脈沖為2MHz,最差多計(jì)或少計(jì)一個(gè)信號(hào)脈沖,這樣相對(duì)誤差為1/1000,可見信號(hào)頻率越高,相對(duì)誤差越小。 

  信號(hào)除輸入到T1(P3.5)外,還輸入到INT1(P3.3)。

unsigned int us100; //對(duì)100us時(shí)間間隔單位計(jì)數(shù),即有多少個(gè)100us。
unsigned char Second;
unsigned int K64; //對(duì)64K單位計(jì)數(shù),即有多少個(gè)64K
unsigned char oldT0;
unsigned int oldus, oldK64, oldT1;
unsigned long fcy; //存放頻率值,單位為Hz
bit HighLow=1; //1:表示信號(hào)超過1KHz;0:表示信號(hào)低于1KHz。
void InitialHigh( void )
{
IE=0; IP=0; HighLow=1;
TMOD = (TMOD & 0xf0) | 0x02; TH0=-200; TL0=TH0; PX0=1; T0=1;
TMOD = (TMOD & 0x0f) | 0x50; TH1=0; TL1=0; T1=1; ET1=1;
Us100=0; Second=0; K64=0;
oldK64=0; oldT1=0;
TCON |= 0x50; //同時(shí)置 TR0=1; TR1=1;
EA = 1;
}
void InitialLow( void )
{
IE=0; IP=0; HighLow=0;
TMOD = (TMOD & 0xf0) | 0x02; TH0=-200; TL0=TH0; ET0=1; TR0=1;
INT1 = 1; IT1=1; EX1=1;
Us100=0; Second=0; K64=0;
oldK64=0; oldT1=0;
EA = 1;
}
void T0intr( void ) interrupt 1
{ if( HighLow==0 ) ++us100;
else
if( ++us100 >= 10000 )
{ unsigned int tmp1, tmp2;
TR1=0; tmp1=(TH1<<8) + (TL1); tmp2=K64; TR1=1;
fcy=((tmp2-oldK64)<<16) + (tmp1-oldT1);
oldK64=tmp1; oldT1=tmp2;
Second++;
us100=0;
}
}
void T1intr( void ) interrupt 3 { ++K64; }
void X1intr( void ) interrupt 2
{ static unsigned char sts=0;
switch( sts )
{
case 0: sts = 1; break;
case 1: oldT0=TL0; oldus=us100; sts=2; break;
case 2:
{
unsigned char tmp1, tmp2;
TR0=0; tmp1=TL0; tmp2=us100; TR0=1;
fcy = 1000000L/( (tmp2-oldus)*100L + (256-tmp1)/2 );
Second ++;
}
Sts = 0;
break;
}
}
void main( void )
{
if( HighLow==1) InitialHigh(); else InitialLow();
While(1)
{
if( Second != 0 )
{
Second = 0;
//display fcy 引用前面的數(shù)碼管驅(qū)動(dòng)程序,注意下面對(duì)T0中斷服務(wù)程序的修改
{ unsigned char i;
for( i=0; i<8; i++ ){ Display(i, fcy%10); fcy /= 10; }
}
if( HighLow==1 )
if( fcy<1000L ){ InitalLow();}
else
if( fcy>1000L ){ InitalHigh();}
}
}
}
//修改T0的中斷服務(wù)程序,讓它在完成時(shí)標(biāo)的功能時(shí),同時(shí)完成數(shù)碼管顯示刷新
void T0intr( void ) interrupt 1
{
static unsigned char ms = 0;
if( HighLow==0 ) ++us100;
else
if( ++us100 >= 10000 )
{ unsigned int tmp1, tmp2;
TR1
  • 上一篇: 單片機(jī)編程入門白金教程系列之五
  • 下一篇: 單片機(jī)編程入門白金教程系列之八
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁(yè)  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對(duì)此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請(qǐng)聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國(guó)行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營(yíng)許可證:浙B2-20080178-1