生活随笔
收集整理的這篇文章主要介紹了
简易单片机制作频率计
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
參數(shù):測量范圍1HZ-50KHZ 測量波形:半波,正弦波,方波,三角波,鋸齒波
數(shù)碼管顯示頻率
一、頻率計原理
我們采用的方案是,用信號觸發(fā)外部中斷,外部中斷觸發(fā)定時器定時一秒,一秒時間到了之后計算一秒內(nèi)觸發(fā)了多少次外部中斷,外部中斷采用的是下降沿觸發(fā)。
?二、使用步驟
?1.引入庫
如果只需要玩玩那么直接復(fù)制就可以了,開發(fā)版是用的普中A2開發(fā)版,如果無法使用發(fā)私信聯(lián)系。
只需要看定時器中斷和外部中斷。
?
#include <STC89C5xRC.H>
#define uint unsigned int?
#define uchar unsigned char?
sbit DIN = P1^0;//信號輸入
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
uint HATA=0,lpoi=0;//計數(shù)位
uchar ii=0;
//**************************************************************************************************************************************
//***************數(shù)碼管
uchar code sz1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//***************三八譯碼器
uchar code sp2[]={0xff,0x18,0x14,0x10,0xc,0x8,0x4,0x00};
//**************************************************************************************************************************************
uchar sp3[5];
/****************************************************************************
*函數(shù)名;dalay
*輸 ?入:時間
*輸 ?出:無
*功 ?能:延時
****************************************************************************/
void delay(time)
{uchar ti=0;while(time--){for(ti=10;ti>0;ti--);}
}
/****************************************************************************
*函數(shù)名;Timer0Init
*輸 ?入:無
*輸 ?出:無
*功 ?能:定時器0初始化
****************************************************************************/
void Timer0Init(void)?? ??? ?//0微秒@11.0592MHz
{AUXR &= 0x7F;?? ??? ?//定時器時鐘12T模式TMOD &= 0xF0;?? ??? ?//設(shè)置定時器模式TMOD |= 0x01;?? ??? ?//設(shè)置定時器模式TL0 = 0x00;?? ??? ?//設(shè)置定時初始值TH0 = 0x4C;?? ??? ?//設(shè)置定時初始值EA=1;EX0=1;IT0 = 1;//下降沿ET0=1;
}
/****************************************************************************
*函數(shù)名;show
*輸 ?入:iny
*輸 ?出:無
*功 ?能:數(shù)碼管顯示
****************************************************************************/
void show()
{uchar i,b=0;for(i=0;i<6;i++){switch(i)?? ? //位選,選擇點亮的數(shù)碼管,{case(0):LSA=1;LSB=0;LSC=1; break;//顯示第2位case(1):LSA=0;LSB=0;LSC=1; break;//顯示第3位case(2):LSA=1;LSB=1;LSC=0; break;//顯示第4位case(3):LSA=0;LSB=1;LSC=0; break;//顯示第5位case(4):LSA=1;LSB=0;LSC=0; break;//顯示第6位case(5):LSA=0;LSB=0;LSC=0; break;//顯示第7位}P0 = sz1[sp3[i]];delay(10);P0 = 0x00;}
}
/****************************************************************************
*函數(shù)名;Calculation_data()
*輸 ?入:無
*輸 ?出:無
*功 ?能:把計數(shù)值按位放到數(shù)組方便調(diào)用
****************************************************************************/
void Calculation_data()//計算數(shù)據(jù)
{HATA=lpoi;lpoi=0;sp3[0]=(HATA/100000);sp3[1]=(HATA%100000/10000);sp3[2]=(HATA%100000%10000/1000);sp3[3]=(HATA%100000%10000%1000/100);sp3[4]=(HATA%100000%10000%1000%100/10);sp3[5]=(HATA%100000%10000%1000%100%10);
}
void main()
{Timer0Init();while(1){show();//數(shù)碼管顯示}
}
/****************************************************************************
*函數(shù)名;外部中斷
*輸 ?入:無
*輸 ?出:無
*功 ?能:計觸發(fā)次數(shù)
****************************************************************************/
void EX00() interrupt 0
{lpoi++;//記觸發(fā)次數(shù)if(TR0==0)//***************此判斷用來減小誤差{lpoi-=1;}?? ??? ? ?//***************TR0=1;
}
/****************************************************************************
*函數(shù)名;定時器中斷
*輸 ?入:無
*輸 ?出:無
*功 ?能:定時一秒后計算數(shù)據(jù)
***********************************************************************/
void ET00() interrupt 1
{TL0 = 0x00;?? ??? ?//設(shè)置定時初始值TH0 = 0x4C;?? ??? ?//設(shè)置定時初始值ii++;if(ii>=20)?? ??? ??? ??? ?//判斷達(dá)到一秒后{ii=0;?? ??? ??? ??? ?//時間計數(shù)清零TR0=0;?? ??? ??? ??? ?//關(guān)閉定時器Calculation_data();//計算數(shù)據(jù)}
}
?2.知識點講解
這一段代碼是外部中斷里的,加這個判斷是為了測低頻的時候減小誤差用的
原理:判斷定時器有沒有觸發(fā),如果沒有觸發(fā)表示此脈沖是第一個脈沖,這一個脈沖我們不能要因為定時器還沒有打開,所以此脈沖不能要
if(TR0==0)//***************此判斷用來減小誤差{lpoi-=1;}?? ??? ? ?//***************
# 總結(jié)
主要理解以上兩個中斷的程序,如果您有不同的方式請留言我們共同學(xué)習(xí)
總結(jié)
以上是生活随笔為你收集整理的简易单片机制作频率计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。