基于51單片機(jī)的多功能計(jì)算器設(shè)計(jì)課程設(shè)計(jì)1_第1頁(yè)
基于51單片機(jī)的多功能計(jì)算器設(shè)計(jì)課程設(shè)計(jì)1_第2頁(yè)
基于51單片機(jī)的多功能計(jì)算器設(shè)計(jì)課程設(shè)計(jì)1_第3頁(yè)
基于51單片機(jī)的多功能計(jì)算器設(shè)計(jì)課程設(shè)計(jì)1_第4頁(yè)
基于51單片機(jī)的多功能計(jì)算器設(shè)計(jì)課程設(shè)計(jì)1_第5頁(yè)
已閱讀5頁(yè),還剩31頁(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、 微機(jī)原理課程設(shè)計(jì)設(shè)計(jì)課題 基于51單片機(jī)的計(jì)算器設(shè)計(jì) 【摘要】 當(dāng)今社會(huì),隨著人們物質(zhì)生活的不斷提高,電子產(chǎn)品已經(jīng)走進(jìn)了家家戶戶,無(wú)論是生活或?qū)W習(xí),還是娛樂(lè)和消遣幾乎樣樣都離不開(kāi)電子產(chǎn)品,大型復(fù)雜的計(jì)算能力是人腦所不能勝任的,而且人腦比較容易出錯(cuò)。計(jì)算器作為一種快速通用的計(jì)算工具方便了用戶的使用。計(jì)算器可謂是我們最親密的電子伙伴之一。本設(shè)計(jì)著重在于分析計(jì)算器設(shè)計(jì)開(kāi)發(fā)過(guò)程中的環(huán)節(jié)和步驟,并從實(shí)踐經(jīng)驗(yàn)出發(fā)對(duì)計(jì)算器設(shè)計(jì)做了詳細(xì)的分析和研究。本設(shè)計(jì)是以stc89c52單片機(jī)為核心的計(jì)算器模擬系統(tǒng)設(shè)計(jì),輸入采用44矩陣鍵盤再加上4個(gè)獨(dú)立按鍵,可以進(jìn)行加、減、乘、除7位帶符號(hào)數(shù)字運(yùn)算,同時(shí)支持括號(hào)的嵌套

2、使用級(jí)浮點(diǎn)數(shù)的運(yùn)算,并在lcd1602上顯示操作過(guò)程。本次設(shè)計(jì)注重設(shè)計(jì)方法及流程,首先根據(jù)原理設(shè)計(jì)電路,利用keil編程,借助實(shí)驗(yàn)開(kāi)發(fā)平臺(tái)進(jìn)行仿真實(shí)驗(yàn),進(jìn)而利用altium designer 制作pcb,最后到焊接元器件,直至調(diào)試成功。在設(shè)計(jì)的同時(shí),特別注重keil軟件和altium designer軟件的使用方法和技巧以及常用的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 方

3、案一 采用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.4 altium designer 原理圖設(shè)計(jì)及pcb制作- 13 -2.4.1 原理圖設(shè)計(jì)- 13 -2.4.2pcb制作- 14 -2.4.3設(shè)計(jì)結(jié)果-

4、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ì)目的通過(guò)本次課題設(shè)計(jì),應(yīng)用單片機(jī)應(yīng)用基礎(chǔ)、數(shù)據(jù)結(jié)構(gòu)等所學(xué)相關(guān)知識(shí)及查閱資料,完成實(shí)用計(jì)算器的設(shè)計(jì),以達(dá)到理論與實(shí)踐更好的結(jié)合、進(jìn)一步提高綜合運(yùn)用所學(xué)知識(shí)和設(shè)計(jì)的能力的目的。通過(guò)本次設(shè)計(jì)的訓(xùn)練,可以使我在基本思路和基本方法上對(duì)基于mcs-51單片機(jī)的嵌入式系統(tǒng)設(shè)計(jì)有一個(gè)比較感性的認(rèn)識(shí),并具備一定程度的設(shè)計(jì)能力。1

5、.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是一種高密度的可編程邏輯器件

