A. 51單片機的數字頻率計
該系統由定時器0中斷子函數、定時器1中斷子函數、延時子函數、按鍵消抖子函數、閘門控制子函數、主函數和數據定義這幾部分組成。
閘門時間由定時器1控制,初始為2s,可以通過按鍵加減,范圍為2s到7秒。閘門時間就是采樣時間,閘門時間越長,測量精度越准確。
由P3.4輸入信號,低電平有效,觸發T0外部中斷。當T0觸發中斷的時候執行的程序。這里只進行了一個操作,t0++。所以,t0的值表示觸發了幾次中斷,也就表示接受到的脈沖幾次從0到65536。所以會有t0*65536。 另外,由於計時的機制是THO++、TL0++,所以,THOTL0就表示當前的計數值。THOTLO- 初值就可以確定沒有觸發中斷定時多少。TH0*256==TH0*2^8,實質就是左移8位,就是拼接TH0跟TL0的處理。
所以頻率的核心演算法為
daimao=(t0*65536+TH0*256+TL0)/n
程序框圖
總源程序
#include "reg52.h"
#define uchar unsigned char
typedef unsigned int uint;
sbit w1=P2^0;
sbit w2=P2^1;
sbit w3=P2^2;
sbit w4=P2^3;
sbit w5=P2^4;
sbit w6=P2^5;
sbit jia=P1^6;
sbit jian=P1^7;
sbit s=P3^7;//啟動
bit flag;//標簽
uchar s1,s2,s3,s4,s5,s6, shu=1;//控制數組取值
uchar t0,t1,t2,a;
unsigned long m=5,n;//m為閘門時間
int y;
unsigned long daimao;//頻率
unsigned char code table1[]={0xc0,0xf9,0xa4,0xb0, //閘門時間數組0-f
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
unsigned char code table2[]={0xc0,0xf9,0xa4,0xb0, //頻率數組0-f
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
B. 誰有微機原理及應用課程設計 要求設計一套以MCS-51單片機為核心的測量與控制系統, 功能是頻率測量儀 謝謝
我做的紅外邏輯分析器。
測量頻率最好用快點的cpu。我用的是arm7.如果會用現場陣列就更好了。
C. 利用單片機的定時/計數功能設計一個頻率測量裝置,並以此頻率輸出方波
可以看看這個,51單片機簡易頻率計
D. 用等精度頻率計原理,設計一個以單片機為核心的等精度數字頻率計。
頻率計就是個計數器,用單片機的外部中斷和定時器就可以搞定
E. 設計一個以單片機為核心的頻率測量裝置。使用AT89C51單片機的定時器/計數器的定時和計數功能
將單片機的兩個定時器設置成:一個定時器模式,一個計數器模式,在定時時間之內檢查計數器的脈沖個數就可以計算出頻率大小了。
F. 基於MCS-51系列單片機AT89C51,設計一個以單片機為核心的頻率測量裝置。
直接列出需求,等現成的,這不是學習之法啊
我只能告訴你,用兩個定時/計數器,一個做定時器,一個做計數器,一定時間內測到的上升沿或者下降沿的個數,就可以算出頻率了
G. 設計數字頻率計
一、基本原理
使用555產生矩形波信號,輸入到單片機進行測量頻率。
測頻的方案有多種:
1、測周法:通過測量被測信號的周期的倒數得到頻率,選用適當的時基,以被測信號作為計數的閘門進行測量,得到閘門內的計數值,與時基相乘即為被測信號的周期,周期的倒數即為頻率。該法適合測量頻率低的信號。
2、測頻法:通過頻率的定義即單位時間的脈沖數,得到被測信號的頻率。選用適當的時基,如1秒,以此作為計數閘門,得到閘門內的計數值即為信號的頻率。該法適合測量頻率高的信號。
二、參考電路框圖
模擬電路,程序在這里 http://hi..com/huang0776/item/a2983cb9d12f35442aebe3dc三、參考程序流程圖
圖
H. 怎麼設計一個數字頻率計 要求:設計一個以單片機為核心的頻率測量裝置。使用AT89C51單片機的定
被測頻率較高時,可以採用樓主所說的《定時計數法》。
如果頻率較低,幾秒鍾,都不來一個脈沖,這方法就不行了。
就應該採用《測量周期法》來測頻。
I. 設計一個以單片機為核心的頻率測量裝置。被測頻率fx<110Hz,採用測周法 利用鍵盤分段測量和自動分段測量
555定時器就可以, 網上有很多類似的資料。
J. 設計一個以單片機為核心的頻率測量裝置。求大神給寫一下程序。
單片機頻率計模擬。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit p0=P1^0;
bit tb0,tb1;
uchar tt0,tt1,tt2,tt3;
uchar code led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void main()
{
TMOD=0x11;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1; //開定時器0中斷
ET1=1; //開定時器1中斷
TR0=1; //啟動定時器0
TR1=1; //啟動定時器1
while(1)
{
if(TR1==0)
{
// tt3=65536*tt2+266*TH1+TL1
TH1=0x00;TL1=0x00;
tt1=0x00;tt2=0x00;
tb1=1;
led[0]=tt3/1000000;
led[1]=tt3/100000%10;
led[2]=tt3/100000%10;
led[3]=tt3/10000%10;
led[4]=tt3/1000%10;
led[5]=tt3/100%10;
led[6]=tt3/10%10;
led[7]=tt3%10;
}
if(tt0==1 && tb0=1)
{
tb0=1;P0==0xff;
P2=led[0];P0=0xfe
}
if(tt0==2 && tb0=1)
{
tb0=1;P0==0xff;
P2=led[1];P0=0xfd
}
if(tt0==3 && tb0=1)
{
tb0=1;P0==0xff;
P2=led[2];P0=0xfb
}
if(tt0==4 && tb0=1)
{
tb0=1;P0==0xff;
P2=led[3];P0=0xf7
}
if(tt0==5 && tb0=1)
{
tb0=1;P0==0xff;
P2=led[4];P0=0xef
}
if(tt0==6 && tb0=1)
{
tb0=1;P0==0xff;
P2=led[5];P0=0xdf
}
if(tt0==7 && tb0=1)
{
tb0=1;P0==0xff;
P2=led[6];P0=0xbf
}
if(tt0==8 && tb0=1)
{
tb0=1;P0==0xff;
P2=led[7];P0=0x7f
tt0=0;
}
}
}
void timer0() interrupt 1
{
TH0=(65535-2000)/256;
TL0=(65535-2000)%256;
tt1++;
if(tt1==500)
{
TR1=0; //啟動定時器1
tb1=0
}
tt0++;tb0=1;
if(tb1==1 && TR1==0)TR1=1;
}
void timer1() interrupt 3
{
tt2++;
}