基于.-51單片機(jī)的多功能計(jì)算器設(shè)計(jì)_第1頁(yè)
基于.-51單片機(jī)的多功能計(jì)算器設(shè)計(jì)_第2頁(yè)
基于.-51單片機(jī)的多功能計(jì)算器設(shè)計(jì)_第3頁(yè)
基于.-51單片機(jī)的多功能計(jì)算器設(shè)計(jì)_第4頁(yè)
基于.-51單片機(jī)的多功能計(jì)算器設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

...wd......wd......wd...微機(jī)原理課程設(shè)計(jì)設(shè)計(jì)課題基于51單片機(jī)的計(jì)算器設(shè)計(jì)學(xué)院姓名學(xué)號(hào)專業(yè)班級(jí)指導(dǎo)教師設(shè)計(jì)時(shí)間南華大學(xué)【摘要】當(dāng)今社會(huì),隨著人們物質(zhì)生活的不斷提高,電子產(chǎn)品已經(jīng)走進(jìn)了家家戶戶,無(wú)論是生活或?qū)W習(xí),還是娛樂和消遣幾乎樣樣都離不開電子產(chǎn)品,大型復(fù)雜的計(jì)算能力是人腦所不能勝任的,而且人腦比擬容易出錯(cuò)。計(jì)算器作為一種快速通用的計(jì)算工具方便了用戶的使用。計(jì)算器可謂是我們最親密的電子伙伴之一。本設(shè)計(jì)著重在于分析計(jì)算器設(shè)計(jì)開發(fā)過程中的環(huán)節(jié)和步驟,并從實(shí)踐經(jīng)歷出發(fā)對(duì)計(jì)算器設(shè)計(jì)做了詳細(xì)的分析和研究。本設(shè)計(jì)是以STC89C52單片機(jī)為核心的計(jì)算器模擬系統(tǒng)設(shè)計(jì),輸入采用4×4矩陣鍵盤再加上4個(gè)獨(dú)立按鍵,可以進(jìn)展加、減、乘、除7位帶符號(hào)數(shù)字運(yùn)算,同時(shí)支持括號(hào)的嵌套使用級(jí)浮點(diǎn)數(shù)的運(yùn)算,并在LCD1602上顯示操作過程。本次設(shè)計(jì)注重設(shè)計(jì)方法及流程,首先根據(jù)原理設(shè)計(jì)電路,利用keil編程,借助實(shí)驗(yàn)開發(fā)平臺(tái)進(jìn)展仿真實(shí)驗(yàn),進(jìn)而利用altiumdesigner制作PCB,最后到焊接元器件,直至調(diào)試成功。在設(shè)計(jì)的同時(shí),特別注重keil軟件和altiumdesigner軟件的使用方法和技巧以及常用的LCD顯示器和矩陣鍵盤的設(shè)計(jì)和使用方法?!娟P(guān)鍵詞】計(jì)算器,STC89C52,矩陣鍵盤,1602液晶目錄1系統(tǒng)方案設(shè)計(jì)-5-1.1設(shè)計(jì)目的及要求-5-1.1.1設(shè)計(jì)目的-5-1.1.2設(shè)計(jì)要求-5-1.2方案論證及選擇-5-1.2.1方案一采用FPGA控制-6-1.2.2方案二采用STC89C52-6-1.2.3方案比擬及選擇-6-2單元電路設(shè)計(jì)-7-2.1工作原理-7-2.2硬件電路設(shè)計(jì)-8-2.2.1單片機(jī)電路設(shè)計(jì)-8-2.2.2鍵盤模塊電路-9-2.2.3蜂鳴器提示電路-9-2.2.4液晶顯示電路-10-2.3軟件設(shè)計(jì)-11-2.3.1鍵盤掃描-11-2.3.2表達(dá)式的處理-11-2.4altiumdesigner原理圖設(shè)計(jì)及PCB制作-13-2.4.1原理圖設(shè)計(jì)-13-2.4.2PCB制作-14-2.4.3設(shè)計(jì)結(jié)果-15-3系統(tǒng)測(cè)試-15-3.1整數(shù)運(yùn)算-15-3.2浮點(diǎn)數(shù)運(yùn)算-16-3.3輸入出錯(cuò)的情況-17-4結(jié)論與心得體會(huì)-17-5參考文獻(xiàn)-18-附錄1元器件清單-18-附錄2程序清單-19-1系統(tǒng)方案設(shè)計(jì)1.1設(shè)計(jì)目的及要求1.1.1設(shè)計(jì)目的通過本次課題設(shè)計(jì),應(yīng)用《單片機(jī)應(yīng)用根基》、《數(shù)據(jù)構(gòu)造》等所學(xué)相關(guān)知識(shí)及查閱資料,完成實(shí)用計(jì)算器的設(shè)計(jì),以到達(dá)理論與實(shí)踐更好的結(jié)合、進(jìn)一步提高綜合運(yùn)用所學(xué)知識(shí)和設(shè)計(jì)的能力的目的。通過本次設(shè)計(jì)的訓(xùn)練,可以使我在根本思路和根本方法上對(duì)基于MCS-51單片機(jī)的嵌入式系統(tǒng)設(shè)計(jì)有一個(gè)比擬感性的認(rèn)識(shí),并具備一定程度的設(shè)計(jì)能力。1.1.2設(shè)計(jì)要求在本次課程設(shè)計(jì)中,主要完成如下方面的設(shè)計(jì)要求:1、掌握MCS-51系列某種產(chǎn)品〔例如8051〕的最小電路及外圍擴(kuò)展電路的設(shè)計(jì)方法;2、計(jì)算器能實(shí)現(xiàn)根本的加、減、乘、除四則運(yùn)算;3、支持浮點(diǎn)數(shù)運(yùn)算;4、支持括號(hào)運(yùn)算,允許括號(hào)的多層正確嵌套;5、較為友好的界面顯示,對(duì)輸入實(shí)時(shí)顯示,對(duì)計(jì)算結(jié)果輸出顯示;6、能夠具備比擬完善的報(bào)錯(cuò)系統(tǒng)1.2方案論證及選擇基于設(shè)計(jì)要求,笨設(shè)計(jì)考慮了兩種設(shè)計(jì)方案,他們均可以實(shí)現(xiàn)計(jì)算器的功能,但基于設(shè)計(jì)目的及微控制器的廣泛運(yùn)用,比擬兩種方案的優(yōu)劣,最終選擇基于51單片機(jī)的計(jì)算器設(shè)計(jì)。1.2.1方案一采用FPGA控制FPGA是一種高密度的可編程邏輯器件,自從Xilinx公司1985年推出第一片F(xiàn)PGA以來,FPGA的集成密度和性能提高很快,其集成密度最高達(dá)500萬(wàn)門/片以上,系統(tǒng)性能可達(dá)200MHz。由于FPGA器件集成度高,方便易用,開發(fā)和上市周期短,在數(shù)字設(shè)計(jì)和電子生產(chǎn)中得到迅速普及和應(yīng)用,并一度在高密度的可編程邏輯器件領(lǐng)域中獨(dú)占鰲頭。但是而基于SRAM編程的FPGA,其編程信息需存放在外部存儲(chǔ)器上,需外部存儲(chǔ)器芯片,且使用方法復(fù)雜,保密性差,而其對(duì)于一個(gè)簡(jiǎn)單的計(jì)算器而言,實(shí)用FPGA有點(diǎn)大材小用,本錢太高。1.2.2方案二采用STC89C52單片機(jī)是單片微型機(jī)的簡(jiǎn)稱,故又稱為微控制器MCU〔MicroControlUnit〕。通常由單塊集成電路芯片組成,內(nèi)部包含有計(jì)算機(jī)的根本功能部件:中央處理器CPU,存儲(chǔ)器和I/O接口電路等。因此,單片機(jī)只要和適當(dāng)?shù)能浖巴獠吭O(shè)備相結(jié)合,便可成為一個(gè)單片機(jī)控制系統(tǒng)。單片機(jī)廣泛用于智能產(chǎn)品,智能儀表,測(cè)控技術(shù),智能接口等,具有操作簡(jiǎn)單,實(shí)用方便,價(jià)格廉價(jià)等優(yōu)點(diǎn),而其中AT89S52以MCS-51為內(nèi)核,是單片機(jī)中最典型的代表,應(yīng)用于各種控制領(lǐng)域。1.2.3方案比擬及選擇通過以上兩種方案論證和比擬,從設(shè)計(jì)的實(shí)用性,方便性和本錢出發(fā),選擇了以STC89C52單片機(jī)作為中央處理單元進(jìn)展計(jì)算器的設(shè)計(jì),這樣設(shè)計(jì)能夠?qū)崿F(xiàn)對(duì)六位浮點(diǎn)數(shù)的加減和三位浮點(diǎn)數(shù)的乘除運(yùn)算。2單元電路設(shè)計(jì)2.1工作原理利用矩陣鍵盤進(jìn)展按鍵的輸入,通過對(duì)矩陣鍵盤的掃描,獲取用戶的輸入,并實(shí)時(shí)的顯示在1602液晶上,每次獲取到輸入時(shí),根據(jù)軟件設(shè)計(jì)的相應(yīng)方法對(duì)輸入進(jìn)展處理、運(yùn)算,輸入完畢后〔以“=“為標(biāo)志〕,將最終的運(yùn)算結(jié)果輸出的液晶上。系統(tǒng)組成及整體框圖如圖2.1所示。LCD液晶顯示屏模塊LCD液晶顯示屏模塊STC89C52主控制模塊〔處理、運(yùn)算〕鍵盤模塊鍵盤模塊電源電源圖2.1系統(tǒng)組成及總體框圖2.2硬件電路設(shè)計(jì)2.2.1單片機(jī)電路設(shè)計(jì)為使單片機(jī)正常工作,除電源供電局部外,還需提供晶振電路和復(fù)位電路。具體電路如下:圖2.2單片機(jī)工作電路由圖2.2可知,9腳外接的是按鍵復(fù)位電路,18,19腳外接的是晶振電路,這樣,就構(gòu)成了單片機(jī)正常工作的必備電路。同時(shí),為使P0口正常工作,并增加其帶負(fù)載能力,P0口需接了上拉電阻。圖中EA為外部訪問允許,欲使CPU僅訪問外部程序存儲(chǔ)器〔地址為0000H-FFFFH〕,EA端必須保持低電平〔接地〕。在這里,STC89C52單片機(jī)8k的程序存儲(chǔ)器已經(jīng)夠本設(shè)計(jì)使用,無(wú)需外部程序儲(chǔ)存器,故EA直接接高電平。2.2.2鍵盤模塊電路圖2.3是鍵盤電路,共20個(gè)按鍵,用來實(shí)現(xiàn)人機(jī)交互和運(yùn)算表達(dá)式的輸入,S0~S3、S5~S8、S10~S13、S15~S18共16個(gè)按鍵組成一組4*4的矩陣鍵盤,行線第一行到第四行分別接在P3.0~P3.3口,列線第一列到第四列分別接在P3.4~P3.7口,這樣P3口就完成了對(duì)4*4的矩陣鍵盤的接線。同時(shí),注意到按鍵數(shù)量還達(dá)不到要求,故增加了四個(gè)獨(dú)立按鍵S4,S9,S14,S19。他們依次接在P20~P23口。可見,矩陣鍵盤相對(duì)來講更節(jié)省I/O口,但本著學(xué)習(xí)的目的,加之本設(shè)計(jì)并不需要太多的I/O口,故為充分學(xué)習(xí)和利用資源,在這里也設(shè)計(jì)了4個(gè)這樣的獨(dú)立按鍵。圖2.3鍵盤模塊電路2.2.3蜂鳴器提示電路蜂鳴器主要用于按鍵時(shí)發(fā)出聲音,提示當(dāng)前的按鍵操作,電路如圖2.5所示,三極管主要用于驅(qū)動(dòng)蜂鳴器,因?yàn)閱纹瑱C(jī)I/O的驅(qū)動(dòng)能力有限。同時(shí)單片機(jī)I/O口還在這里還起到開關(guān)作用,為‘0’時(shí)翻開蜂鳴器通道,使蜂鳴器發(fā)聲。圖2.4蜂鳴器提示電路2.2.4液晶顯示電路LCD也是本次設(shè)計(jì)的重要組成局部之一,主要用于顯示輸入和輸出。電路如圖2.5所示,LCD數(shù)據(jù)端與單片機(jī)P0口相連,控制端與P24~P26連接,電位器用于調(diào)節(jié)比照度。圖2.5LCD顯示電路至此,整個(gè)電容測(cè)量?jī)x的硬件設(shè)計(jì)局部就根本設(shè)計(jì)完成,接下來,需要的就是與之相匹配的軟件支持了。2.3軟件設(shè)計(jì)軟件編程平臺(tái)選擇最常用的keil軟件。由于該程序并未涉及到底層的驅(qū)動(dòng)問題,因此選擇方便快捷的C語(yǔ)言編程。在編程中,將該程序分為四個(gè)模塊:延時(shí)模塊、1602顯示模塊、用于處理計(jì)算表達(dá)式的對(duì)戰(zhàn)模塊及主函數(shù)模塊。采用模塊化設(shè)計(jì),方便調(diào)試與理解。具體程序見附錄二。在這里重點(diǎn)介紹軟件核心的表達(dá)式處理程序算法。2.3.1鍵盤掃描獨(dú)立鍵盤很好實(shí)現(xiàn),只需不停的檢測(cè)即可,出現(xiàn)低電平即出現(xiàn)按鍵,在經(jīng)過一定的延時(shí)消抖,再確認(rèn)判斷即可。矩陣鍵盤掃描程序,首先讀出P3的低四位,然后讀出P3口的高四位。然后確定鍵值并顯示緩存,最終將按鍵的值通過一個(gè)預(yù)先定義好的數(shù)組轉(zhuǎn)換為相應(yīng)的ASCII碼值送給LCD顯示和與表達(dá)式相應(yīng)的堆棧進(jìn)展處理,讀鍵程序使用的是反轉(zhuǎn)法讀鍵,不管鍵盤矩陣的規(guī)模大小,均進(jìn)展兩次讀鍵。第一次所有行線均輸出高電平,從P3口的值讀入鍵盤信息〔行信息〕;第二次所有列線均輸出高電平,從P3口的值讀入鍵盤信息〔列信息〕。2.3.2表達(dá)式的處理表達(dá)式包含加、減、乘、除、括號(hào)等,必須按照相應(yīng)的優(yōu)先級(jí)運(yùn)算,才可能得出正確的結(jié)果。在這兒采用棧構(gòu)造,可以有效的進(jìn)展表達(dá)式的處理。棧構(gòu)造具有“后進(jìn)先出〞的固有屬性,借助這個(gè)屬性我們可以隨時(shí)對(duì)剛輸入的元素進(jìn)展操作,從而實(shí)現(xiàn)邊輸入邊計(jì)算。為了實(shí)現(xiàn)算符優(yōu)先算法??梢允褂脙蓚€(gè)工作棧。一個(gè)稱為OPTR,用以存放運(yùn)算符,另一個(gè)稱做OPND,用以存放操作數(shù)或運(yùn)算結(jié)果。1.首先置操作數(shù)棧為空棧,表達(dá)式起始符〞#〞為運(yùn)算符棧的棧底元素;2.依次讀入表達(dá)式,假設(shè)是操作符即進(jìn)OPND棧,假設(shè)是運(yùn)算符則和OPTR棧的棧頂運(yùn)算符比擬優(yōu)先權(quán)后作相應(yīng)的操作,直至整個(gè)表達(dá)式求值完畢〔即OPTR棧的棧頂元素和當(dāng)前讀入的字符均為〞#〞〕。在這里,相應(yīng)的處理指的是,如果當(dāng)前符號(hào)的優(yōu)先級(jí)比棧頂優(yōu)先級(jí)低,則將該符號(hào)繼續(xù)壓入堆棧,不做其它操作;如果當(dāng)前符號(hào)的優(yōu)先級(jí)比棧頂優(yōu)先級(jí)高,則依次取出操作數(shù)棧的棧頂兩個(gè)數(shù)據(jù)和符號(hào)棧的棧頂符號(hào)進(jìn)展這兩個(gè)數(shù)的運(yùn)算,運(yùn)算結(jié)果數(shù)據(jù)再壓入操作數(shù)棧中。假設(shè)優(yōu)先級(jí)相等,則彈出符號(hào)棧棧頂符號(hào)。算符間的優(yōu)先關(guān)系如下〔‘#‘表示開場(chǎng)和完畢〕:+-*/()#+><<<<>>->><<<>>*>>>><>>/>>>><>>(<<<<<=)>>>>>>#<<<<<=表2.1運(yùn)算符優(yōu)先級(jí)表2.4altiumdesigner原理圖設(shè)計(jì)及PCB制作2.4.1原理圖設(shè)計(jì)圖2.6原理圖設(shè)計(jì)〔1〕——單片機(jī)局部圖2.7原理圖設(shè)計(jì)(2)——鍵盤、蜂鳴器局部PCB制作圖2.8PCB設(shè)計(jì)〔1〕——單片機(jī)局部圖2.9原理圖設(shè)計(jì)〔2〕——鍵盤、蜂鳴器局部注:在此并沒有布雙層板,紅色的線僅僅只是為了標(biāo)志出跳線或者本質(zhì)上實(shí)物已經(jīng)連接上了。設(shè)計(jì)結(jié)果圖2.10設(shè)計(jì)結(jié)果實(shí)物圖如以下圖,各個(gè)按鍵功能如圖中文字說明,電源為5V直流電源。3系統(tǒng)測(cè)試測(cè)試主要測(cè)試其運(yùn)算是否正確,及檢錯(cuò)能力。3.1整數(shù)運(yùn)算在此以整數(shù)運(yùn)算為例,介紹計(jì)算器的使用方法即流程。首先翻開電源,看到LCD翻開顯示,說明運(yùn)行正常,接著,輸入表達(dá)式:12*〔56+23〕*2,其結(jié)果本身應(yīng)為1896。輸入完畢后,點(diǎn)“=〞按鍵,即可在第二行顯示出運(yùn)算結(jié)果,由圖可見運(yùn)算完全正確。在使用時(shí),可以通過聲音開關(guān)按鈕控制按鍵音的翻開和關(guān)閉,在LCD上也有顯示,如果再第二行第一個(gè)位置沒有顯示,則沒有翻開聲音,可以通過按鈕翻開。假設(shè)有顯示,則聲音已經(jīng)翻開,可以通過按鈕關(guān)閉聲音。如圖3.1所示,此時(shí)已經(jīng)翻開聲音。圖3.1整數(shù)運(yùn)算3.2浮點(diǎn)數(shù)運(yùn)算圖3.2浮點(diǎn)數(shù)運(yùn)算由圖可以看出,可以進(jìn)展浮點(diǎn)數(shù)運(yùn)算,還可以從第二行第一個(gè)字符,蜂鳴器處于關(guān)閉狀態(tài)。3.3輸入出錯(cuò)的情況輸入一個(gè)錯(cuò)誤的表達(dá)式,如圖3.3所示。圖3.3輸入錯(cuò)誤的情況下再按“=〞號(hào),將會(huì)出現(xiàn)出錯(cuò)畫面。如圖3.4所示。圖3.4輸入錯(cuò)誤的顯示由以上測(cè)試可知,整個(gè)設(shè)計(jì)運(yùn)行正常,能夠正確的進(jìn)展運(yùn)算和出錯(cuò)提示。由此可得,整個(gè)設(shè)計(jì)是成功的。4結(jié)論與心得體會(huì)總之,通過一系列仿真和設(shè)計(jì),基于單片機(jī)的計(jì)算器設(shè)計(jì)還是比擬成功的做出來了。一路下來還是比擬坎坷,從原理到實(shí)物,從調(diào)試到調(diào)試成功,遇到了很多問題,特別是在軟件編程時(shí),開場(chǎng)以為既然單片機(jī)具有數(shù)據(jù)處理與運(yùn)算的能力,那么用它來做一個(gè)計(jì)算器應(yīng)該很簡(jiǎn)單了,可是,后面實(shí)際操作才知道,當(dāng)計(jì)算表達(dá)式時(shí),優(yōu)先級(jí)問題非常重要,一開場(chǎng)用了很多if語(yǔ)句來實(shí)現(xiàn),程序繁瑣復(fù)雜,且效果不是很好,很容易出錯(cuò),最后通過查閱相關(guān)資料,了解到利用數(shù)據(jù)構(gòu)造中棧的思想來解決這一問題就很方便。但在實(shí)際寫程序時(shí)也遇到了很多問題,但最終還是抑制難關(guān),將整個(gè)軟件比擬完善的實(shí)現(xiàn)了。在硬件的原理圖及PCB設(shè)計(jì)中,也遇到了很多問題,先做模塊后做主板,導(dǎo)致我后面的布線就很麻煩,這也教會(huì)了我一些經(jīng)歷,在PCB分模塊設(shè)計(jì)中,模塊與模塊之間的連接也是必須考慮到的,從左端連接還是從右端連接,都直接影響到整個(gè)PCB板的設(shè)計(jì)??傊?,通過這次設(shè)計(jì)也收獲了很多,知識(shí)層面上,學(xué)得了很多新知識(shí),解決問題的新方法,思考問題的新方向。實(shí)踐方面,提高了動(dòng)手能力,提高了解決實(shí)際問題的能力等等。在思想上,更加明白的堅(jiān)持不懈的重要性,學(xué)習(xí)探索的重要性,實(shí)踐動(dòng)手的重要性。5參考文獻(xiàn)【1】《單片機(jī)根基》第三版李廣弟朱月秀冷祖祁編著北京航天大學(xué)出版社,2007【2】《數(shù)據(jù)構(gòu)造》嚴(yán)蔚敏編著清華大學(xué)出版社附錄1元器件清單〔1〕晶振12M一個(gè)〔2〕stc89c52芯片一片〔3〕30pf2個(gè);10uf1個(gè);〔4〕40腳活動(dòng)底座一個(gè)〔5〕LCD液晶一個(gè)〔6〕按鍵21個(gè)〔7〕發(fā)光二極管1個(gè)〔8〕9引腳排阻1個(gè)〔9〕680Ω1個(gè);10k2個(gè);1k1個(gè);10k滑動(dòng)變阻器1個(gè);10Ω1個(gè);〔10〕開關(guān)1個(gè)〔11〕5V有源蜂鳴器1個(gè)〔12〕三極管S8550一個(gè)〔13〕排針假設(shè)干,杜邦線假設(shè)干附錄2程序清單分9個(gè)文件:delay.h,delay.c,1602.c,1602.h,stack.h,stack.c,keyboard.h,keyboard.c,main.c(a)delay.h程序清單:#ifndef__delay_h__#define__delay_h__voiddelay_us(uintcnt);voiddelay_ms(uintcnt);#endif(b)delay.c程序清單:#include"delay.h"voiddelay_us(unsignedintcnt){while(--cnt);}voiddelay_ms(unsignedintcnt){unsignedinti,j;for(i=0;i<cnt;i++){for(j=0;j<65;j++){delay_us(1);}}}(c)1602.h程序清單:#ifndef__LCD1602_H#define__LCD1602_HvoidLCD_write_com(unsignedcharcom);voidLCD_write_Data(unsignedcharData);voidLCD_clear(void);voidLCD_init(void);voidLCD_write_char(unsignedcharx,unsignedchary,unsignedcharData);voidLCD_write_str(unsignedcharx,unsignedchary,unsignedchar*s);#endif(d)1602.c程序清單:#include"includes.h"sbitRS=P2^4;//定義端口數(shù)據(jù)命令選擇H/LsbitRW=P2^5; //讀寫H/LsbitEN=P2^6; //使能externunsignedcharsk;#defineRS_CLRRS=0#defineRS_SETRS=1#defineRW_CLRRW=0#defineRW_SETRW=1#defineEN_CLREN=0#defineEN_SETEN=1/******************************************************************//*寫入命令函數(shù)*//******************************************************************/voidLCD_write_com(unsignedcharcom){ RS_CLR; RW_CLR; EN_SET; P0=com; delay_us(5); EN_CLR;}/******************************************************************//*寫入數(shù)據(jù)函數(shù)*//******************************************************************/voidLCD_write_Data(unsignedcharData){ RS_SET; RW_CLR; EN_SET; P0=Data; delay_us(5); EN_CLR;}/******************************************************************//*清屏函數(shù)*//******************************************************************/voidLCD_clear(void){ LCD_write_com(0x01); delay_ms(5); if(sk==1) { LCD_write_char(0,1,0xde); LCD_write_com(0x80); } else { LCD_write_char(0,1,0x20); LCD_write_com(0x80); }}/******************************************************************//*寫入字符串函數(shù)*//******************************************************************/voidLCD_write_str(unsignedcharx,unsignedchary,unsignedchar*s){ unsignedchari,j; if(y==0) { LCD_write_com(0x80+x); } else { LCD_write_com(0xC0+x); } for(i=4;i>0;i--) { if(s[14]=='0'||s[14]=='.') { for(j=14;j>1;j--) { s[j]=s[j-1]; } } elsebreak; } while(*s) { LCD_write_Data(*s); s++; }}/******************************************************************//*寫入字節(jié)函數(shù)*//******************************************************************/voidLCD_write_char(unsignedcharx,unsignedchary,unsignedcharData){ if(y==0) { LCD_write_com(0x80+x); } else { LCD_write_com(0xC0+x); } LCD_write_Data(Data);}/******************************************************************//*初始化函數(shù)*//******************************************************************/voidLCD_init(void){ LCD_write_com(0x38);/*顯示模式設(shè)置*/ delay_ms(5); LCD_write_com(0x38); delay_ms(5); LCD_write_com(0x38); delay_ms(5); LCD_write_com(0x38); LCD_write_com(0x08);/*顯示關(guān)閉*/ LCD_write_com(0x01);/*顯示清屏*/ LCD_write_com(0x06);/*顯示光標(biāo)移動(dòng)設(shè)置*/ delay_ms(5); LCD_write_com(0x0C);/*顯示開及光標(biāo)設(shè)置*/}(e)按鍵keyboard.h程序清單:#ifndef__KEYBOARD_H#define__KEYBOARD_HunsignedcharKeyProcess(void);//讀按鍵函數(shù)unsignedcharkeyscan(void);//鍵盤掃描函數(shù)#endif(f)按鍵keyboard.c程序清單:#include"includes.h"externunsignedcharsk;sbitkey0=P2^0;sbitkey1=P2^1; sbitkey2=P2^2;sbitkey3=P2^3;sbitspeak=P2^7;unsignedcharKeyProcess(void){unsignedcharkey; unsignedcharkeyvalue=16; key=keyscan(); //調(diào)用鍵盤掃描 switch(key){ case0xee:keyvalue=0;break;//0按下相應(yīng)的鍵顯示相對(duì)應(yīng)的碼值case0xde:keyvalue=1;break;//1按下相應(yīng)的鍵顯示相對(duì)應(yīng)的碼值case0xbe:keyvalue=2;break;//2case0x7e:keyvalue=3;break;//3case0xed:keyvalue=5;break;//4case0xdd:keyvalue=6;break;//5case0xbd:keyvalue=7;break;//6case0x7d:keyvalue=8;break;//7case0xeb:keyvalue=10;break;//8case0xdb:keyvalue=11;break;//9case0xbb:keyvalue=12;break;//10case0x7b:keyvalue=13;break;//11case0xe7:keyvalue=15;break;//12case0xd7:keyvalue=16;break;//13case0xb7:keyvalue=17;break;//14case0x77:keyvalue=18;break;//15case0x00:keyvalue=4;break;//key0case0x01:keyvalue=9;break;//key1case0x02:keyvalue=14;break;//key2case0x03:keyvalue=19;break;//key3case0xff:keyvalue=20;break;default:keyvalue=20;break; } returnkeyvalue;}unsignedcharkeyscan(void)//鍵盤掃描函數(shù),使用行列反轉(zhuǎn)掃描法{ unsignedcharcord_h,cord_l;//行列值中間變量 P3=0x0f;//行線輸出全為1,列線輸出全為0 cord_h=P3&0x0f;//讀入行線值 if(cord_h!=0x0f)//先檢測(cè)有無(wú)按鍵按下 { delay_us(100);//去抖 if(cord_h!=0x0f) { cord_h=P3&0x0f;//讀入行線值 P3=cord_h|0xf0;//輸出當(dāng)前行線值 cord_l=P3&0xf0;//讀入列線值 while(P3!=0x0f) { P3=0x0f; speak=!sk; } speak=1; delay_ms(20); return(cord_h+cord_l);//鍵盤最后組合碼值 } } if(key0==0) { delay_us(100); if(key0==0) { while(key0==0) { speak=!sk; } speak=1; delay_ms(3); return0x00; } } if(key1==0) { delay_us(100); if(key1==0) { while(key1==0) { speak=!sk; } speak=1; delay_ms(3); return0x01; } } if(key2==0) { delay_us(100); if(key2==0) { while(key2==0) { speak=!sk; } speak=1; delay_ms(3); return0x02; } } if(key3==0) { delay_us(100); if(key3==0) { while(key3==0) { speak=!sk; } speak=1; delay_ms(3); return0x03;} }return(0xff);//返回該值}(g)堆棧stack.h程序清單:#ifndef__STACK_H#define__STACK_Htypedefstruct{ char*rbase; char*rtop;}OPTR;//符號(hào)棧typedefstruct{ double*dbase; double*dtop;}OPND;//數(shù)據(jù)棧voidInit_OPTR(OPTR*s,char*TR1);voidPUSH_OPTR(OPTR*s,charelem);charPOP_OPTR(OPTR*s);voidInit_OPND(OPND*s,double*ND1);voidPUSH_OPND(OPND*s,doubleelem);doublePOP_OPND(OPND*s);charPrecede(chara,charb);doubleOperate(doublenum1,chartheta,doublenum2);voidPushnum(OPND*sq,doublec);voidPushdp(OPND*sq,charflag,doublec);#endif(h)堆棧stack.c程序清單:#include"includes.h"unsignedcharcodeyxj[7][7]={ //+-*/()#2,2,0,0,0,2,2,//+2,2,0,0,0,2,2,//-2,2,2,2,0,2,2,//* 2,2,2,2,0,2,2,///0,0,0,0,0,1,3,//(2,2,2,2,3,2,2,//)0,0,0,0,0,3,1,//#};voidInit_OPTR(OPTR*s,char*TR1){s->rbase=TR1; s->rtop=s->rbase;}voidPUSH_OPTR(OPTR*s,charelem){ *(s->rtop)=elem;s->rtop++;}charPOP_OPTR(OPTR*s){ chartemp; s->rtop--; temp=*(s->rtop);returntemp;}voidInit_OPND(OPND*s,double*ND1){s->dbase=ND1; s->dtop=s->dbase;}voidPUSH_OPND(OPND*s,doubleelem){ *(s->dtop)=elem;s->dtop++;}doublePOP_OPND(OPND*s){ doubletemp; s->dtop--; temp=*(s->dtop); returntemp;}charPrecede(chara,charb){ chari,j; switch(a) {case'+':i=0;break;case'-':i=1;break;case'*':i=2;break;case'/':i=3;break;case'(':i=4;break;case')':i=5;break;case'#':i=6;break;default:i=0;break; }switch(b) {case'+':j=0;break;case'-':j=1;break;case'*':j=2;break;case'/':j=3;break;case'(':j=4;break;case')':j=5;break;case'#':j=6;break;default:j=0;break; } returnyxj[i][j];}doubleOperate(doublenum1,chartheta,doublenum2){doublenum3;switch(theta) {case'+':num3=num1+num2;break;case'-':num3=num1-num2;break;case'*':num3=num1*num2;break;case'/':num3=num1/num2;break; } returnnum3;}voidPushnum(OPND*sq,doublec){doubletemp1,temp2;temp1=POP_OPND(sq);temp2=temp1*10+c; PUSH_OPND(sq,temp2);}voidPushdp(OPND*sq,charflag,doublec){doubletemp3,temp4;chari;doublej=1;for(i=0;i<flag;i++) {j=j*0.1; }temp3=POP_OPND(sq);temp4=temp3+c*j; PUSH_OPND(sq,temp4);}includes.h程序清單:#ifndef__INCLUDES_H#define__INCLUDES_H#include<reg52.h>#include"lcd1602.h"#include"keyboard.h"#include"delay.h"#include"stack.h"#include"stdio.h"#include"math.h"sfrISP_CONTR=0xe7;#endif(j)main.c程序清單:#include"includes.h"unsignedcharcodeuckey[20]={0x37,0x38,0x39,0x28,0x29,0x34,0x35,0x36,0x2b,0x2d,0x31,0x32,0x33,0x2a,0x2f,0x30,0x2e,0x64,0xde,0x3d};charidataTR[20];doubleidataND[20];voiddispdouble(doublevalue);doubleAccProcess(char*s);chargetonechar(void);unsignedcharkeycount=0;unsignedcharsk=0;voidErrorProcess(void);voidmain(void){ doublevalue; unsignedcharkeyvalue; unsignedcharipos=0; chars[32]; P2=0xff; delay_ms(100); LCD_init(); LCD_clear(); while(1){ while(1) { keyvalue=getonechar(); if(uckey[keyvalue]=='=') { s[ipos++]='#'; break; } else { if(uckey[keyvalue]=='d')//表示按下退格鍵 { s[--ipos]='0'; } elseif(uckey[keyvalue]==0xde)//表示按下聲音控制鍵 { sk=!sk; keycount--; if(sk==1) { LCD_write_char(0,1,0xde); LCD_write_com(0x80+keycount); } else { LCD_write_char(0,1,0x20); LCD_write_com(0x80+keycount); } } else { s[ipos++]=uckey[keyvalue]; } } } while(keycount>=16) { LCD_write_com(0x1c); delay_ms(5); keycount--; } s[ipos]='\0'; ipos=0; keycount=0; value=AccProcess(s); dispdouble(value); }}voiddispdouble(doublevalue){ chartext[15]; sprintf(text,"%15.3f",value);LCD_write_str(1,1,text);}doubleAccProcess(char*s){ OPTRstr;//符號(hào)棧 OPNDsnd;//數(shù)據(jù)棧charflagnum=0; charflagdp=0;chari=0; charc,theta; doublenum1,num2,num; Init_OPND(&snd,&ND[0]); Init_OPTR(&str,&TR[0]); PUSH_OPTR(&str,'#'); flagnum=0;c=*(s++);while(c!='#'||(*(str.rtop-1)!='#')) { if(c>='0'&&c<='9'){ c=c-0x30; if(flagdp==0) { if(flagnum==0) { PUSH_OPND(&snd,(double)c); flagnum++; }else { Push

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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)論