嵌入式系統(tǒng)虛擬儀表設(shè)計(jì)_第1頁(yè)
已閱讀1頁(yè),還剩39頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  專業(yè)綜合實(shí)踐報(bào)告</b></p><p>  ——嵌入式系統(tǒng)虛擬儀表設(shè)計(jì)</p><p> 學(xué)生姓名學(xué) 號(hào)</p><p> 教學(xué)院系電氣信息學(xué)院</p><p> 專業(yè)年級(jí)自動(dòng)化2011級(jí) </p><p> 指導(dǎo)教師</p><p> 完成

2、日期2015年3月20日</p><p><b>  摘 要</b></p><p>  針對(duì)傳統(tǒng)儀表和現(xiàn)有儀表存在的不足,本文提出了一種新型的虛擬儀表設(shè)計(jì)方案,采用arm處理器為核心的硬件平臺(tái)和以嵌入式linux系統(tǒng)為核心的軟件平臺(tái),并在此基礎(chǔ)上采用開(kāi)放源代碼的圖形界面庫(kù)qt開(kāi)發(fā)儀表終端應(yīng)用程序。該虛擬儀表可讀性好,讀數(shù)精度高,在可移植性、可維護(hù)性和成本方面都得到

3、了良好的改善,具有較大的科研價(jià)值和商業(yè)使用價(jià)值</p><p>  本文所介紹的車載虛擬儀表的基本設(shè)計(jì)思想是將司鉆監(jiān)控系統(tǒng)上安裝的各種傳感器采集到的數(shù)據(jù)進(jìn)行智能化的處理,然后在運(yùn)行于嵌入式linux系統(tǒng)的使用qt設(shè)計(jì)的虛擬儀表盤(pán)上進(jìn)行顯示,以便于監(jiān)測(cè)各系統(tǒng)的工作狀況,如懸重 鉆壓 鉆速 泥漿返回流量 泥漿泵沖速 立管壓力 轉(zhuǎn)盤(pán)轉(zhuǎn)速 轉(zhuǎn)盤(pán)扭矩 游車高度等,并在某狀態(tài)出現(xiàn)異?;虼嬖谖kU(xiǎn)時(shí)向操作員提示報(bào)警。</p

4、><p>  【關(guān)鍵詞】:虛擬儀器、司鉆監(jiān)測(cè)系統(tǒng)、Linux系統(tǒng)</p><p><b>  目錄</b></p><p><b>  一.緒論1</b></p><p>  1.1虛擬儀器的發(fā)展1</p><p>  1.2 專業(yè)綜合實(shí)踐的主要內(nèi)容1</p>

5、<p>  二. 嵌入式系統(tǒng)虛擬儀表開(kāi)發(fā)環(huán)境3</p><p>  2.1 嵌入式系統(tǒng)虛擬儀表設(shè)計(jì)目標(biāo)3</p><p>  2.2 開(kāi)發(fā)環(huán)境3</p><p>  2.2.1 Qt Creator簡(jiǎn)介3</p><p>  2.2.2 Fedora 簡(jiǎn)介3</p><p>  三. 基

6、于ARM處理器的便攜式儀表人機(jī)接口的設(shè)計(jì)5</p><p>  3.1 設(shè)計(jì)原理及說(shuō)明5</p><p>  3.1.1 A/D轉(zhuǎn)換器.............................................................................................................5</p><p

7、>  3.1.2 A/D轉(zhuǎn)換重要指標(biāo).................................................................................................5</p><p>  3.2 接口總體設(shè)計(jì)....................................................................

8、........................................................6</p><p>  3.3 ADC及觸摸屏接口特殊寄存.....................................................................................................7</p><p>

9、  3.3.1 ADC 控制寄存器....................................................................................................7</p><p>  3.3.2 ADC 開(kāi)始延時(shí)寄存...............................................................

10、.................................8</p><p>  3.3.3 ADC轉(zhuǎn)換數(shù)據(jù)寄存器8</p><p>  3.4 AD轉(zhuǎn)換程序9</p><p>  四. 嵌入式系統(tǒng)虛擬儀表開(kāi)發(fā)22</p><p>  4.1 Qt Creator開(kāi)發(fā)22</p><p>  4.2

11、Qt Create編程24</p><p>  4.3 虛擬儀表運(yùn)行界面29</p><p>  五. 基于Linux操作系統(tǒng)的程序編譯和燒寫(xiě)30</p><p>  5.1 Linux操作系統(tǒng)及其常用命令30</p><p>  5.2 Linux內(nèi)核配置31</p><p>  5.3 終端編譯

12、33</p><p>  六. 課程設(shè)計(jì)收獲與體會(huì)35</p><p><b>  參考文獻(xiàn)36</b></p><p><b>  一.緒論</b></p><p>  1.1虛擬儀器的發(fā)展</p><p>  現(xiàn)代儀器儀表技術(shù)是計(jì)算機(jī)技術(shù)和多種基礎(chǔ)學(xué)科緊密結(jié)合的產(chǎn)物。

13、隨著微電子技術(shù)、計(jì)算機(jī)技術(shù)、軟件技術(shù)、網(wǎng)絡(luò)技術(shù)的飛速發(fā)展,新的測(cè)試?yán)碚?、測(cè)試方法、測(cè)試領(lǐng)域以及新的儀器結(jié)構(gòu)不斷出現(xiàn),在許多方面已經(jīng)沖破了傳統(tǒng)儀器的概念,電子測(cè)量?jī)x器的功能和作用發(fā)生了質(zhì)的變化。在此背景下,1986年美國(guó)國(guó)家儀器公司(National Instruments,NI)提出了虛擬儀器(Virtual Instrument,VI)的概念。盡管迄今為止虛擬儀器還沒(méi)有一個(gè)統(tǒng)一的定義,但是一般認(rèn)為:虛擬儀器是在PC基礎(chǔ)上通過(guò)增加相關(guān)硬

14、件和軟件構(gòu)建而成的、具有可視化界面的可重用測(cè)試儀器系統(tǒng)。</p><p>  作為一種以計(jì)算機(jī)軟件為核心的新型儀器系統(tǒng),虛擬儀器具有功能強(qiáng)、測(cè)試精度高、測(cè)試速度快、自動(dòng)化程度高、人機(jī)界面優(yōu)異、靈活性強(qiáng)等優(yōu)點(diǎn),通常被認(rèn)為是第三代自動(dòng)測(cè)試系統(tǒng)的同義語(yǔ)。使用虛擬儀器系統(tǒng)可以避免儀器編程過(guò)程中的大量重復(fù)性勞動(dòng),從而大大縮短復(fù)雜程序的開(kāi)發(fā)時(shí)間,并且客戶可以用不同的模塊來(lái)構(gòu)造自己的虛擬儀器系統(tǒng),選擇統(tǒng)一的測(cè)試策略。</

