2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩29頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  信息與電氣工程學院</b></p><p>  電子應用系統CDIO一級項目</p><p><b>  設計說明書</b></p><p> ?。?011/2012學年第二學期)</p><p>  題 目 :___ _數 字 電 壓 表__________&

2、lt;/p><p>  專業班級 : 電子信息0902班 </p><p>  學生姓名 : </p><p>  學 號: </p><p>  指導教師 : </p><p>  設計周數 :

3、 </p><p>  設計成績 : </p><p>  2012年6月28日</p><p>  1、CDIO設計目的 </p><p>  本次CDIO設計題目是:</p><p>  利用所學的51單片機,C語言,數字電路等知識,設計一

4、個符合要求的數字電壓表。主控芯片可以是AT89C51,而采集電壓的模擬量轉換成數字量的芯片可以是ADC0804,也可以是PCF8591。而顯示模塊可以是數碼管,也可以是液晶LCD1602,從而展示給我們所得的電壓值。</p><p>  2、CDIO設計正文</p><p>  2.1 數字電壓表系統設計框圖</p><p>  本次數字電壓表系統設計框圖如圖 1

5、所示:</p><p>  模擬量數字量程序液晶</p><p><b>  處理驅動</b></p><p>  數字電壓表主要由模/數轉換電路、單片機控制電路、顯示電路等三部分組成。其中PCF8591等器件組成的轉換電路,將輸入的模擬量信號進行取樣、轉換、然后將轉換的數字信號送進單片機。單片機控制電路主要實現對數據進行程序處理;顯示

6、電路主要用于將單片機的信號數據轉換后顯示測量結果。</p><p>  模擬信號產生模塊:輸入電源電路(變壓器、整流電路、濾波電路、穩壓電路組成)和分壓電路(9萬歐姆和1萬歐姆的電阻分壓)。</p><p>  模數轉換模塊組成部分:PCF8591芯片</p><p>  程序處理的單片機控制模塊:AT89C51芯片</p><p>  電壓

7、結果顯示部分:LCD1602液晶</p><p>  2.2 各模塊介紹</p><p>  2.2.1 AT89C51芯片介紹</p><p>  AT89S52 具有以下標準功能:8k 字節 Flash,256 字節 RAM,32 位 I/O 口線,看門狗定時器,2 個數據指針,三個 16 位定時器/計數器,一個 6 向量 2 級中斷結構,全雙工串行口,片

8、內晶振及時鐘電路。另外,AT89S52 可降至 0Hz 靜態邏輯操作,支持 2 種軟件可選擇節電模式。</p><p>  空閑模式下,CPU停止工作,允許 RAM、定時器/計數器、串口、中斷繼續工作。掉電保護方式下,RAM 內容被保存,振蕩器被凍結,單片機一切工作停止,直到下一個中斷或硬件復位為止。</p><p>  AT89C52的引腳圖如圖2 所示。</p><

9、p>  VCC : 接電源 </p><p><b>  GND: 接地</b></p><p>  P0 口:P0 口是一個 8 位漏極開路的雙向 I/O 口。作為輸出口,每位能驅動 8 個 TTL 邏輯電平。對 P0 端口寫“1”時,引腳用作高阻抗輸入。當訪問外部程序和數據存儲器時,P0 口也被作為低 8 位地址/數據復用。在這種模式下,P0

10、具有內部上拉電阻。在 flash 編</p><p>  程時,P0 口也用來接收指令字節;在程序校驗時,輸出指令字節。程序校時,需要外部上拉電阻。</p><p>  P1 口:P1 口是一個具有內部上拉電阻的 8 位雙向 I/O 口,p1 輸出緩沖器能驅動 4 個TTL 邏輯電平。對 P1 端口寫“1”時,內部上拉電阻把端口拉高,此時可以作為輸入口使用。作為輸入使用時,被外部拉低的引腳

11、由于內部電阻的原因,將輸出電流(IIL)。</p><p>  P2 口:P2 口是一個具有內部上拉電阻的 8 位雙向 I/O 口,P2 輸出緩沖器能驅動 4 個TTL 邏輯電平。對 P2 端口寫“1”時,內部上拉電阻把端口拉高,此時可以作為輸入口使用。作為輸入使用時,被外部拉低的引腳由于內部電阻的原因,將輸出電流(IIL)在訪問外部程序存儲器或用 16 位地址讀取外部數據存儲器(例如執行 MOVX @DPTR)

