導航:首頁 > 操作系統 > 單片機模擬頻率計

單片機模擬頻率計

發布時間:2022-05-27 03:43:58

① 做用51單片機做一個頻率計,測量范圍為0.1Hz~10kHz

在不改變定時時間的前提下,也就是0.5秒定時,是不能實現0.1~2Hz頻率的測量的。
你所謂2Hz~10KHz易實現也是基於這個道理。但這個也是理論情況。
當你0.5s內剛好檢測到一個脈沖,你認為這個時候是2Hz而不是2.5hz或者3.9hz?
這中間存在一個測量精度的問題。實際上你所測到的信號是在2hz到4hz之間。

實際上我們在測量信號的時候,低頻一般會採用測周期,高頻用測頻才能提高測量的准確性。
至於高低頻的臨界點,跟你的計數頻率有關,感興趣的話可以去看《電子測量原理》。

下面我來講下測周實現的方法,可以使用邊沿觸發的D觸發器輸出作為單片機的外部定時控制,測量信號作為觸發時鍾,計數值作為該信號的周期。

② 單片機課程設計數字頻率計

數碼管台古老了,你用這個吧,看著還稍微有點可以,代碼和電路都給你了,沒有做不出來的理由,有問題加我QQ11422376745

#include "d:c51 eg51.h"

#include "d:c51intrins.h"

sbit LCM_RS=P3^0;

sbit LCM_RW=P3^1;

sbit LCM_EN=P3^7;

#define BUSY 0x80 //常量定義

#define DATAPORT P1

#define uchar unsigned char

#define uint unsigned int

#define L 50

uchar str0[16],str1[16],count;

uint speed;

unsigned long time;

void ddelay(uint);

void lcd_wait(void);

void display();

void initLCM();

void WriteCommandLCM(uchar WCLCM,uchar BusyC);

void STR();

void account();

/*********延時K*1ms,12.000mhz**********/

void int0_isr(void) interrupt 0 /*遙控使用外部中斷0,接P3.2口*/

{

unsigned int temp;

time=count;

TR0=0;

temp=TH0;

temp=((temp << 8) | TL0);

TH0=0x3c;

TL0=0xaf;

count=0;

TR0=1;

time=time*50000+temp;

}

void time0_isr(void) interrupt 1 /*遙控使用定時計數器1 */

{

TH0 =0x3c;

TL0 =0xaf;

count++;

}

void main(void)

{

TMOD=0x01; /*TMOD T0選用方式1(16位定時) */

IP|=0x01; /*INT0 中斷優先*/

TCON|=0x11; /*TCON EX0下降沿觸發,啟動T0*/

IE|=0x83;

TH0=0x3c;

TL0=0xaf;

initLCM();

WriteCommandLCM(0x01,1); //清顯示屏

for(;;)

{

account();

display();

}

}

void account()

{

unsigned long a;

if (time!=0)

{

a=L*360000000/time;

}

speed=a;

}

void STR()

{

str0[0]='S';

str0[1]='p';

str0[2]='e';

str0[3]='e';

str0[4]='d';

str0[5]=' ';

str0[6]=(speed%100000)/10000+0x30;

str0[7]=(speed%10000)/1000+0x30;

str0[8]=(speed%1000)/100+0x30;

str0[9]='.';

str0[10]=(speed%100)/10+0x30;

str0[11]=speed%10+0x30;

str0[12]='k';

str0[13]='m';

str0[14]='/';

str0[15]='h';

}

void ddelay(uint k)

{

uint i,j;

for(i=0;i<k;i++)

{

for(j=0;j<60;j++)

{;}

}

}

/**********寫指令到LCD子函數************/

void WriteCommandLCM(uchar WCLCM,uchar BusyC)

{

if(BusyC)lcd_wait();

DATAPORT=WCLCM;

LCM_RS=0; /* 選中指令寄存器*/

LCM_RW=0; // 寫模式

LCM_EN=1;

_nop_();

_nop_();

_nop_();

LCM_EN=0;

}

/**********寫數據到LCD子函數************/

void WriteDataLCM(uchar WDLCM)

{

lcd_wait( ); //檢測忙信號

DATAPORT=WDLCM;

LCM_RS=1; /* 選中數據寄存器 */

LCM_RW=0; // 寫模式

LCM_EN=1;

_nop_();

_nop_();

_nop_();

LCM_EN=0;

}

/***********lcd內部等待函數*************/

void lcd_wait(void)

{

DATAPORT=0xff; //讀LCD前若單片機輸出低電平,而讀出LCD為高電平,則沖突,Proteus模擬會有顯示邏輯黃色

LCM_EN=1;

LCM_RS=0;

LCM_RW=1;

_nop_();

_nop_();

_nop_();

while(DATAPORT&BUSY)

{ LCM_EN=0;

_nop_();

_nop_();

LCM_EN=1;

_nop_();

_nop_();

}

LCM_EN=0;

}

/**********LCD初始化子函數***********/

void initLCM( )