15、p><p>  由于虛擬儀器的功能和性能已被不斷提高,如今在許多應(yīng)用中它已成為傳統(tǒng)儀器的主要替代方式。而虛擬儀器的各種優(yōu)點(diǎn)讓用戶可放心地舍棄舊的傳統(tǒng)測(cè)量設(shè)備,接受更新型、以計(jì)算機(jī)為基礎(chǔ)的虛擬儀器系統(tǒng)。由于計(jì)算機(jī)的性能價(jià)格比不斷改進(jìn),使虛擬儀器的價(jià)格更為大眾化,用戶不必再受限于傳統(tǒng)儀器的使用限制和昂貴的價(jià)格,進(jìn)一步降低了使用成本,減少了系統(tǒng)的開(kāi)發(fā)費(fèi)用和系統(tǒng)的維護(hù)費(fèi)用。</p><p>  此外,

16、新型筆記本電腦又把虛擬儀器的便攜性和強(qiáng)大功能推向一個(gè)新的水平。所有這些必將加快虛擬儀器的發(fā)展,使它的功能和應(yīng)用領(lǐng)域不斷增強(qiáng)和擴(kuò)大。在測(cè)量、檢測(cè)、電信、監(jiān)控、教育等方面的應(yīng)用已廣泛開(kāi)展。</p><p>  1.2 專業(yè)綜合實(shí)踐的主要內(nèi)容</p><p>  司鉆英文名稱為driller,指的是石油鉆井中帶班工人的簡(jiǎn)稱,在本設(shè)計(jì)中司鉆系統(tǒng)則是指一套全自動(dòng)的油井采集監(jiān)控系統(tǒng)。本系統(tǒng)包括以下功能

17、:嵌入式系統(tǒng)AD數(shù)據(jù)采集,嵌入式系統(tǒng)電機(jī)控制,嵌入式系統(tǒng)虛擬儀表設(shè)計(jì),嵌入式系統(tǒng)絞車數(shù)據(jù)采集,嵌入式系采集統(tǒng)數(shù)據(jù)顯示,嵌入式系統(tǒng)采集曲線顯示,嵌入式系統(tǒng)串口通信,嵌入式系統(tǒng)按鍵輸入,嵌入式系統(tǒng)led控制,嵌入式系統(tǒng)音頻輸出。在此系統(tǒng)中本人主要負(fù)責(zé)嵌入式系統(tǒng)虛擬儀表設(shè)計(jì)。</p><p>  本設(shè)計(jì)要求完成虛擬實(shí)驗(yàn)室中虛擬信號(hào)發(fā)生器和虛擬信號(hào)采集器的設(shè)計(jì)。</p><p>  嵌入式系統(tǒng)虛擬

18、儀表開(kāi)發(fā)環(huán)境</p><p>  2.1 嵌入式系統(tǒng)虛擬儀表設(shè)計(jì)目標(biāo)</p><p>  本文設(shè)計(jì)了一種基于Qt Creator的虛擬儀表設(shè)計(jì)。它的主要設(shè)計(jì)目標(biāo)是:</p><p>  系統(tǒng)的主要工作是對(duì)大量的過(guò)程狀態(tài)參數(shù)實(shí)時(shí)監(jiān)測(cè)、數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)處理、進(jìn)行實(shí)時(shí)數(shù)據(jù)分析等。因此要求硬件上必須要有實(shí)時(shí)時(shí)鐘和優(yōu)先級(jí)中斷信息處理電路。</p><p>

19、;<b>  2.2 開(kāi)發(fā)環(huán)境</b></p><p>  2.2.1 Qt Creator簡(jiǎn)介</p><p>  Qt Creator是跨平臺(tái)的 Qt IDE, Qt Creator 是 Qt 被 Nokia 收購(gòu)后推出的一款新的輕量級(jí)集成開(kāi)發(fā)環(huán)境(IDE)。此 IDE 能夠跨平臺(tái)運(yùn)行,支持的系統(tǒng)包括 Linux(32 位及 64 位)、Mac OS X 以及 W

20、indows。根據(jù)官方描述,Qt Creator 的設(shè)計(jì)目標(biāo)是使開(kāi)發(fā)人員能夠利用 Qt 這個(gè)應(yīng)用程序框架更加快速及輕易的完成開(kāi)發(fā)任務(wù)。</p><p>  Qt Creator 包括項(xiàng)目生成向?qū)?、高?jí)的 C++ 代碼編輯器、瀏覽文件及類的工具、集成了 Qt Designer、Qt Assistant、Qt Linguist、圖形化的 GDB 調(diào)試前端,集成 qmake 構(gòu)建工具等。</p><

21、p>  QtCreator 主要是為了幫助新 Qt 用戶更快速入門(mén)并運(yùn)行項(xiàng)目,還可提高有經(jīng)驗(yàn)的 Qt 開(kāi)發(fā)人員的工作效率。</p><p>  使用強(qiáng)大的 C++ 代碼編輯器可快速編寫(xiě)代碼語(yǔ)法標(biāo)識(shí)和代碼完成功能輸入時(shí)進(jìn)行靜態(tài)代碼檢驗(yàn)以及提示樣式上下文相關(guān)的幫助代碼折疊括號(hào)匹配和括號(hào)選擇模式高級(jí)編輯功能使用瀏覽工具管理源代碼集成了領(lǐng)先的版本控制軟件,包括 Gi

22、t、Perforce 和 Subversion開(kāi)放式文件,無(wú)須知曉確切的名稱或位置搜索類和文件跨不同位置或文件沿用符號(hào)在頭文件和源文件,或在聲明和定義之間切換為 Qt跨平臺(tái)開(kāi)發(fā)人員的需求而量身定制集成了特定于 Qt 的功能,如信號(hào)與槽 (Signals & Slots)圖示調(diào)試器, 對(duì) Qt 類結(jié)構(gòu)可一目了然集成了 Qt Designer 可視化布局和格式構(gòu)建器只需單擊一下就可生成和運(yùn)行 Qt 項(xiàng)目。</p>