12、時,P2 口送出高八位地址。</p><p>  P3 口:P3 口是一個具有內部上拉電阻的 8 位雙向 I/O 口,p2 輸出緩沖器能驅動 4 個TTL 邏輯電平。對 P3 端口寫“1”時,內部上拉電阻把端口拉高,此時可以作為輸入口使用。作為輸入使用時,被外部拉低的引腳由于內部電阻的原因,將輸出電流(IIL)。P3 口亦作為 AT89C52 特殊功能(第二功能)使用,AT89C52的P3口的第二功能表如表1所示

13、。</p><p>  RST: 復位輸入。晶振工作時,RST 腳持續 2 個機器周期高電平將使單片機復位??撮T狗計時完成后,RST 腳輸出 96 個晶振周期的高電平。特殊寄存器 AUXR(地址 8EH)上的 DISRTO 位可以使此功能無效。DISRTO 默認狀態下,復位高電平有效。</p><p>  ALE/PROG:地址鎖存控制信號(ALE)是訪問外部程序存儲器時,鎖存低 8 位地

14、址的輸出脈沖。在 flash 編程時,此引腳(PROG)也用作編程輸入脈沖。在一般情況下,ALE 以晶振六分之一的固定頻率輸出脈沖,可用來作為外部定時器或時鐘使用。然而,特別強調,在每次訪問外部數據存儲器時,ALE 脈沖將會跳過。</p><p>  PSEN:外部程序存儲器選通信號(PSEN)是外部程序存儲器選通信號。當 AT89S52 從外部程序存儲器執行外部代碼時,PSEN 在每個機器周期被激活兩次,而在訪

15、問外部數據存儲器時,PSEN 將不被激活。</p><p>  EA/VPP:訪問外部程序存儲器控制信號。為使能從 0000H 到 FFFFH 的外部程序存儲器讀取指令,EA 必須接 GND。為了執行內部程序指令,EA 應該接 VCC。在 flash 編程期間,EA 也接收 12V編程電源( VPP)。</p><p>  XTAL1:振蕩器反相放大器和內部時鐘發生電路的輸入端。</

16、p><p>  XTAL2:振蕩器反相放大器的輸出端。</p><p><b> ?。?)晶振電路</b></p><p>  晶振電路是單片機的最小系統的組成部分。典型的晶振取11.0592MHz(因為可以準確地得到9600波特率和19200波特率,用于有串口通訊的場合)/12MHz(產生精確的uS級時歇,方便定時操作)。</p>

17、<p>  特別注意:對于31腳(EA/Vpp),當接高電平時,單片機在復位后從內部ROM的0000H開始執行;當接低電平時,復位后直接從外部ROM的0000H開始執行。</p><p><b> ?。?)復位電路</b></p><p>  復位電路也是單片機的最小系統的組成部分。當單片機系統在運行中,受到環境干擾出現程序執行錯亂的時候,按下復位按鈕內部的

18、程序自動從頭開始執行。</p><p>  復位電路的原理是單片機RST引腳接收到2us以上的電平信號,只要保證電容的充放電時間大于2US,即可實現復位,所以電路中的電容值是可以改變的。按鍵按下系統復位,是電容處于一個短路電路中,釋放了所有的電能,電阻兩端的電壓增加引起的。</p><p>  單片機最小系統復位電路的極性電容的大小直接影響單片機的復位時間,一般采用10~30uF,51單片

19、機最小系統容值越大需要的復位時間越短。</p><p>  2.2.2 PCF8591 AD/DA芯片</p><p>  PCF8591是一個單片集成、單獨供電、低功耗、8-bit CMOS數據獲取器件。PCF8591具有4個模擬輸入、1個模擬輸出和1個串行I²C總線接口。PCF8591的3個地址引腳A0, A1和A2可用于硬件地址編程,允許在同一個I²C總線上接入

