版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 信息與電氣工程學(xué)院</b></p><p> 電子應(yīng)用系統(tǒng)CDIO一級(jí)項(xiàng)目</p><p><b> 設(shè)計(jì)說明書</b></p><p> ?。?011/2012學(xué)年第二學(xué)期)</p><p> 題 目 :___ _數(shù) 字 電 壓 表__________&
2、lt;/p><p> 專業(yè)班級(jí) : 電子信息0902班 </p><p> 學(xué)生姓名 : </p><p> 學(xué) 號(hào): </p><p> 指導(dǎo)教師 : </p><p> 設(shè)計(jì)周數(shù) :
3、 </p><p> 設(shè)計(jì)成績(jī) : </p><p> 2012年6月28日</p><p> 1、CDIO設(shè)計(jì)目的 </p><p> 本次CDIO設(shè)計(jì)題目是:</p><p> 利用所學(xué)的51單片機(jī),C語言,數(shù)字電路等知識(shí),設(shè)計(jì)一
4、個(gè)符合要求的數(shù)字電壓表。主控芯片可以是AT89C51,而采集電壓的模擬量轉(zhuǎn)換成數(shù)字量的芯片可以是ADC0804,也可以是PCF8591。而顯示模塊可以是數(shù)碼管,也可以是液晶LCD1602,從而展示給我們所得的電壓值。</p><p> 2、CDIO設(shè)計(jì)正文</p><p> 2.1 數(shù)字電壓表系統(tǒng)設(shè)計(jì)框圖</p><p> 本次數(shù)字電壓表系統(tǒng)設(shè)計(jì)框圖如圖 1
5、所示:</p><p> 模擬量數(shù)字量程序液晶</p><p><b> 處理驅(qū)動(dòng)</b></p><p> 數(shù)字電壓表主要由模/數(shù)轉(zhuǎn)換電路、單片機(jī)控制電路、顯示電路等三部分組成。其中PCF8591等器件組成的轉(zhuǎn)換電路,將輸入的模擬量信號(hào)進(jìn)行取樣、轉(zhuǎn)換、然后將轉(zhuǎn)換的數(shù)字信號(hào)送進(jìn)單片機(jī)。單片機(jī)控制電路主要實(shí)現(xiàn)對(duì)數(shù)據(jù)進(jìn)行程序處理;顯示
6、電路主要用于將單片機(jī)的信號(hào)數(shù)據(jù)轉(zhuǎn)換后顯示測(cè)量結(jié)果。</p><p> 模擬信號(hào)產(chǎn)生模塊:輸入電源電路(變壓器、整流電路、濾波電路、穩(wěn)壓電路組成)和分壓電路(9萬歐姆和1萬歐姆的電阻分壓)。</p><p> 模數(shù)轉(zhuǎn)換模塊組成部分:PCF8591芯片</p><p> 程序處理的單片機(jī)控制模塊:AT89C51芯片</p><p> 電壓
7、結(jié)果顯示部分:LCD1602液晶</p><p> 2.2 各模塊介紹</p><p> 2.2.1 AT89C51芯片介紹</p><p> AT89S52 具有以下標(biāo)準(zhǔn)功能:8k 字節(jié) Flash,256 字節(jié) RAM,32 位 I/O 口線,看門狗定時(shí)器,2 個(gè)數(shù)據(jù)指針,三個(gè) 16 位定時(shí)器/計(jì)數(shù)器,一個(gè) 6 向量 2 級(jí)中斷結(jié)構(gòu),全雙工串行口,片
8、內(nèi)晶振及時(shí)鐘電路。另外,AT89S52 可降至 0Hz 靜態(tài)邏輯操作,支持 2 種軟件可選擇節(jié)電模式。</p><p> 空閑模式下,CPU停止工作,允許 RAM、定時(shí)器/計(jì)數(shù)器、串口、中斷繼續(xù)工作。掉電保護(hù)方式下,RAM 內(nèi)容被保存,振蕩器被凍結(jié),單片機(jī)一切工作停止,直到下一個(gè)中斷或硬件復(fù)位為止。</p><p> AT89C52的引腳圖如圖2 所示。</p><
9、p> VCC : 接電源 </p><p><b> GND: 接地</b></p><p> P0 口:P0 口是一個(gè) 8 位漏極開路的雙向 I/O 口。作為輸出口,每位能驅(qū)動(dòng) 8 個(gè) TTL 邏輯電平。對(duì) P0 端口寫“1”時(shí),引腳用作高阻抗輸入。當(dāng)訪問外部程序和數(shù)據(jù)存儲(chǔ)器時(shí),P0 口也被作為低 8 位地址/數(shù)據(jù)復(fù)用。在這種模式下,P0
10、具有內(nèi)部上拉電阻。在 flash 編</p><p> 程時(shí),P0 口也用來接收指令字節(jié);在程序校驗(yàn)時(shí),輸出指令字節(jié)。程序校時(shí),需要外部上拉電阻。</p><p> P1 口:P1 口是一個(gè)具有內(nèi)部上拉電阻的 8 位雙向 I/O 口,p1 輸出緩沖器能驅(qū)動(dòng) 4 個(gè)TTL 邏輯電平。對(duì) P1 端口寫“1”時(shí),內(nèi)部上拉電阻把端口拉高,此時(shí)可以作為輸入口使用。作為輸入使用時(shí),被外部拉低的引腳
11、由于內(nèi)部電阻的原因,將輸出電流(IIL)。</p><p> P2 口:P2 口是一個(gè)具有內(nèi)部上拉電阻的 8 位雙向 I/O 口,P2 輸出緩沖器能驅(qū)動(dòng) 4 個(gè)TTL 邏輯電平。對(duì) P2 端口寫“1”時(shí),內(nèi)部上拉電阻把端口拉高,此時(shí)可以作為輸入口使用。作為輸入使用時(shí),被外部拉低的引腳由于內(nèi)部電阻的原因,將輸出電流(IIL)在訪問外部程序存儲(chǔ)器或用 16 位地址讀取外部數(shù)據(jù)存儲(chǔ)器(例如執(zhí)行 MOVX @DPTR)
12、時(shí),P2 口送出高八位地址。</p><p> P3 口:P3 口是一個(gè)具有內(nèi)部上拉電阻的 8 位雙向 I/O 口,p2 輸出緩沖器能驅(qū)動(dòng) 4 個(gè)TTL 邏輯電平。對(duì) P3 端口寫“1”時(shí),內(nèi)部上拉電阻把端口拉高,此時(shí)可以作為輸入口使用。作為輸入使用時(shí),被外部拉低的引腳由于內(nèi)部電阻的原因,將輸出電流(IIL)。P3 口亦作為 AT89C52 特殊功能(第二功能)使用,AT89C52的P3口的第二功能表如表1所示
13、。</p><p> RST: 復(fù)位輸入。晶振工作時(shí),RST 腳持續(xù) 2 個(gè)機(jī)器周期高電平將使單片機(jī)復(fù)位??撮T狗計(jì)時(shí)完成后,RST 腳輸出 96 個(gè)晶振周期的高電平。特殊寄存器 AUXR(地址 8EH)上的 DISRTO 位可以使此功能無效。DISRTO 默認(rèn)狀態(tài)下,復(fù)位高電平有效。</p><p> ALE/PROG:地址鎖存控制信號(hào)(ALE)是訪問外部程序存儲(chǔ)器時(shí),鎖存低 8 位地
14、址的輸出脈沖。在 flash 編程時(shí),此引腳(PROG)也用作編程輸入脈沖。在一般情況下,ALE 以晶振六分之一的固定頻率輸出脈沖,可用來作為外部定時(shí)器或時(shí)鐘使用。然而,特別強(qiáng)調(diào),在每次訪問外部數(shù)據(jù)存儲(chǔ)器時(shí),ALE 脈沖將會(huì)跳過。</p><p> PSEN:外部程序存儲(chǔ)器選通信號(hào)(PSEN)是外部程序存儲(chǔ)器選通信號(hào)。當(dāng) AT89S52 從外部程序存儲(chǔ)器執(zhí)行外部代碼時(shí),PSEN 在每個(gè)機(jī)器周期被激活兩次,而在訪
15、問外部數(shù)據(jù)存儲(chǔ)器時(shí),PSEN 將不被激活。</p><p> EA/VPP:訪問外部程序存儲(chǔ)器控制信號(hào)。為使能從 0000H 到 FFFFH 的外部程序存儲(chǔ)器讀取指令,EA 必須接 GND。為了執(zhí)行內(nèi)部程序指令,EA 應(yīng)該接 VCC。在 flash 編程期間,EA 也接收 12V編程電源( VPP)。</p><p> XTAL1:振蕩器反相放大器和內(nèi)部時(shí)鐘發(fā)生電路的輸入端。</
16、p><p> XTAL2:振蕩器反相放大器的輸出端。</p><p><b> (2)晶振電路</b></p><p> 晶振電路是單片機(jī)的最小系統(tǒng)的組成部分。典型的晶振取11.0592MHz(因?yàn)榭梢詼?zhǔn)確地得到9600波特率和19200波特率,用于有串口通訊的場(chǎng)合)/12MHz(產(chǎn)生精確的uS級(jí)時(shí)歇,方便定時(shí)操作)。</p>
17、<p> 特別注意:對(duì)于31腳(EA/Vpp),當(dāng)接高電平時(shí),單片機(jī)在復(fù)位后從內(nèi)部ROM的0000H開始執(zhí)行;當(dāng)接低電平時(shí),復(fù)位后直接從外部ROM的0000H開始執(zhí)行。</p><p><b> (3)復(fù)位電路</b></p><p> 復(fù)位電路也是單片機(jī)的最小系統(tǒng)的組成部分。當(dāng)單片機(jī)系統(tǒng)在運(yùn)行中,受到環(huán)境干擾出現(xiàn)程序執(zhí)行錯(cuò)亂的時(shí)候,按下復(fù)位按鈕內(nèi)部的
18、程序自動(dòng)從頭開始執(zhí)行。</p><p> 復(fù)位電路的原理是單片機(jī)RST引腳接收到2us以上的電平信號(hào),只要保證電容的充放電時(shí)間大于2US,即可實(shí)現(xiàn)復(fù)位,所以電路中的電容值是可以改變的。按鍵按下系統(tǒng)復(fù)位,是電容處于一個(gè)短路電路中,釋放了所有的電能,電阻兩端的電壓增加引起的。</p><p> 單片機(jī)最小系統(tǒng)復(fù)位電路的極性電容的大小直接影響單片機(jī)的復(fù)位時(shí)間,一般采用10~30uF,51單片
19、機(jī)最小系統(tǒng)容值越大需要的復(fù)位時(shí)間越短。</p><p> 2.2.2 PCF8591 AD/DA芯片</p><p> PCF8591是一個(gè)單片集成、單獨(dú)供電、低功耗、8-bit CMOS數(shù)據(jù)獲取器件。PCF8591具有4個(gè)模擬輸入、1個(gè)模擬輸出和1個(gè)串行I²C總線接口。PCF8591的3個(gè)地址引腳A0, A1和A2可用于硬件地址編程,允許在同一個(gè)I²C總線上接入
20、8個(gè)PCF8591器件,而無需額外的硬件。在PCF8591器件上輸入輸出的地址、控制和數(shù)據(jù)信號(hào)都是通過雙線雙向I²C總線以串行的方式進(jìn)行傳輸。</p><p> PCF8591的功能包括多路模擬輸入、內(nèi)置跟蹤保持、8-bit模數(shù)轉(zhuǎn)換和8-bit數(shù)模轉(zhuǎn)換。PCF8591的最大轉(zhuǎn)化速率由I²C總線的最大速率決定。</p><p> 1、主要技術(shù)指標(biāo)和特性</p&g
21、t;<p><b> 單獨(dú)供電 </b></p><p> PCF8591的操作電壓范圍2.5V-6V </p><p><b> 低待機(jī)電流 </b></p><p> 通過I2C總線串行輸入/輸出 </p><p> PCF8591通過3個(gè)硬件地址引腳尋址 </p&
22、gt;<p> PCF8591的采樣率由I2C總線速率決定 </p><p> 4個(gè)模擬輸入可編程為單端型或差分輸入 </p><p><b> 自動(dòng)增量頻道選擇 </b></p><p> PCF8591的模擬電壓范圍從Vss到VDD </p><p> PCF8591內(nèi)置跟蹤保持電路 <
23、/p><p> 8-bit逐次逼近A/D轉(zhuǎn)換器 </p><p> 通過1路模擬輸出實(shí)現(xiàn)DAC增益 </p><p> 2、ADC0808引腳功能 </p><p> PCF8591引腳圖如圖3所示</p><p> AIN0~AIN3:模擬信
24、號(hào)輸入端。 </p><p> A0~A3:引腳地址端。 </p><p> VDD、VSS:電源端。 (2.5~6V) </p><p> SDA、SCL:I2C 總線的數(shù)據(jù)線、 時(shí)鐘線。 </p><p> OSC:外部時(shí)鐘輸入端,內(nèi)部時(shí)鐘輸出端。 </p><p> EXT:內(nèi)部、外部時(shí)鐘選擇線,使用內(nèi)
25、部時(shí)鐘時(shí) EXT 接地。 </p><p> AGND:模擬信號(hào)地。 </p><p> AOUT:D/A 轉(zhuǎn)換輸出端。 </p><p> VREF:基準(zhǔn)電源端。</p><p><b> 4 功能描述</b></p><p><b> ?。?)地址</b><
26、/p><p> IIC總線系統(tǒng)中的每一片PCF8591通過發(fā)送有效地址到該地址器件來激活。該地址包括固定部分和可編程部分??删幊滩糠直匦韪鶕?jù)地址引腳A0、A1和A2來設(shè)置。在IIC總線協(xié)議中地址必需是起始條件后作為第一個(gè)字節(jié)發(fā)送。地址字節(jié)的最后一位是用于設(shè)置以后數(shù)據(jù)傳輸方向的讀/寫。</p><p><b> (2)控制字</b></p><p&g
27、t; 控制字節(jié)用于實(shí)現(xiàn)器件的各種功能,如模擬信號(hào)由哪幾個(gè)通道輸入等??刂谱止?jié)存放在控制寄存器中??偩€操作時(shí)為主控器發(fā)送的第二字節(jié)。其格式如下圖5所示: </p><p> 其中:D1、D0兩位是A/D通道編號(hào):00通道0,01通道1,10通道2,11通道3 D2
28、 自動(dòng)增益選擇(有效位為1) D5、D4模擬量輸入選擇:00為四路單數(shù)入、01為三路差分輸入、10為單端與差分配合輸入、11為模擬輸出允許有效 當(dāng)系統(tǒng)為A/D轉(zhuǎn)換時(shí),模擬輸出允許為0。模擬量輸入選擇位取值由輸入方式?jīng)Q定:四路單端輸入時(shí)取00,三路差分輸入時(shí)取01,單端與差分輸入時(shí)取10,二路差分輸入時(shí)取11。最低兩位時(shí)通道編號(hào)位,當(dāng)對(duì)0通道的模擬信號(hào)進(jìn)行A/D轉(zhuǎn)換時(shí)取0
29、0,當(dāng)對(duì)1通道的模擬信號(hào)進(jìn)行A/D轉(zhuǎn)換時(shí)取01,當(dāng)對(duì)2通道的模擬信號(hào)進(jìn)行A/D轉(zhuǎn)換時(shí)取10,當(dāng)對(duì)3通道的模擬信號(hào)進(jìn)行A/D轉(zhuǎn)換時(shí)取11。 在進(jìn)行數(shù)據(jù)操作時(shí),首先是主控器發(fā)出起始信號(hào),然后發(fā)出讀尋址字節(jié),被控器做出應(yīng)答后,主控器從被控器讀出第一個(gè)數(shù)據(jù)字節(jié),主控器發(fā)出應(yīng)答,主控器從被控器讀出第二個(gè)數(shù)據(jù)字節(jié),主控器發(fā)出應(yīng)答…一直到主控器從被控器中讀出第n個(gè)數(shù)據(jù)字節(jié),主控器發(fā)出非應(yīng)答信號(hào),最后主控器發(fā)出停止
30、信號(hào)。</p><p><b> (3)A/D轉(zhuǎn)換</b></p><p> A/D轉(zhuǎn)換器采用逐次逼近轉(zhuǎn)換技術(shù)。在A/D轉(zhuǎn)換周期將臨時(shí)使用片上轉(zhuǎn)換器和高增益比較器。一個(gè)A/D轉(zhuǎn)換周期總是開始于發(fā)送一個(gè)有效讀模式地址給PCF8591之后。A/D轉(zhuǎn)換周期子在應(yīng)答時(shí)鐘脈沖的后延被觸發(fā)。并在傳輸前一次轉(zhuǎn)換結(jié)果時(shí)執(zhí)行(見圖6)</p><p> 圖
31、 6 A/D轉(zhuǎn)換</p><p> 一旦一個(gè)轉(zhuǎn)換周期被觸發(fā),所選通的輸入電壓采樣將保存到芯片并被轉(zhuǎn)換為對(duì)應(yīng)的8位二進(jìn)制碼,取自差分輸入的采樣將被轉(zhuǎn)換為8位二進(jìn)制補(bǔ)碼</p><p> 轉(zhuǎn)換結(jié)果被保存在ADC數(shù)據(jù)寄存器等待傳輸。如果自動(dòng)增量標(biāo)志被置1,將選擇下一個(gè)通道。在讀周期傳輸?shù)牡谝粋€(gè)字節(jié)包含前一次讀周期的轉(zhuǎn)換結(jié)果代碼,以上電復(fù)位之后讀取的第一個(gè)字節(jié)是0x80。最高A/D轉(zhuǎn)換速率
32、取決于實(shí)際的IIC總線速度。</p><p><b> ?。?)D/A轉(zhuǎn)換</b></p><p> 發(fā)送給PCF8591的第三個(gè)字節(jié)被存儲(chǔ)到DAC數(shù)據(jù)存儲(chǔ)器,并使用片內(nèi)D/A轉(zhuǎn)換器轉(zhuǎn)換成對(duì)應(yīng)的模擬電壓。這個(gè)D/A 轉(zhuǎn)換器由連接到外部參考電壓的具有256個(gè)接頭的電阻分壓電路和選擇開關(guān)組成。接頭譯碼器切換一個(gè)接頭至DAC輸出線。</p><p>
33、; 模擬輸出電壓由自動(dòng)清零單位增益放大器緩沖。這個(gè)緩沖放大器可通過設(shè)置控制寄存器的模擬輸出允許標(biāo)志來打開或關(guān)閉。在激活狀態(tài),輸出電壓將保持到新的數(shù)據(jù)字節(jié)被發(fā)送。</p><p> 提供給模擬輸出AOUT的輸出電壓由下式給出。D/A轉(zhuǎn)換順序的波形圖如圖7</p><p><b> = +</b></p><p> 圖7 D/A轉(zhuǎn)換&l
34、t;/p><p><b> (5)振蕩器</b></p><p> 片上振蕩器產(chǎn)生A/D轉(zhuǎn)換周期和刷新自動(dòng)清零緩沖放大器需要的時(shí)鐘信號(hào)。在使用這個(gè)振蕩器時(shí)EXT引腳必須連接到VSS。在OSC引腳振蕩頻率是可用的。</p><p> 如果EXT引腳被連接到VDD,振蕩輸出OSC將切換到高阻態(tài)以允許用戶連接外部時(shí)鐘信號(hào)至OSC。</p>
35、;<p><b> 6 I2C總線特性</b></p><p> I2C總線是不同的IC或模塊之間的雙向兩線通信,這兩條線是串行數(shù)據(jù)線(SDA)和串行時(shí)鐘線(SCL),這兩條線必須通過上拉電路連接至正電源。數(shù)據(jù)傳輸只能是在總線不忙時(shí)啟動(dòng)。</p><p><b> ?。?)位傳輸</b></p><p>
36、 一個(gè)數(shù)據(jù)位在每一個(gè)時(shí)鐘脈沖期間傳輸。SDA線上的數(shù)據(jù)必須在時(shí)鐘脈沖的高電平期間保持穩(wěn)定。這個(gè)期間數(shù)據(jù)線上的改變被當(dāng)作控制信號(hào)。具體時(shí)序如圖 8所示:</p><p><b> 圖8 位傳輸</b></p><p> ?。?)開始或停止條件</p><p> 數(shù)據(jù)和時(shí)鐘線在總不忙時(shí)保持高電平。在時(shí)鐘為高電平時(shí),數(shù)據(jù)線上的一個(gè)由高到低的變
37、化被定義為開始條件。時(shí)鐘為高電平時(shí),數(shù)據(jù)線上的一個(gè)由低到高的變化被定義為停止條件。具體時(shí)序如圖 9所示</p><p> 圖9 開始和停止條件</p><p><b> (3)系統(tǒng)配置</b></p><p> 產(chǎn)生信息的器件稱作“發(fā)送機(jī)”,接收信息的器件稱作“接收機(jī)”。控制信息的器件稱作“主機(jī)”,被控制的器件稱作“從機(jī)”。如圖10 所
38、示:</p><p><b> 圖10 系統(tǒng)配置</b></p><p><b> (4)應(yīng)答</b></p><p> 在開始和停止條件之間從發(fā)送機(jī)傳輸?shù)浇邮諜C(jī)的數(shù)據(jù)字節(jié)數(shù)是沒有限制的。每個(gè)8位數(shù)據(jù)字節(jié)之后緊跟著一個(gè)應(yīng)答位。應(yīng)答位是由發(fā)送機(jī)放在總線的一個(gè)高電平,而主機(jī)也產(chǎn)生一個(gè)額外的與應(yīng)答有關(guān)的時(shí)鐘脈沖。地址匹配
39、的從接收機(jī)必須在接收每一個(gè)字節(jié)后產(chǎn)生一個(gè)應(yīng)答。在應(yīng)答時(shí)鐘脈沖期間,應(yīng)答的器件必須將SDA線拉低。因此在應(yīng)答相應(yīng)的時(shí)鐘脈沖的高電平期間,SDA線必須保持穩(wěn)定的低電平。在由從機(jī)終止的最后一個(gè)字節(jié),主接收機(jī)必須通過產(chǎn)生一個(gè)低電平應(yīng)答向發(fā)送機(jī)發(fā)送一個(gè)數(shù)據(jù)結(jié)束信號(hào),這樣發(fā)送機(jī)必須將數(shù)據(jù)線SDA拉高以允許主機(jī)產(chǎn)生停止條件。具體時(shí)序如圖 11所示</p><p> 圖11 I2C 總線應(yīng)答</p><p
40、><b> ?。?)總線協(xié)議</b></p><p> 在開始條件后一個(gè)有效的硬件地址必須發(fā)送至PCF8591。讀/寫位定義了以后單個(gè)或多個(gè)字節(jié)數(shù)據(jù)傳輸?shù)姆较?。開始條件、停止條件和應(yīng)答位的格式應(yīng)定時(shí)參考I2C總線特性。在寫模式數(shù)據(jù)傳輸通過發(fā)送下一個(gè)數(shù)據(jù)的停止條件或開始條件來約束。</p><p> 總線協(xié)議具體時(shí)序如圖12,13所示:</p>
41、<p> 圖12 寫模式的總線協(xié)議,D/A轉(zhuǎn)換</p><p> 圖13 讀模式的總線協(xié)議,A/D轉(zhuǎn)換</p><p> 2.2.3 LCD1602液晶</p><p> 字符型液晶顯示模塊是一種專門用于顯示字母、數(shù)字、符號(hào)等點(diǎn)陣式LCD。</p><p><b> ?、僖_功能說明</b><
42、;/p><p> 1602LCD采用標(biāo)準(zhǔn)的14腳(無背光)或16腳(帶背光)接口,各引腳接口說明如表2 所示。</p><p> 第1腳:VSS為地電源。</p><p> 第2腳:VDD接5V正電源。</p><p> 第3腳:VL為液晶顯示器對(duì)比度調(diào)整端,接正電源時(shí)對(duì)比度最弱,接地時(shí)對(duì)比度最高,對(duì)比度過高時(shí)會(huì)產(chǎn)生“鬼影”,使用時(shí)可以通
43、過一個(gè)10K的電位器調(diào)整對(duì)比度。</p><p> 第4腳:RS為寄存器選擇,高電平時(shí)選擇數(shù)據(jù)寄存器、低電平時(shí)選擇指令寄存器。</p><p> 第5腳:R/W為讀寫信號(hào)線,高電平時(shí)進(jìn)行讀操作,低電平時(shí)進(jìn)行寫操作。當(dāng)RS和R/W共同為低電平時(shí)可以寫入指令或者顯示地址,當(dāng)RS為低電平R/W為高電平時(shí)可以讀忙信號(hào),當(dāng)RS為高電平R/W為低電平時(shí)可以寫入數(shù)據(jù)。</p><
44、p> 第6腳:E端為使能端,當(dāng)E端由高電平跳變成低電平時(shí),液晶模塊執(zhí)行命令。</p><p> 第7~14腳:D0~D7為8位雙向數(shù)據(jù)線。</p><p> 第15腳:背光源正極。</p><p> 第16腳:背光源負(fù)極。</p><p> ②1602LCD的指令說明及時(shí)序</p><p> 1602
45、液晶模塊內(nèi)部的控制器共有11條控制指令,如表3所示:</p><p> 1602液晶模塊的讀寫操作、屏幕和光標(biāo)的操作都是通過指令編程來實(shí)現(xiàn)的。(說明:1為高電平、0為低電平)</p><p> 指令1:清顯示,指令碼01H,光標(biāo)復(fù)位到地址00H位置。</p><p> 指令2:光標(biāo)復(fù)位,光標(biāo)返回到地址00H。</p><p> 指令3
46、:光標(biāo)和顯示模式設(shè)置 I/D:光標(biāo)移動(dòng)方向,高電平右移,低電平左移 S:屏幕上所有文字是否左移或者右移。高電平表示有效,低電平則無效。</p><p> 指令4:顯示開關(guān)控制。 D:控制整體顯示的開與關(guān),高電平表示開顯示,低電平表示關(guān)顯示 C:控制光標(biāo)的開與關(guān),高電平表示有光標(biāo),低電平表示無光標(biāo) B:控制光標(biāo)是否閃爍,高電平閃爍,低電平不閃爍。</p><p> 指令5:光標(biāo)或顯示移位
47、 S/C:高電平時(shí)移動(dòng)顯示的文字,低電平時(shí)移動(dòng)光標(biāo)。</p><p> 指令6:功能設(shè)置命令 DL:高電平時(shí)為4位總線,低電平時(shí)為8位總線 N:低電平時(shí)為單行顯示,高電平時(shí)雙行顯示 F: 低電平時(shí)顯示5x7的點(diǎn)陣字符,高電平時(shí)顯示5x10的點(diǎn)陣字符。</p><p> 指令7:字符發(fā)生器RAM地址設(shè)置。</p><p> 指令8:DDRAM地址設(shè)置。</
48、p><p> 指令9:讀忙信號(hào)和光標(biāo)地址 BF:為忙標(biāo)志位,高電平表示忙,此時(shí)模塊不能接收命令或者數(shù)據(jù),如果為低電平表示不忙。</p><p><b> 指令10:寫數(shù)據(jù)。</b></p><p><b> 指令11:讀數(shù)據(jù)。</b></p><p> 與HD44780相兼容的芯片時(shí)序如表4所示
49、:</p><p> 讀操作時(shí)序如圖14所示。</p><p> 寫操作時(shí)序如圖15所示。</p><p> 2.3 系統(tǒng)硬件仿真</p><p> 用Protues繪制數(shù)字電壓表的電路圖后,將Keil4生成的HEX文件下載進(jìn)主控芯片AT89C51芯片里,運(yùn)行,電路圖和結(jié)果如圖 16所示</p><p>
50、2.4 系統(tǒng)程序設(shè)計(jì)</p><p> 根據(jù)設(shè)計(jì)要求結(jié)合硬件電路,采用的是PCF8591模數(shù)數(shù)模轉(zhuǎn)換芯片,采用的是液晶顯示方式,在液晶顯示之前,需對(duì)采集回的二進(jìn)制數(shù)字量進(jìn)行轉(zhuǎn)換顯示,這段過程5V電壓為基準(zhǔn)進(jìn)行數(shù)據(jù)處理。圖16是程序流程圖:</p><p><b> 2.5 程序</b></p><p> 2.5.1 主程序模塊<
51、;/p><p> #include<reg52.h></p><p> #include<stdio.h></p><p> #include"config.h"</p><p> #include"lcd.h"</p><p> /****與AD轉(zhuǎn)
52、換有關(guān)的全局變量**********/</p><p> uchar AD_result=0;</p><p> float Volt=0;</p><p> /****與LCD顯示有關(guān)的全局變***********/</p><p> char temp[16],temp1[16];</p><p> /*
53、**************************************************************</p><p> **函數(shù)名**void LCD_DIS()</p><p> **功 能 **顯示函數(shù)</p><p><b> **參 數(shù) **</b></p><p><b>
54、; **說 明 **</b></p><p> **********</p><p> ****************************************************************/</p><p> void LCD_DIS()</p><p><b> {</b&g
55、t;</p><p> sprintf((char *)temp,"Volt:%-6.4fV",Volt);</p><p> LCD_Str_DIS((char *)temp,0,1);</p><p> sprintf((char *)temp1,"FINISH");</p><p> LC
56、D_Str_DIS((char *)temp1,1,5);</p><p><b> }</b></p><p> /***************************************************************</p><p> **函數(shù)名**void AD_WORK()</p><p
57、> **功 能 **AD轉(zhuǎn)換函數(shù)</p><p><b> **參 數(shù) **</b></p><p><b> **說 明 **</b></p><p> **********</p><p> ********************************************
58、********************/</p><p> void AD_WORK()</p><p><b> {</b></p><p> AD_start();</p><p> AD_write(0x90);</p><p> AD_respons();</p>
59、<p> AD_write(0x41);</p><p> AD_respons();</p><p><b> AD_end();</b></p><p> AD_start();</p><p> AD_write(0x90);</p><p> AD_respons(
60、);</p><p> AD_write(0x41);</p><p> AD_respons();</p><p> AD_start();</p><p> AD_write(0x91);</p><p> AD_respons();</p><p> AD_result=AD_
61、read();</p><p> AD_respons();</p><p><b> AD_end();</b></p><p> AD_start();</p><p> AD_write(0x90);</p><p> AD_respons();</p><p&
62、gt; AD_write(0x41);</p><p> AD_respons();</p><p> AD_write(AD_result);</p><p> AD_respons();</p><p><b> AD_end();</b></p><p><b> }&
63、lt;/b></p><p> /***************************************************************</p><p> **函數(shù)名**void Data_Done()</p><p> **功 能 **數(shù)據(jù)處理函數(shù)</p><p><b> **參 數(shù) **&
64、lt;/b></p><p><b> **說 明 **</b></p><p> **********</p><p> ****************************************************************/</p><p> void Data_Done()&
65、lt;/p><p><b> {</b></p><p> P1=~AD_result; //AD轉(zhuǎn)換的值通過流水燈顯示</p><p> Volt=(AD_result*5)/255.0;//以5V電壓為基準(zhǔn),轉(zhuǎn)換成真正的電壓</p><p><b> }</b>&l
66、t;/p><p> /***************************************************************</p><p> **函數(shù)名**void main()</p><p><b> **功 能 **</b></p><p><b> **參 數(shù) **<
67、/b></p><p><b> **說 明 **</b></p><p> **********</p><p> ****************************************************************/</p><p> void main()</p>
68、;<p><b> {</b></p><p> LCD_init(); //液晶初始化</p><p><b> while(1)</b></p><p><b> {</b></p><p> AD_init();
69、 //AD初始化</p><p> AD_WORK(); //AD轉(zhuǎn)換</p><p> Data_Done(); //數(shù)據(jù)處理</p><p> LCD_DIS(); //液晶顯示</p><p><b> }</b>&l
70、t;/p><p><b> }</b></p><p> 2.5.2 PCF8591 AD/DA模塊</p><p> #include<config.h></p><p> sbit sda=P2^0;</p><p> sbit scl=P2^1;</p>&
71、lt;p> /***************************************************************</p><p> **函數(shù)名**void AD_init()</p><p><b> **功 能 **</b></p><p><b> **參 數(shù) **</b>&l
72、t;/p><p><b> **說 明 **</b></p><p> **********</p><p> ****************************************************************/</p><p> void AD_init()</p>&l
73、t;p><b> {</b></p><p><b> sda=1;</b></p><p><b> delay();</b></p><p><b> scl=1;</b></p><p> delay();</p>
74、<p><b> }</b></p><p> /***************************************************************</p><p> **函數(shù)名**void AD_start()</p><p><b> **功 能 **</b></p&
75、gt;<p><b> **參 數(shù) **</b></p><p><b> **說 明 **</b></p><p> **********</p><p> ****************************************************************/</p
76、><p> void AD_start()</p><p><b> {</b></p><p><b> sda=1;</b></p><p><b> delay();</b></p><p><b> scl=1;</b>
77、;</p><p><b> delay();</b></p><p><b> sda=0;</b></p><p><b> delay();</b></p><p><b> }</b></p><p> /****
78、***********************************************************</p><p> **函數(shù)名**void AD_end()</p><p><b> **功 能 **</b></p><p><b> **參 數(shù) **</b></p><p&
79、gt;<b> **說 明 **</b></p><p> **********</p><p> ****************************************************************/</p><p> void AD_end()</p><p><b>
80、 {</b></p><p><b> sda=0;</b></p><p><b> delay();</b></p><p><b> scl=1;</b></p><p><b> delay();</b></p>
81、<p><b> sda=1;</b></p><p><b> delay();</b></p><p><b> }</b></p><p> /***************************************************************<
82、/p><p> **函數(shù)名**void AD_write(uchar dat)</p><p><b> **功 能 **</b></p><p><b> **參 數(shù) **</b></p><p><b> **說 明 **</b></p><p>
83、; **********寫數(shù)據(jù)時(shí)序:scl=1時(shí)保持?jǐn)?shù)據(jù),scl=0時(shí)變化數(shù)據(jù)</p><p> ****************************************************************/</p><p> void AD_write(uchar dat)</p><p><b> {</b>&l
84、t;/p><p> uchar i,temp;</p><p><b> temp=dat;</b></p><p> for(i=8;i>0;i--)</p><p><b> {</b></p><p> dat=dat<<1;</p>
85、<p><b> scl=0;</b></p><p><b> delay();</b></p><p><b> sda=CY;</b></p><p><b> delay();</b></p><p><b> s
86、cl=1;</b></p><p><b> delay();</b></p><p><b> }</b></p><p><b> scl=0;</b></p><p><b> delay();</b></p>&l
87、t;p><b> sda=1;</b></p><p><b> delay();</b></p><p><b> }</b></p><p> /***************************************************************</p
88、><p> **函數(shù)名**uchar AD_read()</p><p><b> **功 能 **</b></p><p><b> **參 數(shù) **</b></p><p><b> **說 明 **</b></p><p> ********
89、**讀時(shí)序:scl=1時(shí)讀數(shù)據(jù),scl=0時(shí)變化</p><p> ****************************************************************/</p><p> uchar AD_read()</p><p><b> {</b></p><p> ucha
90、r i,k;</p><p><b> scl=0;</b></p><p><b> delay();</b></p><p><b> sda=1;</b></p><p><b> delay();</b></p><p&
91、gt; for(i=8;i>0;i--)</p><p><b> {</b></p><p><b> scl=1;</b></p><p><b> delay();</b></p><p> k=(k<<1)|sda;</p>&
92、lt;p><b> delay();</b></p><p><b> scl=0;</b></p><p> delay();</p><p><b> }</b></p><p><b> return k;</b></p&g
93、t;<p><b> }</b></p><p> /***************************************************************</p><p> **函數(shù)名**void AD_respons()</p><p><b> **功 能 **</b>&
94、lt;/p><p><b> **參 數(shù) **</b></p><p><b> **說 明 **</b></p><p> **********respons sda=0;norespons sda=1</p><p> ************************************
95、****************************/</p><p> void AD_respons()</p><p><b> {</b></p><p><b> uchar i;</b></p><p><b> scl=1;</b></p>
96、<p><b> delay();</b></p><p> while((sda==1)&&(i<250))i++;</p><p><b> scl=0;</b></p><p><b> delay();</b></p><p>
97、;<b> }</b></p><p> 2.5.3 液晶1602顯示模塊</p><p> #include"lcd.h"</p><p> /****與液晶相關(guān)的參數(shù)***************************/</p><p> sbit RS=P2^6;</p>
98、;<p> sbit RW=P2^5;</p><p> sbit LCDE=P2^7;</p><p> char buf[16];</p><p> /***************************************************************</p><p> **函數(shù)名**vo
99、id LCD_init()</p><p> **功 能 **液晶初始化函數(shù)</p><p><b> **參 數(shù) **</b></p><p><b> **說 明 **</b></p><p> **********</p><p> *************
100、***************************************************/</p><p> void LCD_init()</p><p><b> {</b></p><p> LCD_Wcom(0x38);</p><p> delay_ms(5);</p>&l
101、t;p> LCD_Wcom(0x38);</p><p> delay_ms(5);</p><p> LCD_Wcom(0x38);</p><p> delay_ms(5);</p><p> LCD_Wcom(0x0c);</p><p> delay_ms(5);</p><
102、;p> LCD_Wcom(0x06);</p><p> delay_ms(5);</p><p><b> }</b></p><p> /***************************************************************</p><p> **函數(shù)名**bi
103、t lcd_busy()</p><p> **功 能 **檢測(cè)液晶狀態(tài),是否忙</p><p> **參 數(shù) **返回狀態(tài) 1:忙 0:不忙</p><p> **說 明 **RS=0 RW=1 LCDE=1,讀狀態(tài)字(檢測(cè)忙主要是第8位)</p><p> **********</p><p> **
104、**************************************************************/</p><p> bit lcd_busy()</p><p><b> {</b></p><p> bit result;</p><p><b> RS=0;</b
105、></p><p><b> RW=1;</b></p><p><b> LCDE=1;</b></p><p> delay_ms(5);</p><p> result=(bit)(P0&0x80);</p><p><b> LCDE
106、=0;</b></p><p> return result;</p><p><b> }</b></p><p> /***************************************************************</p><p> **函數(shù)名**LCD_Wcom(u
107、char com)</p><p> **功 能 **液晶寫命令函數(shù)</p><p><b> **參 數(shù) **</b></p><p> **說 明 **RS=0 RW=0 LCDE高脈沖,寫指令</p><p> **********</p><p> ***************
108、*************************************************/</p><p> void LCD_Wcom(uchar com)</p><p><b> {</b></p><p> while(lcd_busy());</p><p><b> RS=0;&l
109、t;/b></p><p><b> RW=0;</b></p><p><b> LCDE=0;</b></p><p><b> P0=com;</b></p><p> delay_ms(5);</p><p><b>
110、LCDE=1;</b></p><p> delay_ms(5);</p><p><b> LCDE=0;</b></p><p><b> }</b></p><p> /****************************************************
111、***********</p><p> **函數(shù)名**LCD_Wdat(uchar dat)</p><p> **功 能 **液晶寫數(shù)據(jù)函數(shù)</p><p><b> **參 數(shù) **</b></p><p> **說 明 **RS=1 RW=0 LCDE高脈沖,寫數(shù)據(jù)</p><p>
112、; **********</p><p> ****************************************************************/</p><p> void LCD_Wdat(uchar dat)</p><p><b> {</b></p><p> while(
113、lcd_busy());</p><p><b> RS=1;</b></p><p><b> RW=0;</b></p><p><b> LCDE=0;</b></p><p><b> P0=dat;</b></p><
114、p> delay_ms(5);</p><p><b> LCDE=1;</b></p><p> delay_ms(5);</p><p><b> LCDE=0;</b></p><p><b> }</b></p><p> /*
115、**************************************************************</p><p> **函數(shù)名**void lcd_pos(bit x,uchar y)</p><p> **功 能 **液晶顯示位置設(shè)置函數(shù)</p><p> **參 數(shù) **x:行設(shè)置 y:列設(shè)置</p><p
116、> **說 明 **x=0在第一行顯示,x=1在第二行顯示</p><p> **********y對(duì)應(yīng)列,取值從0到15</p><p> ****************************************************************/</p><p> void lcd_pos(bit x,uchar y)<
117、/p><p><b> {</b></p><p><b> if(x)</b></p><p> LCD_Wcom(0x80+0x40+y);</p><p><b> else</b></p><p> LCD_Wcom(0x80+y);<
118、;/p><p><b> }</b></p><p> /***************************************************************</p><p> **函數(shù)名**void LCD_clr()</p><p> **功 能 **液晶清屏函數(shù)</p>
119、<p><b> **參 數(shù) **</b></p><p> **說 明 **寫0x01指令即清屏</p><p> **********</p><p> ****************************************************************/</p><p>
120、; void LCD_clr()</p><p><b> {</b></p><p> LCD_Wcom(0x01);</p><p> delay_ms(5);</p><p><b> }</b></p><p> /********************
121、*******************************************</p><p> **函數(shù)名**void LCD_out(char *s)</p><p> **功 能 **發(fā)送串</p><p><b> **參 數(shù) **</b></p><p><b> **說 明 **&l
122、t;/b></p><p> **********</p><p> ****************************************************************/</p><p> void LCD_out(char *s)</p><p><b> {</b><
123、/p><p><b> while(*s)</b></p><p> LCD_Wdat(*s++);</p><p><b> }</b></p><p> /***************************************************************</
124、p><p> **函數(shù)名**void LCD_Str_DIS(char*addr,bit x,uchar y)</p><p> **功 能 **在指定位置顯示指針?biāo)傅淖址?lt;/p><p><b> **參 數(shù) **</b></p><p><b> **說 明 **</b></p&g
125、t;<p> **********</p><p> ****************************************************************/</p><p> void LCD_Str_DIS(char *addr,bit x,uchar y)</p><p><b> {</b>
126、;</p><p> lcd_pos(x,y);</p><p> LCD_out(addr);</p><p><b> }</b></p><p> 2.5.4 延時(shí)函數(shù)</p><p> #include"config.h"</p><p&g
127、t; /***************************************************************</p><p> **函數(shù)名**void delay()</p><p> **功 能 **短延時(shí)函數(shù)</p><p><b> **參 數(shù) **</b></p><p><
128、;b> **說 明 **</b></p><p> **********</p><p> ****************************************************************/</p><p> void delay()</p><p><b> {;;}&l
129、t;/b></p><p> /***************************************************************</p><p> **函數(shù)名**void delay_ms(uint z)</p><p> **功 能 **延時(shí)函數(shù)</p><p><b> **參 數(shù) *
130、*</b></p><p><b> **說 明 **</b></p><p> **********</p><p> ****************************************************************/</p><p> void delay_ms(u
131、int z)</p><p><b> {</b></p><p><b> uint x,y;</b></p><p> for(x=z;x>0;x--)</p><p> for(y=110;y>0;y--);</p><p><b> }
132、</b></p><p><b> 3、設(shè)計(jì)總結(jié)</b></p><p> 本次CDIO設(shè)計(jì)的題目是設(shè)計(jì)一個(gè)數(shù)字電壓表,在這個(gè)CDIO設(shè)計(jì)中,考查了我們很多知識(shí)和能力,是一個(gè)比較綜合,又很鍛煉我們能力的設(shè)計(jì)。要求我們利用課上所學(xué)的單片機(jī)知識(shí),及大一學(xué)的C語言,在這個(gè)過程中涉及到的軟件有Keil4 51編譯軟件,Protues仿真軟件,還有畫PCB的Al
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)課程設(shè)計(jì)---基于單片機(jī)的數(shù)字電壓表設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)-數(shù)字電壓表
- 單片機(jī)課程設(shè)計(jì)---數(shù)字電壓表
- 單片機(jī)課程設(shè)計(jì)-數(shù)字電壓表
- 單片機(jī)(數(shù)字電壓表)課程設(shè)計(jì)
- 基于單片機(jī)的數(shù)字電壓表課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)----數(shù)字電壓表
- 單片機(jī)課程設(shè)計(jì)-數(shù)字電壓表
- 單片機(jī)課程設(shè)計(jì)--數(shù)字電壓表
- 基于單片機(jī)的數(shù)字電壓表課程設(shè)計(jì)
- 數(shù)字電壓表課程設(shè)計(jì)--基于單片機(jī)的簡(jiǎn)易數(shù)字電壓表的設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--數(shù)字電壓表
- 數(shù)字電壓表課程設(shè)計(jì)--基于單片機(jī)的簡(jiǎn)易數(shù)字電壓表的設(shè)計(jì)
- 89c51單片機(jī)數(shù)字電壓表課程設(shè)計(jì)
- 基于51單片機(jī)的數(shù)字電壓表設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告--基于單片機(jī)的數(shù)字電壓表
- 基于單片機(jī)的數(shù)字電壓表設(shè)計(jì)-課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---數(shù)字電壓表設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---數(shù)字電壓表設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告--基于單片機(jī)的數(shù)字電壓表
評(píng)論
0/150
提交評(píng)論