6、,自從xilinx公司1985年推出第一片fpga以來(lái),fpga的集成密度和性能提高很快,其集成密度最高達(dá)500萬(wàn)門/片以上,系統(tǒng)性能可達(dá)200mhz。由于fpga器件集成度高,方便易用,開(kāi)發(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(micro control un

7、it)。通常由單塊集成電路芯片組成,內(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à)格便宜等優(yōu)點(diǎn),而其中at89s52以mcs-51為內(nèi)核,是單片機(jī)中最典型的代表,應(yīng)用于各種控制領(lǐng)域。1.2.3 方案比較及選擇通過(guò)以上兩種方案論證和比較,從設(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

8、 工作原理利用矩陣鍵盤進(jìn)行按鍵的輸入,通過(guò)對(duì)矩陣鍵盤的掃描,獲取用戶的輸入,并實(shí)時(shí)的顯示在1602液晶上,每次獲取到輸入時(shí),根據(jù)軟件設(shè)計(jì)的相應(yīng)方法對(duì)輸入進(jìn)行處理、運(yùn)算,輸入結(jié)束后(以“=“為標(biāo)志),將最終的運(yùn)算結(jié)果輸出的液晶上。系統(tǒng)組成及整體框圖如圖2.1所示。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)成了單

9、片機(jī)正常工作的必備電路。同時(shí),為使p0口正常工作,并增加其帶負(fù)載能力,p0口需接了上拉電阻。圖中ea為外部訪問(wèn)允許,欲使cpu僅訪問(wèn)外部程序存儲(chǔ)器(地址為0000h-ffffh),ea端必須保持低電平(接地)。在這里,stc89c52單片機(jī)8k的程序存儲(chǔ)器已經(jīng)夠本設(shè)計(jì)使用,無(wú)需外部程序儲(chǔ)存器,故ea直接接高電平。 2.2.2 鍵盤模塊電路圖2.3是鍵盤電路,共20個(gè)按鍵,用來(lái)實(shí)現(xiàn)人機(jī)交互和運(yùn)算表達(dá)式的輸入,s0s3、s5s8、s10s13、s15s18共16個(gè)按鍵組成一組4*4的矩陣鍵盤,行線第一行到第四行分別接在p3.0p3.3口,列線第一列到第四列分別接在p3.4p3.7口,這樣p3口就完

10、成了對(duì)4*4的矩陣鍵盤的接線。同時(shí),注意到按鍵數(shù)量還達(dá)不到要求,故增加了四個(gè)獨(dú)立按鍵s4,s9,s14,s19。他們依次接在p20p23口??梢?jiàn),矩陣鍵盤相對(duì)來(lái)講更節(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口還在這里還起到開(kāi)關(guān)作用,為0時(shí)打開(kāi)蜂鳴器通道,使蜂鳴器發(fā)聲。圖2.4 蜂鳴器提示電路2.2.4 液晶顯示電路lcd也是

11、本次設(shè)計(jì)的重要組成部分之一,主要用于顯示輸入和輸出。電路如圖2.5所示,lcd數(shù)據(jù)端與單片機(jī)p0口相連,控制端與p24p26連接,電位器用于調(diào)節(jié)對(duì)比度。圖2.5 lcd顯示電路至此,整個(gè)電容測(cè)量?jī)x的硬件設(shè)計(jì)部分就基本設(shè)計(jì)完成,接下來(lái),需要的就是與之相匹配的軟件支持了。2.3 軟件設(shè)計(jì)軟件編程平臺(tái)選擇最常用的keil軟件。由于該程序并未涉及到底層的驅(qū)動(dòng)問(wèn)題,因此選擇方便快捷的c語(yǔ)言編程。在編程中,將該程序分為四個(gè)模塊:延時(shí)模塊、1602顯示模塊、用于處理計(jì)算表達(dá)式的對(duì)戰(zhàn)模塊及主函數(shù)模塊。采用模塊化設(shè)計(jì),方便調(diào)試與理解。具體程序見(jiàn)附錄二。在這里重點(diǎn)介紹軟件核心的表達(dá)式處理程序算法。2.3.1 鍵盤

12、掃描獨(dú)立鍵盤很好實(shí)現(xiàn),只需不停的檢測(cè)即可,出現(xiàn)低電平即出現(xiàn)按鍵,在經(jīng)過(guò)一定的延時(shí)消抖,再確認(rèn)判斷即可。矩陣鍵盤掃描程序,首先讀出p3的低四位,然后讀出p3口的高四位。然后確定鍵值并顯示緩存,最終將按鍵的值通過(guò)一個(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é)果。