20、8個PCF8591器件,而無需額外的硬件。在PCF8591器件上輸入輸出的地址、控制和數據信號都是通過雙線雙向I²C總線以串行的方式進行傳輸。</p><p>  PCF8591的功能包括多路模擬輸入、內置跟蹤保持、8-bit模數轉換和8-bit數模轉換。PCF8591的最大轉化速率由I²C總線的最大速率決定。</p><p>  1、主要技術指標和特性</p&g

21、t;<p><b>  單獨供電 </b></p><p>  PCF8591的操作電壓范圍2.5V-6V </p><p><b>  低待機電流 </b></p><p>  通過I2C總線串行輸入/輸出 </p><p>  PCF8591通過3個硬件地址引腳尋址 </p&

22、gt;<p>  PCF8591的采樣率由I2C總線速率決定 </p><p>  4個模擬輸入可編程為單端型或差分輸入 </p><p><b>  自動增量頻道選擇 </b></p><p>  PCF8591的模擬電壓范圍從Vss到VDD </p><p>  PCF8591內置跟蹤保持電路 <

23、/p><p>  8-bit逐次逼近A/D轉換器 </p><p>  通過1路模擬輸出實現DAC增益 </p><p>  2、ADC0808引腳功能 </p><p>  PCF8591引腳圖如圖3所示</p><p>  AIN0~AIN3:模擬信

24、號輸入端。 </p><p>  A0~A3:引腳地址端。 </p><p>  VDD、VSS:電源端。 (2.5~6V) </p><p>  SDA、SCL:I2C 總線的數據線、 時鐘線。 </p><p>  OSC:外部時鐘輸入端,內部時鐘輸出端。 </p><p>  EXT:內部、外部時鐘選擇線,使用內

25、部時鐘時 EXT 接地。 </p><p>  AGND:模擬信號地。 </p><p>  AOUT:D/A 轉換輸出端。 </p><p>  VREF:基準電源端。</p><p><b>  4 功能描述</b></p><p><b> ?。?)地址</b><

26、/p><p>  IIC總線系統中的每一片PCF8591通過發送有效地址到該地址器件來激活。該地址包括固定部分和可編程部分??删幊滩糠直匦韪鶕刂芬_A0、A1和A2來設置。在IIC總線協議中地址必需是起始條件后作為第一個字節發送。地址字節的最后一位是用于設置以后數據傳輸方向的讀/寫。</p><p><b> ?。?)控制字</b></p><p&g

27、t;  控制字節用于實現器件的各種功能,如模擬信號由哪幾個通道輸入等??刂谱止澊娣旁诳刂萍拇嫫髦???偩€操作時為主控器發送的第二字節。其格式如下圖5所示:  </p><p>  其中:D1、D0兩位是A/D通道編號:00通道0,01通道1,10通道2,11通道3        D2 

28、 自動增益選擇(有效位為1)   D5、D4模擬量輸入選擇:00為四路單數入、01為三路差分輸入、10為單端與差分配合輸入、11為模擬輸出允許有效    當系統為A/D轉換時,模擬輸出允許為0。模擬量輸入選擇位取值由輸入方式決定:四路單端輸入時取00,三路差分輸入時取01,單端與差分輸入時取10,二路差分輸入時取11。最低兩位時通道編號位,當對0通道的模擬信號進行A/D轉換時取0

29、0,當對1通道的模擬信號進行A/D轉換時取01,當對2通道的模擬信號進行A/D轉換時取10,當對3通道的模擬信號進行A/D轉換時取11。    在進行數據操作時,首先是主控器發出起始信號,然后發出讀尋址字節,被控器做出應答后,主控器從被控器讀出第一個數據字節,主控器發出應答,主控器從被控器讀出第二個數據字節,主控器發出應答…一直到主控器從被控器中讀出第n個數據字節,主控器發出非應答信號,最后主控器發出停止

30、信號。</p><p><b> ?。?)A/D轉換</b></p><p>  A/D轉換器采用逐次逼近轉換技術。在A/D轉換周期將臨時使用片上轉換器和高增益比較器。一個A/D轉換周期總是開始于發送一個有效讀模式地址給PCF8591之后。A/D轉換周期子在應答時鐘脈沖的后延被觸發。并在傳輸前一次轉換結果時執行(見圖6)</p><p>  圖

