找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 6184|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

關(guān)于數(shù)值電阻阻值測(cè)量電路設(shè)計(jì)的實(shí)習(xí)(實(shí)訓(xùn))報(bào)告下載

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
word格式的完整論文下載:
關(guān)于數(shù)值電阻阻值測(cè)量電路設(shè)計(jì)的實(shí)習(xí).docx (224.96 KB, 下載次數(shù): 25)


摘要

隨著電子工業(yè)的發(fā)展,電子元器件急劇增加,電子元器件的適用范圍也逐漸廣泛起來(lái),在應(yīng)用中我們常常要測(cè)定電阻的大小。因此,設(shè)計(jì)可靠,安全,便捷的電阻阻值測(cè)量電路具有極大的現(xiàn)實(shí)必要性。

該電路設(shè)計(jì)是以單片STC89C52為核心,通過(guò)恒流源模塊,555多諧振蕩電路,LCD顯示模塊實(shí)現(xiàn)了電阻在大范圍內(nèi)測(cè)量,并且能在測(cè)量量程為 10Ω、1kΩ、10kΩ、1MΩ四檔中自由切換。

目錄
關(guān)于數(shù)值電阻阻值測(cè)量電路設(shè)計(jì)的實(shí)習(xí)(實(shí)訓(xùn))報(bào)告
摘要
1.前言
1.1設(shè)計(jì)的背景及意義
1.2本設(shè)計(jì)所做的工作
2.電阻阻值測(cè)量電路設(shè)計(jì)的原理
2.1電阻測(cè)量電路的設(shè)計(jì)方案
2.2系統(tǒng)的原理框圖
3.電阻阻值測(cè)量的設(shè)計(jì)電路
3.1單片機(jī)電路的設(shè)計(jì)
3.2測(cè)量電阻電路的設(shè)計(jì)
4 電阻阻值測(cè)量電路的軟件設(shè)計(jì)
4.1 I/O口的分配
4.2 主程序流程圖
4.3 頻率參數(shù)計(jì)算的原理
5系統(tǒng)調(diào)試與系統(tǒng)測(cè)試
5.1系統(tǒng)軟件調(diào)試
5.2系統(tǒng)測(cè)試
6 總結(jié)
參 考 文 獻(xiàn)
附 錄
附錄一 系統(tǒng)原理圖
附錄二 PCB圖
附錄三 源程序


1.前言1.1設(shè)計(jì)的背景及意義

通常情況下,電路參數(shù)的數(shù)字化測(cè)量是把被測(cè)參數(shù)傳換成直流電壓或頻率后進(jìn)行測(cè)量。

電阻測(cè)量依據(jù)產(chǎn)生恒流源的方法分為電位降法、比例運(yùn)算器法和積分運(yùn)算器法。比例運(yùn)算器法測(cè)量誤差稍大,積分運(yùn)算器法適用于高電阻的測(cè)量。

本次設(shè)計(jì)是在參考555振蕩器基礎(chǔ)上擬定的一套自己的設(shè)計(jì)方案。是嘗試用555振蕩器將被測(cè)參數(shù)轉(zhuǎn)化為頻率,這里我們將測(cè)量電路產(chǎn)生的頻率送入AT89S52的計(jì)數(shù)端,通過(guò)定時(shí)并且計(jì)數(shù)可以計(jì)算出被測(cè)頻率再通過(guò)該頻率計(jì)算出各個(gè)參數(shù)。

1.2本設(shè)計(jì)所做的工作

設(shè)計(jì)要求:電阻測(cè)量范圍10Ω到1MΩ,精度5%,4位顯示。

本設(shè)計(jì)是以555為核心的振蕩電路,將被測(cè)參數(shù)模擬轉(zhuǎn)化為頻率,并利用單片機(jī)實(shí)現(xiàn)計(jì)算頻率,所以,本次設(shè)計(jì)需要做好以下工作:

(1)學(xué)習(xí)單片機(jī)原理等資料。

(2)設(shè)計(jì)測(cè)量電阻的振蕩電路。

(3)設(shè)計(jì)LCD電路。

(4)設(shè)計(jì)測(cè)量頻率程序,設(shè)置程序。

(5)安裝和調(diào)試,并進(jìn)行實(shí)際測(cè)試,記錄測(cè)試數(shù)據(jù)和結(jié)果。

