標題:
求51單片機測頻率代碼
[打印本頁]
作者:
zhb1997
時間:
2018-4-18 13:18
標題:
求51單片機測頻率代碼
求51單片機測頻率代碼
作者:
fred_Li
時間:
2023-5-18 02:34
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define wdm P0
sbit pulse = P3^4; //脈沖輸入端口
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4; //控制數(shù)碼管位
uchar code DM[] =
{
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f
}; //段表
/******全局變量定義******/
uchar f0[5],pwm[2]; //分別保存頻率、占空比
/******函數(shù)聲明******/
void Delay(uint n); //延時函數(shù)
void init(); //初始化函數(shù)
void handle1_f(uint f); //處理頻率函數(shù)
void handle2_p(uint p); //處理函數(shù)
void Display_f(); //顯示占空比頻率
void Display_p(); //顯示占空比
/******主函數(shù)******/
void main()
{
uint th1,tl1,tf1,th2,tl2,tf2;
uint f,p;
int i,j;
init(); //初始化
while(1)
{
TH0 = 0;
TL0 = 0;
while(pulse); //pulse為脈沖的輸入引腳
while(!pulse); //等待上升沿來臨
TR0=1; //打開定時器
while(pulse); //等待下降沿來臨
th1=TH0;
tl1=TL0;
tf1=TF0;
while(!pulse); //等待上升沿來臨
TR0=0; //關(guān)閉定時器
th2=TH0;
tl2=TL0;
tf2=TF0;
p = ((1.0)*(th1*256+tl1+tf1*64536)/(th2*256 + tl2+tf2*64536))*1000;
f = 1000000.0/((th2*256 + tl2+tf2*64536)*12/12);
handle1_f(f);
handle2_p(p);
//刷新一次
for(i=0;i<2;i++){
Display_f();
Display_p();
}
}
}
void init()
{
TMOD = 0x11; //定時器T0、T1工作在方式1
EA = 1;
ET0 = 1;
ET1 = 1;
TH0 = 0;
TL0 = 0;
}
void Delay(int x)
{
int i, j;
for(i = x; i > 0; i--)
for(j = 114; j > 0; j--);
}
void handle1_f(uint x)
{
f0[5] = x%10;
f0[4] = x/10%10;
f0[3] = x/100%10;
f0[2] = x/1000%10;
f0[1] = x/10000%10;
f0[0] = x/100000%10;
}
void handle2_p(uint x)
{
pwm[2] = x%10;
pwm[1] = x/10%10;
pwm[0] = x/100%10;
}
void Display_f()
{
int i,j;
for(i=0;i<6;i++)
{
switch(i) //位選,選擇點亮的數(shù)碼管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//顯示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//顯示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//顯示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//顯示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//顯示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//顯示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//顯示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//顯示第7位
}
j=f0[i];
P0=DM[j];//發(fā)送段碼
Delay(5); //間隔一段時間掃描
}
}
void Display_p()
{
int i,j;
for(i=0;i<3;i++)
{
switch(i) //位選,選擇點亮的數(shù)碼管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//顯示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//顯示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//顯示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//顯示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//顯示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//顯示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//顯示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//顯示第7位
}
j=pwm[i];
P0=DM[j];//發(fā)送段碼
Delay(5); //間隔一段時間掃描
}
}
作者:
王秋冬
時間:
2023-5-20 16:15
這個頻率計程序是沙發(fā)上傳的,有誰實際實驗過嗎、
作者:
coody_sz
時間:
2023-5-21 14:39
51單片機測頻最好方式是,產(chǎn)生一個高電平1秒、低電平10ms的信號,控制Timer0或Timer1做門控對外計數(shù),外中斷下降沿觸發(fā)讀取。輸入電路用一般的邏輯IC處理可以到50MHz,用專用分頻IC可以做到2.4GHz。
作者:
hy47566398
時間:
2023-5-22 01:20
供參考:
/*********************************
*實驗:定時器,計數(shù)器
*做計數(shù)器,P3.4,若信號直接輸入,
*最好為方波,信號源幅度(>2.9V)
*交流電壓值:>1.0v,過低無效
*********************************/
void _Time0() interrupt 1
{
TL0 = x;
TH0 = y;
nTrig++;
P2++; //LEDx8
}
/*********************************
* 時基:(1ms,晶振:12M)
* 定時:TL1=0x3C(理論計算=0x18),
* TH1=0xFC
* 計數(shù)測頻:TL1=0x2C(測頻校正)
* TL1取值與函數(shù)體內(nèi)代碼行數(shù)相關(guān)聯(lián)
* 計數(shù)器,測得顯示最高頻率:
* 489.1K,信號源輸入:501.111KHz時
* 與理論上480KHz相差不大
*********************************/
void _Time1() interrupt 3
{
TL1 = 0x2C;
TH1 = 0xFC;
//5秒提取一次計數(shù)數(shù)字
if(_x++>5000)
{
TR0 = 0;
bInter = true;
_x = 0;
}
}
void main()
{
。。。
TMOD = 0x15; //設(shè)置定時器模式
TF0 = 0; //清除TF0標志
TF1 = 0; //清除TF1標志
x = 0xB0;
y = 0x3C;
//0x3CB0=15536
TL0 = 0xB0;
TH0 = 0x3C;
TL1 = 0x3C; //設(shè)置定時初始值
TH1 = 0xFC; //設(shè)置定時初始值
TR1 = 1; //定時器1開始計
ET1 = 1;
TR0 = 1;
ET0 = 1;
//中斷總開關(guān)
EA = 1;
while(1)
{
...
LcdDisplayStr(0, 2, "OutFreq:");
if(bInter)
{
Vout = nTrig*(0x10000-(y*0x100+x));
Max = (TH0 * 0x100 + TL0) - (y*0x100 + x);
//頻率
Hz = (Vout + Max)/5;
LcdDisplayNum(4,3,Hz,7,0,0);
//PROBE = true;
nTrig = 0;
bInter = false;
TL0 = x;
TH0 = y;
TR0 = 1;
}
}
}
作者:
123456ZXC1
時間:
2023-5-22 13:32
#include <reg51.h>
#define TRIGGER_PIN P1 // 觸發(fā)引腳
#define TIMER0_TH0 TH0 // 定時器0高字節(jié)
#define TIMER0_TL0 TL0 // 定時器0低字節(jié)
volatile unsigned long frequency = 0; // 測量的頻率
void timer0_init() {
TMOD |= 0x01; // 設(shè)置定時器0為模式1
ET0 = 1; // 允許定時器0中斷
}
void delay(unsigned int milliseconds) {
unsigned int i, j;
for (i = 0; i < milliseconds; i++) {
for (j = 0; j < 120; j++) {
}
}
}
void measure_frequency() {
TRIGGER_PIN = 1; // 設(shè)置觸發(fā)引腳為高電平
TRIGGER_PIN = 0; // 設(shè)置觸發(fā)引腳為低電平
while (!TRIGGER_PIN); // 等待觸發(fā)引腳為高電平
TH0 = TL0 = 0; // 清零定時器0
while (TRIGGER_PIN); // 等待觸發(fā)引腳為低電平
TR0 = 1; // 啟動定時器0
while (TRIGGER_PIN); // 等待觸發(fā)引腳為高電平
TR0 = 0; // 停止定時器0
frequency = (TIMER0_TH0 << 8) | TIMER0_TL0; // 讀取定時器0計數(shù)值
}
void main() {
timer0_init(); // 初始化定時器0
while (1) {
measure_frequency(); // 測量頻率
delay(1000); // 延時1秒
}
}
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1