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

QQ登錄

只需一步,快速開始

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

51單片機(jī)的ADC0808數(shù)字電壓表設(shè)計(jì)文檔下載

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:442669 發(fā)表于 2018-12-13 11:09 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

基于單片機(jī)的數(shù)字電壓表的設(shè)計(jì)


摘要


近些年來,數(shù)字電壓表逐漸進(jìn)入人們的視線中,它主要采取數(shù)字化測(cè)量技術(shù)。與傳統(tǒng)的指針式儀表相比,它的功能有了進(jìn)一步的完善,并且精度也有了很大的提高。數(shù)字電壓表主要采用單片機(jī)和模/數(shù)轉(zhuǎn)換模塊,這樣不僅提高了測(cè)量速度,而且抗干擾能力強(qiáng)、使用便捷、可擴(kuò)展性強(qiáng)、測(cè)量準(zhǔn)確。

本文主要采用AT89C51單片機(jī)和ADC0808芯片制作的簡(jiǎn)易數(shù)字電壓表,可以采集0~5V和5~10V的模擬直流電壓進(jìn)行測(cè)量,其測(cè)量結(jié)果在液晶LCD1602上顯示。該設(shè)計(jì)硬件電路主要有三個(gè)模塊組成:A/D轉(zhuǎn)換模塊、數(shù)據(jù)處理模塊及輸出顯示模塊。數(shù)據(jù)處理由單片機(jī)AT89C51來完成,它主要把ADC0808傳送來的數(shù)值經(jīng)一定的數(shù)據(jù)處理,然后送至顯示模塊進(jìn)行顯示,同時(shí)控制顯示芯片1602的工作。程序設(shè)計(jì)上有各模塊初始化操作、電壓檔位選擇和LCD1602液晶顯示程序等。



系統(tǒng)硬件設(shè)計(jì)總體方案

1.1    設(shè)計(jì)要求

以MCS-51單片機(jī)為關(guān)鍵部件,制作一個(gè)簡(jiǎn)易的數(shù)字電壓表。

  • 使用雙通道可選擇直流電壓輸入,能夠測(cè)量0-5V5-10V之間的直流電壓。當(dāng)電壓值超過5V時(shí),選擇通道25-10V通道)采集電壓。
  • 使用LCD1602來完成電壓的液晶顯示。
  • 使用較少的元器件,盡可能降低功率損耗,同時(shí)準(zhǔn)確、快速完成測(cè)量。
  • 由于電壓表允許過載,因此所測(cè)電壓允許適當(dāng)超過量程。
1.2    設(shè)計(jì)方案

總體設(shè)計(jì)電路有以下幾部分組成:AT89C51單片機(jī)、A/D轉(zhuǎn)換電路、液晶LCD顯示電路、時(shí)鐘電路、復(fù)位電路、被測(cè)電壓輸入電路及量程選擇和報(bào)警電路?傮w硬件設(shè)計(jì)框圖如圖1-1所示:

圖1-1 硬件電路設(shè)計(jì)框圖


1.3   2.      系統(tǒng)硬件電路設(shè)計(jì)2.1    A/D轉(zhuǎn)換模塊

日常生活中的物理量都是模擬量,為了能夠方便的分析各個(gè)量,就需要把模擬量轉(zhuǎn)換成數(shù)字量的器件。現(xiàn)在越來越多的設(shè)備都需要進(jìn)行模數(shù)轉(zhuǎn)換,把復(fù)雜的模擬信號(hào)轉(zhuǎn)換成已明白的數(shù)字信號(hào),因此A/D轉(zhuǎn)換器也得到了更深一層的研究。按照不同的A/D轉(zhuǎn)換芯片的轉(zhuǎn)換原理可把其分為逐次逼近行、雙積分型等。其中雙積分式A/D轉(zhuǎn)換器抗干擾能力強(qiáng)、轉(zhuǎn)換精度高、價(jià)格便宜。但與雙積分相比,逐次逼近式A/D轉(zhuǎn)換的轉(zhuǎn)換速度更快,而且精度更高,它們可以與單片機(jī)系統(tǒng)連接,將數(shù)字量送入單片機(jī)進(jìn)行分析和顯示。一個(gè)n位的逐次逼近型轉(zhuǎn)換器只需要比較n次,這樣大大節(jié)省了時(shí)間,而且逐次逼近型轉(zhuǎn)換速度快,因而在實(shí)際中得到廣泛的使用。