{

DATAPORT=0;

ddelay(15);

WriteCommandLCM(0x38,0); //三次顯示模式設置,不檢測忙信號

ddelay(5);

WriteCommandLCM(0x38,0);

ddelay(5);

WriteCommandLCM(0x38,0);

ddelay(5);

WriteCommandLCM(0x38,1); //8bit數據傳送,2行顯示,5*7字型,檢測忙信號

WriteCommandLCM(0x08,1); //關閉顯示,檢測忙信號

WriteCommandLCM(0x01,1); //清屏,檢測忙信號

WriteCommandLCM(0x06,1); //顯示游標右移設置,檢測忙信號

WriteCommandLCM(0x0c,1); //顯示屏打開,游標不顯示,不閃爍,檢測忙信號

}

/****顯示指定坐標的一個字元子函數****/

void DisplayOneChar(uchar X,uchar Y,uchar DData)

{

Y&=1;

X&=15;

if(Y)X|=0x40; //若y為1(顯示第二行),地址碼+0X40

X|=0x80; //指令碼為地址碼+0X80

WriteCommandLCM(X,0);

WriteDataLCM(DData);

}

/*******顯示指定坐標的一串字元子函數*****/

void DisplayListChar(uchar X,uchar Y,uchar *DData)

{

uchar ListLength=0;

Y&=0x01;

X&=0x0f;

while(X<16)

{

DisplayOneChar(X,Y,DData[ListLength]);

ListLength++;

X++;

}

}

void display()

{

STR();

DisplayListChar(0,0,str0);

DisplayListChar(0,1,str1);

}

③ CPLD和單片機的等精度頻率計模擬怎麼做只用軟體可以模擬嗎CPLD晶元需要畫嗎

完全可以自己去做,遇到問題再問、再討論。現在根本就一點都不去想,直接要就完了。這不能怪罪於學生,而是我國教育的失敗!(當然不排除花父母錢去學校玩的,這種人也大有人在)

④ 基於89C51單片機的數字頻率計怎麼模擬啊

你使用PROTEUS軟體調用AT89C51,等你的程序編輯好了後,使用這個軟體調用軟體示波器產看對應頻率大小即可,其實,你需要做的就是程序,您這個程序可以使用定時器0來輸出,定時器1來計算數字頻率的脈沖計數,這樣就可以知道具體數字頻率的大小了。

⑤ 基於51單片機的數字頻率計設計(proteus模擬)

#include"reg51.h"
#define uchar unsigned char
uchar tt;
void init();
void main(uchar t) //根據需要修改相應的值;
{
t=tt;
init();
while(1)
{
if(tt==t) //如果t==10,那麼周期是1秒,即平率==1Hz;
{
tt=0;
P0^0=~P0^0; //設信號從P0_0口輸出;
}
}
}
void init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //這里周期是100ms,你可以根據你的需要修改
EA=1;
ET0=1;
TR0=1;
}
void timer() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
}

⑥ 利用單片機的定時/計數功能設計一個頻率測量裝置,並以此頻率輸出方波

可以看看這個,51單片機簡易頻率計

⑦ 求51單片機設計數字頻率計,附帶Proteus模擬和程序

剛剛下了一樓傳的附件,測試後發現精度和測量范圍都比較差。如果單從測頻的角度來說,51的頻率計是很簡單的。恰好幾年前我寫過類似的程序,是用來測頻率和占空比的。

理論上單用C52這單片機測頻率最高為:12M/12/2=500KHZ。我寫的這個程序可以同時測頻率和脈寬,模擬下大概可以測到350KHZ;測脈寬好像10KHZ左右,再高的話脈寬的精度就會下降。測頻精度在100KHZ以內,基本是2HZ;200K是5HZ;350KHZ以內是10HZ;最低測量頻率1HZ。

模擬比較慢,數據要3秒後才會穩定,有興趣的話自測吧。

50KHZ測量

⑧ 單片機怎麼模擬

單片機體積小,重量輕,具有很強的靈活性而且價格便宜,具有邏輯判斷,定時計數等多種功能,廣泛應用於儀器儀表,家用電器,醫用設備的智能化管理和過程式控制制等領域。以單片機為核心的嵌入式系統已經成為目前電子設計最活躍的領域之一。

在嵌入式系統的中,開發板成本高,特別是對於大量的初學者而言,還可能由於設計的錯誤導致開發板損壞。利用Proteus我們可以很好地解決這個問題,由此我們可以快速地建立一個模擬系統。

2.Proteus介紹

Proteus是英國Labcenter Electro-nics公司開發的一款電路模擬軟體,軟體由兩部分組成:一部分是智能原理圖輸入系統ISIS(Intelligent Schematic Input System)和虛擬系統模型VSM(Virtual Model System);另一部分是高級布線及編輯軟體ARES(Adv-Ancd Routing and Editing Software)也就是PCB.

2.1 Proteus VSM的模擬

Proteus可以模擬模擬電路及數字電路,也可以模擬模擬數字混合電路。

