1.3系統(tǒng)結(jié)構(gòu)框圖 2系統(tǒng)硬件電路設(shè)計 2.1總體電路圖 圖2、總體電路圖 2.2各單元模塊功能 ①STC89C52RC: 具有以下標(biāo)準(zhǔn)功能: 8k字節(jié)Flash,512字節(jié)RAM, 32 位I/O 口線,看門狗定時器,內(nèi)置4KB EEPROM,MAX810復(fù)位電路,3個16 位定時器/計數(shù)器,4個外部中斷,一個7向量4級中斷結(jié)構(gòu)(兼容傳統(tǒng)51的5向量2級中斷結(jié)構(gòu)),全雙工串行口。另外 STC89C52 可降至0Hz 靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式。空閑模式下,CPU 停止工作,允許RAM、定時器/計數(shù)器、串口、中斷繼續(xù)工作。掉電保護方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié),單片機一切工作停止,直到下一個中斷或硬件復(fù)位為止。最高運作頻率35MHz,6T/12T可選。 圖3、STC89C52RC引腳圖 ②LCD1602液晶顯示屏: 1602采用標(biāo)準(zhǔn)的16腳接口,其中: 第1腳:VSS為電源地 第2腳:VCC接5V電源正極 第3腳:V0為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地電源時對比度最高(對比度過高時會 產(chǎn)生“鬼影”,使用時可以通過一個10K的電位器調(diào)整對比度)。 第4腳:RS為寄存器選擇,高電平1時選擇數(shù)據(jù)寄存器、低電平0時選擇指令寄存器。 第5腳:RW為讀寫信號線,高電平(1)時進行讀操作,低電平(0)時進行寫操作。 第6腳:E(或EN)端為使能(enable)端,高電平(1)時讀取信息,負(fù)跳變時執(zhí)行指令。 第7~14腳:D0~D7為8位雙向數(shù)據(jù)端。 第15~16腳:空腳或背燈電源。15腳背光正極,16腳背光負(fù)極。 主要功能:用來顯示頻率 ③LM393比較器: lm393引腳圖 圖4、 LM393內(nèi)部結(jié)構(gòu)圖 LM393主要功能: 輸出負(fù)載電阻能銜接在可允許電源電壓范圍內(nèi)的任何電源電壓上,不受 Vcc端電壓值的限制,輸出部分的陷電流被可能得到的驅(qū)動和器件的β值所限制。當(dāng)達(dá)到極限電流(16mA)時,輸出晶體管將退出而且輸出電壓將很快上升。輸出飽和電壓被輸出晶體管大約60ohm 的γSAT限制。當(dāng)負(fù)載電流很小時,輸出晶體管的低失調(diào)電壓(約1.0mV)允許 輸出箝位在零電平。 ④UA741集成運放: UA741的2腳是反相輸入端,3腳是同相輸入端,6腳是輸出端,7腳接正電源,4腳接負(fù)電源(雙電源工作時或地(單電源工作時),1腳和5腳是失調(diào)電壓調(diào)零端,8腳是空腳內(nèi)部沒有任何連接。如下圖—— 圖5、 UA741引腳圖 主要功能:把信號放大,得到所需要的電壓幅值。 ⑤11.0592Mhz晶振: 晶體振蕩器,能產(chǎn)生振蕩,其特點是固有頻率十分穩(wěn)定,而且震動具有多諧性,除了奇頻震動外還有奇次諧波泛音震動.性能上,晶振的品質(zhì)因素Q和特性阻抗都非常高,而且接入系數(shù)很小,因此具有很高的頻率穩(wěn)定度,提供單片機工作時鐘 2.3模塊電路設(shè)計 電路的關(guān)鍵部分還是放大整形電路,下面是放大整形電路的設(shè)計模塊 總體電路: 圖6 、放大整形總體電路圖 放大器部分: 圖7、 放大部分電路圖 根據(jù)實際器件的設(shè)計,我們放大器放大倍數(shù)為Au=101倍 具體算法如下 假定放大器同向輸入端電壓為Ui,放大器放大輸出電壓端電壓Uo,則回路近似有以下關(guān)系 (公式1) 則放大倍數(shù)為: (公式2) 比較器部分: 圖8、 比較電路設(shè)計圖 我們給比較器反向輸入端的基準(zhǔn)電壓為2.5v,輸出端接一個上拉電阻增強輸出引腳的驅(qū)動能力。當(dāng)同向輸入端電壓大于反向輸入端電壓(2.5V)時,比較器輸出高電平,當(dāng)同向輸入端電壓低于反向輸入端電壓(2.5V)時,比較器輸出低電平。
因此,以2.5V為界,當(dāng)輸入電壓變化時,輸出端反映出兩種狀態(tài),高電位和低電位。 3系統(tǒng)軟件設(shè)計 3.1程序流程圖 3.2程序主要模塊 程序包括,定時模塊,計數(shù)模塊,顯示模塊 定時模塊是用來定時1秒給計數(shù)器,計數(shù)器在這1秒數(shù)了多少個數(shù),再把數(shù)了多少個數(shù)拿去給顯示模塊顯示。 4系統(tǒng)仿真及調(diào)試 4.1Proteus仿真 圖10、 Proteus仿真圖一 圖11、 Proteus仿真圖二 4.2實物研制及調(diào)試 4.2.1方波頻率測試 結(jié)論
實訓(xùn)過程中遇到了很多問題,這個題目不僅關(guān)于如何寫單片機的程序,還要理清放大整形電路的設(shè)計思路,一剛開始,我們也不知道怎么設(shè)計放大整形電路。然后去百度借鑒別人的設(shè)計思路,設(shè)計過程也很懊惱,各種器件的取值怎么選取,由于實驗室的器材種類有限,我們還得根據(jù)實際出發(fā),選擇合適的器件。放大整形電路設(shè)計完成后,我們就根據(jù)電路來搭個原理圖。我是第一次使用Altium Designer來畫PCB的,使用操作有點陌生,我就根據(jù)老師的演示和課后看課本慢慢熟悉Altium Designer畫PCB的過程,最后完成了自己的PCB電路。后面就是打印PCB焊接電路的過程了,實物做出來后,和仿真的還是有很大差別,特別是放大器部分,單電源無法工作,這就給我們的電路造成一個很大的錯誤,最后我們改成了雙電源工作,電路其他部分因為雙電源工作的影響,我們也改了一下。最終完成了我們的頻率計的設(shè)計,頻率也能測得出來了。總之實訓(xùn)過程很有趣和考驗我們的設(shè)計能力,在實訓(xùn)中體會學(xué)習(xí)的快樂。
附錄一:實物圖 圖12、實物圖一 圖13、實物圖二
#include"reg51.h"
#define uint unsigned int
#define uchar unsigned char
#define DATAPORT P2
sbit RS=P3^2;
sbit RW=P3^6;
sbit E=P3^7;
sbit fangbo1=P3^0;//提供10Hz左右的自檢信號
sbit fangbo2=P3^1;//提供1Hz左右的自檢信號
uchar num;
uint f=0;//頻率f
uchar code table[]="0123456789.";
uchar code table1[]="=sHZFT: ero!";
void init(void); //初始化函數(shù)聲明
void writeCOM(uchar i); //寫命令函數(shù)聲明
void writeData(uchar j); //寫數(shù)據(jù)函數(shù)聲明
void fbusy(void); //檢查忙函數(shù)聲明
void display(); //寫顯示函數(shù)
void delay(uint mux)
{
uint i,j;
for(i=mux;i>0;i--)
for(j=120;j>0;j--);
}
void main()
{
TMOD=0x51;//定時器·0工作在方式1,計數(shù)器1工作在方式1,晶振11.0592M,機器周期為12/f.
TL0=(65536-46080)%256; //定時50ms初值為 T(定時時間,秒)*F(晶振頻率 HZ)/12, 46080、45872
TH0=(65536-46080)/256;
TL1=0;
TH1=0;
ET0=1;
EA=1;
init();
while(1)
{
TR0=1;//打開定時器
TR1=1;//打開計數(shù)器
while(num==20)
{
num=0;//定時計算清
TR0=0;//關(guān)閉定時器
TR1=0; //關(guān)閉計數(shù)器
f=(TH1*256)+TL1;//計算頻率
delay(10);
TH1=0;//計數(shù)清0
TL1=0;//計數(shù)清0
}
display();//顯示結(jié)果
}
}
//定時1S溢出
void interr_zd2()interrupt 1
{
TL0=(65536-46080)%256;
TH0=(65536-46080)/256;
num++;
fangbo1=~fangbo1; //產(chǎn)生個10Hz左右的方波
if(num==10){fangbo2=~fangbo2;}//產(chǎn)生個1Hz左右的方波
}
//顯示屏數(shù)據(jù)
void display()
{
writeCOM(0x80);
writeData(table1[4]); //顯示F:
writeData(table1[6]);
writeCOM(0x8c);
writeData(table1[2]); // 顯示HZ
writeData(table1[3]);
writeCOM(0xc0);
writeData(table1[5]); // 顯示T:
writeData(table1[6]);
writeCOM(0xcd);
writeData(table1[1]); // 顯示S
if(f<10) //頻率1位數(shù)
{
writeCOM(0x85);
writeData(table1[7]);
writeData(table1[7]);
writeData(table1[7]);
writeData(table1[7]);
writeData(table1[7]);
writeData(table[f]);
}
if((f>=10)&(f<100))//頻率2位數(shù)
{
writeCOM(0x85);
writeData(table1[7]);
writeData(table1[7]);
writeData(table1[7]);
writeData(table1[7]);
writeData(table[f/10]);
writeData(table[f%10]);
}
if((f>=100)&(f<1000))//頻率3位數(shù)
{
writeCOM(0x85);
writeData(table1[7]);
writeData(table1[7]);
writeData(table1[7]);
writeData(table[f/100]);
writeData(table[f%100/10]);
writeData(table[f%10]);
}
if((f>=1000)&(f<10000))//頻率4位數(shù)
{
writeCOM(0x85);
writeData(table1[7]);
writeData(table1[7]);
writeData(table[f/1000]);
writeData(table[f%1000/100]);
writeData(table[f%100/10]);
writeData(table[f%10]);
}
if((f>=10000)&(f<=50000))//頻率5位數(shù)
{
writeCOM(0x85);
writeData(table1[7]);
writeData(table[f/10000]);
writeData(table[f%10000/1000]);
writeData(table[f%1000/100]);
writeData(table[f%100/10]);
writeData(table[f%10]);
}
if(f>50000) //超出50khz提示錯誤
{
writeCOM(0x84);
writeData(table1[7]);
writeData(table1[8]);
writeData(table1[9]);
writeData(table1[9]);
writeData(table1[10]);
writeData(table1[9]);
writeData(table1[11]);
writeCOM(0xc3);
writeData(table1[7]);
writeData(table1[7]);
writeData(table1[7]);
writeData(table1[8]);
writeData(table1[9]);
writeData(table1[9]);
writeData(table1[10]);
writeData(table1[9]);
writeData(table1[11]);
}
if((0<f)&(f<=50000)) //計算周期,顯示
{
writeCOM(0xc3);
writeData(table[1000000/f/1000000]);
writeData(table[10]);
writeData(table[1000000/f%1000000/100000]);
writeData(table[1000000/f%100000/10000]);
writeData(table[1000000/f%10000/1000]);
writeData(table1[7]);
writeData(table[1000000/f%1000/100]);
writeData(table[1000000/f%100/10]);
writeData(table[1000000/f%10]);
}
if(f==0) //顯示周期、頻率為0時算周期比較特殊
{
writeCOM(0xc3);
writeData(table[0]);
writeData(table[10]);
writeData(table[0]);
writeData(table[0]);
writeData(table[0]);
writeData(table1[7]);
writeData(table[0]);
writeData(table[0]);
writeData(table[0]);
}
}
//初始化函數(shù)
void init()
{
writeCOM(0x01); //清屏
writeCOM(0x38); //讀8位數(shù)據(jù),顯示兩行,使用5*7的字型
writeCOM(0x0c); //顯示器開,光標(biāo)關(guān),字符不閃爍
writeCOM(0x06); //字符不動,光標(biāo)自動右移一位
}
//檢查忙函數(shù)
void fbusy()
{
DATAPORT=0xff; //讀之前向端口寫1,確保讀數(shù)正確
RS=0;RW=1;
E=0;E=1; //正脈沖讀
while(DATAPORT&0x80) //忙,等待
{E=0;E=1;}
}
//寫命令函數(shù)
void writeCOM(uchar i)
{
fbusy();
RS=0;RW=0;
E=1;
DATAPORT=i;
E=0; //負(fù)脈沖寫
}
//寫數(shù)據(jù)函數(shù)
void writeData(uchar j)
{
fbusy();
RS=1;RW=0;
E=1;
DATAPORT=j;
E=0; //負(fù)脈沖寫
}
全部資料51hei下載地址:
頻率計(1~10KHz).zip
(251.61 KB, 下載次數(shù): 71)
2020-5-12 13:35 上傳
點擊文件名下載附件
實訓(xùn)文檔.docx
(511.62 KB, 下載次數(shù): 24)
2020-5-12 13:40 上傳
點擊文件名下載附件
|