31、 6 A/D轉換</p><p>  一旦一個轉換周期被觸發,所選通的輸入電壓采樣將保存到芯片并被轉換為對應的8位二進制碼,取自差分輸入的采樣將被轉換為8位二進制補碼</p><p>  轉換結果被保存在ADC數據寄存器等待傳輸。如果自動增量標志被置1,將選擇下一個通道。在讀周期傳輸的第一個字節包含前一次讀周期的轉換結果代碼,以上電復位之后讀取的第一個字節是0x80。最高A/D轉換速率

32、取決于實際的IIC總線速度。</p><p><b> ?。?)D/A轉換</b></p><p>  發送給PCF8591的第三個字節被存儲到DAC數據存儲器,并使用片內D/A轉換器轉換成對應的模擬電壓。這個D/A 轉換器由連接到外部參考電壓的具有256個接頭的電阻分壓電路和選擇開關組成。接頭譯碼器切換一個接頭至DAC輸出線。</p><p>

33、;  模擬輸出電壓由自動清零單位增益放大器緩沖。這個緩沖放大器可通過設置控制寄存器的模擬輸出允許標志來打開或關閉。在激活狀態,輸出電壓將保持到新的數據字節被發送。</p><p>  提供給模擬輸出AOUT的輸出電壓由下式給出。D/A轉換順序的波形圖如圖7</p><p><b>  = +</b></p><p>  圖7 D/A轉換&l

34、t;/p><p><b> ?。?)振蕩器</b></p><p>  片上振蕩器產生A/D轉換周期和刷新自動清零緩沖放大器需要的時鐘信號。在使用這個振蕩器時EXT引腳必須連接到VSS。在OSC引腳振蕩頻率是可用的。</p><p>  如果EXT引腳被連接到VDD,振蕩輸出OSC將切換到高阻態以允許用戶連接外部時鐘信號至OSC。</p>

35、;<p><b>  6 I2C總線特性</b></p><p>  I2C總線是不同的IC或模塊之間的雙向兩線通信,這兩條線是串行數據線(SDA)和串行時鐘線(SCL),這兩條線必須通過上拉電路連接至正電源。數據傳輸只能是在總線不忙時啟動。</p><p><b> ?。?)位傳輸</b></p><p>

36、  一個數據位在每一個時鐘脈沖期間傳輸。SDA線上的數據必須在時鐘脈沖的高電平期間保持穩定。這個期間數據線上的改變被當作控制信號。具體時序如圖 8所示:</p><p><b>  圖8 位傳輸</b></p><p> ?。?)開始或停止條件</p><p>  數據和時鐘線在總不忙時保持高電平。在時鐘為高電平時,數據線上的一個由高到低的變

37、化被定義為開始條件。時鐘為高電平時,數據線上的一個由低到高的變化被定義為停止條件。具體時序如圖 9所示</p><p>  圖9 開始和停止條件</p><p><b> ?。?)系統配置</b></p><p>  產生信息的器件稱作“發送機”,接收信息的器件稱作“接收機”??刂菩畔⒌钠骷Q作“主機”,被控制的器件稱作“從機”。如圖10 所

38、示:</p><p><b>  圖10 系統配置</b></p><p><b> ?。?)應答</b></p><p>  在開始和停止條件之間從發送機傳輸到接收機的數據字節數是沒有限制的。每個8位數據字節之后緊跟著一個應答位。應答位是由發送機放在總線的一個高電平,而主機也產生一個額外的與應答有關的時鐘脈沖。地址匹配

39、的從接收機必須在接收每一個字節后產生一個應答。在應答時鐘脈沖期間,應答的器件必須將SDA線拉低。因此在應答相應的時鐘脈沖的高電平期間,SDA線必須保持穩定的低電平。在由從機終止的最后一個字節,主接收機必須通過產生一個低電平應答向發送機發送一個數據結束信號,這樣發送機必須將數據線SDA拉高以允許主機產生停止條件。具體時序如圖 11所示</p><p>  圖11 I2C 總線應答</p><p

40、><b> ?。?)總線協議</b></p><p>  在開始條件后一個有效的硬件地址必須發送至PCF8591。讀/寫位定義了以后單個或多個字節數據傳輸的方向。開始條件、停止條件和應答位的格式應定時參考I2C總線特性。在寫模式數據傳輸通過發送下一個數據的停止條件或開始條件來約束。</p><p>  總線協議具體時序如圖12,13所示:</p>