2.電阻阻值測(cè)量電路設(shè)計(jì)的原理2.1電阻測(cè)量電路的設(shè)計(jì)方案

利用555多諧振蕩電路將電阻參數(shù)轉(zhuǎn)化為頻率,這樣就能夠把模擬量近似的轉(zhuǎn)換為數(shù)字量,而頻率f是單片機(jī)很容易處理的數(shù)字量,一方面測(cè)量精度高,另一方面便于使儀表實(shí)現(xiàn)自動(dòng)化,而且單片機(jī)構(gòu)成的應(yīng)用系統(tǒng)有較大的可靠性。系統(tǒng)擴(kuò)展、系統(tǒng)配置靈活。容易構(gòu)成各種規(guī)模的應(yīng)用系統(tǒng),且應(yīng)用系統(tǒng)有較高的軟、硬件利用系數(shù)。單片機(jī)具有可編程性,硬件的功能描述可完全在軟件上實(shí)現(xiàn),而且設(shè)計(jì)時(shí)間短,成本低,可靠性高。所以,本次設(shè)計(jì)選定以單片機(jī)為核心來(lái)進(jìn)行。

2.2系統(tǒng)的原理框圖

統(tǒng)設(shè)計(jì)框圖如圖2-1如下所示



圖2-1 系統(tǒng)設(shè)計(jì)框圖

框圖各部分說(shuō)明如下:

1)控制部分:本設(shè)計(jì)以單片機(jī)為核心,采用89C52單片機(jī),利用其管腳的特殊功能以及所具備的中斷系統(tǒng),定時(shí)/計(jì)數(shù)器和LCD顯示功能等。在本設(shè)計(jì)中,采用LCD1602液晶顯示。

2)測(cè)量電路:RC震蕩電路是利用555振蕩電路實(shí)現(xiàn)被測(cè)電阻頻率化。

3.電阻阻值測(cè)量的設(shè)計(jì)電路3.1單片機(jī)電路的設(shè)計(jì)

在本設(shè)計(jì)中,考慮到單片機(jī)構(gòu)成的應(yīng)用系統(tǒng)有較大的可靠性,容易構(gòu)成各種規(guī)模的應(yīng)用系統(tǒng),且應(yīng)用系統(tǒng)有較高的軟、硬件利用系數(shù)。還具有可編程性,硬件的功能描述可完全在軟件上實(shí)現(xiàn)。另外,本設(shè)計(jì)還需要利用單片機(jī)的定時(shí)計(jì)數(shù)器、中斷系統(tǒng)、串行接口等等,所以,選擇以單片機(jī)為核心進(jìn)行設(shè)計(jì)具有極大的必要性。在硬件設(shè)計(jì)中,選用STC89C52單片機(jī),其LED燈、LCD液晶屏等,通過(guò)軟件進(jìn)行控制。

本設(shè)計(jì)中單片機(jī)的設(shè)計(jì)電路如下圖3-1所示:

圖3-1 單片機(jī)的設(shè)計(jì)電路

本電路使用單片機(jī)內(nèi)部振蕩器,12MHz的晶體諧振器直接接在單片機(jī)的時(shí)鐘端口X1和X2,電路中C2、C3為振蕩器的匹配電容。該電路簡(jiǎn)單,工作可靠 。另外本系統(tǒng)的容阻上電復(fù)位,就是利用RC電路的充電過(guò)程來(lái)給單片機(jī)復(fù)位。當(dāng)需要復(fù)位時(shí),也可以按下復(fù)位按鍵,進(jìn)行復(fù)位。

3.2測(cè)量電阻電路的設(shè)計(jì)

定時(shí)器555是一種用途很廣的集成電路,只需外接少量R、C元件,就可以構(gòu)成多諧、單穩(wěn)及施密特觸發(fā)器。電阻的測(cè)量采用“脈沖計(jì)數(shù)法”,由555電路構(gòu)成的多諧振蕩電路,通過(guò)計(jì)算振蕩輸出的頻率來(lái)計(jì)算被測(cè)電阻的大小。

555接成多諧振蕩器的形式,其振蕩周期為:

得出:

即:   

其中R16=1KΩ, R17=1KΩ,C11=0.1uF:

電阻測(cè)試電路見圖3-2所示。

圖3-2 電阻測(cè)試電路
4 電阻阻值測(cè)量電路的軟件設(shè)計(jì)4.1 I/O口的分配

P1.0  R測(cè)量程序的選擇

在本設(shè)計(jì)的模塊中,模塊是以單片機(jī)為核心,再通過(guò)按鍵控制測(cè)量的被測(cè)參數(shù)在數(shù)碼管顯示。

按鍵主流程圖如4-1所示。

圖4-1按鍵主程序流程圖

4.2 主程序流程圖

4.3 頻率參數(shù)計(jì)算的原理

本設(shè)計(jì)頻率的計(jì)算采用單片機(jī)外部中斷    ,對(duì)外觸發(fā)電路產(chǎn)生的脈沖頻率的測(cè)量,再通過(guò)對(duì)測(cè)量數(shù)據(jù)的校正來(lái)完成。

單片機(jī)對(duì)頻率測(cè)量的原理如下圖4-3所示。

圖4-3 測(cè)頻率原理圖示

說(shuō)明:圖4-3中t1時(shí)刻檢測(cè)到高電平開定時(shí)器1,開始計(jì)數(shù);t2時(shí)刻等待檢測(cè)低電平;t3時(shí)刻第二次檢測(cè)到高電平時(shí)關(guān)定時(shí)器停止計(jì)數(shù)。

利用GATE=1,TR1=1,只有

引腳輸入高電平時(shí),T1才允許計(jì)數(shù),利用此,將外部輸入脈沖經(jīng) 引腳上輸入,等待高電平的到來(lái),當(dāng)檢測(cè)到高電平時(shí)開定時(shí)器開始計(jì)數(shù),然后檢測(cè)低電平,當(dāng)檢測(cè)到低電平時(shí)已經(jīng)測(cè)得脈沖的脈寬,但我們測(cè)得是頻率,故在程序中藥繼續(xù)檢測(cè)等待下一個(gè)高電平的到來(lái),此時(shí)關(guān)定時(shí)器停止計(jì)數(shù),用此計(jì)數(shù)值乘以機(jī)器的周期數(shù)(晶振頻率已知),得出觸發(fā)電路產(chǎn)生的周期,然后再經(jīng)過(guò)數(shù)據(jù)處理便得到輸入信號(hào)的頻率。

5系統(tǒng)調(diào)試與系統(tǒng)測(cè)試5.1系統(tǒng)軟件調(diào)試

Keil提供了包括C編譯器、宏匯編、連接器、庫(kù)管理和一個(gè)功能強(qiáng)大的仿真調(diào)試器等在內(nèi)的完整開發(fā)方案,通過(guò)一個(gè)集成開發(fā)環(huán)境(uVision)將這些部份組合在一起。運(yùn)行Keil軟件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空閑的硬盤空間、WIN98、NT、WIN2000、WINXP等操作系統(tǒng)。

5.2系統(tǒng)測(cè)試

(1)測(cè)試原理:在系統(tǒng)設(shè)計(jì)中,以STC89C52單片機(jī)為核心的電阻測(cè)量電路,將電阻使用對(duì)應(yīng)的振蕩電路轉(zhuǎn)化為頻率實(shí)現(xiàn)各個(gè)參數(shù)的測(cè)量。電阻是采用555多諧振蕩電路產(chǎn)生的,將振蕩頻率送入STC89C52的計(jì)數(shù)端,通過(guò)定時(shí)并且計(jì)數(shù)可以計(jì)算出被測(cè)頻率,再通過(guò)該頻率計(jì)算出被測(cè)參數(shù)。以Keil51為仿真平臺(tái),使用C語(yǔ)言與匯編語(yǔ)言混合編程編寫了系統(tǒng)應(yīng)用軟件;包括主程序模塊、顯示模塊、電阻測(cè)試模塊。

(2)測(cè)試方法:在測(cè)試時(shí)將被測(cè)參數(shù)通過(guò)本系統(tǒng)測(cè)量出來(lái)的示值與參數(shù)的標(biāo)稱值進(jìn)行對(duì)比,進(jìn)而可以知道本系統(tǒng)的測(cè)試精度。

(3)測(cè)試儀器:示波器,萬(wàn)用表,穩(wěn)壓電源,計(jì)算機(jī)。