由于ADC0808芯片采用逐次逼近式A/D轉(zhuǎn)換原理,因此本設(shè)計(jì)便運(yùn)用其進(jìn)行模/數(shù)轉(zhuǎn)換,它可以實(shí)現(xiàn)8路模擬信號(hào)的選擇采集,而且它的轉(zhuǎn)換時(shí)間為100us。此次使用的是12MHz的晶振,因此它能夠提供轉(zhuǎn)換的時(shí)鐘即滿足設(shè)計(jì)的需要。

對(duì)于n位的A/D轉(zhuǎn)換器,它的分辨率是滿量程輸入電壓和2n之比。ADC0808的滿量程為5V。則其分辨率為0.02V。

ADC0808內(nèi)部結(jié)構(gòu)主要有8路模擬通道選擇開關(guān)、地址鎖存與譯碼器和8位A/D轉(zhuǎn)換器、三態(tài)輸出鎖存器等構(gòu)成,其引腳及連接電路如圖2-1所示:

圖2-1 ADC0808引腳圖

由圖2-1所示,其中IN0~IN7為模擬量輸入通道,其輸入電壓范圍均為0~5V。此次設(shè)計(jì)分為兩通道輸入分別為IN0(0-5V)和IN1(5-10V),并且采用開關(guān)K1、K2來選擇。A、B、C為模擬量輸入通道的選擇端,是與單片機(jī)的P1相連并通過軟件的編程產(chǎn)生控制信號(hào)。ALE、START為地址鎖存允許信號(hào)和轉(zhuǎn)換啟動(dòng)信號(hào),它們都有單片機(jī)P3口產(chǎn)生控制信號(hào)。轉(zhuǎn)換器的CLK由單片機(jī)的中斷程序產(chǎn)生,主要是完成輸入數(shù)據(jù)的掃描。EOC是ADC0808轉(zhuǎn)換結(jié)束信號(hào)端口,只有等到EOC變?yōu)楦唠娖,?shù)據(jù)轉(zhuǎn)換才結(jié)束。實(shí)現(xiàn)這個(gè)過程,就需要使用程序設(shè)計(jì)來完成。OE是輸出允許信號(hào),只有OE為低電平時(shí),才能輸出轉(zhuǎn)換得到的數(shù)據(jù)。程序中先讓OE為0,然后為1,這樣把數(shù)據(jù)送入單片機(jī)P2口。VREF(+)、VREF(—)是芯片的電源接口。

2.2    電壓輸入電路

ADC0808的基準(zhǔn)電壓為+5V,所以當(dāng)要測(cè)量的電壓值超過5V時(shí)則需要由開關(guān)選擇衰減電路,經(jīng)過衰減后輸入轉(zhuǎn)換采集器。輸入電路如圖2-4所示:

圖2-4 輸入電路圖

當(dāng)要測(cè)試的電壓為0~5V時(shí),選擇IN0輸入,在仿真中運(yùn)用滑動(dòng)變阻器分壓的原理產(chǎn)生0-5V的電壓來代表實(shí)際電壓。而當(dāng)超過5V時(shí)則選擇左邊的電路,由于實(shí)際的電壓變?cè)试S適當(dāng)?shù)某砍,所以圖中R5和R6的電阻值分別為6k、3k,這樣就把電壓衰減為原來電壓值的1/3,同時(shí)由于RV5分壓的原理可以得到5~10V的電壓來模擬實(shí)際要測(cè)試的電壓值。同時(shí)其最高測(cè)量電壓允許適當(dāng)超過10V。這樣本電壓表就有兩個(gè)量程即0~5V和5V~10V。需要變換量程時(shí),由選側(cè)開關(guān)K1、K2相互切換。由于本此設(shè)計(jì)采用手動(dòng)調(diào)節(jié)電壓檔位的方式,因此在測(cè)量電壓時(shí)應(yīng)該先對(duì)被測(cè)電壓進(jìn)行估算,同時(shí)先由較大量程進(jìn)行測(cè)量,如果值過小,再調(diào)節(jié)檔位。不然不容易超量程損壞儀器。直流電壓輸入時(shí),由于尖峰的出現(xiàn),也就需要對(duì)輸入的電壓進(jìn)行濾波,電容C4、C5在次的作用就是進(jìn)行濾波