23、;<p>  2.2.2 Fedora 簡(jiǎn)介</p><p>  Fedora 是一個(gè)知名的Linux發(fā)行版,是一款由全球社區(qū)愛(ài)好者構(gòu)建的面向日常應(yīng)用的快速、穩(wěn)定、強(qiáng)大的操作系統(tǒng)。它允許任何人自由地使用、修改和重發(fā)布,無(wú)論現(xiàn)在還是將來(lái)。它由一個(gè)強(qiáng)大的社群開(kāi)發(fā),這個(gè)社群的成員以自己的不懈努力,提供并維護(hù)自由、開(kāi)放源碼的軟件和開(kāi)放的標(biāo)準(zhǔn)。Fedora 項(xiàng)目由 Fedora 基金會(huì)管理和控制,得

24、到了 Red Hat, Inc. 的支持。Fedora 是一個(gè)獨(dú)立的操作系統(tǒng),可運(yùn)行的體系結(jié)構(gòu)包括 x86(即i386-i686), x86_64 和 PowerPC。</p><p>  Fedora (第七版以前為Fedora Core)是一款基于 Linux 的操作系統(tǒng),也是一組維持計(jì)算機(jī)正常運(yùn)行的軟件集合。Fedora 由Fedora Project社區(qū)開(kāi)發(fā)、紅帽公司贊助,目標(biāo)是創(chuàng)建一

25、套新穎、多功能并且自由和開(kāi)源的操作系統(tǒng)。Fedora 項(xiàng)目以社區(qū)的方式工作,引領(lǐng)創(chuàng)新并傳播自由代碼和內(nèi)容,是世界各地愛(ài)好、使用和構(gòu)建自由軟件的社區(qū)朋友的代名詞。</p><p>  Fedora基于Red Hat Linux,在Red Hat Linux終止發(fā)行后,紅帽公司計(jì)劃以Fedora來(lái)取代Red Hat Linux在個(gè)人領(lǐng)域的應(yīng)用,而另外發(fā)行的Red Hat Enterprise Linux(Red Ha

26、t企業(yè)版Linux,RHEL)則取代Red Hat Linux在商業(yè)應(yīng)用的領(lǐng)域。</p><p>  Fedora的功能對(duì)于用戶而言,它是一套功能完備、更新快速的免費(fèi)操作系統(tǒng),而對(duì)贊助者Red Hat公司而言,它是許多新技術(shù)的測(cè)試平臺(tái),被認(rèn)為可用的技術(shù)最終會(huì)加入到Red Hat Enterprise Linux中。</p><p>  Fedora是一個(gè)基于 Linux 的操作系統(tǒng),旨在為

27、用戶提供穩(wěn)定、安全且易于使用和管理的自由和開(kāi)源軟件。Fedora 發(fā)行版是 Fedora 項(xiàng)目的各種自由軟件創(chuàng)造中最大的一個(gè)。由于其與生俱來(lái)的優(yōu)勢(shì),"Fedora" 這個(gè)單詞通??梢杂糜诒磉_(dá) Fedora 項(xiàng)目或 Fedora 發(fā)行版二者之中的任意一個(gè)。</p><p>  Fedora項(xiàng)目以不同方式發(fā)行 Fedora:</p><p>  Fedora DVD/CD

28、– 包含了所有主要軟件包的DVD或CD套裝;</p><p>  (2) Live光盤(pán) – CD或DVD大小的光盤(pán)鏡像,可用于創(chuàng)建Live CD或從USB設(shè)備啟動(dòng),并可選安裝到硬盤(pán);</p><p>  (3) 最小CD – 用于通過(guò)HTTP,F(xiàn)TP或NFS安裝。</p><p>  您可以通過(guò)Fedora Live USB Creator或UNetbootin創(chuàng)建

29、Live USB版本的Fedora。</p><p>  同時(shí),F(xiàn)edora項(xiàng)目發(fā)布自定義的Fedora版本,稱作Fedora spins。這些版本包含特定的軟件包集合,以滿足特定種類的用戶之需要。Fedora spins由一些對(duì)Fedora有特殊興趣的小組開(kāi)發(fā)。</p><p>  Enterprise Linux額外軟件包(英文: Extra Packages for Enterpri

30、se Linux,EPEL)是由來(lái)自Fedora Project的志愿者發(fā)起的社區(qū)力量,為了創(chuàng)建由高質(zhì)量的附加軟件組成的、用于補(bǔ)足RHEL和其他兼容版本的軟件倉(cāng)庫(kù)。</p><p>  軟件包管理主要由yum實(shí)用程序提供。Fedora同樣提供圖形界面(例如pirut,pup和puplet),用于在更新可用時(shí)提供視覺(jué)通知。apt-rpm是yum的替代品,對(duì)于Debian類發(fā)行版的用戶來(lái)說(shuō)可能更熟悉。這里,APT被用

31、于管理軟件包。額外的軟件倉(cāng)庫(kù)可以被添加到Fedora,以便安裝Fedora軟件倉(cāng)庫(kù)未提供的軟件包。</p><p>  基于ARM處理器的便攜式儀表人機(jī)接口的設(shè)計(jì)</p><p>  3.1 設(shè)計(jì)原理及說(shuō)明</p><p>  3.1.1 A/D轉(zhuǎn)換器  </p><p>  A/D轉(zhuǎn)換器是模擬信號(hào)源和CPU之間聯(lián)系的接口

32、,它的任務(wù)是將連續(xù)變化的模擬信號(hào)轉(zhuǎn)換為數(shù)字信號(hào),以便計(jì)算機(jī)和數(shù)字系統(tǒng)進(jìn)行處理、存儲(chǔ)、控制和顯示。在工業(yè)控制和數(shù)據(jù)采集及許多其他領(lǐng)域中,A/D轉(zhuǎn)換是不可缺少的。  </p><p>  A/D轉(zhuǎn)換器有以下類型:逐位比較型、積分型、計(jì)數(shù)型、并行比較型、電壓-頻率型,主要應(yīng)根據(jù)使用場(chǎng)合的具體要求,按照轉(zhuǎn)換速度、精度、價(jià)格、功能以及接口條件等因素來(lái)決定選擇何種類型。常用的有以下兩種: 

