国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于ARM7與uClinux嵌入式智能終端系統(tǒng)

2014-03-12 09:50
自動(dòng)化與儀表 2014年2期
關(guān)鍵詞:鍵值寄存器圖標(biāo)

艾 紅

(北京信息科技大學(xué) 自動(dòng)化學(xué)院,北京 100192)

嵌入式系統(tǒng)在生活的各個(gè)方面都有其身影,比如人們平時(shí)廣泛使用的手機(jī)、PDA、MP3、機(jī)頂盒都屬于嵌入式系統(tǒng)設(shè)備。uClinux是Linux2.0的一個(gè)分支,被應(yīng)用于微控制領(lǐng)域。uClinux最大的特征是沒(méi)有MMU即內(nèi)存管理單元模塊,很適合那些沒(méi)有MMU的處理器,例如ARM7-TDMI等。這種沒(méi)有MMU的處理器在嵌入式領(lǐng)域中應(yīng)用得相當(dāng)普遍。同標(biāo)準(zhǔn)的Linux相比,由于uClinux上運(yùn)行的絕大多數(shù)用戶程序并不需要多任務(wù)。uClinux有完整的TCP/IP協(xié)議,同時(shí)對(duì)其他網(wǎng)絡(luò)協(xié)議都提供支持,這些網(wǎng)絡(luò)協(xié)議都在uClinux上得到了很好實(shí)現(xiàn)?;贏RM7和uClinux操作系統(tǒng)構(gòu)建嵌入式系統(tǒng)硬件平臺(tái)實(shí)現(xiàn)網(wǎng)頁(yè)顯示實(shí)時(shí)溫度、數(shù)據(jù)采集、存儲(chǔ)和人機(jī)交互功能。計(jì)算機(jī)圖形界面是計(jì)算機(jī)與使用者之間的對(duì)話接口。隨著嵌入式系統(tǒng)性能的不斷提高,圖形化的接口己經(jīng)成為嵌入式設(shè)備應(yīng)用領(lǐng)域中的一個(gè)熱點(diǎn)。圖形用戶界面使人們能夠更加方便地與機(jī)器進(jìn)行互動(dòng)操作,其中以MiniGUI為代表的嵌入式GUI較為突出,可以設(shè)計(jì)人機(jī)交互界面[1-2]。

1 嵌入式智能終端硬件平臺(tái)

采用PHILIPS公司的ARM7微處理器LPC2210,其片內(nèi)具有16KB靜態(tài)RAM,8路10位A/D轉(zhuǎn)換器。ARM7處理器硬件平臺(tái)的外部資源如圖1所示,包括2MB的NOR FLASH,16MB的NAND FLASH,8MB的RAM,兩個(gè)9針D型串行接口,一個(gè)RJ45以太網(wǎng)接口,3個(gè)符合I2C總線協(xié)議的設(shè)備分別是LM75溫度傳感器、CAT1025E2PROM存儲(chǔ)器和ZLG7290鍵盤(pán)接口芯片,還有一個(gè)TFT液晶屏。

圖1 ARM7處理器硬件平臺(tái)Fig.1 ARM7 processor hardware platform

I2C總線只需由兩根信號(hào)線組成:一根是串行數(shù)據(jù)線SDA;另一根是串行時(shí)鐘線SCL。SDA和SCL引腳是漏極開(kāi)路輸出結(jié)構(gòu)。使用時(shí)SDA和SCL信號(hào)線要加上拉電阻。ARM7硬件平臺(tái)中有3個(gè)設(shè)備是通過(guò)I2C協(xié)議來(lái)進(jìn)行數(shù)據(jù)通信的,分別是LM75溫度傳感器、CAT1025數(shù)據(jù)存儲(chǔ)器和ZLG7290鍵盤(pán)管理芯片。它們具有不同的地址,I2C存儲(chǔ)器CAT1025的地址為0xA0,鍵盤(pán)管理芯片ZLG7290的地址為0x70,溫度傳感器芯片LM75的地址為0x90。

