簡易計算器系統(tǒng)設計_第1頁
簡易計算器系統(tǒng)設計_第2頁
簡易計算器系統(tǒng)設計_第3頁
簡易計算器系統(tǒng)設計_第4頁
簡易計算器系統(tǒng)設計_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、湖南文理學院芙蓉學院嵌入式系統(tǒng)課程設計報告題 目 簡易計算器系統(tǒng)設計 學生姓名 劉勝凱 學 號 11170108 專業(yè)班級 計算機科學與技術 指導老師 婁小平 組 員 李陽、楊帆、曾家俊 設計時間 2014.12.29-2015.1.4 評閱意見:評定成績: 指導老師簽名: 年 月 日目錄一、摘要3二、原理與總體方案3三、硬件設計6四、調試10五、測試與分析12六、心得體會14七、參考文獻15八、附錄15一、摘要計算器一般是指“電子計算器”,是能進行數(shù)學運算的手持機器,擁有集成電路芯片。對于嵌入式系統(tǒng),以其占用資源少、專用性強,在汽車電子、航空和工控領域得到了廣泛地應用。本設計就是先通過C語言

2、進行相應程序的編寫然后在ADS中進行運行最后導入PROTUES進行仿真。最后利用ARM中的LPC2106芯片來控制液晶顯示器和4X4矩陣式鍵盤,從而實現(xiàn)簡單的加、減、乘、除等四則運算功能。 二、原理與總體方案 主程序在初始化后調用鍵盤程序,再判斷返回的值。若為數(shù)字09,則根據(jù)按鍵的次數(shù)進行保存和顯示處理。若為功能鍵,則先判斷上次的功能鍵,根據(jù)代號執(zhí)行不同功能,并將按鍵次數(shù)清零。程序中鍵盤部分使用行列式掃描原理,若無鍵按下則調用動態(tài)顯示程序,并繼續(xù)檢測鍵盤;若有鍵按下則得其鍵值,并通過查表轉換為數(shù)字09和功能鍵與清零鍵的代號。最后將計算結果拆分成個、十、百位,再返回主程序繼續(xù)檢測鍵盤并顯示;若為

3、清零鍵,則返回主程序的最開始。電路設計與原理:通過LPC2106芯片進行相應的設置來控制LCD顯示器。而通過對鍵盤上的值進行掃描,把相應的鍵值通過MM74C922芯片進行運算從而讓ARM芯片接收。2.1 系統(tǒng)整體流程圖2.2 程序運行流程圖2.3 仿真電路圖設計2.4 仿真圖形 2.4.1 計算加法 2.4.2 計算減法(結果為負數(shù)) 2.4.3 計算減法(結果為正數(shù)) 2.4.4 計算乘法 2.4.5 計算除法注:本設計不能進行連續(xù)運算,只能進行當次運算,且只能進行單行顯示。進行除法時會自動取整,無小數(shù)。顯示器上不會顯示加減乘除等運算符號,只有操作數(shù)和操作結果。三、硬件設計3.1元件清單器件

4、件數(shù)LPC21061個LED1個KEYPAD1個電源若干電源地若干電線若干3.2 鍵盤接口電路計算器輸入數(shù)字和其他功能按鍵要用到很多按鍵,如果采用獨立按鍵的方式,在這種情況下,編程會很簡單,但是會占用大量的I/O 口資源,因此在很多情況下都不采用這種方式,而是采用矩陣鍵盤的方案。矩陣鍵盤采用四條I/O 線作為行線,四條I/O 線作為列線組成鍵盤,在行線和列線的每個交叉點上設置一個按鍵。這樣鍵盤上按鍵的個數(shù)就為4×4個。這種行列式鍵盤結構能有效地提高單片機系統(tǒng)中I/O 口的利用率。矩陣鍵盤的工作原理:計算器的鍵盤布局如圖3-1所示:一般有16個鍵組成,在單片機中正好可以用一個P口實現(xiàn)1