33、60; </p><p>  1)雙積分型的A/D轉(zhuǎn)換器  2)逐次逼近型的A/D轉(zhuǎn)換器</p><p>  3.1.2 A/D轉(zhuǎn)換的重要指標(biāo)  </p><p>  (1)分辨率(Resolution)    </p><p>  指數(shù)字量變化一個(gè)最小

34、量時(shí)模擬信號(hào)的變化量,定義為滿刻度與2”的比值。分辨率又稱精度,通常以數(shù)字信號(hào)的位數(shù)來(lái)表示。     </p><p>  (2)轉(zhuǎn)換速率(Conversion Rate) </p><p>  指完成一次從模擬到數(shù)字的A/D轉(zhuǎn)換所需的時(shí)間的倒數(shù)。積分型AfD韻轉(zhuǎn)換時(shí)間是毫秒級(jí),屬低速A/D,逐次逼近型A/D是微秒級(jí),屬

35、中速A/D,全并行/串并行型A/D可達(dá)到納秒級(jí)。采樣時(shí)間則是另外一個(gè)概念,是指兩次轉(zhuǎn)換的間隔。為了保證轉(zhuǎn)換正確完成,采樣速率( Sample Rate)必須小于或等于轉(zhuǎn)換速率。因此有人習(xí)慣上將轉(zhuǎn)換速率在數(shù)值上等同于采樣速率也是可以接受的。</p><p>  量化誤差(Quantizing Error) </p><p>  由AfD的有限分辨率而引

36、起的誤差,即有限分辨率A/D的階梯狀轉(zhuǎn)移特性曲線與無(wú)限分辨率AfD(理想A/D)的轉(zhuǎn)移特性曲線(直線)之間的最大偏差。通常是1個(gè)或半個(gè)最小數(shù)字量的模擬變化量,表示為1LSB、1/2LSB。    </p><p>  (4)偏移誤差(Offset Error) </p><p>  輸入信號(hào)為零時(shí)輸出信號(hào)不為零的值,可外接電位器調(diào)

37、至最小。     </p><p>  (5)滿刻度誤差(Full Scale Error) </p><p>  滿度輸出時(shí)對(duì)應(yīng)的輸入信號(hào)與理想輸入信號(hào)值的差。     </p><p>  (6)線性度(Linearity) 

38、;</p><p>  實(shí)際轉(zhuǎn)換器的轉(zhuǎn)移函數(shù)與理想直線的最大偏移,不包括以上三種誤差。     </p><p>  其他指標(biāo)還有:絕對(duì)精度( Absolute Accuracy)、相對(duì)精度(Relative Accuracy)、微分非線性、單調(diào)性和無(wú)錯(cuò)碼、總諧波失真( Total Harm

39、onic Distotortion,THD)和積分非線性。     </p><p><b>  3.2接口總體設(shè)計(jì)</b></p><p>  本文設(shè)計(jì)的高速高精度數(shù)據(jù)采集系統(tǒng)有硬件和軟件兩部分組成。而硬件部分主要完成數(shù)據(jù)采集、存儲(chǔ)功能,軟件部分則完成對(duì)硬件控制、對(duì)采集數(shù)據(jù)進(jìn)行處理。</p>

40、<p>  Micro2440 開(kāi)發(fā)板由核心板 Micro2440 和底板 Micro2440SDK 組成,因?yàn)楸臼謨?cè)描述的是整個(gè)開(kāi)發(fā)板的使用說(shuō)明,因此以下我們簡(jiǎn)稱為 Micro2440 開(kāi)發(fā)板。</p><p>  Micro2440 核心板其實(shí)是一個(gè)最小系統(tǒng)板,它具有最基本的系統(tǒng)配置:</p><p>  * CPU - 三星 S3C2440,運(yùn)行于 400Mhz</

41、p><p>  * NOR FLASH – 2M,很多公司為了節(jié)省成本并不提供 NOR FLASH,這對(duì)開(kāi)發(fā)和量產(chǎn)是很不利的</p><p>  * NAND FLASH - 256M(可根據(jù)用戶需求更改為 64M-1G)</p><p>  * SDRAM – 64M,由 2 片 16-bit 寬度的 32M SDRAM 組成</p><p&

42、gt;  * 1個(gè)電源指示等和 4 個(gè)用戶指示燈</p><p><b>  * 專業(yè)復(fù)位芯片</b></p><p>  * 在板 JTAG</p><p>  * 專業(yè)電壓調(diào)節(jié)芯片</p><p>  Samsung S3C2440 芯片內(nèi)部總共有 8 路 A/D 轉(zhuǎn)換通道,但其轉(zhuǎn)換器只有一個(gè)。在常見(jiàn)的設(shè)計(jì)中

43、,一般 AIN4、 AIN5、 AIN6、 AIN7 被用作了四線電阻觸摸的 YM、 YP、 XM、 XP通道;本開(kāi)發(fā)板引出了剩余的 AIN0-3,它們位于 CON4 接口,為了方便測(cè)試,其中 AIN0 直接和一個(gè)可調(diào)電阻 W1 連接。</p><p><b>  模塊圖:</b></p><p>  圖3.1 AD 轉(zhuǎn)換器的功能模塊圖</p><

44、p><b>  AD 轉(zhuǎn)換時(shí)間</b></p><p>  當(dāng)GCLK頻率為 50MHz和預(yù)分頻器(預(yù)定標(biāo)器)值為 49,總共 10 位轉(zhuǎn)換時(shí)間如下:</p><p>  A D轉(zhuǎn)換器頻率 = 50 M Hz/ ( 49 +1) = 1M Hz</p><p>  轉(zhuǎn)換時(shí)間 = 1/ ( 1M H z / 5c y c l e s ) =

45、 1/ 20 0 K Hz = 5 u s</p><p>  注: AD轉(zhuǎn)換器設(shè)計(jì)在最大 2.5MHz時(shí)鐘下工作,所以轉(zhuǎn)換率最高達(dá)到 500KSPS。</p><p><b>  AD 轉(zhuǎn)換方式</b></p><p>  ( 1 ) AD轉(zhuǎn)換的數(shù)據(jù)可以通過(guò)中斷或查詢的方式來(lái)訪問(wèn)。使用中斷方式整個(gè)轉(zhuǎn)換時(shí)間(從AD轉(zhuǎn)換器開(kāi)始到轉(zhuǎn)換數(shù)據(jù)讀取)可能