2 溫度測(cè)量

2.1 溫度測(cè)量硬件電路

LM75芯片溫度測(cè)量范圍是-55~125℃,LM75將溫度直接轉(zhuǎn)換為數(shù)字值,再通過(guò)ARM7處理器直接讀取,硬件電路連接如圖2所示。

圖2 LM75電路連接圖Fig.2 LM75 circuit connection diagram

LM75的工作電壓為3.0~5.5 V,采用3.3 V直接供電。使用一片LM75時(shí)將芯片的A0~A2引腳接地,使其I2C地址為0x90。LM75是一個(gè)使用了內(nèi)置帶隙溫度傳感器和Σ-Δ模數(shù)轉(zhuǎn)換技術(shù)的溫度-數(shù)字轉(zhuǎn)換器。LM75也是一個(gè)溫度檢測(cè)器,可提供一個(gè)過(guò)熱檢測(cè)輸出。溫度寄存器通常存放著一個(gè)11位的二進(jìn)制數(shù)補(bǔ)碼,用來(lái)實(shí)現(xiàn)0.125℃的精度。

2.2 溫度測(cè)量軟件設(shè)計(jì)

使用 fd=open("/dev/lm75",O_RDWR)打開(kāi) I2C設(shè)備,對(duì)I2C進(jìn)行初始化,寫(xiě)入溫度寄存器地址,使用 read (fd,tmp,2) 讀取溫度寄存器中的數(shù)值,tmp為兩個(gè)數(shù)據(jù)的數(shù)組,高位數(shù)據(jù)讀在前,低位數(shù)據(jù)讀在后。數(shù)據(jù)有效位處理使用value=tmp[0]*256+tmp[1]合并為一個(gè)16位數(shù)據(jù)。value=value>>7忽略7位數(shù)據(jù),得到有效數(shù)據(jù)。判斷溫度正負(fù)值。負(fù)值處理過(guò)程是數(shù)據(jù)為補(bǔ)碼格式,先要把數(shù)據(jù)轉(zhuǎn)換成原碼,補(bǔ)碼是原碼取反再加上 1。 value=~value;val=((value& 0xff)+1)*0.5。 正數(shù)的處理過(guò)程 val=value*0.5;當(dāng)有按鍵按下后,利用LM75芯片對(duì)溫度進(jìn)行采集,通過(guò)I2C總線讀取數(shù)值并顯示溫度值。讀取溫度值對(duì)應(yīng)的溫度寄存器為00H。根據(jù)LM75的時(shí)序圖,使用suba=0x00;write(fd,&suba,1)先將地址寫(xiě)入,再使用 read(fd,tmp,2)讀取數(shù)值。

3 網(wǎng)絡(luò)程序設(shè)計(jì)

Socket接口是 TCP/IP網(wǎng)絡(luò)的 API,Socket接口定義了許多函數(shù),可以開(kāi)發(fā)TCP/IP網(wǎng)絡(luò)的應(yīng)用程序。網(wǎng)絡(luò)的Socket數(shù)據(jù)傳輸是一種特殊的I/O,Socket也是一種文件描述符。Socket具有一個(gè)類(lèi)似于打開(kāi)文件的函數(shù)調(diào)用Socket(),該函數(shù)返回一個(gè)整型的Socket描述符,隨后的連接建立、數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^(guò)Socket實(shí)現(xiàn)的。常用的Socket類(lèi)型有兩種:流式 Socket(SOCK_STREAM)和數(shù)據(jù)報(bào)式Socket(SOCK_DGRAM)。流式是一種面向連接的Socket,針對(duì)于面向連接的TCP服務(wù)應(yīng)用。數(shù)據(jù)報(bào)式Socket是一種無(wú)連接的Socket,對(duì)應(yīng)于無(wú)連接的UDP服務(wù)應(yīng)用。