5、6個按鍵功能,這種形式在單片機系統(tǒng)中也最常用。圖3-1 矩陣鍵盤布局圖電路中采用4*4鍵盤作為輸入電路模塊的話,電路連線會比較簡單,而且這種行列式鍵盤結構能有效地提高單片機系統(tǒng)中I/O 口的利用率。但是在硬件電路設計的過程中,實驗室沒有提供矩陣鍵盤,所以我們將4*4的矩陣鍵盤換成了16個獨立按鍵。采用獨立按鍵的方式的話,會占用大量的I/O 口資源,但是在這種情況下,編程會很簡單。矩陣鍵盤內(nèi)部電路圖如圖3-2所示。圖3-2 矩陣鍵盤內(nèi)部電路圖3.3顯示模塊:本設計采用LCD1液晶顯示屏來顯示輸出數(shù)據(jù)。通過D0-D7引腳向LCD1寫指令字或寫數(shù)據(jù)以使LCD1實現(xiàn)不同的功能或顯示相應數(shù)據(jù)。LCD1管

6、腳圖如圖3-3所示。圖3-3 LCD1管腳圖3.4各模塊的特性與作用 3.4.1 LPC2106的特性及引腳功能LPC2106 是基于一個支持實時仿真和跟蹤的32 位ARM CPU 的微處理器,并帶有256kB 嵌入的高速Flash 存儲器。128 位寬度的存儲器接口和獨特的加速結構使32 位代碼能夠最大時鐘速率下運行,并具有廣泛應用。含向量中斷控制器,多個串行接口,兩個三十二位定時器,片內(nèi)晶振的操作頻率范圍:10MHZ-25MHZ,兩個低功耗模式:空閑和掉電.CPU操作電壓范圍:1.65V-1.95V圖3-4 LPC2106管腳圖管腳說明:V3、V18:供電電壓Vss、DBGSEL:接地XT

7、AL1:反向振蕩放大器的輸入及內(nèi)部時鐘工作電路的輸入。 XTAL2:來自反向振蕩器的輸出。P0.0-P0.14作為GPIO接口,P0.15作為EINT2接口。3.4.2 LCD的特性 LCD 顯示屏可以采用字符顯示,當使用字符顯示方式時,可以直接用外碼作為輸入數(shù)據(jù),由顯示屏自動給出顯示字模數(shù)據(jù),而無需由微處理器提供字模。3.4.3 數(shù)字式鍵盤的特性 數(shù)字式鍵盤的實質仍是行列式鍵盤,4 根行線和4 根列線通過下拉電阻接地,在其表面貼有標示對應按鍵的膜,使得易于觀察和操作,更加貼近使用者的需求。3.4.4 MM74C922的特性及其引腳功能: MM74C922具有功耗低,電壓為3-5V,三態(tài)門輸出

8、,與LPTTL兼容,輸出鎖存按下最后的鍵,用一個電容器就可以消除鍵盤抖動,兩鍵輪回,行具有上拉功能,具有芯片內(nèi)或芯片外時鐘,最大開關電阻為管腳說明: A-D為行鍵掃描電平輸出端,1-4為列鍵輸入讀取端;OSC為振蕩器的外接引線端,可用外部的輸入脈沖或電容器;OE為數(shù)據(jù)輸出端,低電平有效;DAV為數(shù)據(jù)輸出有效,高電平有效;VCC為電源端,接3-5V;GND為接地端。本設計中選用LPC2106的P0.0P0.10 與LCD 顯示屏相連,它們所輸出信號控制顯示屏上的顯示,其中P0.0P0.7 分別接顯示屏的D0D7,P0.8P0.10分別接顯示屏的RS、RW、E 接口;選用LPC2106的P0.11

9、P0.14 連續(xù)4 個IO口與芯片MM74C922和計算器鍵盤相連,可通過反轉法檢測到按下按鍵的鍵碼,再通過查鍵盤對應的字符編碼使LCD 顯示,其中AD依次接鍵盤的4 根行線,14依次接鍵盤的4 根列線。管腳說明: A-D為行鍵掃描電平輸出端,1-4為列鍵輸入讀取端;OSC為振蕩器的外接引線端,可用外部的輸入脈沖或電容器;OE為數(shù)據(jù)輸出端,低電平有效;DAV為數(shù)據(jù)輸出有效,高電平有效;VCC為電源端,接3-5V;GND為接地端。本設計中選用LPC2106的P0.0P0.10 與LCD 顯示屏相連,它們所輸出信號控制顯示屏上的顯示,其中P0.0P0.7 分別接顯示屏的D0D7,P0.8P0.10

