基于51單片機的數(shù)字頻率計設計
#define LED_GLOBAL 1
#include "led.h"
/*******************************************************************************************
*函數(shù)名稱:delay_us(uint us)
*函數(shù)功能:實現(xiàn)微秒級的延時
*函數(shù)入口:us,延時函數(shù)循環(huán)后期數(shù)
*函數(shù)出口:無
*******************************************************************************************/
void delay_us(uint us)
{
uint i;
while(us--)
{
for(i=0;i<100;i++);
}
}
/*******************************************************************************************
*函數(shù)名稱:led_init(void)
*函數(shù)功能:四位七段數(shù)碼管顯示初始化
*函數(shù)入口:無
*函數(shù)出口:無
*******************************************************************************************/
void init_led(void)
{
LED=segLedCode[0];
LED_CS1=0;
LED_CS2=0;
LED_CS3=0;
LED_CS4=0;
}
/*******************************************************************************************
*函數(shù)名稱:ledWrite(uchar c,uchar n,uchar mod)
*函數(shù)功能:對一組數(shù)碼管的某一位進行短暫顯示
*函數(shù)入口:c,要顯示的數(shù)據(jù);n,顯示一組數(shù)碼管中的第n位;mod,c的數(shù)據(jù)形式
*函數(shù)出口:無
*說明:當mod==DIGITAL時,c為數(shù)字0~9的ANCII碼形式,此時在n位數(shù)碼管上顯示想用數(shù)字
當mod==CHARACTER,直接將c輸出數(shù)據(jù)口
*******************************************************************************************/
void ledWrite(uchar c,uchar n,uchar mod)
{
if(CHARACTER==mod)
{
LED=c;
}
else if(DIGITAL==mod)
{
if((c-'0')<0x0a)
{
LED=segLedCode[c-'0'];
}
else
{
LED=segLedCode[0];
}
/*******************************************************************************************
*函數(shù)名稱:ledSweepDisplay(uchar *segCode,uchar segCodeMod,uchar segNumber)
*函數(shù)功能:循環(huán)在數(shù)碼管上顯示緩沖區(qū)中的數(shù)據(jù)
*函數(shù)入口:segCode,指向顯示緩沖區(qū)中的指針;segCodeMod,0~7位為1或0標示1~8位數(shù)碼管顯示的數(shù)據(jù)的類型(DIGITAL或者CHARACTER);segNumber,代表要顯示數(shù)碼管的位數(shù)
*函數(shù)出口:無
*說明:本函數(shù)主要實現(xiàn)將顯示緩沖區(qū)中的數(shù)據(jù)在數(shù)碼管上顯示出來
*******************************************************************************************/
void ledSweepDisplay(uchar *segCode,uchar segCodeMod,uchar segNumber)
{
uchar segCount;
for(segCount=0;segCount<segNumber;segCount++)
{
if(segCodeMod&0x01)???? ?? /*1代表此處顯示任意字符 */
{
ledWrite(segCode[segCount],segCount+1,CHARACTER);
}
else
{
ledWrite(segCode[segCount],segCount+1,DIGITAL);
}
segCodeMod=segCodeMod>>1;
}
}
#define TARGET_GLOBAL 1
#include "target.h"
uint? timer0Count;?????? //timer0溢出計數(shù)
uint? pulseCount;??????? //脈沖計數(shù)
uint? pulseCountTemp;??? //脈沖計數(shù)寄存
/*************************************************
*函數(shù)名稱:timer0_init(void)
*函數(shù)功能:timer0初始化
*函數(shù)入口:無
*函數(shù)出口:無
*說明:本系統(tǒng)用12Mhz晶振,定時1ms
*************************************************/
void timer0_init(void)
{
TMOD|=0x01;?? //timer0工作在MODEL1,timer
TH0=0xFC;
TL0=0x18;
ET0=1;??????? //timer0中斷使能
IP=0x02;????? //timer0優(yōu)先級最高
TR0=1;????????????????? //timer0啟動
}
/*************************************************
*函數(shù)名稱:int0_init(void)
*函數(shù)功能:外部中斷0初始化
*函數(shù)入口:無
*函數(shù)出口:無
*************************************************/
pulseCountTemp=pulseCount-pulseCount/(uint)36;??? //頻率計數(shù)校準
pulseCount=0;
timer0Count=0;
}
sei();
}
void int0(void) interrupt 0????? //int0中斷入口函數(shù),實時計數(shù)檢測頻率
{
pulseCount++;
}
/*********************************************
*函數(shù)名稱:uint get_fre_number(void)
*函數(shù)功能:計算頻率,1~1000HZ
*********************************************/
uint get_fre_number(void)
{
return pulseCountTemp;
}
/*************************************************************************
*實例名稱:頻率計
*實例說明:實現(xiàn)0~9000hz頻率計的統(tǒng)計
*************************************************************************/
#include "target.h"
#include "led.h"
uchar displayBuff[4]={'0','0','0','0'}; //數(shù)碼管顯示緩沖區(qū),千,百,十,個
const uchar displayMode=0x00;?????????? //后四位分別對應緩沖區(qū)中每位的數(shù)據(jù)類型,1為任意字符顯示,0為數(shù)字顯示
void main()
{
uint get_fre;
target_init();
init_led();
sei();
while(1)
{
get_fre=get_fre_number();
if(get_fre/1000<0x0A)
{
displayBuff[0]=get_fre/1000+'0';??????????? //計算頻率千位,放在緩沖區(qū)第0位
}
displayBuff[1]=(get_fre/100)%10+'0';????????? //計算頻率百位,放在緩沖區(qū)第1位
displayBuff[2]=(get_fre%100)/10+'0';????????? //計算頻率十位,放在緩沖區(qū)第2位
displayBuff[3]=get_fre%10+'0';???????????? ????????? //計算頻率個位,放在緩沖區(qū)第3位
ledSweepDisplay(displayBuff,displayMode,0x04);//循環(huán)顯示數(shù)碼管緩沖區(qū)中數(shù)據(jù)
}