(4)測(cè)試結(jié)果:通過(guò)按鍵,實(shí)現(xiàn)其按鍵所對(duì)應(yīng)的功能,并觀察測(cè)試結(jié)果,對(duì)設(shè)計(jì)進(jìn)一步的進(jìn)行校正和對(duì)實(shí)現(xiàn)功能的可靠性的確認(rèn),并記錄觀察結(jié)果。

測(cè)試結(jié)果如下:

a)電阻測(cè)試數(shù)據(jù)如表5-1所示。

表5-1電阻測(cè)試數(shù)據(jù)

標(biāo)稱值

(Ω)

振蕩頻率

(Hz)

系統(tǒng)測(cè)量

(Ω)

相對(duì)誤差

(%)

330

6929

333

0.9

200

9501

205

2.5

530

4981

528

0.4

4700

5036

4892

4.1

20000

2596

19216

3.9

470000

157

464683

1.1


(4)測(cè)試分析:在實(shí)際測(cè)量中,由于測(cè)試環(huán)境,測(cè)試儀器,測(cè)試方法等都對(duì)測(cè)試值有一定的影響,都會(huì)導(dǎo)致測(cè)量結(jié)果或多或少地偏離被測(cè)量的真值。為了減小本設(shè)計(jì)中誤差的大小,主要利用修正的方法來(lái)減小本測(cè)試儀的測(cè)量誤差。所謂修正的方法就是在測(cè)量前或測(cè)量過(guò)程中,求取某類系統(tǒng)誤差的修正值。在測(cè)量的數(shù)據(jù)處理過(guò)程中選取合適的修正值很關(guān)鍵,修正值的獲得有三種途徑。第一種途徑是從相關(guān)資料中查;第二種途徑是通過(guò)理論推導(dǎo)求;第三種途徑是通過(guò)實(shí)驗(yàn)求取。

本測(cè)試修正值選取主要通過(guò)實(shí)驗(yàn)求取,對(duì)影響測(cè)量讀數(shù)的各種影響因素,如溫度、濕度、電源電壓等變化引起的系統(tǒng)誤差。通過(guò)對(duì)相同被測(cè)參數(shù)的多次測(cè)量結(jié)果和不同被測(cè)參數(shù)的多次測(cè)量選取平均值,最后確定被測(cè)參數(shù)公式的常數(shù)K值,從而達(dá)到減小本設(shè)計(jì)系統(tǒng)誤差的目的。由于振蕩電路外圍器件由電容電阻分立元件搭接而成,所以由振蕩電路產(chǎn)生的被測(cè)參數(shù)對(duì)應(yīng)的頻率有一定的誤差,所以只能通過(guò)多次實(shí)驗(yàn)測(cè)量,選取合適的修正值來(lái)盡可能的減少本測(cè)試系統(tǒng)的誤差。

6 總結(jié)

本設(shè)計(jì)的硬件電路圖簡(jiǎn)單,可降低生產(chǎn)成本。采用單片機(jī)可提高系統(tǒng)的可靠性和穩(wěn)定性,縮小系統(tǒng)的體積,調(diào)試和維護(hù)方便,而且以STC89C5251單片機(jī)最小系統(tǒng)為核心的設(shè)計(jì)能夠滿足了整個(gè)系統(tǒng)的工作需求,555振蕩器實(shí)現(xiàn)了被測(cè)電阻參數(shù)的頻率化,被測(cè)頻率通過(guò)模擬開關(guān)送入單片機(jī)計(jì)數(shù),再經(jīng)過(guò)顯示電路顯示被測(cè)參數(shù)的測(cè)量值,軟件用C語(yǔ)言編程,根據(jù)具體情況控制啟動(dòng)被測(cè)參數(shù)的相應(yīng)程序,能靈活控制被測(cè)參數(shù)的檔位切換。經(jīng)過(guò)測(cè)試,系統(tǒng)各個(gè)模塊都能正常共組,成功地達(dá)到了設(shè)計(jì)的硬件要求。

系統(tǒng)的軟件部分是系統(tǒng)實(shí)現(xiàn)各種工作狀態(tài)的關(guān)鍵。通過(guò)結(jié)合硬件電路,在Keil51的平臺(tái)上,使用C語(yǔ)言與匯編語(yǔ)言混合編程編寫了系統(tǒng)應(yīng)用程序,使程序能夠正常運(yùn)行,實(shí)現(xiàn)了設(shè)計(jì)的要求。