13、在這兒采用棧結(jié)構(gòu),可以有效的進(jìn)行表達(dá)式的處理。棧結(jié)構(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á)式,若是操作符即進(jìn)opnd棧,若是運(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ù)壓

14、入堆棧,不做其它操作;如果當(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ù)棧中。若優(yōu)先級(jí)相等,則彈出符號(hào)棧棧頂符號(hào)。算符間的優(yōu)先關(guān)系如下(#表示開(kāi)始和結(jié)束):+-*/()#+-*/(#=表2.1 運(yùn)算符優(yōu)先級(jí)表2.4 altium designer 原理圖設(shè)計(jì)及pcb制作2.4.1 原理圖設(shè)計(jì)圖2.6 原理圖設(shè)計(jì)(1)單片機(jī)部分圖2.7 原理圖設(shè)計(jì)(2)鍵盤、蜂鳴器部分2.4.2 pcb制作圖2.8 pcb設(shè)計(jì)(1)單片機(jī)部分圖2.9 原理圖設(shè)計(jì)(2)鍵盤、蜂鳴器部分注:在此并沒(méi)有布雙層板,紅色的線僅僅只是為了標(biāo)志出

15、跳線或者本質(zhì)上實(shí)物已經(jīng)連接上了。2.4.3 設(shè)計(jì)結(jié)果圖2.10 設(shè)計(jì)結(jié)果實(shí)物圖如圖所示,各個(gè)按鍵功能如圖中文字說(shuō)明,電源為5v直流電源。3系統(tǒng)測(cè)試測(cè)試主要測(cè)試其運(yùn)算是否正確,及檢錯(cuò)能力。3.1 整數(shù)運(yùn)算在此以整數(shù)運(yùn)算為例,介紹計(jì)算器的使用方法即流程。首先打開(kāi)電源,看到lcd打開(kāi)顯示,說(shuō)明運(yùn)行正常,接著,輸入表達(dá)式:12*(56+23)*2,其結(jié)果本身應(yīng)為1896。輸入結(jié)束后,點(diǎn)“=”按鍵,即可在第二行顯示出運(yùn)算結(jié)果,由圖可見(jiàn)運(yùn)算完全正確。在使用時(shí),可以通過(guò)聲音開(kāi)關(guān)按鈕控制按鍵音的打開(kāi)和關(guān)閉,在lcd上也有顯示,如果再第二行第一個(gè)位置沒(méi)有顯示,則沒(méi)有打開(kāi)聲音,可以通過(guò)按鈕打開(kāi)。若有顯示,則聲音已

16、經(jīng)打開(kāi),可以通過(guò)按鈕關(guān)閉聲音。如圖3.1所示,此時(shí)已經(jīng)打開(kāi)聲音。圖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ì)總之,通過(guò)一系列仿真和設(shè)計(jì),基于單片機(jī)的計(jì)算器設(shè)計(jì)還是比較成功的做出來(lái)了。一路下來(lái)還是比較坎坷,從原理到實(shí)物,從調(diào)試到調(diào)試成功,遇到

17、了很多問(wèn)題,特別是在軟件編程時(shí),開(kāi)始以為既然單片機(jī)具有數(shù)據(jù)處理與運(yùn)算的能力,那么用它來(lái)做一個(gè)計(jì)算器應(yīng)該很簡(jiǎn)單了,可是,后面實(shí)際操作才知道,當(dāng)計(jì)算表達(dá)式時(shí),優(yōu)先級(jí)問(wèn)題非常重要,一開(kāi)始用了很多if語(yǔ)句來(lái)實(shí)現(xiàn),程序繁瑣復(fù)雜,且效果不是很好,很容易出錯(cuò),最后通過(guò)查閱相關(guān)資料,了解到利用數(shù)據(jù)結(jié)構(gòu)中棧的思想來(lái)解決這一問(wèn)題就很方便。但在實(shí)際寫程序時(shí)也遇到了很多問(wèn)題,但最終還是克服難關(guān),將整個(gè)軟件比較完善的實(shí)現(xiàn)了。在硬件的原理圖及pcb設(shè)計(jì)中,也遇到了很多問(wèn)題,先做模塊后做主板,導(dǎo)致我后面的布線就很麻煩,這也教會(huì)了我一些經(jīng)驗(yàn),在pcb分模塊設(shè)計(jì)中,模塊與模塊之間的連接也是必須考慮到的,從左端連接還是從右端連接