建立Webserver,對(duì)ARM7硬件平臺(tái)上的LM75溫度芯片進(jìn)行溫度采集,在客戶機(jī)上通過(guò)網(wǎng)頁(yè)瀏覽器進(jìn)行訪問(wèn),顯示溫度值。建立Webserver,只需要建立服務(wù)端程序,客戶端用網(wǎng)頁(yè)瀏覽器進(jìn)行打開(kāi)。在服務(wù)端程序中需要用到HTML語(yǔ)言,HTML語(yǔ)句是以字符串的形式編寫(xiě)的,當(dāng)服務(wù)器將以字符串形式的HTML語(yǔ)言發(fā)送到客戶端后,客戶端的瀏覽器會(huì)根據(jù)字符串的內(nèi)容來(lái)識(shí)別HTML語(yǔ)言。例如以下語(yǔ)句的作用是設(shè)置瀏覽器的標(biāo)題欄內(nèi)容以及瀏覽器背景的顏色。WebServer流程圖如圖3所示。

圖3 WebServer流程圖Fig.3 Flow chart of WebServer

調(diào)用Socket函數(shù)創(chuàng)建一個(gè)socket,調(diào)用Bind函數(shù)將其與本機(jī)地址以及一個(gè)本地端口號(hào)綁定,調(diào)用Listen在相應(yīng)的socket上監(jiān)聽(tīng),當(dāng)accpet接收到一個(gè)連接服務(wù)請(qǐng)求時(shí),將生成一個(gè)新的socket。服務(wù)器顯示該客戶機(jī)的IP地址,并通過(guò)新的socket向客戶端的服務(wù)器發(fā)送溫度采集到的數(shù)值,最后關(guān)閉該socket。Socket創(chuàng)建套接字 sockfd=socket(AF_INET,SOCK_STREAM,0),Bind()與本地 IP 和端口與套接字相連,等待客戶的連接,發(fā)送溫度值。通過(guò)I2C總線采集LM75芯片的溫度值,利用sprintf函數(shù)將要發(fā)送的內(nèi)容轉(zhuǎn)化成字符格式存入緩存區(qū)后,將數(shù)值發(fā)送到網(wǎng)頁(yè)中?;境绦蛟O(shè)計(jì)是讀取溫度值,進(jìn)行格式轉(zhuǎn)換,計(jì)算字符串的個(gè)數(shù),發(fā)送溫度數(shù)值。其中html關(guān)鍵字含義是<br>換行,<center>格式居中,<font color=#000000>設(shè)置文字顏色為黑色,<font size=7>設(shè)置字體大小,<u>加入下劃線。關(guān)閉連接close(nsockfd);將程序下載到ARM7處理器目標(biāo)板后,啟動(dòng)uClinux,運(yùn)行程序。在宿主機(jī)上運(yùn)行IE瀏覽器,輸入目標(biāo)機(jī)的IP地址。會(huì)出現(xiàn)界面顯示實(shí)時(shí)溫度值。

4 數(shù)據(jù)采集與存儲(chǔ)

4.1 數(shù)據(jù)采集

LPC2210處理器提供了A/D轉(zhuǎn)換功能,有10位逐次逼近式A/D轉(zhuǎn)換器,有8個(gè)引腳復(fù)用為A/D輸入腳,A/D參考電壓為3.3 V,測(cè)量范圍為0~3.3 V。AIN7~AIN0是模擬輸入,A/D轉(zhuǎn)換器單元可測(cè)量8個(gè)輸入信號(hào)的電壓。使用ioctl(fd,ADC_SET_CLKDIV,(Fpclk+Fadc-1)/Fadc-1)設(shè)置 A/D 轉(zhuǎn)換速率。Fpclk為總線時(shí)鐘頻率,F(xiàn)adc為ADC轉(zhuǎn)換時(shí)鐘頻率,A/D轉(zhuǎn)換時(shí)鐘不能大于4.5 MHz。設(shè)置A/D轉(zhuǎn)換精度使用 ioctl (fd,ADC_SET_BITS,N),N 為要設(shè)置的轉(zhuǎn)換精度,取值范圍為3~10位。A/D轉(zhuǎn)換結(jié)果有10位,占 2 個(gè)字節(jié)。 read(fd,&ad_data,sizeof(ad_data))設(shè)置ad_data為16位的存儲(chǔ)變量,運(yùn)用sizeof()函數(shù)計(jì)算出變量占用的位數(shù)。計(jì)算出要讀取的字節(jié)數(shù)。

