藍橋杯單片機必備知識-----(8)NE555測頻
NE555測頻原理
很多人不知道NE555測頻怎么搞,其實很簡單,

已經使用跳線帽將P34和NE555的輸出端接在一起了,關乎NE555,有些許數電基礎的都明白,NE555就是改變RB3,改變負載電阻,使其輸出方波的頻率發生改變,其中并不涉及任何對NE555的編程,當然你也沒法對其編程,
官方的CT107D的NE555輸出頻率范圍是50-20K赫茲(以上),
那么我們怎么測頻呢,
P34對應的是單片機的定時器0的脈沖輸入口,那么我們可以把定時器0設定為計數模式,每接收到NE555的一個脈沖,定時器0計數值就加1,然后500ms讀取一次定時器0的計數值,再乘以2大約就是1s內的脈沖,不就是NE555輸出的方波的頻率嗎,
然后按鍵、LED、數碼管等等其余需要使用定時器的就使用定時器1來完成,
主要代碼:
//記500ms,乘以2就是頻率
if(f_flag) //500ms
{
f_flag = 0;
TR0 = 0; //關閉定時器0
FRE = TH0 * 256 + TL0; //二進制轉十進制
FRE *= 2; //乘2就為頻率
TH0 = TL0 = 0; //將計數器的高低位置0
TR0 = 1; //打開定時器0
}
測驗結果:
但是自己的顯示結果肯定是不夠的的,需要結合示波器來判斷自己測量是否準確;我的測驗結果之前在學校實驗室校對過,

完整代碼粘貼:
#include <stc15f2k60s2.h>
#define uchar unsigned char
#define uint unsigned int
uchar tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar dspbuf[] = {10,10,10,10,10,10,10,10};
long int FRE;
uchar f_flag;
void load();
void display();
void cls()
{
P2 = (P2 & 0x1f) | 0x80;
P0 = 0xff;
P2 = 0x1f;
P2 = (P2 & 0x1f) | 0xa0;
P0 = 0x00;
P2 = 0x1f;
}
void main()
{
cls();
AUXR = 0xc0;
TMOD = 0x04;
TL1 = 0xcd;
TH1 = 0xd4;
TL0 = TH0 = 0;
TR0 = 1;
TR1 = 1;
ET1 = 1;
EA = 1;
while(1)
{
if(f_flag)
{
f_flag = 0;
TR0 = 0;
FRE = TH0 * 256 + TL0;
FRE *= 2;
TH0 = TL0 = 0;
TR0 = 1;
}
}
}
void time1() interrupt 3
{
static unsigned int intr = 0;
if(++intr == 500){intr = 0;f_flag = 1;}
display();
}
void load()
{
dspbuf[7] = FRE % 10;
dspbuf[4] = FRE / 1000;
dspbuf[5] = FRE / 100 - dspbuf[4] * 10;
dspbuf[6] = FRE / 10 - dspbuf[4] * 100 - dspbuf[5] * 10;
}
void display()
{
static unsigned char dspcom = 0;
load();
P2 = (P2 & 0x1f) | 0xe0;
P0 = 0xff;
P2 = 0x1f;
P2 = (P2 & 0x1f) | 0xc0;
P0 = 1<<dspcom;
P2 = 0x1f;
P2 = (P2 & 0x1f) | 0xe0;
P0 = tab[dspbuf[dspcom]];
P2 = 0x1f;
if(++dspcom == 8) dspcom = 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/226954.html
標籤:其他
上一篇:2020年浙江省物理科技創新競賽一等獎——基于物聯網感知的家居人體健康狀況檢測系統
下一篇:問題 A: 阿Q的記憶