46、會(huì)因?yàn)橹袛喾?wù)程序的返回時(shí)間和數(shù)據(jù)訪問(wèn)時(shí)間而延長(zhǎng)。使用查詢方式,通過(guò)查看ADCCON[15]位(轉(zhuǎn)換標(biāo)志結(jié)束位),ADCDAT寄存器的讀取時(shí)間可以確定。</p><p>  ( 2 ) 提供另外的開(kāi)啟 AD轉(zhuǎn)換的方法。在ADCCON[1]置 1 ( AD轉(zhuǎn)換開(kāi)始讀取模式),只要轉(zhuǎn)換數(shù)據(jù)被讀取, AD轉(zhuǎn)換同時(shí)開(kāi)始。</p><p>  3.3 ADC及觸摸屏接口特殊寄存器</p>

47、<p>  3.3.1 ADC 控制寄存器</p><p>  表3.1 ADC 控制寄存器</p><p>  3.3.2 ADC 開(kāi)始延時(shí)寄存器</p><p>  表3.2 ADC 開(kāi)始延時(shí)寄存器</p><p>  3.3.3 ADC轉(zhuǎn)換數(shù)據(jù)寄存器</p><p>  表3.3 ADC轉(zhuǎn)換數(shù)據(jù)寄存

48、器0</p><p>  表3.4 ADC轉(zhuǎn)換數(shù)據(jù)寄存器1</p><p>  3.4 AD轉(zhuǎn)換程序4.1 AD數(shù)據(jù)轉(zhuǎn)換程序(查詢方式)</p><p>  AD轉(zhuǎn)換的數(shù)據(jù)可以通過(guò)中斷或查詢的方式來(lái)訪問(wèn)。使用中斷方式整個(gè)轉(zhuǎn)換時(shí)間(從AD轉(zhuǎn)換器開(kāi)始到轉(zhuǎn)換數(shù)據(jù)讀?。┛赡軙?huì)因?yàn)橹袛喾?wù)程序的返回時(shí)間和數(shù)據(jù)訪問(wèn)時(shí)間而延長(zhǎng)。使用查詢方式,通過(guò)查看ADCCON[15]位(轉(zhuǎn)換

49、標(biāo)志結(jié)束位),ADCDAT寄存器的讀取時(shí)間可以確定。提供另外的開(kāi)啟 AD轉(zhuǎn)換的方法。在ADCCON[1]置 1 ( AD轉(zhuǎn)換開(kāi)始讀取模式),只要轉(zhuǎn)換數(shù)據(jù)被讀取, AD轉(zhuǎn)換同時(shí)開(kāi)始。</p><p>  圖3.2 AD數(shù)據(jù)轉(zhuǎn)換程序流程圖</p><p><b>  AD數(shù)據(jù)轉(zhuǎn)換程序:</b></p><p>  #include "de

50、f.h"</p><p>  #include "option.h"</p><p>  #include "2440addr.h"</p><p>  #include "2440lib.h"</p><p>  #include "2440slib.h&quo

51、t; </p><p>  #define REQCNT 100 //May 08, 2002 SOP</p><p>  #define ADC_FREQ 2500000</p><p>  //設(shè)定AD的轉(zhuǎn)換頻率,應(yīng)該至少小于PCLK的1/5(10.14Mhz) 2.5MHz</p><p>  #define

52、 LOOP 10000 </p><p><b>  //延遲的循環(huán)次數(shù)</b></p><p>  volatile U32 preScaler; </p><p><b>  //通道設(shè)置存儲(chǔ)</b></p><p>  /================================

53、==================================================</p><p>  int ReadAdc(int ch) </p><p>  //讀ADC函數(shù),ch決定那個(gè)通道被選擇,通道數(shù)(ch為0-7)</p><p><b>  {</b></p><p><

54、b>  int i;</b></p><p>  static int prevCh=-1; </p><p>  //定義靜態(tài)整形變量prevCh存儲(chǔ)AD轉(zhuǎn)換通道</p><p>  //ADC設(shè)置使能端、設(shè)置預(yù)分頻值為49、選擇通道位,選中的通道上的電壓被連接到</p><p><b>  AD</

55、b></p><p>  rADCCON = (1<<14)|(preScaler<<6)|(ch<<3);</p><p>  //setup channelhttp:分頻使能,寫(xiě)入分頻值,選擇通道</p><p>  //ADCCON第14位置1,AD轉(zhuǎn)換預(yù)分頻器始能。</p><p>  //

56、將preScaler賦給ADCCON第6~13位,給AD預(yù)分頻器賦值。</p><p>  //將Ch值賦給ADCCON第3~5位選擇模擬輸入通道。</p><p>  if(prevCh!=ch)</p><p>  //判斷通道是否切換</p><p><b>  {</b></p><p>

57、  rADCCON = (1<<14)|(preScaler<<6)|(ch<<3); </p><p>  //重新設(shè)置設(shè)置通道ch和預(yù)分頻值preScaler</p><p>  for(i=0;i<LOOP;i++);</p><p>  //delay to set up the next channel切

58、換通道要等待一段時(shí)間</p><p>  prevCh=ch;</p><p><b>  }</b></p><p>  rADCCON|=0x1; </p><p>  //start ADCCON第0位置1,AD轉(zhuǎn)換開(kāi)始且該位在開(kāi)始后清零</p><p>  while(rADCCON &

59、amp; 0x1);</p><p>  //check if Enable_start is low等待啟動(dòng)位清零,轉(zhuǎn)換啟動(dòng)結(jié)束</p><p>  while(!(rADCCON & 0x8000));</p><p>  //check if EC(End of Conversion) flag is high判斷第15位是否為1等待轉(zhuǎn)換結(jié)束</

60、p><p>  return ( (int)rADCDAT0 & 0x3ff );</p><p>  //返回0~9位的采樣值,0~1023</p><p><b>  }</b></p><p>  AD數(shù)據(jù)轉(zhuǎn)換測(cè)試程序(查詢方式)</p><p>  Samsung S3C2440 芯片