4.2 CAT1025 E2PROM存儲(chǔ)器

LPC2210具有支持400 kb/s高速模式的硬件I2C接口,使用一片I2C接口的E2PROM存儲(chǔ)器CAT1025與ARM7處理器相連接,實(shí)現(xiàn)I2C的讀/寫(xiě)操作。E2PROM存儲(chǔ)器讀寫(xiě)流程圖如圖4所示。

圖4 存儲(chǔ)器讀寫(xiě)流程圖Fig.4 Flow chart of memory read and write

使用 fd=open("/dev/cat1025",O_RDWR)打開(kāi)設(shè)備文件,初始化I2C設(shè)備。系統(tǒng)時(shí)鐘為11.0592 MHz,I2C速率為10 kHz。設(shè)置高電平時(shí)間采用ioctl(fd,I2C_SET_CLH, ((11059200/100000) +1)/2), 設(shè)置低電平時(shí)間采用 ioctl(fd,I2C_SET_CLL,(11059200/100000)/2),將內(nèi)容寫(xiě)入E2PROM。第一個(gè)字節(jié)為器件的子地址,子地址為00H。將snd存儲(chǔ)區(qū)內(nèi)的12個(gè)字節(jié)發(fā)存儲(chǔ)到E2PROM中。讀出E2PROM中剛寫(xiě)入的數(shù)據(jù)。根據(jù)時(shí)序圖,先寫(xiě)入器件的子地址,再讀出相應(yīng)個(gè)數(shù)的數(shù)據(jù)。

5 人機(jī)接口

ARM7硬件平臺(tái)具有16個(gè)按鍵,使用I2C接口的鍵盤(pán)驅(qū)動(dòng)芯片ZLG7290進(jìn)行鍵盤(pán)管理。ZLG7290可以掃描管理多達(dá)64個(gè)按鍵,訪問(wèn)這些寄存器需要通過(guò)I2C總線接口來(lái)實(shí)現(xiàn)。ZLG7290的I2C總線器件寫(xiě)操作地址是70H,讀操作地址是71H。訪問(wèn)內(nèi)部寄存器要通過(guò)“子地址”來(lái)實(shí)現(xiàn)。當(dāng)有按鍵按下后,ZLG7290會(huì)將相應(yīng)的鍵值保存在鍵值寄存器中,如果沒(méi)有鍵值按下,鍵值寄存器中的數(shù)值為0,鍵值寄存器的值在被讀走后會(huì)自動(dòng)變成0。芯片具有防抖動(dòng)功能。ZLG7290采用3.3 V電源,復(fù)位引腳與系統(tǒng)復(fù)位信號(hào)nRST相連,當(dāng)系統(tǒng)上電復(fù)位或手動(dòng)復(fù)位時(shí)會(huì)同時(shí)復(fù)位ZLG7290。ZLG7290的鍵盤(pán)中斷輸出信號(hào)與LPC2210的中斷引腳P0.30相連,當(dāng)有按鍵按下時(shí),有中斷信號(hào)輸出通知ZLG7290。使用fd=open("/dev/zlg7290",O_RDWR)打開(kāi)設(shè)備文件,初始化I2C速率,設(shè)置 I2C 速率為 100kHz。 ioctl(fd,I2C_SET_CLH,((11059200/100000) +1)/2);ioctl(fd,I2C_SET_CLL,(11059200/100000)/2);讀取 ZLG7290 鍵值寄存器,子地址為 01H,使用 suba=0x01;write(fd,&suba,1)發(fā)送將要讀取的子地址。 使用 read(fd,&tmp,1)讀取鍵值寄存器中的鍵值,放入tmp變量。判斷鍵盤(pán)是否按下,如果沒(méi)有鍵值按下,鍵值寄存器中的數(shù)值為0。判斷鍵值寄存器中的數(shù)值,當(dāng)為0時(shí),繼續(xù)讀取鍵值寄存器,當(dāng)讀到的數(shù)值不為0為止。