18、,都直接影響到整個(gè)pcb板的設(shè)計(jì)。總之,通過(guò)這次設(shè)計(jì)也收獲了很多,知識(shí)層面上,學(xué)得了很多新知識(shí),解決問(wèn)題的新方法,思考問(wèn)題的新方向。實(shí)踐方面,提高了動(dòng)手能力,提高了解決實(shí)際問(wèn)題的能力等等。在思想上,更加明白的堅(jiān)持不懈的重要性,學(xué)習(xí)探索的重要性,實(shí)踐動(dòng)手的重要性。5 參考文獻(xiàn)【1】 單片機(jī)基礎(chǔ)第三版 李廣弟 朱月秀 冷祖祁 編著 北京航天大學(xué)出版社,2007【2】 數(shù)據(jù)結(jié)構(gòu)嚴(yán)蔚敏 編著 清華大學(xué)出版社附錄1 元器件清單(1)晶振12m一個(gè)(2)stc89c52芯片一片(3)30pf 2個(gè);10uf 1個(gè); (4)40腳活動(dòng)底座一個(gè)(5)lcd液晶一個(gè)(6)按鍵21個(gè)(7)發(fā)光二極管1個(gè)(8)9引

19、腳排阻 1個(gè)(9)680 1個(gè);10k 2個(gè);1k 1個(gè);10k滑動(dòng)變阻器 1個(gè); 10 1個(gè);(10) 開(kāi)關(guān)1個(gè)(11) 5v有源蜂鳴器1個(gè)(12) 三極管s8550一個(gè)(13)排針若干,杜邦線若干附錄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_void delay_us(uint cnt);void delay_ms(uint cnt);#endif(b) del

20、ay.c 程序清單:#include delay.hvoid delay_us(unsigned int cnt) while(-cnt);void delay_ms(unsigned int cnt) unsigned int i, j; for (i = 0; i cnt; i+) for (j = 0;j 0;i-)if(s14 = 0 | s14 = .) for(j=14;j1;j-)sj = sj-1;else break; while (*s) lcd_write_data(*s); s+; /*/* 寫入字節(jié)函數(shù) */*/void lcd_write_char(unsigned

21、 char x,unsigned char y,unsigned char data) if (y = 0) lcd_write_com(0x80 + x); else lcd_write_com(0xc0 + x); lcd_write_data(data); /*/* 初始化函數(shù) */*/void lcd_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);

22、 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); /*顯示開(kāi)及光標(biāo)設(shè)置*/(e)按鍵keyboard.h程序清單:#ifndef _keyboard_h#define _keyboard_hunsigned char keyprocess(void); /讀按鍵函數(shù)unsigned char keyscan(void); /鍵盤掃描函數(shù)#endif (f)按鍵keyboard.c程序清單:

23、#include includes.hextern unsigned char sk;sbit key0=p20;sbit key1=p21; sbit key2=p22;sbit key3=p23;sbit speak=p27;unsigned char keyprocess(void)unsigned char key;unsigned char keyvalue = 16;key=keyscan(); /調(diào)用鍵盤掃描 switch(key) case 0xee:keyvalue = 0;break; /0 按下相應(yīng)的鍵顯示相對(duì)應(yīng)的碼值 case 0xde:keyvalue = 1;bre

24、ak; /1 按下相應(yīng)的鍵顯示相對(duì)應(yīng)的碼值 case 0xbe:keyvalue = 2;break; /2 case 0x7e:keyvalue = 3;break; /3 case 0xed:keyvalue = 5;break; /4 case 0xdd:keyvalue = 6;break; /5 case 0xbd:keyvalue = 7;break; /6 case 0x7d:keyvalue = 8;break; /7 case 0xeb:keyvalue = 10;break; /8 case 0xdb:keyvalue = 11;break; /9 case 0xbb:ke