61、內(nèi)部總共有 8 路 A/D 轉(zhuǎn)換通道,但其轉(zhuǎn)換器只有一個(gè)。在常見(jiàn) 的設(shè)計(jì)中,一般 AIN4、 AIN5、 AIN6、 AIN7 被用作了四線電阻觸摸的 YM、 YP、 XM、 XP 通道;本開(kāi)發(fā)板引出了剩余的 AIN0-3,它們位于 CON4 接 口,為了方便測(cè)試,其中 AIN0 直接和一個(gè)可調(diào)電阻 W1 連接??赏ㄟ^(guò)旋轉(zhuǎn)板上的 W1 可調(diào)電阻,來(lái)測(cè)試AD數(shù)據(jù)轉(zhuǎn)換,可以看到不斷變化的轉(zhuǎn)換結(jié)果,因?yàn)槭?10 位精度的 轉(zhuǎn)換器,故轉(zhuǎn)換值最小

62、時(shí)會(huì)接近 0,最大時(shí)會(huì)接近 1024。</p><p>  AD數(shù)據(jù)轉(zhuǎn)換測(cè)試程序:</p><p>  void Test_Adc(void) </p><p><b>  {</b></p><p>  int a0=0, a1; </p><p>  //Initialize variable

63、s//初始化變量</p><p>  U32 rADCCON_save = rADCCON;</p><p>  //用rADCCON_save 存儲(chǔ)初始的ADCCON,以備恢復(fù)用</p><p>  Uart_Printf( "ADC INPUT Test, press ESC key to exit !\n" ) </p>&

64、lt;p>  //PCLK:50.7MHz 。通過(guò)轉(zhuǎn)化頻率計(jì)算預(yù)分頻值</p><p>  //FCLK=400M HCLK=100M PCLK=50M </p><p>  //AD轉(zhuǎn)換器頻率=PCLK/(preScaler+1</p><p>  preScaler = ADC_FREQ;</p><p>  //預(yù)定標(biāo)器賦值

65、25M</p><p>  Uart_Printf("ADC conv. freq. = %dHz\n",preScaler); </p><p>  //串口輸出預(yù)分頻值</p><p>  preScaler = 50000000/ADC_FREQ -1; </p><p>  //PCLK:5

66、0.7MHz</p><p>  //preScaler =1轉(zhuǎn)換頻率freq=50M/(1+1)=25M,最大不超過(guò)PCLK的1/5?</p><p>  //A D轉(zhuǎn)換器頻率 = 50 M Hz/ ( preScaler +1) = 1M Hz</p><p>  Uart_Printf("PCLK/ADC_FREQ - 1 = %d\n",

67、preScaler);</p><p>  while( Uart_GetKey() != ESC_KEY )</p><p><b>  {</b></p><p>  a0=ReadAdc(0); //對(duì)應(yīng)開(kāi)發(fā)板上W1可調(diào)電阻</p><p>  a1=ReadAdc(1); //對(duì)應(yīng)開(kāi)發(fā)板上W2可調(diào)電阻</p

68、><p>  Uart_Printf( "AIN0: %04d,AIN1: %04d\n", a0, a1 );</p><p>  Delay( 500 ) ;</p><p><b>  }</b></p><p>  rADCCON = rADCCON_save; //恢復(fù)現(xiàn)場(chǎng)</p>

69、<p>  Uart_Printf("\nrADCCON = 0x%x\n", rADCCON);//輸出ADC控制器內(nèi)容</p><p><b>  }</b></p><p><b>  ADC驅(qū)動(dòng)程序</b></p><p>  #include <linux/errno.h&

70、gt;#include <linux/kernel.h>#include <linux/module.h>#include <linux/slab.h>#include <linux/input.h>#include <linux/init.h>#include <linux/serio.h>#include <linux/delay.h>

71、#include <linux/clk.h>#include <linux/wait.h>#include <linux/sched.h>#include <asm/io.h>#include <asm/irq.h>#include <asm/uaccess.h>#include <mach/regs-clock.h>#include &

72、lt;plat/regs-timer.h>#include <plat/regs-adc.h>#include <mach/regs-gpio.h>#include <linux/cdev.h>#include <linux/miscdevic</p><p>  //;自己定義的頭文件,因原生內(nèi)核并沒(méi)有包含#include "s3c24xx-a

73、dc.h"</p><p>  #undef DEBUG//#define DEBUG#ifdef DEBUG#define DPRINTK(x...) {printk(__FUNCTION__"(%d): ",__LINE__);printk(##x);}#else#define DPRINTK(x...) (void)(0)#endif</p><

74、p>  //;定義ADC 轉(zhuǎn)換設(shè)備名稱,將出現(xiàn)在/dev/adc#define DEVICE_NAME "adc"</p><p>  static void __iomem *adc_base; /*定義了一個(gè)用來(lái)保存經(jīng)過(guò)虛擬映射后的內(nèi)存地址*/</p><p>  //;定義ADC 設(shè)備結(jié)構(gòu)typedef struct { wait_

75、queue_head_t wait; int channel; int prescale;}ADC_DEV;static ADC_DEV adcdev;</p><p>  //;聲明全局信號(hào)量,以便和觸摸屏驅(qū)動(dòng)程序共享A/D 轉(zhuǎn)換器DECLARE_MUTEX(ADC_LOCK);</p><p>  //;ADC驅(qū)動(dòng)是否擁有A/D 轉(zhuǎn)換器資源的狀態(tài)變量//

76、static volatile int OwnADC = 0;</p><p>  /*用于標(biāo)識(shí)AD轉(zhuǎn)換后的數(shù)據(jù)是否可以讀取,0表示不可讀取*/static volatile int ev_adc = 0;</p><p>  /*用于保存讀取的AD轉(zhuǎn)換后的值,該值在ADC中斷中讀取*/static int adc_data;</p><p>  /*保存從平臺(tái)

77、時(shí)鐘隊(duì)列中獲取ADC的時(shí)鐘*/static struct clk *adc_clk;</p><p>  //;定義ADC 相關(guān)的寄存器#define ADCCON (*(volatile unsigned long *)(adc_base + S3C2410_ADCCON)) //ADC control#define ADCTSC (*(volatile unsigned long *)(adc_base

78、 + S3C2410_ADCTSC)) //ADC touch screen control#define ADCDLY (*(volatile unsigned long *)(adc_base + S3C2410_ADCDLY)) //ADC start or IntervalDelay#define ADCDAT0 (*(volatile unsigned long *)(adc_base + S3C2410_ADCDAT0)