這次實(shí)訓(xùn)一次非常好的將理論與實(shí)際相結(jié)合的機(jī)會(huì),通過(guò)對(duì)電阻測(cè)量的課題設(shè)計(jì),鍛煉了我的實(shí)際動(dòng)手能力,增強(qiáng)了我解決實(shí)際工程問(wèn)題的能力,同時(shí)也提高我查閱文獻(xiàn)資料、設(shè)計(jì)規(guī)范以及電腦制圖等其他專業(yè)能力水平。

參 考 文 獻(xiàn)

[1]申忠如,申淼,譚亞麗.MCS-51單片機(jī)原理及系統(tǒng)設(shè)計(jì).西安交通大學(xué)出版社,2008年3月第1版

[2]申忠如,郭福田,丁暉.現(xiàn)代測(cè)試技術(shù)與系統(tǒng)設(shè)計(jì).西安:西安交通大學(xué)出版社,2006.2.

[3]付家才.單片機(jī)控制工程實(shí)踐技術(shù)[M].北京化學(xué)工業(yè)出版社,2004

[4]張毅剛.MCS-51單片機(jī)應(yīng)用系統(tǒng).哈爾濱工業(yè)大學(xué)出版社,1997

[5]夏繼強(qiáng).單片機(jī)實(shí)驗(yàn)與實(shí)踐教程.北京航空航天大學(xué)出版社,2001

[6]肖洪兵.跟我學(xué)用單片機(jī).北京航空航天大學(xué)出版社,2002
[7]付曉光.單片機(jī)原理與使用技術(shù).清華大學(xué)出版社,ISBN7- 81082- 169- 5TP

[8]李桂安.電子技術(shù)實(shí)驗(yàn)及課程設(shè)計(jì).東南大學(xué)出版社,2008

附 錄附錄一 系統(tǒng)原理圖
附錄二 PCB圖