41、<p>  圖12 寫模式的總線協議,D/A轉換</p><p>  圖13 讀模式的總線協議,A/D轉換</p><p>  2.2.3 LCD1602液晶</p><p>  字符型液晶顯示模塊是一種專門用于顯示字母、數字、符號等點陣式LCD。</p><p><b> ?、僖_功能說明</b><

42、;/p><p>  1602LCD采用標準的14腳(無背光)或16腳(帶背光)接口,各引腳接口說明如表2 所示。</p><p>  第1腳:VSS為地電源。</p><p>  第2腳:VDD接5V正電源。</p><p>  第3腳:VL為液晶顯示器對比度調整端,接正電源時對比度最弱,接地時對比度最高,對比度過高時會產生“鬼影”,使用時可以通

43、過一個10K的電位器調整對比度。</p><p>  第4腳:RS為寄存器選擇,高電平時選擇數據寄存器、低電平時選擇指令寄存器。</p><p>  第5腳:R/W為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。當RS和R/W共同為低電平時可以寫入指令或者顯示地址,當RS為低電平R/W為高電平時可以讀忙信號,當RS為高電平R/W為低電平時可以寫入數據。</p><

44、p>  第6腳:E端為使能端,當E端由高電平跳變成低電平時,液晶模塊執行命令。</p><p>  第7~14腳:D0~D7為8位雙向數據線。</p><p>  第15腳:背光源正極。</p><p>  第16腳:背光源負極。</p><p> ?、?602LCD的指令說明及時序</p><p>  1602

45、液晶模塊內部的控制器共有11條控制指令,如表3所示:</p><p>  1602液晶模塊的讀寫操作、屏幕和光標的操作都是通過指令編程來實現的。(說明:1為高電平、0為低電平)</p><p>  指令1:清顯示,指令碼01H,光標復位到地址00H位置。</p><p>  指令2:光標復位,光標返回到地址00H。</p><p>  指令3

46、:光標和顯示模式設置 I/D:光標移動方向,高電平右移,低電平左移 S:屏幕上所有文字是否左移或者右移。高電平表示有效,低電平則無效。</p><p>  指令4:顯示開關控制。 D:控制整體顯示的開與關,高電平表示開顯示,低電平表示關顯示 C:控制光標的開與關,高電平表示有光標,低電平表示無光標 B:控制光標是否閃爍,高電平閃爍,低電平不閃爍。</p><p>  指令5:光標或顯示移位

47、 S/C:高電平時移動顯示的文字,低電平時移動光標。</p><p>  指令6:功能設置命令 DL:高電平時為4位總線,低電平時為8位總線 N:低電平時為單行顯示,高電平時雙行顯示 F: 低電平時顯示5x7的點陣字符,高電平時顯示5x10的點陣字符。</p><p>  指令7:字符發生器RAM地址設置。</p><p>  指令8:DDRAM地址設置。</

48、p><p>  指令9:讀忙信號和光標地址 BF:為忙標志位,高電平表示忙,此時模塊不能接收命令或者數據,如果為低電平表示不忙。</p><p><b>  指令10:寫數據。</b></p><p><b>  指令11:讀數據。</b></p><p>  與HD44780相兼容的芯片時序如表4所示

49、:</p><p>  讀操作時序如圖14所示。</p><p>  寫操作時序如圖15所示。</p><p>  2.3 系統硬件仿真</p><p>  用Protues繪制數字電壓表的電路圖后,將Keil4生成的HEX文件下載進主控芯片AT89C51芯片里,運行,電路圖和結果如圖 16所示</p><p>  

50、2.4 系統程序設計</p><p>  根據設計要求結合硬件電路,采用的是PCF8591模數數模轉換芯片,采用的是液晶顯示方式,在液晶顯示之前,需對采集回的二進制數字量進行轉換顯示,這段過程5V電壓為基準進行數據處理。圖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轉