2.3    接口電路

對(duì)于本設(shè)計(jì),主要的接口電路有時(shí)鐘電路、復(fù)位電路、電壓量程選擇和報(bào)警電路。

2.4.1時(shí)鐘電路

單片機(jī)89C51芯片中有一個(gè)內(nèi)部時(shí)鐘,其中引腳18為輸入端,19為輸出端引腳,這兩個(gè)引腳連接一個(gè)12MHz的晶振,同時(shí)再連接兩個(gè)瓷片電容,這樣便提供片內(nèi)相移的條件,時(shí)鐘電路如圖2-5所示:

圖2-5 時(shí)鐘電路圖

由圖2-4可知,晶體的振蕩頻率通常取取12MHz,對(duì)于11.0592MHz一般在單片機(jī)串行通信時(shí)使用。這時(shí)單片機(jī)一個(gè)時(shí)鐘周期為:

            (2-1)

圖電容C1和C2,它們和晶振的主要作用是結(jié)合單片機(jī)內(nèi)部振蕩電路實(shí)現(xiàn)相位的180°移相,這樣晶振才能夠起振。同時(shí)對(duì)電路中所需的電容儲(chǔ)電量要求不高,均為30pF。若過高或過低都會(huì)對(duì)振蕩產(chǎn)生影響。

2.4.2 復(fù)位電路

AT89C51單片機(jī)的RST為復(fù)位引腳,復(fù)位信號(hào)高電平有效,并且其有效時(shí)間應(yīng)該延續(xù)出現(xiàn)2個(gè)機(jī)器周期以上即可確保系統(tǒng)復(fù)位,復(fù)位操作完成后,RST端一直保持高電平,那么單片機(jī)就始終處于復(fù)位狀態(tài),當(dāng)RST恢復(fù)低電平后單片機(jī)才能進(jìn)入其他操作。單片機(jī)復(fù)位電路有幾種類,本次設(shè)計(jì)主要采用手動(dòng)復(fù)位電路,這樣可以人為的操作,簡(jiǎn)單方便。電路如圖2-6所示:

圖2-6 復(fù)位電路

由上圖2-6可知,只有RST端維持2個(gè)周期以上高電平才能完成復(fù)位操作。電容C3兩端在單片機(jī)啟動(dòng)時(shí)持續(xù)充電為5V,由于按鍵未按下,電阻R1兩端電壓為0,此時(shí)RST處于低電平系統(tǒng)工作正常,當(dāng)按鍵摁下時(shí),電阻R2所在的支路導(dǎo)通,與C3形成一個(gè)回路,電容C3開始釋放之前所充的電量,在很短的時(shí)間內(nèi),其電壓值由5V變?yōu)?.0V,甚至更小些,與此同時(shí),RST又收到高電平,這時(shí)系統(tǒng)自動(dòng)復(fù)位。

2.4.3量程選擇和報(bào)警電路

本設(shè)計(jì)由于采用雙通道輸入的方式,所以可以選擇不同的量程,分別為0~5V和5~10V。這個(gè)操作由選擇開關(guān)K1、K2來完成,但是如果K1、K2同時(shí)閉合,報(bào)警提示燈點(diǎn)亮。電路如圖2-7所示:

圖2-7 量程選擇和報(bào)警電路圖


2.4    LCD1602顯示電路設(shè)計(jì)

本次設(shè)計(jì)中采用LCD1602作為顯示器,與以前的LED數(shù)碼管顯示相比,其顯示模塊具有體積小、功耗低、顯示內(nèi)容豐富等優(yōu)點(diǎn),而且不需要外加驅(qū)動(dòng)電路。同時(shí)可以滿足不同的輸入、移位要求,而且接口方式簡(jiǎn)單、可靠。LCD1602模塊的引腳及連接電路如圖2-8所示:

圖2-8 LCD1602引腳