10、分別接顯示屏的RS、RW、E 接口;選用LPC2106的P0.11P0.14 連續(xù)4 個IO口與芯片MM74C922和計算器鍵盤相連,可通過反轉法檢測到按下按鍵的鍵碼,再通過查鍵盤對應的字符編碼使LCD 顯示,其中AD依次接鍵盤的4 根行線,14依次接鍵盤的4 根列線。四、調試 4.1 GPIO: LPC2000系列ARM的GPIO具有如下特性:1)可以獨立控制每個GPIO口的方向(輸入/輸出模式);2) 可以獨立設置每個GPIO的輸出狀態(tài)(高/低電平);3)所有GPIO口在復位后默認為輸入狀態(tài)。每個作為GPIO功能的引腳受到四個寄存器控制,分別為控制方向的IOxDIR、控制輸出電平狀態(tài)的IO

11、xSET和IOxCLR、反映引腳電平狀態(tài)的IOxPIN。這四個寄存器構成一組,而一組寄存器控制著一個端口(P0、P1、P2或P3)。注意事項:引腳設置為輸出方式時,輸出狀態(tài)由IOxSET和IOxCLR中最后操作的寄存器決定。LPC2000系列ARM大部分的I/O引腳為推挽方式輸出,但是具有總線功能的I/O引腳為開漏輸出(P0.2/3和P0.11/14)。使用這些開漏輸出的引腳作為GPIO功能,并用于高電平輸出或者引腳狀態(tài)輸入時,要接上拉電阻才能正常使用。推挽輸出的I/O引腳正常拉出/灌入電流均為4mA,短時間極限值為40mA。復位后,大部分引腳默認作為GPIO功能,并且均為輸入狀態(tài)。但是,有部

12、分引腳在復位后默認作為第二功能(如:P0.27P0.30在復位后默認為A/D輸入引腳)。4.2硬件和程序原理在鍵盤按鍵后,產(chǎn)生一個中斷,mcu對鍵盤進行掃描,確定按下的鍵,如果不是等號,就把按下的字符依次存入數(shù)組,并在lcd顯示表達式,如果是等號,就計算出數(shù)組中存入的表達式的值,并顯示在lcd中。計算表達式值的方法:把表達式中的表示數(shù)值的字符轉成數(shù)值存入一個數(shù)值數(shù)組,把表達式中的表示運算符的字符存入運算符數(shù)組;關于四則運算優(yōu)先級算法:依次檢索運算符數(shù)組,當遇到 * 號 或者 / 號的時候,就先計算乘法或除法,算出結果后存入數(shù)值數(shù)組相應位置,然后刪除此運算符和多余的數(shù)值,再重復檢索,直到數(shù)值數(shù)組

13、中只有一個數(shù)值為止,這個數(shù)值即是運算結果。調用stdio.h庫里的sprintf函數(shù),把數(shù)值轉化成字符數(shù)組,然后顯示到lcd中。五、測試與分析5.1 ADS1.2新建工程5.2 Proteus實時仿真六、心得體會本學期為期一周的嵌入式課程設計在不知不覺中結束了,雖說這次課程設計時間不是很長,但是感覺自己收獲頗豐,不僅學習到了一些新知識,回顧了以前的一些快要遺忘的知識點,而且使自己的學習目標更加明確,學習方法更加完善,也體會到軟件開發(fā)的趣味,更加清楚地認識到了自己在軟件開發(fā)及學習上的一些不足之處。一周的課程設計,一周的實訓,讓我明白計算機這個博大深奧的領域我感覺自己還有好多東西要學,還有好多的東

14、西不懂,嵌入式軟件開發(fā)應用廣泛而且前景很好,目前正處于人才緊缺的關口,嵌入式技術在未來能夠得到更加廣泛的應用。學好嵌入式,C語言很重要,所以感覺自己有必要在學習、積累一下這方面的知識。要想學好還必須下大力氣,還必須堅持。這次的課程設計讓我明確了一點:嵌入式開發(fā)對于提升我們的系統(tǒng)知識有很大的幫助,尤其是操作系統(tǒng)的知識。嵌入式系統(tǒng)開發(fā)對于我們的知識面要求非常的廣,且要有一定的深度。這次的課程設計因為是一個有針對性的訓練,所以記的會非常牢固。跟平時上課不太一樣,平時上完理論課很少有時間上機進行時間或者隔幾天才上機練習,等到上機時一些東西可能遺忘了,比較耗費時間。在課上,有老師在前面演示我們感覺看得懂