6 MiniGUI體系結(jié)構(gòu)

MiniGUI采用分層結(jié)構(gòu)設(shè)計(jì),可分為三層。在系統(tǒng)硬件之上的是圖形抽象層GAL和輸入抽象層IAL,這部分與系統(tǒng)的硬件驅(qū)動(dòng)程序緊密相關(guān)。中間核心層是MiniGUI的最重要部分,一般采用客戶機(jī)/服務(wù)器(Client/Server,C/S)模式運(yùn)行,配合相應(yīng)的功能模塊。最上面的API層是GUI提供給用戶的編程接口。一個(gè)C程序的入口點(diǎn)為main函數(shù),而一個(gè)MiniGUI程序的入口點(diǎn)為MiniGUIMain,該函數(shù)原型為 int MiniGUIMain(int argc,const char*argv[])main函數(shù)已經(jīng)在MiniGUI的函數(shù)庫(kù)中定義了,該函數(shù)在進(jìn)行一些MiniGUI的初始化工作之后調(diào)用MiniGUIMain函數(shù)。每個(gè)MiniGUI應(yīng)用程序的入口點(diǎn)均為MiniGUIMain函數(shù)。參數(shù)argc和argv與C程序main函數(shù)的參數(shù)argc和argv的含義是一樣的,分別為命令行參數(shù)個(gè)數(shù)和參數(shù)字符串?dāng)?shù)組指針。

6.1 創(chuàng)建主窗口和顯示主窗口

使用 hMainWnd=CreateMainWindow(&window_info);創(chuàng)建主窗口。每個(gè)MiniGUI應(yīng)用程序的初始界面一般都是一個(gè)主窗口,可以通過(guò)調(diào)用CreateMainWindow函數(shù)創(chuàng)建一個(gè)主窗口,參數(shù)是一個(gè)指向MAINWINCREATE結(jié)構(gòu)的指針,本例中就是window_info,返回值為所創(chuàng)建主窗口的句柄。MAINWINCREATE結(jié)構(gòu)描述一個(gè)主窗口的屬性,在使用window_info創(chuàng)建主窗口之前,需要設(shè)置它的各項(xiàng)屬性。 使用 ShowWindow(hMainWnd,SW_SHOWNORMAL);顯示主窗口。創(chuàng)建完主窗口之后,還需要調(diào)用ShowWindow函數(shù)才能把所創(chuàng)建的窗口顯示在屏幕上。ShowWindow的第一個(gè)參數(shù)為所要顯示的窗口句柄,第二個(gè)參數(shù)指明顯示窗口的方式即顯示還是隱藏,SW_SHOWNORMAL說(shuō)明要顯示主窗口,并把它置為頂層窗口。

6.2 進(jìn)入消息循環(huán)

在調(diào)用ShowWindow函數(shù)之后,主窗口就會(huì)顯示在屏幕上。MiniGUI為每一個(gè)MiniGUI程序維護(hù)一個(gè)消息隊(duì)列。在發(fā)生事件之后,MiniGUI將事件轉(zhuǎn)換為一個(gè)消息,并將消息放入目標(biāo)程序的消息隊(duì)列之中。應(yīng)用程序現(xiàn)在的任務(wù)就是執(zhí)行如下的消息循環(huán)代碼,不斷地從消息隊(duì)列中取出消息進(jìn)行處理。

