導航:首頁 > 編程語言 > 51單片機測頻率的程序

51單片機測頻率的程序

發布時間:2023-09-07 13:32:35

A. 51單片機製作簡易數字頻率計程序

這里有一個四位數碼管的頻率計,供參考

#include<reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
ucharan[10]={0xc0,0Xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //所需的段的位碼
//ucharwei[4]={0XEf,0XDf,0XBf,0X7f};//位的控制端 (開發板)
ucharwei[4]={0X80,0X40,0X20,0X10};//位的控制端 (模擬)
uintz,x,c,v,date; //定義數據類型
uintdispcount=0;
uintlck=0;
uintdisp=0;
/******************************************************************

延時函數

******************************************************************/
voiddelay(uchart)
{
uchari,j;
for(i=0;i<t;i++)
{
for(j=13;j>0;j--);
{;
}
}
}

/**********************************************************************
數碼管動態掃描
*********************************************************************/
voidxianshi()
{
/*****************數據轉換*****************************/
z=date/1000; //求千位
x=date%1000/100; //求百位
c=date%100/10; //求十位
v=date%10; //求個位

P2=wei[0];
P0=an[z];
delay(50);
P2=wei[1];
P0=an[x];
delay(50);
P2=wei[2];
P0=an[c];
delay(50);
P2=wei[3];
P0=an[v];
delay(50);


}

/*************************************************************************
定時器初值1ms
**************************************************************************/
voidinitTimer(void)
{
TMOD=0x0;
TH0=0xe3;
TL0=0xc;
}

/*************************************************************************
定時器函數
**************************************************************************/
voidtimer0(void)interrupt1
{
TH0=0xe3;
TL0=0xc;
lck++;
if(lck==1000)
{
disp=dispcount;
lck=0;
dispcount=0;
}

}

/*************************************************************************
中斷函數
**************************************************************************/
voidint0(void)interrupt0
{

dispcount++;//每一次中斷,計數加一

}

/*************************************************************************
主函數
**************************************************************************/
voidmain(void)
{

IT0=1;//INT0下降沿中斷
EX0=1;//允許INT1中斷
initTimer();//裝入初值
TR0=1;
ET0=1;
EA=1;
while(1)

{
date=disp;
xianshi();
}
}

B. 求51單片機測量正弦波(20~100hz)的頻率的c程序,最好是已經通過測試過的

首先使用電壓比較器電路將正弦波轉化成方波,以方便單片機接收,參考下圖(該電路可接收峰峰值正負12V的正弦波),如果你的正弦波電路和單片機電路使用了不同的電源,則還需進行隔離處理

#include<AT89X51.H>

//********數碼管位代碼表(P0口)**********//

unsignedcharcodedispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

//********數碼管段代碼表(P2口,共陰且高位接a,低位接h筆段)**********//

unsignedcharcodedispcode[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,

0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0x00};

//********8位數據緩沖器**********//

unsignedchardispbuf[8];

unsignedchartemp[8];

unsignedchardispcount;

unsignedcharT0count;

unsignedchartimecount;

bitflag;

unsignedlongx;

//*********初始化模塊**********//

voidinitial(void){

TMOD=0x15;

TH0=0;

TL0=0;

TH1=(65536-4000)/256;

TL1=(65536-4000)%256;

TR1=0;

TR0=0;

ET0=1;

ET1=1;

EA=1;

}

//******************************************************//

//*********顯示模塊**********//

voiddataDisplay(){

unsignedchari;

for(i=0;i<8;i++){

temp[i]=0;

}

i=0;

while(x/10){

temp[i]=x%10;

x=x/10;

i++;

}

temp[i]=x;

for(i=0;i<8;i++){

dispbuf[i]=temp[i];

}

P2=dispcode[dispbuf[dispcount]];

P0=dispbit[dispcount];

dispcount++;

if(dispcount==8){

dispcount=0;

}

}

//******************************************************//

//*********信號頻率測量模塊**********//

floatfrequency(floatfreq){

initial();

TR0=1;TR1=1;

if(timecount==250){

TR0=0;

freq=T0count*65536+TH0*256+TL0;

return(freq);

}

}

//******************************************************//

//*********信號周期測量模塊**********//

floatcycle(floatcount){

initial();

if(P3_4==1){

TR0=1;TR1=1;

if(P3_4==0){

TR0=0;

count=1000000/(timecount*4000+TH1*256+TL1-61536);

}

}

return(count);

}

//******************************************************//

//*********定時中斷服務程序1**********//

voidt1(void)interrupt3using0{

//initial();

//TR0=1;

//TR1=1;

TH1=(65536-4000)/256;

TL1=(65536-4000)%256;

timecount++;

}

//******************************************************//

//*********定時中斷服務程序2**********//

voidt0(void)interrupt1using0{

//initial();

//TR0=1;

//TR1=1;

T0count++;

}

//******************************************************//

//*********主函數**********//

voidmain(void){

while(1){

x=frequency(x);

if(x<100){

x=cycle(x);

}

dataDisplay();

}

}

//******************************************************//

C. 51單片機控簡易頻率計的程序

1M,似乎不太好弄,如果要求比較精確的話;

100HZ~1M,換成同期:1US~10MS,周期/2=(0.5US~5MS),0.5US的脈寬....24M晶振都做不到的;檢測一個脈寬起碼也行四五條指令吧。。。

用匯編:
loop:
JB DATA_IN,$;高電平等待
JNB DATA_IN,$;低電平等待
INC TIMES;脈寬數加1
AJMP loop;

再用定時器定時:如:10MS,記錄這10MS內TIMES變化了多少次,再換算成頻率;注意誤差范圍。。。。頻率低的話10MS得換大些。。
顯示部分也可用定時器來做。。

綜合以上,應該還是能做的;
如能選些6T 或 1T的51單片機肯定沒問題,傳統的12T的估計有點難

閱讀全文

與51單片機測頻率的程序相關的資料

熱點內容
js跳到頁面某地 瀏覽:550
jsp展示clob欄位 瀏覽:779
nyx在網路上是什麼意思 瀏覽:145
樂播農業app是什麼 瀏覽:530
編程框架如何開發 瀏覽:136
金庸群俠傳3修改代碼 瀏覽:712
檢察院的文件類別有哪些 瀏覽:793
怎麼把九游殘留數據刪除 瀏覽:828
有什麼女生主動聊天的app 瀏覽:436
有哪些可以督促自己的app 瀏覽:244
用USB傳輸視頻文件夾顯示為空 瀏覽:710
恢復文件軟體免費版手機 瀏覽:648
lg怎麼隱藏文件 瀏覽:836
蘋果免費讀書app推薦 瀏覽:497
劉駿微信 瀏覽:113
書旗舊版本80 瀏覽:467
教編程考什麼證 瀏覽:990
下載編程貓後哪裡有客服 瀏覽:13
如何編輯歌曲文件格式 瀏覽:638
cf無限領取cdk工具 瀏覽:350

友情鏈接