52、換有關的全局變量**********/</p><p>  uchar AD_result=0;</p><p>  float Volt=0;</p><p>  /****與LCD顯示有關的全局變***********/</p><p>  char temp[16],temp1[16];</p><p>  /*

53、**************************************************************</p><p>  **函數名**void LCD_DIS()</p><p>  **功 能 **顯示函數</p><p><b>  **參 數 **</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>  **函數名**void AD_WORK()</p><p

57、>  **功 能 **AD轉換函數</p><p><b>  **參 數 **</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>  **函數名**void Data_Done()</p><p>  **功 能 **數據處理函數</p><p><b>  **參 數 **&

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轉換的值通過流水燈顯示</p><p>  Volt=(AD_result*5)/255.0;//以5V電壓為基準,轉換成真正的電壓</p><p><b>  }</b>&l

66、t;/p><p>  /***************************************************************</p><p>  **函數名**void main()</p><p><b>  **功 能 **</b></p><p><b>  **參 數 **<

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轉換</p><p>  Data_Done(); //數據處理</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>  **函數名**void AD_init()</p><p><b>  **功 能 **</b></p><p><b>  **參 數 **</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>  **函數名**void AD_start()</p><p><b>  **功 能 **</b></p&

75、gt;<p><b>  **參 數 **</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>  **函數名**void AD_end()</p><p><b>  **功 能 **</b></p><p><b>  **參 數 **</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>  **函數名**void AD_write(uchar dat)</p><p><b>  **功 能 **</b></p><p><b>  **參 數 **</b></p><p><b>  **說 明 **</b></p><p>

83、;  **********寫數據時序:scl=1時保持數據,scl=0時變化數據</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>  **函數名**uchar AD_read()</p><p><b>  **功 能 **</b></p><p><b>  **參 數 **</b></p><p><b>  **說 明 **</b></p><p>  ********

89、**讀時序:scl=1時讀數據,scl=0時變化</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>  **函數名**void AD_respons()</p><p><b>  **功 能 **</b>&

94、lt;/p><p><b>  **參 數 **</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>  /****與液晶相關的參數***************************/</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>  **函數名**vo

99、id LCD_init()</p><p>  **功 能 **液晶初始化函數</p><p><b>  **參 數 **</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>  **函數名**bi

103、t lcd_busy()</p><p>  **功 能 **檢測液晶狀態,是否忙</p><p>  **參 數 **返回狀態 1:忙 0:不忙</p><p>  **說 明 **RS=0 RW=1 LCDE=1,讀狀態字(檢測忙主要是第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>  **函數名**LCD_Wcom(u

107、char com)</p><p>  **功 能 **液晶寫命令函數</p><p><b>  **參 數 **</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>  **函數名**LCD_Wdat(uchar dat)</p><p>  **功 能 **液晶寫數據函數</p><p><b>  **參 數 **</b></p><p>  **說 明 **RS=1 RW=0 LCDE高脈沖,寫數據</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>  **函數名**void lcd_pos(bit x,uchar y)</p><p>  **功 能 **液晶顯示位置設置函數</p><p>  **參 數 **x:行設置 y:列設置</p><p

116、>  **說 明 **x=0在第一行顯示,x=1在第二行顯示</p><p>  **********y對應列,取值從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>  **函數名**void LCD_clr()</p><p>  **功 能 **液晶清屏函數</p>

119、<p><b>  **參 數 **</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>  **函數名**void LCD_out(char *s)</p><p>  **功 能 **發送串</p><p><b>  **參 數 **</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>  **函數名**void LCD_Str_DIS(char*addr,bit x,uchar y)</p><p>  **功 能 **在指定位置顯示指針所指的字符串</p><p><b>  **參 數 **</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 延時函數</p><p>  #include"config.h"</p><p&g

127、t;  /***************************************************************</p><p>  **函數名**void delay()</p><p>  **功 能 **短延時函數</p><p><b>  **參 數 **</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>  **函數名**void delay_ms(uint z)</p><p>  **功 能 **延時函數</p><p><b>  **參 數 *

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、設計總結</b></p><p>  本次CDIO設計的題目是設計一個數字電壓表,在這個CDIO設計中,考查了我們很多知識和能力,是一個比較綜合,又很鍛煉我們能力的設計。要求我們利用課上所學的單片機知識,及大一學的C語言,在這個過程中涉及到的軟件有Keil4 51編譯軟件,Protues仿真軟件,還有畫PCB的Al

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論