15、或感覺沒問題,可輪到我們獨立完成的時候,因為實際操作的少,跟中問題就來了!我很感謝學校特別是學院老師有實訓這樣的安排,把我們這一學期學的東西系統(tǒng)的集中的進行訓練,讓我們深刻明確的體驗了一下軟件開發(fā)的流程!經(jīng)過這次的實訓,我真真確確的感受到了計算機在我們生活中工作中的運用,這些軟件、程序能讓我們提高工作的效率,更直觀更便捷的切入主題。當然,在學習的過程中并不是一帆風順的,在這之中,因為要操作的東西很多,有時錯一步,后面的結果就無法顯示,而自己的計算機水平還有待提高,根本檢查不出來是哪里出了錯!在平時我們就需要好好的查閱書籍或者上網(wǎng)搜集相關資料去解決問題。對我們而言,知識上的收獲重要,精神上的豐收

16、更加可喜。挫折是一份財富,經(jīng)歷是一份擁有。這次實習必將成為我人生旅途上一個非常美好的回憶!此次實訓最大的收獲不是我學習到了多少知識而是這幾天實訓給我的感悟:首先是心態(tài)。一定要有一個積極的心態(tài),獨立解決問題的意識,培養(yǎng)扎實基礎的認識。不要什么東西都感覺跟簡單,就不去做了或者不屑一做,以至于感覺網(wǎng)上搜搜就可以了,這樣很不好。有自己的東西有自己的付出才會有程序運行成功時的喜悅和小自豪,這樣也有助于培養(yǎng)自己的興趣。要時刻牢記態(tài)度決定一切。其次是興趣,感覺學習工作中興趣很關鍵,只是一個引發(fā)人積極性的問題,有了興趣就自覺了,效率自然就高了。再次要敢于嘗試和挑戰(zhàn)。不要安于現(xiàn)成的程序,而且不要害怕失敗,在程序

17、調試的過程中這點尤為重要,“發(fā)現(xiàn)出問題然后解決問題”是一個積累經(jīng)驗的過程,而且很高效。最后要不懈追求。對于源代碼進行不斷的完善,要盡可能的實現(xiàn)課題所要求的功能。對于初學者或者開發(fā)較少的人來說,大量大寫程序還是有必要的,但同時要注意思考,理解其實現(xiàn)的內(nèi)在意義。還可以自己添加一些有意義的功能來實現(xiàn)。當看到自己編寫的程序正常運行時,興趣也會隨之而來,樂此不疲,形成一個良性循環(huán)。七、參考文獻 1、ARM嵌入式系統(tǒng)開發(fā)-軟件設計與優(yōu)化,Andrew N.Sloss,沈建華(譯),北京航空航天大學出版社,2005; 2、ARM體系結構與編程,杜春雷,清華大學出版社,2007;八、附錄#include &q

18、uot;config.h"#include "math.h"/宏定義#define LCD_RS 1<<0#define LCD_RW 1<<1#define LCD_E 1<<2#define D7 1<<10 /判斷LCD忙碌/函數(shù)聲明void system_init(void);void LCDInit(void);void _irq IRQ_EINT2(void);int ucKeyScan(void);char translate();void arithmetic(long x,long y);char