其中D0~D7數(shù)據(jù)接收端口與單片機(jī)P0口相連。E端為使能端,當(dāng)它由0變?yōu)?,LCD1602才能進(jìn)行讀寫操作,它和單片機(jī)P3.5相連,并由其輸出控制信號(hào)。RS、RW是1602的讀寫控制端,它們分別與單片機(jī)的P3.6、P3.7相對(duì)應(yīng),這樣使用LCD顯示時(shí)可由單片機(jī)的程序完成控制。VDD、VSS為液晶屏的電源端口,VEE端電壓信號(hào)的大小可以改變液晶屏的亮度。由于P0口作為輸出口時(shí),它沒有高電平的狀態(tài)所以仿真電路時(shí)需要加上拉電阻RP1,這樣P0口就有高電平狀態(tài)。


3.      系統(tǒng)程序設(shè)計(jì)

系統(tǒng)的主程序流程如圖3-1所示:

圖3-1 系統(tǒng)主程序流程圖

本設(shè)計(jì)程序設(shè)計(jì)主要分為幾個(gè)模塊:初始化程序設(shè)計(jì)、A/D采樣程序設(shè)計(jì)、測(cè)量參數(shù)數(shù)據(jù)處理程序設(shè)計(jì)、量程選擇和報(bào)警程序設(shè)計(jì)、LCD1602顯示程序設(shè)計(jì)。下面逐個(gè)介紹各個(gè)模塊的程序設(shè)計(jì)。

3.1    初始化程序

所謂初始化,將利用到單片機(jī)內(nèi)部各部件或擴(kuò)展芯片進(jìn)行初始工作狀態(tài)設(shè)定,其主要負(fù)責(zé)設(shè)置定時(shí)器模式、初始設(shè)定、開中斷和打開定時(shí)器等,對(duì)于液晶1602同樣也要進(jìn)行初始化,其中包括清除顯示屏、顯示開/關(guān)控制、功能設(shè)置、進(jìn)入模式設(shè)置等。其中部分初始化程序如下:

w_comd(0x0c);                                          //開顯示屏,關(guān)光標(biāo);

w_comd(0x06);                                          //字符進(jìn)入模式:屏幕不動(dòng),字符后移;

ET0=1;                                                                      //開定時(shí)中斷;

3.2    A/D轉(zhuǎn)換程序

模/數(shù)轉(zhuǎn)換流程圖如圖3-2所示。


圖3-2 A/D轉(zhuǎn)換流程圖

由圖可知,A/D轉(zhuǎn)換程序首先定義啟動(dòng)信號(hào)、輸出允許信號(hào)、輸入地址鎖存信號(hào)、A/D轉(zhuǎn)換結(jié)束信號(hào)及CLK時(shí)鐘信號(hào)的變量。然后利用AT89C51中定時(shí)器T0的工作方式2產(chǎn)生CLK信號(hào),供A/D轉(zhuǎn)換器使用,START信號(hào)的上升沿啟動(dòng)A/D轉(zhuǎn)換,等待轉(zhuǎn)換結(jié)束,即EOC從0變?yōu)?,同時(shí)OE是輸出使能信號(hào)端,其信號(hào)從高到低電平,輸出轉(zhuǎn)換數(shù)據(jù)并將其進(jìn)行數(shù)值轉(zhuǎn)換分別求出百、十、個(gè)位,再送入LCD進(jìn)行數(shù)據(jù)顯示。

3.3    LCD1602顯示程序3.3.1 LCD1602初始化

液晶LCD初始化主要就是在液晶顯示器的每一個(gè)寄存器的初始設(shè)置,也就是向LCD中的各個(gè)寄存器寫入要設(shè)定的數(shù)據(jù)。該設(shè)計(jì)的初始化過程為先上電,然后進(jìn)行判忙操作,最后再進(jìn)行各個(gè)功能的設(shè)置,其中包括顯示狀態(tài)的設(shè)置(行、位的起始位置)、輸入方式的設(shè)置。初始化過程如圖3-5所示:

圖3-5 LCD初始化流程圖