6.3 窗口過(guò)程函數(shù)

窗口過(guò)程函數(shù)是MiniGUI程序的主體部分,應(yīng)用程序?qū)嶋H所做的工作大部分都發(fā)生在窗口過(guò)程函數(shù)中,因?yàn)镸iniGUI程序的主要任務(wù)是接收和處理窗口收到的各種消息。窗口過(guò)程函數(shù)可以由程序員任意命名,CreateMainWindow函數(shù)根據(jù)MAINWINCREATE結(jié)構(gòu)類(lèi)型的參數(shù)中指定的窗口過(guò)程創(chuàng)建主窗口。

6.4 鍵盤(pán)消息MSG_CHAR

MiniGUI通過(guò)鍵盤(pán)設(shè)備驅(qū)動(dòng)程序從鍵盤(pán)接收原始的輸入事件或數(shù)據(jù),將它轉(zhuǎn)換為MiniGUI抽象的鍵盤(pán)事件和數(shù)據(jù)。相關(guān)的底層事件處理例程把這些鍵盤(pán)事件轉(zhuǎn)換為上層的擊鍵消息,放到相應(yīng)的消息隊(duì)列中。應(yīng)用程序通過(guò)消息循環(huán)獲取這些消息,交由窗口過(guò)程處理。

6.5 擊鍵消息

當(dāng)一個(gè)鍵被按下時(shí),應(yīng)用程序?qū)⑹盏揭粋€(gè)MSG_KEYDOWN消息或MGS_SYSKEYDOWN消息。釋放一個(gè)鍵會(huì)產(chǎn)生一個(gè)MSG_KEYUP消息或MGS_SYSKEYUP消息。按鍵和釋放鍵消息通常是成對(duì)出現(xiàn)的。如果用戶按住某個(gè)鍵不放手,一段時(shí)間以后就會(huì)啟動(dòng)鍵盤(pán)的自動(dòng)重復(fù)特性,系統(tǒng)將會(huì)產(chǎn)生一系列的MSG_KEYDOWN或MSG_SYSKEYDOWN消息。在用戶釋放該鍵時(shí),才會(huì)產(chǎn)生一條MSG_KEYUP或MSG_SYSKEYUP消息。

6.6 桌面主題設(shè)計(jì)

ARM7硬件平臺(tái)上有一個(gè)4×4的矩陣鍵盤(pán),MiniGUI通過(guò)鍵盤(pán)設(shè)備驅(qū)動(dòng)已經(jīng)將鍵盤(pán)中的每個(gè)按鍵都賦予了相應(yīng)的鍵值?;贏RM硬件平臺(tái)采用MiniGUI設(shè)計(jì)的智能終端屏幕上有六個(gè)圖標(biāo),每個(gè)圖標(biāo)都有各自的功能,屏幕下方有相應(yīng)圖標(biāo)功能的說(shuō)明。對(duì)界面的操作主要以鍵盤(pán)為主,鍵盤(pán)可以移動(dòng)桌面上圖標(biāo)中的光標(biāo)對(duì)圖標(biāo)進(jìn)行選擇。利用光標(biāo)的移動(dòng)改變將要實(shí)現(xiàn)功能的選擇,使用上下左右鍵可以切換圖標(biāo)的選擇,按確定鍵就可以進(jìn)入相應(yīng)圖標(biāo)的功能。進(jìn)入圖標(biāo)后,桌面顯示界面將會(huì)被清除,取而代之的是相應(yīng)功能界面。此時(shí)根據(jù)不同功能的需要,鍵盤(pán)也有相應(yīng)的操作。按退出鍵返回桌面主題,可以繼續(xù)對(duì)其它功能進(jìn)行操作。應(yīng)用程序由7個(gè)應(yīng)用程序共同組成,分別是桌面顯示、虛擬示波器、LED控制、蜂鳴器控制、電子相框、幫助文件等所組成。每一個(gè)程序都需要一個(gè)顯示界面,MiniGUI中建立了一個(gè)主窗口,這幾個(gè)應(yīng)用程序都用這一個(gè)主窗口來(lái)顯示。程序中需要設(shè)置一個(gè)非常關(guān)鍵的變量,對(duì)應(yīng)用程序進(jìn)行標(biāo)志性的記錄,利用這個(gè)標(biāo)志變量選擇輸出窗口的顯示內(nèi)容。桌面上共有六個(gè)圖標(biāo),這六個(gè)圖標(biāo)就代表六個(gè)分支語(yǔ)句,選擇任意一個(gè)圖標(biāo),就代表進(jìn)入了這個(gè)分支,同時(shí)改變標(biāo)志變量的值。當(dāng)從這六個(gè)應(yīng)用程序退出時(shí),標(biāo)志變量的值都將改變?yōu)樽烂嬷黝}的標(biāo)志,這樣每次退出都能夠返回桌面主題的顯示。