19、txt1="error!", txt2="data overflow", txt3=""/全局變量定義long add1=0,add2=0;int operators=0,iny=0;uint8 num=0,x,y,sign=0,count=0,k=0,repeat=0,flag=0;unsigned int code4=0x0E00000,0x0D00000,0x0B00000,0x0700000;/列線掃描電壓,分為第1,2,3,4根列線unsigned int ucRow,ucLine; /行號,列號。/* 名 稱:DelayN

20、S()* 功 能:長軟件延時* 入口參數(shù):dly延時參數(shù),值越大,延時越久* 出口參數(shù):無*/void DelayNS(uint32 dly) uint32 i; for(; dly>0; dly-) for(i=0; i<500; i+); /* 名 稱:Busy()* 功 能:LCD是否忙碌*/void Busy() while(1) IOCLR = LCD_RS; IOSET = LCD_RW; if(!(IOPIN&D7) break; /* 名 稱:Command()* 功 能:LCD命令*/void Command(char com) Busy(); IOCLR

21、 = 0x0FFF; IOCLR = LCD_RS; IOCLR = LCD_RW; IOSET = LCD_E; IOSET = com<<3; IOCLR = LCD_E;/* 名 稱:LCDInit()* 功 能:LCD初始化* 入口參數(shù):* 出口參數(shù):無*/void LCDInit() Command(0x0C); /顯示開/關控制命令 Command(0x38); /功能設置命令:數(shù)據(jù)線長度為8位 / Command(0x80); /地址命令 Command(0x06); /輸入方式設置/* 名 稱:write()* 功 能:LCD寫數(shù)據(jù)*/void write(char

22、 data) Busy(); IOCLR = 0x0FFF; IOSET = LCD_RS; IOCLR = LCD_RW; IOSET = LCD_E; IOSET = data<<3; DelayNS(1); IOCLR = LCD_E; /* 名 稱:display()* 功 能:LCD顯示*/void display(long a) long temp,b,c=-1; uint8 lenth=1,i,j; / Command(0x01); if(a<0) a=a*c; write('-'); temp=a; while(temp=temp/10)!=0

23、) lenth+; for(i=lenth;i>0;i-) b=1; for(j=0;j<i-1;j+) b=b*10; write(0x30+a/b); a=a%b; /為低電平,其他為高電平。 /主函數(shù)int main() system_init();LCDInit();while(1) ucKeyScan();return(0);/* 名稱:system_init()* 功能:system初始化函數(shù)*/void system_init() /引腳功能選擇PINSEL0 = 0x80000000; /設置P0.15為EINT2,其余為GPIOPINSEL1 = 0x000000

24、00;/設置P0.15P0.31為GPIOIODIR = 0x0f007ff; /設置P0.0-P0.10,P0.20-P0.23為輸出,其余為輸入IOCLR = 0x80000000; /向量中斷初始化VICIntSelect =0x00; /設置P0.15為IRQ中斷VICVectAddr0 = (uint32)IRQ_EINT2;VICVectCntl0 = 0x30;VICIntEnable = 1<<16; /使能EINT2/外部中斷初始化EXTMODE = 1<<2; /設置為EINT2下降沿觸發(fā)EXTPOLAR = 0; EXTINT = 1<<

25、;2; /清除EINT2中斷標志/* 名稱:ucKeyScan()* 功能:鍵盤掃描函數(shù)當有外部中斷2時調用此函數(shù),使用列掃描的方式獲取鍵碼,鍵碼由2位數(shù)字組成。高位為行號低位為列號。*/int ucKeyScan() unsigned int ucTemp=0; /掃描狀態(tài)暫存。for(ucLine=0;ucLine<4;ucLine+)/行掃描IOSET=codeucLine; /輸出掃描電位。IOCLR=(codeucLine)&0xF00000;/ucTemp=IOPIN>>24;if(ucTemp!=0x0F) /判斷該列是否有按鍵按下。continue;

26、/返回按鍵編碼。格式為2位數(shù),高位為列號,低位為行號。/* 名稱:IRQ_EINT2()* 功能:EINT2中斷服務程序*/void _irq IRQ_EINT2(void) unsigned int ucTemp2=0,a; ucTemp2=IOPIN>>24; switch(ucTemp2)case 0x0E: ucRow=00;break; /判斷列號。case 0x0D: ucRow=10;break;case 0x0B: ucRow=20;break;case 0x07: ucRow=30;break;default: ucRow=40;break; num=ucRow+

27、ucLine;if(repeat=1&num!=23&x!=3) /計算結束后,若輸入數(shù)字,在輸入前清屏 Command(0x01); add1=add2=sign=0; count=0; repeat=0; DelayNS(10); /延時讓LCD反應 switch(num) case 00:write('7');k=8;break; case 01:write('4');k=5;break; case 02:write('1');k=2;break; case 03:Command(0x01);k=0;add1=add2=sign=0;break; case 10:write('8');k=9;break; case 11:write('5');k=6;break; case 12:write('2');k=3;break; case 13:write('0');k=1;break; case 20:write('9');k=10;break; case 21:write('

溫馨提示

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

評論

0/150

提交評論