79、) //ADC conversion data 0#define ADCDAT1 (*(volatile unsigned long *)(adc_base + S3C2410_ADCDAT1)) //ADC conversion data 1#d</p><p>  //;定義“開(kāi)啟AD 輸入”宏,因?yàn)楸容^簡(jiǎn)單,故沒(méi)有做成函數(shù)</p><p>  //#define START_AD

80、C_AIN(ch, prescale) #define start_adc(ch, prescale) \do{ \ ADCCON = PRESCALE_EN | PRSCVL(prescale) | ADC_INPUT((ch)) ; \ ADCCON |= ADC_START; \}while(0)/*設(shè)置ADC控制寄存器,開(kāi)啟AD轉(zhuǎn)換*//*static void start_adc(i

81、nt ch,int prescale){    unsigned int tmp;</p><p>  tmp = PRESCALE_EN | PRSCVL(prescale) | ADC_INPUT(ch); //(1 << 14)|(255 << 6)|(0 << 3);// 0 1 00000011 000 0 0 0 

82、; //此處writl()的原型是void writel(u32 b, volatile void __iomem *addr),addr是經(jīng)過(guò)地址重映射后的地址    writel(tmp, ADCCON); //AD預(yù)分頻器使能、模擬輸入通道設(shè)為AIN0</p><p>  tmp = readl(ADCCON);    t

83、mp = tmp | ADC_START; //(1 << 0);   // 0 1 00000011 000 0 0 1     writel(tmp, ADCCON);   //AD轉(zhuǎn)換開(kāi)始}問(wèn)題:此函數(shù)被調(diào)用時(shí)為什么地址映射錯(cuò)誤?答案應(yīng)該需要使用專用的函數(shù)iowrite32操作。*/</p><

84、;p>  //;ADC 中斷處理函數(shù)static irqreturn_t adc_irq(int irq, void *dev_id){ //;如果ADC 驅(qū)動(dòng)擁有“A/D 轉(zhuǎn)換器”資源,則從ADC 寄存器讀取轉(zhuǎn)換結(jié)果 if (!ev_adc)  {  /*讀取AD轉(zhuǎn)換后的值保存到全局變量adc_data中,S3C2410_ADCDAT0定義在regs-adc

85、.h中,           這里為什么要與上一個(gè)0x3ff,很簡(jiǎn)單,因?yàn)锳D轉(zhuǎn)換后的數(shù)據(jù)是保存在ADCDAT0的第0-9位,           所以與上0x3ff(即:1111111111)后就得到第0-9位的數(shù)據(jù),多余的位就都為0

86、*/  adc_data = ADCDAT0 & 0x3ff;</p><p>  /*將可讀標(biāo)識(shí)為1,并喚醒等待隊(duì)列*/  ev_adc = 1;  wake_up_interruptible(&adcdev.wait); } return IRQ_HANDLED;}</p><p&g

87、t;  //;ADC 讀函數(shù),一般對(duì)應(yīng)于用戶層/應(yīng)用層的設(shè)備讀函數(shù)(read)static ssize_t adc_read(struct file *filp, char *buffer, size_t count, loff_t *ppos){  /*試著獲取信號(hào)量(即:加鎖)*/ if (down_trylock(&ADC_LOCK))  { 

88、60;return -EBUSY; } if(!ev_adc) /*表示還沒(méi)有AD轉(zhuǎn)換后的數(shù)據(jù),不可讀取*/     {      if(filp->f_flags & O_NONBLOCK)         {&

89、#160;             /*應(yīng)用程序若采用非阻塞方式讀取則返回錯(cuò)誤*/         return -EAGAIN;         }&#

90、160;     else /*以阻塞方式進(jìn)行讀取*/         {              /*設(shè)置ADC控制寄存器,開(kāi)啟AD轉(zhuǎn)換*/  

91、60;      start_adc(adcdev.channel, adcdev.prescale);</p><p>  /*使等待隊(duì)列進(jìn)入睡眠*/         wait_event_interruptible(adcdev.wait, ev_adc); 

92、0;       }     } /*能到這里就表示已有AD轉(zhuǎn)換后的數(shù)據(jù),則標(biāo)識(shí)清0,給下一次讀做判斷用*/   ev_adc = 0;</p><p>  /*將讀取到的AD轉(zhuǎn)換后的值發(fā)往到上層應(yīng)用程序*/   copy_to_user(buffer, (

93、char *)&adc_data, sizeof(adc_data));</p><p>  /*釋放獲取的信號(hào)量(即:解鎖)*/   up(&ADC_LOCK);</p><p>  return sizeof(adc_data); }</p><p>  //;打開(kāi)ADC設(shè)備的函數(shù),一般對(duì)應(yīng)于用戶態(tài)程序的ope