Proteus可提供30多種元件庫,超過8000種模擬、數字元器件。可以按照設計的要求選擇不同生產廠家的元器件。此外,對於元器件庫中沒有的元件,設計者也可以通過軟體自己創建。

除擁有豐富的元器件外,Proteus還提供了各種虛擬儀器,如常用的電流表,電壓表,示波器,計數/定時/頻率計,SPI調試器等虛擬終端。支持圖形化的分析功能等。

Proteus特別適合對嵌入式系統進行軟硬體協同設計與模擬,其最大的特點是可以模擬8051,PIA,AVR,ARM等多種系列的處理器。Protues包含強大的調試工具,具有對寄存器和存儲器、斷點和單步模式IAR C-SPY,Keil、MPLAB等開發工具的源程序進行調試的功能;能夠觀察代碼在模擬硬體上的實時運行效果;對顯示,按鈕,鍵盤等外設的交互可視化進行模擬。

2.2 Proteus PCB

Proteus 的PCB設計除了有自動布線模擬功能外,還集成了PCB設計,支持多達16個布線層,可以任意角度放置元件和焊接連線;集成了高智能的布線演算法,可以方便地進行PCB設計。

3. 基於Protesus的簡單數據採集系統。

3.1 軟體的編寫

本例題採用可調電阻調節電壓值作為模擬信號的輸入

⑨ 51單片機的數字頻率計

本應用系統設計的目的是通過在「單片機原理及應用」課堂上學習的知識,以及查閱資料,培養一種自學的能力。並且引導一種創新的思維,把學到的知識應用到日常生活當中。在設計的過程中,不斷的學習,思考和同學間的相互討論,運用科學的分析問題的方法解決遇到的困難,掌握單片機系統一般的開發流程,學會對常見問題的處理方法,積累設計系統的經驗,充分發揮教學與實踐的結合。全能提高個人系統開發的綜合能力,開拓了思維,為今後能在相應工作崗位上的工作打下了堅實的基礎。

1.1數字頻率計概述
數字頻率計是計算機、通訊設備、音頻視頻等科研生產領域不可缺少的測量儀器。它是一種用十進制數字顯示被測信號頻率的數字測量儀器。它的基本功能是測量正弦信號,方波信號及其他各種單位時間內變化的物理量。在進行模擬、數字電路的設計、安裝、調試過程中,由於其使用十進制數顯示,測量迅速,精確度高,顯示直觀,經常要用到頻率計。
本數字頻率計將採用定時、計數的方法測量頻率,採用一個1602A LCD顯示器動態顯示6位數。測量范圍從1Hz—10kHz的正弦波、方波、三角波,時基寬度為1us,10us,100us,1ms。用單片機實現自動測量功能。
基本設計原理是直接用十進制數字顯示被測信號頻率的一種測量裝置。它以測量周期的方法對正弦波、方波、三角波的頻率進行自動的測量。
點擊重新載入
1.2頻率測量儀的設計思路與頻率的計算

圖1 頻率測量原理圖

頻率測量儀的設計思路主要是:對信號分頻,測量一個或幾個被測量信號周期中已知標准頻率信號的周期個數,進而測量出該信號頻率的大小,其原理如右圖1所示。

若被測量信號的周期為,分頻數m1,分頻後信號的周期為T,則:T=m1Tx 。由圖可知: T=NTo
(註:To為標准信號的周期,所以T為分頻後信號的周期,則可以算出被測量信號的頻率f。)
由於單片機系統的標准頻率比較穩定,而是系統標准信號頻率的誤差,通常情況下很小;而系統的量化誤差小於1,所以由式T=NTo可知,頻率測量的誤差主要取決於N值的大小,N值越大,誤差越小,測量的精度越高。

1.3 基本設計原理

基本設計原理是直接用十進制數字顯示被測信號頻率的一種測量裝置。它以測量周期的方法對正弦波、方波、三角波的頻率進行自動的測量。
所謂「頻率」,就是周期性信號在單位時間(1s)內

⑩ 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();
}
}

閱讀全文

與單片機模擬頻率計相關的資料

熱點內容
編譯程序輸入一個字元串 瀏覽:402
圓命令畫法 瀏覽:303
如果給電腦e盤文件加密 瀏覽:801
javaswing項目 瀏覽:774
androidsdksetup 瀏覽:1003
pdf怎麼設置中文 瀏覽:126
安卓手機用什麼軟體看倫敦金 瀏覽:962
魅族文件夾無名稱 瀏覽:789
蘇黎世無人機演算法 瀏覽:872
核桃編程和小碼王的融資 瀏覽:684
微積分教材pdf 瀏覽:725
寫python給微信好友發消息 瀏覽:336
蚊帳自營米加密 瀏覽:418
學校推薦核桃編程 瀏覽:804
湖南農信app怎麼導明細 瀏覽:471
福特abs編程 瀏覽:509
如何自學安卓手機 瀏覽:439
以太坊源碼共識機制 瀏覽:910
單片機探測器 瀏覽:872
demo編程大賽作品怎麼運行 瀏覽:52