源程序:
  1. #include "reg51.h"
  2. #include
  3. #include
  4. #define uint8 unsigned char
  5. #define uint16 unsigned int
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8. uint16 cnt2ms;              //10ms計(jì)數(shù)器
  9. uint8 cnt1s;              //1秒計(jì)數(shù)器
  10. #define        Z1 13700053.00
  11. #define        Z2 3685279.00
  12. float RZ=0;
  13. unsigned long   RX=0;
  14. unsigned long   RX2=0;
  15. unsigned long   RX3=0;
  16. unsigned long   RX4=0;
  17. unsigned long   RX5=0;
  18. unsigned long   RX6=0;
  19. unsigned long   RX7=0;
  20. unsigned long   RX8=0;
  21. unsigned long   RX9=0;
  22. float LZ=0;
  23. #define        C1 0.0461
  24. float CZ=0;
  25. float CX=0;
  26. #define        R1 24874

  27. uint8 KL=0;              //
  28. unsigned int Pulsecnt=0;              //脈沖個(gè)數(shù)
  29. unsigned int Pulsenum;              //脈沖個(gè)數(shù)
  30. uint8 start=0;              //
  31. uint16 PulseTime;              //10ms計(jì)數(shù)器
  32. uint16 Pulse;              //10ms計(jì)數(shù)器
  33. bit flag=0;
  34. uint8 CH=0;              //
  35. unsigned long x;
  36. void Init_Extint(void);
  37. void TimerInitProc();
  38. void Init_System(void);
  39. void Display(uint8 chose_dat, uint8 dat);
  40. void ShowDisp(uint8 tPulsenum, uint8 tPulsecnt, uint8 tcnt1s);
  41. void DelayMs(uint8 Ms);
  42. uint8 Pulse_FLAG=0;
  43. uint8 Pulse_5=0;
  44. sbit    K1=P1^3;
  45. sbit    K2=P1^4;
  46. sbit    K3=P1^5;
  47. sbit    A0=P2^1;
  48. sbit    A1=P2^0;
  49. sbit    RED=P3^6;
  50. sbit    YEW=P3^4;
  51. sbit    GRE=P3^3;
  52. #define LCD_Data P0           //LCD的數(shù)據(jù)口
  53. sbit    LCD_BF=LCD_Data^7;    //LCD忙信號(hào)位
  54. sbit    LCD_RS=P1^0;
  55. sbit    LCD_RW=P1^1;
  56. sbit    LCD_EN=P1^2;
  57. #define LCD_GO_HOME               0x02        
  58. #define LCD_AC_AUTO_INCREMENT     0x06        
  59. #define LCD_AC_AUTO_DECREASE      0x04        
  60. #define LCD_MOVE_ENABLE           0x05        
  61. #define LCD_MOVE_DISENABLE        0x04     
  62. #define LCD_DISPLAY_ON            0x0C      
  63. #define LCD_DISPLAY_OFF           0x08      
  64. #define LCD_CURSOR_ON             0x0A        
  65. #define LCD_CURSOR_OFF            0x08        
  66. #define LCD_CURSOR_BLINK_ON       0x09      
  67. #define LCD_CURSOR_BLINK_OFF      0x08      
  68. #define LCD_LEFT_MOVE             0x18         //LCD顯示左移一位
  69. #define LCD_RIGHT_MOVE            0x1C         //LCD顯示右移一位
  70. #define LCD_CURSOR_LEFT_MOVE      0x10         //光標(biāo)左移一位
  71. #define LCD_CURSOR_RIGHT_MOVE     0x14         //光標(biāo)右移一位
  72. #define LCD_DISPLAY_DOUBLE_LINE   0x38         //兩行顯示
  73. #define LCD_DISPLAY_SINGLE_LINE   0x30         //單行顯示
  74. void LCD_ClrAll(void);              //清屏
  75. void Judge_LCD_busy(void);           //檢測(cè)是否忙碌
  76. void LCD_Write(uchar WriteData);     //寫控制字
  77. void LCD_write_data(uchar LCD_data); //寫數(shù)據(jù)顯示
  78. void LCD_cursor(uchar x);    //光標(biāo)起始地址
  79. void LCD_printc(unsigned char lcd_data) ;  //輸出一個(gè)字符
  80. void LCD_prints(unsigned char *lcd_string);//輸出字符串
  81. /*LCD1602忙碌判斷子程序*/
  82. void Judge_LCD_busy(void)   //判斷LCD1602是否忙狀態(tài)
  83. {
  84. while(1)
  85.   {
  86.    LCD_EN=0;
  87.    LCD_RS=0;
  88.    LCD_RW=1;
  89.    LCD_Data=0xff;
  90.    LCD_EN=1;   //EN 是 1—0 使能
  91.    if(!LCD_BF)break; //LCD_BF=1表示忙碌,需要等待。
  92.   }
  93.    LCD_EN=0;
  94. }
  95. void LCD_ClrAll(void)
  96. {
  97. Judge_LCD_busy();   //判斷是否忙碌
  98. LCD_RS=0;
  99. LCD_RW=0;
  100. LCD_Data=0x01;
  101. LCD_EN=1;
  102. LCD_EN=0;
  103. }
  104. /*******LCD寫數(shù)據(jù)定義各種模式*********/
  105. void LCD_Write(uchar WriteData)   //寫指令到LCD
  106. {
  107. Judge_LCD_busy();
  108. LCD_RS=0;
  109. LCD_RW=0;

  110. P0=WriteData; //把WriteData的數(shù)據(jù)送到數(shù)據(jù)口
  111. LCD_EN=1;
  112. LCD_EN=0;
  113. }
  114. /********LCD顯示數(shù)據(jù)***********/
  115. void LCD_write_data(uchar LCD_data)      //輸出一個(gè)字節(jié)數(shù)據(jù)到LCD
  116. {
  117. Judge_LCD_busy();
  118. LCD_RS=1;
  119. LCD_RW=0;

  120. P0=LCD_data;
  121. LCD_EN=1;
  122. LCD_EN=0;
  123. }
  124. /****光標(biāo)位置的確定***/
  125. void LCD_cursor(uchar x)            //LCD光標(biāo)定位到x處
  126. {
  127. LCD_Write(0x80+x);                       //第一行地址是0x80

  128. }
  129. /*輸出一個(gè)字符*/
  130. void LCD_printc(unsigned char lcd_data)
  131. {
  132. LCD_write_data(lcd_data);
  133. }

  134. /*輸出字符串*/
  135. void LCD_prints(unsigned char *lcd_string)
  136. {
  137. unsigned char i=0;
  138. while(lcd_string[i]!=0x00)
  139.   {
  140.    LCD_write_data(lcd_string[i]);
  141.    i++;
  142.   }
  143. }

  144. /*初始化程序*/
  145. void LCD_initial(void)                        //初始化LCD
  146. {
  147. LCD_Write(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);
  148. LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_OFF);
  149. LCD_Write(LCD_DISPLAY_DOUBLE_LINE);
  150. LCD_ClrAll();

  151. }
  152. void delay_1ms(uint x)
  153. {
  154. uint j;
  155. uchar i;
  156. for(j=0;j<x;j++)
  157. {
  158. for(i=0;i<120;i++);
  159. }
  160. }
  161. void Key_SM(void){

  162.         if(K3==0){
  163.              delay_1ms(5);
  164.             if(K3==0){
  165.                 YEW=1;RED=0;
  166.                 GRE=1;                 
  167.                 LCD_cursor(0x00);
  168.                 LCD_prints("   MEASURE Lx   ");
  169.                                A0=0;
  170.                 A1=1;
  171.                 CH=2;//電感檔

  172.                 while(K3==0){}

  173.                  }
  174.             }

  175.         if(K2==0){
  176.              delay_1ms(5);
  177.             if(K2==0){
  178.                 GRE=1;YEW=0;
  179.                 RED=1;                 
  180.                 LCD_cursor(0x00);           
  181.                 LCD_prints("   MEASURE Rx   ");
  182.                 A0=1;
  183.                 A1=0;
  184.                 CH=1;

  185.                 while(K2==0){}
  186.                      }
  187.                 }
  188.        if(K1==0){
  189.              delay_1ms(5);
  190.             if(K1==0){
  191.                YEW=1;GRE=0;RED=1;
  192.                LCD_cursor(0x00);
  193.                LCD_prints("   MEASURE Cx   ");
  194.                 A0=0;
  195.                 A1=0;
  196.                 CH=3;                  
  197.                while(K1==0){}
  198.                        }
  199. }

  200. void  Value_to_ASCII(unsigned long value,uchar add)
  201. {
  202.     unsigned char temp[] = "0000.000K ";
  203.     temp[0] = value/1000000 + 0x30;//數(shù)值改成字符,液晶顯示需要ASCII碼
  204.     value = value%1000000;
  205.     temp[1] = value/100000 + 0x30;
  206.     value = value%100000;
  207.     temp[2] = value/10000 + 0x30;
  208.     value = value%10000;
  209.     temp[3] = value/1000 + 0x30;
  210.     value = value%1000;
  211.     temp[5] = value/100 + 0x30;
  212.     value = value%100;
  213.     temp[6] = value/10 + 0x30;
  214.     value = value%10;
  215.     temp[7] = value + 0x30;
  216.     LCD_cursor(add);   //光標(biāo)起始地址 ,第一行地址是0x00~0x0F,第二行地址是0x40~0x4f
  217.     LCD_prints(temp);
  218. }

  219. void  Value_to_ASCIIL(unsigned long value,uchar add)
  220. {
  221.     unsigned char temp[] = "000000uH ";
  222.     temp[0] = value/100000 + 0x30;
  223.     value = value%100000;
  224.     temp[1] = value/10000 + 0x30;
  225.     value = value%10000;
  226.     temp[2] = value/1000 + 0x30;
  227.     value = value%1000;
  228.     temp[3] = value/100 + 0x30;
  229.     value = value%100;
  230.     temp[4] = value/10 + 0x30;
  231.     value = value%10;
  232.     temp[5] = value + 0x30;

  233.     LCD_cursor(add);   //光標(biāo)起始地址 ,第一行地址是0x00~0x0F,第二行地址是0x40~0x4f
  234.     LCD_prints(temp);
  235. }
  236. void  Value_to_ASCIIC(unsigned long value,uchar add)
  237. {
  238.     unsigned char temp[] = "00000.0pF ";
  239.     temp[0] = value/100000 + 0x30;
  240.     value = value%100000;
  241.     temp[1] = value/10000 + 0x30;
  242.     value = value%10000;
  243.     temp[2] = value/1000 + 0x30;
  244.     value = value%1000;
  245.     temp[3] = value/100 + 0x30;
  246.     value = value%100;
  247.     temp[4] = value/10 + 0x30;
  248.     value = value%10;
  249.     temp[6] = value + 0x30;

  250.     LCD_cursor(add);   //光標(biāo)起始地址 ,第一行地址是0x00~0x0F,第二行地址是0x40~0x4f
  251.     LCD_prints(temp);
  252. }
  253. void main()
  254. {

  255.       TMOD=0x01;                             //設(shè)置定時(shí)器0,方式1:16位定時(shí)器
  256.       TH1=0;
  257.       TL1=0;
  258.       TH0=(65536-2300)/256; //設(shè)定定時(shí)周期
  259.       TL0=(65536-2300)%256;
  260.       TR0=1;
  261.       TR1=1;
  262.       ET1=1;
  263.       ET0=1;
  264.       EA=1;
  265.       A0=1;
  266.       A1=0;
  267.     LCD_initial();
  268.               delay_1ms(50);
  269.     LCD_initial();
  270.               delay_1ms(50);
  271.     LCD_cursor(0x00);

  272.     LCD_prints("   MEASURE Rx   ");
  273.     GRE=1;
  274.               YEW=0;
  275.                 RED=1;
  276.     LCD_cursor(0x45);
  277.     CH=1;

  278.               while(1)
  279.               {

  280.      Key_SM();
  281.     if(flag==1){

  282.         flag=0;

  283.         x=Pulsenum*6536+TH1*256+TL1;//計(jì)算1s內(nèi)的脈沖個(gè)數(shù),頻率=脈沖個(gè)數(shù)
  284. if(CH==1){

  285.         RZ=(Z1/x);//測(cè)量100到1000
  286.         RX=RZ-1000;
  287.         RX=RX>>1;

  288. if(RX>=1005){
  289.         RX=RX-1005;
  290.     }else{RX=0;}

  291.     if(x==0){RX=0;RX2=0;RX3=0;RX4=0;RX5=0;RX6=0;RX7=0;RX8=0;RX9=0;}
  292.   if(RX>1000000){RX=100000; }

  293.               RX2=(RX+RX3+RX4+RX5+RX6+RX7+RX8+RX9)>>3;//求平均提高精度

  294. RX9=RX8;RX8=RX7;RX7=RX6;RX6=RX5;RX5=RX4;RX4=RX3;RX3=RX;
  295.               //保存上一次的阻值

  296.          Value_to_ASCII(RX2,0x44);//更新阻值顯示



  297. }
  298. if(CH==2){


  299.         LZ=(x*39*C1)/100000;
  300.         LZ=LZ*x;
  301.         LZ=1000000/LZ;
  302.     if(x==0)LZ=0;
  303.   if(LZ>999999)LZ=999999; //限制最高值
  304.          Value_to_ASCIIL(LZ,0x44);//更新電感值顯示
  305. }
  306. if(CH==3){

  307.        CZ=6600000/x;
  308.     if(x==0||x>3050)CZ=0;
  309.   if(CZ>999999)CZ=99999;  //限制最高值
  310.          Value_to_ASCIIC(CZ,0x44);//更新電容值顯示
  311. }
  312.          cnt2ms=0;
  313.          Pulsenum=0;
  314.          TH1=0;
  315.          TL1=0;
  316.          TR1=1;

  317.     }
  318.             
  319.               }
  320. }
  321. void T1_interrupt(void) interrupt 3 using 0
  322. {

  323.   Pulsenum++;              //保存測(cè)得脈搏值
  324.             
  325. }
  326. 函數(shù)功能:定時(shí)器/計(jì)數(shù)器1中斷處理
  327. 入口參數(shù):null
  328. 返    回:null
  329. void Timer0IntProc() interrupt 1 using 0 //3ms
  330. {
  331.   TH0=(65536-3000)/256;
  332.   TL0=(65536-3000)%256;
  333.     cnt2ms++;

  334.               if(cnt2ms==297)              //1s計(jì)時(shí)到
  335.               {

  336.         TR1=0;


  337.                             cnt2ms = 0;
  338.                  
  339.         flag=1;
  340.               }

  341. }
復(fù)制代碼

</x;j++)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表