該設(shè)計(jì)主要使用了LCD1602的讀忙操作、寫數(shù)據(jù)操作、寫命令操作和寫字符操作。其中每個(gè)操作都需要使能端RW、RS的控制信號(hào),當(dāng)RS、RW均為0的情況下,可以進(jìn)行讀、寫操作,而讀忙只有RS=0、RW=1時(shí),才能進(jìn)行此操作。LCD1602如果要顯示字符,首先要寫入顯示字符的首地址,此次使用的是從第一行第四個(gè)字符04地址開始顯示,但是液晶寫數(shù)據(jù)操作時(shí)地址最高位D7必須為高電平,因此寫入數(shù)據(jù)的時(shí)候應(yīng)該是00000100(04H)+10000000(80H)=10000100(84H)。


4.1    顯示結(jié)果及誤差分析4.2.1 顯示結(jié)果
  • 當(dāng)輸入電壓為4.55V時(shí),顯示結(jié)果如圖4-1 所示,實(shí)際電壓為4.54V。

圖4-1 輸入電壓為4.55V時(shí),LCD顯示結(jié)果


  • 當(dāng)輸入電壓為9.97V時(shí),顯示結(jié)果如圖4.2所示,實(shí)際電壓為9.96V。


4.2.2 誤差分析

通過對(duì)輸入不同的電壓進(jìn)行測(cè)試,得到了仿真數(shù)據(jù)?傻贸鰞烧叩膶(duì)比測(cè)試表,如下表4-1所示:

4-1 簡(jiǎn)易電壓表與“標(biāo)準(zhǔn)”電壓表對(duì)比測(cè)試表

標(biāo)準(zhǔn)電壓/V

電壓表測(cè)量值/V

絕對(duì)誤差/V

1.50

3.50

4.50

5.00

7.45

8.71

9.97

1.50

3.49

4.49

5.00

7.44

8.70

9.96

0.00

0.01

0.01

0.00

0.01

0.01

0.01


從表4-1中的幾組數(shù)據(jù)的分析,測(cè)試電壓誤差以0.01V的幅度變化。這主要是硬件本身的誤差導(dǎo)致。由于單片機(jī)AT89C51、ADC0808數(shù)據(jù)傳輸端口為8,當(dāng)輸入電壓為5.00V時(shí),輸出端口的數(shù)據(jù)為11111111(FFH),所以ADC0808的最高分辯率為0.0196V(5/255)。這就決定了電壓表的最高分辯率只能到0.0196,因此測(cè)試電壓通常以0.01的幅度變化。

該數(shù)字電壓表所測(cè)得的電壓值和標(biāo)準(zhǔn)的電壓相比,大概有0-0.01V的偏差。由于硬件方面的原因,此誤差只能通過硬件上的完善才能得以校正。因?yàn)樵撾妷罕碓O(shè)計(jì)時(shí)用的是5V的供電電源作為基準(zhǔn)電壓,所以電壓可能出現(xiàn)誤差。如果要測(cè)量大于5V的電壓時(shí),應(yīng)當(dāng)使用分壓電路,程序中對(duì)計(jì)算結(jié)果進(jìn)行調(diào)整就可以了。

通過多次的仿真和調(diào)整,此次設(shè)計(jì)的電壓表的絕對(duì)誤差為0~0.01V,因此本次畢業(yè)設(shè)計(jì)符合最初設(shè)計(jì)要求。

附錄一 系統(tǒng)硬件設(shè)計(jì)總圖


