• 方案介紹
  • 附件下載
  • 相關推薦
申請入駐 產業(yè)圖譜

基于51單片機的數(shù)字頻率計設計

2024/09/26
1644
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

有需要資料的可了解一下.docx

共1個文件

基于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ù)

}

 

  • 有需要資料的可了解一下.docx
    下載

相關推薦