25、yvalue = 12;break; /10 case 0x7b:keyvalue = 13;break; /11 case 0xe7:keyvalue = 15;break; /12 case 0xd7:keyvalue = 16;break; /13 case 0xb7:keyvalue = 17;break; /14 case 0x77:keyvalue = 18;break; /15 case 0x00:keyvalue = 4;break; /key0 case 0x01:keyvalue = 9;break; /key1 case 0x02:keyvalue = 14;break;

26、 /key2 case 0x03:keyvalue = 19;break; /key3 case 0xff:keyvalue = 20;break; default: keyvalue = 20;break; return keyvalue;unsigned char keyscan(void) /鍵盤掃描函數(shù),使用行列反轉(zhuǎn)掃描法unsigned char cord_h,cord_l; /行列值中間變量p3=0x0f; /行線輸出全為1,列線輸出全為0cord_h=p3&0x0f; /讀入行線值if(cord_h!=0x0f) /先檢測(cè)有無(wú)按鍵按下delay_us(100); /去抖if(co

27、rd_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);return 0x00;if(key1 = 0) delay_us(100);if(k

28、ey1=0)while(key1 = 0)speak = !sk;speak = 1;delay_ms(3);return 0x01;if(key2 = 0) delay_us(100);if(key2=0)while(key2 = 0)speak = !sk;speak = 1;delay_ms(3);return 0x02;if(key3 = 0) delay_us(100);if(key3=0)while(key3 = 0)speak = !sk;speak = 1;delay_ms(3);return 0x03; return(0xff); /返回該值(g)堆棧stack.h程序清單:

29、#ifndef _stack_h#define _stack_htypedef struct char *rbase;char *rtop;optr; /符號(hào)棧typedef struct double *dbase;double *dtop;opnd; /數(shù)據(jù)棧void init_optr(optr *s,char *tr1);void push_optr(optr *s,char elem);char pop_optr(optr *s);void init_opnd(opnd *s,double *nd1);void push_opnd(opnd *s,double elem);doubl

30、e pop_opnd(opnd *s);char precede(char a,char b);double operate(double num1,char theta,double num2);void pushnum(opnd *sq,double c);void pushdp(opnd *sq,char flag,double c);#endif(h)堆棧stack.c程序清單:#include includes.hunsigned char code yxj77 = / + - * / ( ) # 2,2,0,0,0,2,2, / + 2,2,0,0,0,2,2, / - 2,2,2

31、,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, / #;void init_optr(optr *s,char *tr1) s-rbase = tr1;s-rtop = s-rbase;void push_optr(optr *s,char elem)* (s-rtop) = elem;s-rtop +;char pop_optr(optr *s)char temp;s-rtop-;temp= *(s-rtop); return temp;void init_opnd(op

32、nd *s,double *nd1) s-dbase = nd1;s-dtop = s-dbase;void push_opnd(opnd *s,double elem)* (s-dtop) = elem; s-dtop +;double pop_opnd(opnd *s)double temp;s-dtop-;temp= *(s-dtop);return temp;char precede(char a,char b)char i,j;switch(a) case +:i=0;break; case -:i=1;break; case *:i=2;break; case /:i=3;brea

33、k; 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;return yxjij;double operate(double num1,char theta,double num2) doub

34、le num3; switch(theta) case +:num3 = num1 + num2;break; case -:num3 = num1 - num2;break; case *:num3 = num1 * num2;break; case /:num3 = num1 / num2;break; return num3;void pushnum(opnd *sq,double c) double temp1,temp2; temp1 = pop_opnd(sq); temp2 = temp1 * 10 + c;push_opnd(sq,temp2);void pushdp(opnd

35、 *sq,char flag,double c) double temp3,temp4; char i; double j = 1; for(i=0;iflag;i+) j = j * 0.1; temp3 = pop_opnd(sq); temp4 = temp3 + c * j;push_opnd(sq,temp4);(i) includes.h程序清單:#ifndef _includes_h#define _includes_h#include #include lcd1602.h#include keyboard.h#include delay.h#include stack.h#include stdio.h#include math.hsfr isp_contr = 0xe7;#endif (j)main.c程序清單:#include includes.hunsigned char code uckey20 = 0x37,0x38,0x39,0x28,0x29, 0x34,0x35,0x36,0x2b,0x2d, 0x31,0x32,0x33,0x2a,

溫馨提示

  • 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ù)網(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)論