單片機(jī)源程序如下:


  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define  uint unsigned int
  4. sbit OE=P3^2;                                                                                    //AD數(shù)據(jù)輸出控制端口
  5. sbit EOC=P3^3;                                                                      //數(shù)據(jù)轉(zhuǎn)換結(jié)束由0變1
  6. sbit START=P3^4;                                                                      //AD轉(zhuǎn)換啟動(dòng)  ALE接口
  7. sbit CLK=P3^1;
  8. sbit  rw=P3^6;                                                                      //1602讀寫選擇
  9. sbit  rs=P3^5;                                                                                    //1602寄存器選擇端
  10. sbit  en=P3^7;                                                                      // //1602讀寫使能端
  11. sbit a=P1^0;                                                                                    //a,b,c為轉(zhuǎn)換器通道選擇地址
  12. sbit b=P1^1;
  13. sbit c=P1^2;
  14. sbit d=P1^5;                                                                                                  //報(bào)警信號(hào)端
  15. sbit K1=P1^6;                                                                                                  //量程選擇開關(guān)
  16. sbit K2=P1^7;                                                                                   
  17. uchar dis[4]={0,0,0,0};                                                                      //緩存數(shù)據(jù)處理結(jié)果
  18. void delay(uchar i)                                                                      //延時(shí)程序
  19. { uchar n;
  20.   while(i--)
  21.     {
  22.   for(n=0;n<250;n++)
  23.      ;
  24.     }
  25. }

  26. bit lcd_busy_check()                                                        //1602狀態(tài)檢測(cè)是否忙碌
  27. { bit  result;
  28.   rs=0;
  29.   rw=1;
  30.   en=1;
  31.   delay(10);
  32.   result=(bit)(P0&0x80);
  33.   en=0;
  34.   return  result;
  35. }

  36. void w_comd(uchar command)                                            //寫LCD命令
  37. {
  38.   while(lcd_busy_check());
  39.   rw=0;
  40.   rs=0;
  41.   en=0;
  42.   P0=command;
  43.   delay(10);
  44.   en=1;
  45.   delay(10);
  46.   en=0;
  47. }

  48. void  vWriteData(uchar dat)                                             //向1602發(fā)送數(shù)據(jù)
  49. {
  50.   while(lcd_busy_check());
  51.   rs=1;
  52.   rw=0;
  53.   en=0;
  54.   P0=dat;
  55.   delay(1);
  56.   en=1;
  57.   delay(1);
  58.   en=0;
  59. }


  60. lcd_init()                                                                                                     //LCD1602初始化
  61. {
  62.   w_comd(0x38);
  63.   delay(5);
  64.   w_comd(0x0c);                //開顯示屏,關(guān)光標(biāo)
  65.   delay(5);
  66.   w_comd(0x06);    //字符進(jìn)入模式:屏幕不動(dòng),字符后移
  67.   delay(5);
  68.   w_comd(0x01);  //清屏

  69. }


  70. void show_lcd_char(uchar ucChar)                                                        //LCD1602字庫(kù)表
  71. {
  72.               switch(ucChar)
  73.                             {
  74.                             case ' ': vWriteData(0x20);break;
  75.                             case '!': vWriteData(0x21);break;
  76.                             case '"': vWriteData(0x22);break;
  77.                             case '#': vWriteData(0x23);break;
  78.                             case '[/p]完整的Word格式文檔51黑下載地址:
  79. 51單片機(jī)的數(shù)字電壓表設(shè)計(jì).rar (229.46 KB, 下載次數(shù): 107)



  80. : vWriteData(0x24);break;
  81.                             case '%': vWriteData(0x25);break;
  82.                             case '&': vWriteData(0x26);break;
  83.                             case '>': vWriteData(0x27);break;
  84.                             case '(': vWriteData(0x28);break;
  85.                             case ')': vWriteData(0x29);break;
  86.                             case '.': vWriteData(0x2E);break;

  87.                             case '0': vWriteData(0x30);break;
  88.                             case '1': vWriteData(0x31);break;
  89.                             case '2': vWriteData(0x32);break;
  90.                             case '3': vWriteData(0x33);break;
  91.                             case '4': vWriteData(0x34);break;
  92.                             case '5': vWriteData(0x35);break;
  93.                             case '6': vWriteData(0x36);break;
  94.                             case '7': vWriteData(0x37);break;
  95.                             case '8': vWriteData(0x38);break;
  96.                             case '9': vWriteData(0x39);break;

  97.                            
  98.                             case 'V': vWriteData(0x56);break;

  99.                             case 'a': vWriteData(0x61);break;
  100.                             case 'd': vWriteData(0x64);break;
  101.                             case 'e': vWriteData(0x65);break;
  102.                             case 'f': vWriteData(0x66);break;
  103.                             case 'g': vWriteData(0x67);break;
  104.                             case 'h': vWriteData(0x68);break;
  105.                             case 'i': vWriteData(0x69);break;
  106.                             case 'j': vWriteData(0x6A);break;
  107.                             case 'k': vWriteData(0x6B);break;
  108.                             case 'l': vWriteData(0x6C);break;
  109.                             case 'm': vWriteData(0x6D);break;
  110.                             case 'n': vWriteData(0x6E);break;
  111.                             case 'o': vWriteData(0x6F);break;
  112.                             case 'p': vWriteData(0x70);break;
  113.                             case 'q': vWriteData(0x71);break;
  114.                             case 'r': vWriteData(0x72);break;
  115.                             case 's': vWriteData(0x73);break;
  116.                             case 't': vWriteData(0x74);break;
  117.                             case 'u': vWriteData(0x75);break;
  118.                             case 'v': vWriteData(0x76);break;
  119.                            

  120.                             default: break;
  121.                             }
  122. }

  123. void show_lcd(uchar xschar[])                                          //顯示字符
  124. {
  125.   uchar i;
  126.               for(i=0;;i++)
  127.                             {
  128.                             show_lcd_char(xschar[i]);
  129.                             if(xschar[i+1]=='\0')
  130.                                           break;            
  131.         }                           
  132. }

  133. void v_display0(uint getdata)                                            //顯示數(shù)據(jù)
  134. {
  135.    uint m,i;
  136.   m=getdata*1.0/255*500;
  137.   dis[0]=m/100;                                                                        //把計(jì)算的數(shù)據(jù)每個(gè)位存入數(shù)組
  138.   dis[1]=m/10%10;
  139.   dis[2]=m%10;
  140.   for(i=0;i<3;i++)                                             //數(shù)據(jù)逐一輸出
  141.   {
  142.    show_lcd_char(dis[i]+48);

  143.    if(i==0)
  144.        show_lcd_char('.');
  145.   }
  146. }

  147. void v_display1(uint getdata)                                            //顯示數(shù)據(jù)
  148. {
  149.    uint m,i;
  150.   m=getdata*1.0/255*500*3;
  151. if(m>=1000)
  152.   {
  153.      dis[0]=m/1000;                                                                        //把計(jì)算的數(shù)據(jù)每個(gè)位存入數(shù)組
  154.      dis[1]=m/100%10;
  155.      dis[2]=m/10%10;
  156.               dis[3]=m%10;
  157.      for(i=0;i<4;i++)                                             //數(shù)據(jù)逐一輸出
  158.    {
  159.    show_lcd_char(dis[i]+48);

  160.    if(i==1)
  161.        show_lcd_char('.');}
  162.   }
  163.   else
  164.   {
  165.      dis[0]=m/100;                                                                        //把計(jì)算的數(shù)據(jù)每個(gè)位存入數(shù)組
  166.      dis[1]=m/10%10;
  167.      dis[2]=m%10;
  168.   for(i=0;i<3;i++)                                             //數(shù)據(jù)逐一輸出
  169.    {
  170.    show_lcd_char(dis[i]+48);

  171.    if(i==0)
  172.        show_lcd_char('.');
  173.    }
  174.   }
  175. }


  176. void main()
  177. {
  178.   TMOD=0x01;                                            //定時(shí)器0,模式1
  179.   TH0=0xfa;
  180.   TL0=0x00;
  181.   EA=1;                                                                                    //開總中斷
  182.   ET0=1;                                                        //開定時(shí)中斷            
  183.   ET1=1;
  184.   TR0=1;                                                        //啟動(dòng)定時(shí)中斷
  185.   d=0;

  186.   lcd_init();          //初始化

  187.   w_comd(0x84);                                                         //顯示起始地址
  188.    delay(10);
  189.   show_lcd("Voltage:");

  190.   w_comd(0xc9);
  191.   delay(10);
  192.   show_lcd("(V)");

  193.   while(1)
  194.   {
  195.   w_comd(0xc4);
  196.   d=0;
  197.   if((K1==0)&&(K2!=0))                                          //測(cè)量0~5V電壓
  198.   {a=0;
  199.   b=0;
  200.   c=0;
  201.   START=0;
  202.   OE=0;               
  203.   START=1;                                                        //啟動(dòng)AD轉(zhuǎn)換

  204.   START=0;
  205.   while(EOC==0);                               //等待轉(zhuǎn)換結(jié)束
  206.   OE=1;
  207.    v_display0(P2);
  208.   OE=0;
  209. ……………………

  210. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

完整的Word格式文檔51黑下載地址:




評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:540911 發(fā)表于 2020-4-13 15:35 | 只看該作者
值得參考,很棒
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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