頻率定義為每秒的周期數。它也可以定義為總時間“T”的倒數。在本項目中,我們將計算進入8051微控制器端口3.5的脈沖數,并將其顯示在16 * 2 LCD顯示屏上。所以基本上我們測量了8051端口3.5的信號頻率。這里我們使用了AT89S528051芯片,在非穩(wěn)定模式下使用555 IC來生成采樣脈沖進行演示。
所需組件:
8051 微控制器 (AT89S52)
16*2液晶顯示屏
頻率源(555 定時器)
電位計
連接線
電路圖:
使用 8051 定時器測量頻率:
8051微控制器是一款8位微控制器,具有128字節(jié)的片上RAM,4K字節(jié)的片上ROM,兩個定時器,一個串行端口和四個8位端口。8052微控制器是微控制器的擴展。要將端口 3.5 配置為計數器,TMOD 寄存器值設置為 0x51。下圖顯示了TMOD寄存器。
門 | C / T | M1 | M0 | 門 | C / T | M1 | M2 |
定時器 1 | 定時器 0 |
GATE- 設置 GATE時,僅當 INTx 引腳為高電平且 TRx 控制引腳設置為 TRx 控制引腳時,才會使能定時器或計數器。當 GATE 被清除時,只要 TRx 控制位設置為 U,定時器就會啟用。
C / T– 當C / T= 0時,它充當計時器。當 C/T = 1 時,它充當計數器。
M1 和M0表示工作模式。
對于 TMOD = 0x51,定時器1充當計數器,并在模式1(16位)下運行。
16 * 2 LCD用于以赫茲(Hz)顯示信號的頻率。如果您不熟悉 16x2 LCD,請在此處查看有關 16x2 LCD 引腳及其命令的更多信息。另請查看如何將液晶屏與8051連接。
555定時器作為頻率源:
頻率源應產生方波,最大幅度限制為5V,因為8051微控制器的端口無法處理大于5V的電壓。它可以測量的最大頻率為655.35 KHz,因為TH1和TL1寄存器的內存限制(每個8位)。在 100 毫秒內,TH1 和 TL1 最多可容納 65535 個計數。因此,可以測量的最大頻率為 65535 * 10 = 655.35 KHz。
在這個 8051 頻率計項目中,我在非穩(wěn)定模式下使用 555 定時器來產生可變頻率方波。555 IC產生的信號頻率可以通過調整電位計來改變,如本項目結束時給出的視頻所示。
在本項目中,Timer1 (T1) 對進入 8051 微控制器端口 3.5 的脈沖數進行 100 毫秒的計數。計數值將分別存儲在 TH1 和 TL1 寄存器中。為了組合TH1和TL1寄存器的值,使用以下公式。
Pulses = TH1 * (0x100) + TL1
現在,“脈沖”將在 100 毫秒內具有周期數。但信號的頻率定義為每秒的周期數。要將其轉換為頻率,請使用以下公式。
Pulses = Pulses * 10
工作和代碼解釋:
本項目結束時給出了該頻率計的完整 C 程序。代碼被分成有意義的小塊,并在下面解釋。
對于與8051微控制器的16 * 2 LCD接口,我們必須定義16 * 2 LCD連接到8051微控制器的引腳。16*2 LCD 的 RS 引腳連接到 P2.7,16*2 LCD 的 RW 引腳連接到 P2.6,16*2 LCD 的 E 引腳連接到 P2.5。數據引腳連接到 8051 微控制器的端口 0。
sbit rs=P2^7;
sbit rw=P2^6;
sbit en=P2^5;
接下來,我們必須定義一些在程序中使用的函數。延遲功能用于創(chuàng)建指定的時間延遲。Cmdwrt功能用于向16 * 2 LCD顯示器發(fā)送命令。Datawrt功能用于將數據發(fā)送到16 * 2 LCD顯示器。
void delay(unsigned int) ;
void cmdwrt(unsigned char);
void datawrt(unsigned char);
在代碼的這一部分中,我們將命令發(fā)送到 16*2 lcd。清除顯示、遞增光標、強制光標以 1 開頭等命令圣在指定的時間延遲后,線被一一發(fā)送到16 * 2液晶顯示器。
for(i=0;i<5;i++)?
{
cmdwrt (cmd[i]);
delay (1);
}
在代碼的這一部分中,定時器1配置為計數器,操作模式設置為模式1。
定時器0配置為定時器,操作模式設置為模式1。定時器1用于計算脈沖數,定時器0用于產生延時。TH1 和 TL1 值設置為 0,以確保計數從 0 開始。
TMOD=0x51;
TL1=0;
TH1=0;
在代碼的這一部分中,計時器運行 100 毫秒。使用延遲功能生成 100 毫秒的延遲。TR1=1 用于啟動計時器,TR1=0 用于在 100 毫秒后停止計時器。
TR1=1;
delay(100);
TR1=0;
在代碼的這一部分中,將 TH1 和 TL1 寄存器中存在的計數值組合在一起,然后乘以 10 以獲得 1 秒內的總周期數。
Pulses = TH1*(0x100) + TL1;
Pulses = pulses*10;
在代碼的這一部分中,頻率值被轉換為單個字節(jié),以便于在16 * 2 LCD顯示器上顯示。
d1 = pulses % 10;
s1 = pulses % 100;
s2 = pulses % 1000;
s3 = pulses % 10000;
s4 = pulses % 100000;
d2 = (s1-d1) / 10;
d3 = (s2-s1) / 100;
d4 = (s3-s2) / 1000;
d5 = (s4-s3) / 10000;
d6 = (pulses-s4) / 100000;
在代碼的這一部分中,頻率值的各個數字被轉換為ASCII格式,并顯示在16 * 2 LCD顯示屏上。
If (pulses>=100000)
datawrt ( 0x30 + d6);
if(pulses>=10000)
datawrt( 0x30 + d5);
if(pulses>=1000)
datawrt( 0x30 + d4);
if(pulses>=100)
datawrt( 0x30 + d3);
if(pulses>=10)
datawrt( 0x30 + d2);
datawrt( 0x30 + d1);
在代碼的這一部分中,我們將命令發(fā)送到 16*2 LCD 顯示器。該命令將復制到 8051 微控制器的端口 0。對于命令寫入,RS 設置為低電平。對于寫入操作,RW 設置為低電平。在使能 (E) 引腳上施加高到低脈沖以啟動命令寫入操作。
void cmdwrt (unsigned char x)
{
P0=x;
rs=0;
rw=0;
en=1;
delay(1);
en=0;
}
在代碼的這一部分中,我們將數據發(fā)送到16 * 2 LCD顯示器。數據將復制到 8051 微控制器的端口 0。RS 設置為高電平以進行命令寫入。對于寫入操作,RW 設置為低電平。在使能(E)引腳上施加高到低脈沖以啟動數據寫入操作。
void datawrt (unsigned char y)
{
P0=y;
rs=1;
rw=0;
en=1;
delay(1);
en=0;
}
這就是我們使用8051微控制器測量任何信號頻率的方式。
#include
sbit rs=P2^7;
sbit rw=P2^6;
sbit en=P2^5;
void delay(unsigned int) ;
void cmdwrt(unsigned char);
void datawrt(unsigned char);
void main (void)
{
unsigned long int pulses;
unsigned char i;
unsigned int s1,s2,s3,s4;
unsigned char d1,d2,d3,d4,d5,d6;
unsigned char cmd[]={0x38,0x01,0x06,0x0c,0x82};
unsigned char msg[]={"Freq: "};
unsigned char msg2[]={" Hz"};
for(i=0;i<5;i++)?
{
cmdwrt(cmd[i]);
delay(1);
}
while(1)
{
TMOD=0x51;
TL1=0;
TH1=0;
TR1=1;
delay(100);
TR1=0;
pulses= TH1*256 + TL1;
pulses=pulses*10;
d1=pulses%10;
s1=pulses%100;
s2=pulses%1000;
s3=pulses%10000;
s4=pulses%100000;
d2=(s1-d1)/10;
d3=(s2-s1)/100;
d4=(s3-s2)/1000;
d5=(s4-s3)/10000;
d6=(pulses-s4)/100000;
cmdwrt(0x01);
delay(1);
for(i=0;msg[i]!='';i++)
datawrt(msg[i]);
if(pulses>=100000)
datawrt(0x30+d6);
if(pulses>=10000)
datawrt(0x30+d5);
if(pulses>=1000)
datawrt(0x30+d4);
if(pulses>=100)
datawrt(0x30+d3);
if(pulses>=10)
datawrt(0x30+d2);
datawrt(0x30+d1);
for(i=0;msg2[i]!='';i++)
datawrt(msg2[i]);
delay(1000);
}
}
void cmdwrt (unsigned char x)
{
P0=x;
rs=0;
rw=0;
en=1;
delay(1);
en=0;
}
void datawrt (unsigned char y)
{
P0=y;
rs=1;
rw=0;
en=1;
delay(1);
en=0;
}
void delay(unsigned int z)
{
unsigned int p;
for(p=0;p
-
微控制器
+關注
關注
48文章
7487瀏覽量
151044 -
8051
+關注
關注
3文章
309瀏覽量
51452 -
信號頻率
+關注
關注
0文章
21瀏覽量
1941
發(fā)布評論請先 登錄
相關推薦
評論