7 虛擬示波器功能

在桌面主題中選擇第一個(gè)圖標(biāo),按確定鍵后即可進(jìn)入虛擬示波器功能。主要實(shí)現(xiàn)對(duì)ARM7硬件電路板上的兩路電壓進(jìn)行采集,在液晶屏上實(shí)時(shí)顯示電壓數(shù)值,并且畫(huà)出相應(yīng)的變化曲線如圖5所示。使用退出鍵可以返回桌面主題。

當(dāng)進(jìn)入虛擬示波器功能后,程序?qū)/D進(jìn)行初始化,調(diào)用SetTimer函數(shù)進(jìn)行定時(shí)器的設(shè)置。A/D轉(zhuǎn)換時(shí)鐘頻率為4.5 MHz,打開(kāi)通道1設(shè)備,打開(kāi)通道2設(shè)備,設(shè)置通道1和通道2的A/D轉(zhuǎn)換速率,設(shè)置通道1和通道2的A/D轉(zhuǎn)換精度。當(dāng)定時(shí)時(shí)間到達(dá)后,系統(tǒng)會(huì)產(chǎn)生MSG_TIMER消息,在此消息中進(jìn)行電壓的采集以及數(shù)值輸出和波形繪制。波形繪制主要用到了MoveTo和LineTo函數(shù),前一個(gè)為線段的起點(diǎn)坐標(biāo),后一個(gè)是線段的終點(diǎn)坐標(biāo),當(dāng)波形畫(huà)滿整個(gè)屏幕后,程序?qū)⒄{(diào)用刷新命令I(lǐng)nitMainWindow函數(shù),將波形清除,重新開(kāi)始繪制。流程圖如圖6所示。由于電壓采集的范圍為0~3.3 V,以液晶屏縱坐標(biāo)280的像素點(diǎn)為0 V,以縱坐標(biāo)115的像素點(diǎn)為3.3 V,0 V與3.3 V的電壓坐標(biāo)相差165個(gè)像素,將電壓值進(jìn)行轉(zhuǎn)換可以得到屏幕繪制的精度為20 mV。

圖5 虛擬示波器顯示采集電壓值Fig.5 Virtual oscilloscopedisplay voltage acquisition value

圖6 示波器定時(shí)器消息Fig.6 Oscilloscope timer message

程序設(shè)計(jì)實(shí)現(xiàn)定時(shí)消息產(chǎn)生,采集第一路電壓,輸出格式處理,獲取上下文設(shè)備,輸出當(dāng)前值,得到縱坐標(biāo)值,得到橫坐標(biāo)值,設(shè)置顏色,繪制起始坐標(biāo)和終點(diǎn)坐標(biāo),保存坐標(biāo)值,繪制下次坐標(biāo)的起點(diǎn)。判斷橫坐標(biāo)是否大于240,如果大于,刷新屏幕,從起始點(diǎn)重新繪制。釋放上下文設(shè)備。當(dāng)有按鍵產(chǎn)生后,按鍵消息首先判斷是否為退出鍵,退出鍵響應(yīng)后,程序會(huì)改變標(biāo)志變量的值為桌面主題,關(guān)閉A/D采集設(shè)備文件,更新屏幕顯示,使液晶屏重新輸出桌面主題。如果不是退出鍵,則程序繼續(xù)進(jìn)行A/D采集。當(dāng)有按鍵按下進(jìn)行處理,釋放A/D轉(zhuǎn)換第一路,釋放A/D轉(zhuǎn)換第二路,釋放定時(shí)器,建立并顯示主窗口,界面切換到主菜單,波形起始坐標(biāo)歸位[3]。

8 結(jié)語(yǔ)

基于ARM7利用I2C總線對(duì)E2PROM存儲(chǔ)器進(jìn)行讀寫(xiě)操作。利用I2C總線對(duì)LM75溫度傳感器進(jìn)行溫度采集。利用I2C總線對(duì)ZLG7290鍵盤(pán)管理芯片實(shí)現(xiàn)按鍵處理。利用A/D對(duì)多路電壓進(jìn)行采集。利用MiniGUI編制綜合應(yīng)用程序,效果類(lèi)似于個(gè)人數(shù)字助理,能夠?qū)崿F(xiàn)多種應(yīng)用程序的管理。如利用通用I/O接口實(shí)現(xiàn)LED小燈與蜂鳴器的控制,利用A/D對(duì)多路電壓進(jìn)行采集并畫(huà)出相應(yīng)的曲線圖,實(shí)現(xiàn)虛擬示波器功能。利用液晶屏顯示圖片實(shí)現(xiàn)數(shù)碼相框功能。編制了網(wǎng)絡(luò)服務(wù)器程序,通過(guò)網(wǎng)頁(yè)瀏覽器的訪問(wèn)可以顯示實(shí)時(shí)溫度值?;贏RM7和uClinux較好地實(shí)現(xiàn)了嵌入式終端系統(tǒng)的管理。