94、nstatic int adc_open(struct inode *inode, struct file *filp){ int ret;  /* normal ADC */ ADCTSC = 0; //;初始化中斷隊(duì)列 init_waitqueue_head(&(adcdev.wait)); adcdev.channel=0;//;缺省通道

95、為“0” adcdev.prescale=0xff; /* 申請(qǐng)ADC中斷服務(wù),這里使用的是共享中斷:IRQF_SHARED,為什么要使用共享中斷,因?yàn)樵谟|摸屏驅(qū)動(dòng)中      也使用了這個(gè)中斷號(hào)。中斷服務(wù)程序?yàn)?adc_irq在下面實(shí)現(xiàn),IRQ_ADC是ADC的中斷號(hào),這里注意:      申請(qǐng)中斷函數(shù)的最后

96、一個(gè)參數(shù)一定不能為NULL,否則中斷申請(qǐng)會(huì)失敗,這里傳入的是ADC_DEV類型的變量*/ ret = request_irq(IRQ_ADC, adc_irq, IRQF_SHARED, DEVICE_NAME, &adcdev); if (ret)   </p><p>  DPRINTK( "adc opened\n");&

97、#160;  return 0;</p><p>  }static int adc_release(struct inode *inode, struct file *filp){ DPRINTK( "adc closed\n"); return 0;}static struct file_operations dev_fops = { 

98、owner: THIS_MODULE, open: adc_open, read: adc_read, release: adc_release,};static struct miscdevice adc_miscdev = { .minor = MISC_DYNAMIC_MINOR, .name = DEVICE_NAME, .fops = &am

99、p;dev_fops,};static int __init dev_init(void){ int ret; /*  1,從平臺(tái)時(shí)鐘隊(duì)列中獲取ADC的時(shí)鐘,這里為什么要取得這個(gè)時(shí)鐘,因?yàn)锳DC的轉(zhuǎn)換頻率跟時(shí)鐘有關(guān)。     系統(tǒng)的一些時(shí)鐘定義在arch/arm/plat-s3c24xx/s3c2410-clock.c中*</p><p

100、>  /*  2,將ADC的IO端口占用的這段IO空間映射到內(nèi)存的虛擬地址,ioremap定義在io.h中。      注意:IO空間要映射后才能使用,以后對(duì)虛擬地址的操作就是對(duì)IO空間的操作,   S3C2410_PA_ADC是ADC控制器的基地址,定義在mach-s3c2410/include/mach/map.h中,0x20是虛擬地址長(zhǎng)度大小

101、*/ adc_base=ioremap(S3C2410_PA_ADC,0x20); if (adc_base == NULL) {  printk(KERN_ERR "Failed to remap register block\n");  ret = -EINVAL;      goto err_

102、noclk; }</p><p>  /*   3,把看ADC注冊(cè)成為misc設(shè)備,misc_register定義在miscdevice.h中   adc_miscdev結(jié)構(gòu)體定義及內(nèi)部接口函數(shù)在第2步中講,MISC_DYNAMIC_MINOR是次設(shè)備號(hào),定義在miscdevice.h中*/   ret = misc_register(&

103、amp;adc_miscdev);   if (ret)      {          /*錯(cuò)誤處理*/      printk(KERN_ERR "Cannot register miscdev on min

104、or=%d (%d)\n", MISC_DYNAMIC_MINOR, ret);      goto err_nomap;     }    printk(DEVICE_NAME "\tinitialized!\n");  return 0; 

105、//以下是上面錯(cuò)誤處理的跳轉(zhuǎn)點(diǎn)err_noclk:   clk_disable(adc_clk);   clk_put(adc_clk);</p><p>  err_nomap:   iounmap(adc_base);</p><p>  return ret;</p><p><b>

106、;  }</b></p><p>  static void __exit dev_exit(void){  free_irq(IRQ_ADC, &adcdev); //;釋放中斷 iounmap(adc_base); /*釋放虛擬地址映射空間*/ if (adc_clk)  /*屏蔽和銷毀時(shí)鐘*/&#

107、160;{  clk_disable(adc_clk);  clk_put(adc_clk);  adc_clk = NULL; } misc_deregister(&adc_miscdev);}//;導(dǎo)出信號(hào)量“ADC_LOCK”,以便觸摸屏驅(qū)動(dòng)使用</p><p>  嵌入式系統(tǒng)虛擬儀表開(kāi)發(fā) </p&g

108、t;<p>  4.1 Qt Creator開(kāi)發(fā)</p><p><b>  建立工程</b></p><p>  圖4.1 選擇工程類型</p><p>  圖4.2 工程名和路徑</p><p>  圖4.3工程的文件類型</p><p>  圖4.5 一個(gè)完整工程和Qt開(kāi)發(fā)工具

109、欄</p><p><b>  虛擬儀表界面搭建</b></p><p>  圖4.6 司鉆監(jiān)測(cè)系統(tǒng)虛擬儀表界面</p><p>  4.2 Qt Create編程</p><p>  Mainwindow.cpp</p><p>  #include "mainwindow.h&qu

110、ot;</p><p>  #include "ui_mainwindow.h"</p><p>  #include <qwt_dial.h></p><p>  #include <qwt_dial_needle.h></p><p>  #include <qwt_slider.h>

111、;</p><p>  #include <qtimer.h></p><p>  MainWindow::MainWindow(QWidget *parent) :</p><p>  QMainWindow(parent),</p><p>  ui(new Ui::MainWindow)</p><p&g

112、t;<b>  {</b></p><p>  ui->setupUi(this);</p><p>  /******************************************************/</p><p>  /*************************************************

113、*****/</p><p>  //////////////dial量程////////////////</p><p>  ui->Dial_2->setScaleArc(0.0, 360.0);</p><p>  ui->Dial_2->scaleDraw()->setSpacing(8);</p><p&g

114、t;  ui->Dial_2->setWrapping(false);</p><p>  ui->Dial_2->setReadOnly(true);</p><p>  ui->Dial_2->setRange(0.0, 300.0);</p><p>  ui->Dial_2->setScale(-1, 2, 2

115、0);</p><p>  ui->Dial_2->setScaleTicks(0, 4,8);</p><p>  QwtDialSimpleNeedle *needle = new QwtDialSimpleNeedle(</p><p>  QwtDialSimpleNeedle::Arrow, true, Qt::blue,</p>

116、<p>  QColor(Qt::gray).light(130));</p><p>  ui->Dial_2->setNeedle(needle);</p><p>  ui->Dial->setRange(0.0, 200.0);</p><p>  ui->Dial->setScale(-1, 2, 20);&

117、lt;/p><p>  QwtDialSimpleNeedle *needle1 = new QwtDialSimpleNeedle(</p><p>  QwtDialSimpleNeedle::Arrow, true, Qt::red,</p><p>  QColor(Qt::gray).light(130));</p><p>  ui-

118、>Dial->setNeedle(needle1);</p><p>  ui->Dial_3->setRange(0.0, 300.0);</p><p>  ui->Dial_3->setScale(-1, 2, 20);</p><p>  QwtDialSimpleNeedle *needle2 = new QwtDial

119、SimpleNeedle(</p><p>  QwtDialSimpleNeedle::Arrow, true, Qt::black,</p><p>  QColor(Qt::gray).light(130));</p><p>  ui->Dial_3->setNeedle(needle2);</p><p>  QTime

120、r *timer = new QTimer(this);</p><p>  connect(timer, SIGNAL(timeout()), this, SLOT(update()));</p><p>  timer->start(50);</p><p>  //////dial指針轉(zhuǎn)動(dòng)//////////////////</p><

121、;p><b>  /*</b></p><p>  static double offset = 0.8;</p><p>  double speed = ui->Dial_2->value();</p><p>  if ( (speed < 40.0 && offset < 0.0 ) ||&

122、lt;/p><p>  (speed > 160.0 && offset > 0.0) )</p><p><b>  {</b></p><p>  offset = -offset;</p><p><b>  }</b></p><p>  st

123、atic int counter = 0;</p><p>  switch(counter++ % 12 )</p><p><b>  {</b></p><p><b>  case 0:</b></p><p><b>  case 2:</b></p>

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論