[1] 周立功.ARM嵌入式系統(tǒng)基礎(chǔ)教程[M].北京:北京航空航天大學(xué)出版社,2005:245-258.

[2] 劉玥.ARM嵌入式系統(tǒng)GUI開(kāi)發(fā)研究[J].微計(jì)算機(jī)信息,2007,23(5-2):153-154,160.

[3] 張杰.基于ARM-uClinux的嵌入式產(chǎn)品平臺(tái)構(gòu)建[J].自動(dòng)化與儀器儀表,2007,22(3):68-70. ■

猜你喜歡
鍵值寄存器圖標(biāo)
非請(qǐng)勿進(jìn) 為注冊(cè)表的重要鍵值上把“鎖”
Lite寄存器模型的設(shè)計(jì)與實(shí)現(xiàn)
二進(jìn)制翻譯中動(dòng)靜結(jié)合的寄存器分配優(yōu)化方法
Android手機(jī)上那些好看的第三方圖標(biāo)包
移位寄存器及算術(shù)運(yùn)算應(yīng)用
圖標(biāo)
一鍵直達(dá) Windows 10注冊(cè)表編輯高招
中國(guó)風(fēng)圖標(biāo)設(shè)計(jì)
有意思的廁所圖標(biāo)
Lx5280模擬器移植設(shè)計(jì)及實(shí)施
开鲁县| 寿阳县| 新绛县| 珲春市| 佳木斯市| 河北区| 海南省| 和平区| 靖安县| 错那县| 怀来县| 临颍县| 彩票| 奉新县| 华安县| 商洛市| 怀来县| 牙克石市| 全南县| 青岛市| 石景山区| 玛曲县| 清镇市| 都昌县| 盘锦市| 阆中市| 沂南县| 隆林| 内乡县| 五河县| 新龙县| 巨鹿县| 长沙县| 无极县| 肥东县| 灵台县| 太仓市| 阳东县| 崇阳县| 浏阳市| 大埔县|