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

下載本文檔

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

文檔簡介

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

2、使用級浮點數(shù)的運算,并在lcd1602上顯示操作過程。本次設(shè)計注重設(shè)計方法及流程,首先根據(jù)原理設(shè)計電路,利用keil編程,借助實驗開發(fā)平臺進(jìn)行仿真實驗,進(jìn)而利用altium designer 制作pcb,最后到焊接元器件,直至調(diào)試成功。在設(shè)計的同時,特別注重keil軟件和altium designer軟件的使用方法和技巧以及常用的lcd顯示器和矩陣鍵盤的設(shè)計和使用方法?!娟P(guān)鍵詞】 計算器,stc89c52,矩陣鍵盤,1602液晶目錄1 系統(tǒng)方案設(shè)計- 5 -1.1 設(shè)計目的及要求- 5 -1.1.1 設(shè)計目的- 5 -1.1.2 設(shè)計要求- 5 -1.2 方案論證及選擇- 5 -1.2.1 方

3、案一 采用fpga控制- 6 -1.2.2 方案二 采用stc89c52- 6 -1.2.3 方案比較及選擇- 6 -2 單元電路設(shè)計- 7 -2.1 工作原理- 7 -2.2 硬件電路設(shè)計- 8 -2.2.1 單片機(jī)電路設(shè)計- 8 -2.2.2 鍵盤模塊電路- 9 -2.2.3 蜂鳴器提示電路- 9 -2.2.4 液晶顯示電路- 10 -2.3 軟件設(shè)計- 11 -2.3.1 鍵盤掃描- 11 -2.3.2 表達(dá)式的處理- 11 -2.4 altium designer 原理圖設(shè)計及pcb制作- 13 -2.4.1 原理圖設(shè)計- 13 -2.4.2pcb制作- 14 -2.4.3設(shè)計結(jié)果-

4、15 -3系統(tǒng)測試- 15 -3.1 整數(shù)運算- 15 -3.2 浮點數(shù)運算- 16 -3.3 輸入出錯的情況- 17 -4 結(jié)論與心得體會- 17 -5 參考文獻(xiàn)- 18 -附錄1 元器件清單- 18 -附錄2 程序清單- 19 -1 系統(tǒng)方案設(shè)計1.1 設(shè)計目的及要求1.1.1 設(shè)計目的通過本次課題設(shè)計,應(yīng)用單片機(jī)應(yīng)用基礎(chǔ)、數(shù)據(jù)結(jié)構(gòu)等所學(xué)相關(guān)知識及查閱資料,完成實用計算器的設(shè)計,以達(dá)到理論與實踐更好的結(jié)合、進(jìn)一步提高綜合運用所學(xué)知識和設(shè)計的能力的目的。通過本次設(shè)計的訓(xùn)練,可以使我在基本思路和基本方法上對基于mcs-51單片機(jī)的嵌入式系統(tǒng)設(shè)計有一個比較感性的認(rèn)識,并具備一定程度的設(shè)計能力。1

5、.1.2 設(shè)計要求在本次課程設(shè)計中,主要完成如下方面的設(shè)計要求:1、掌握mcs-51系列某種產(chǎn)品(例如8051)的最小電路及外圍擴(kuò)展電路的設(shè)計方法;2、計算器能實現(xiàn)基本的加、減、乘、除四則運算;3、支持浮點數(shù)運算;4、支持括號運算,允許括號的多層正確嵌套;5、較為友好的界面顯示,對輸入實時顯示,對計算結(jié)果輸出顯示;6、能夠具備比較完善的報錯系統(tǒng)1.2 方案論證及選擇基于設(shè)計要求,笨設(shè)計考慮了兩種設(shè)計方案,他們均可以實現(xiàn)計算器的功能,但基于設(shè)計目的及微控制器的廣泛運用,比較兩種方案的優(yōu)劣,最終選擇基于51單片機(jī)的計算器設(shè)計。1.2.1 方案一 采用fpga控制fpga是一種高密度的可編程邏輯器件

6、,自從xilinx公司1985年推出第一片fpga以來,fpga的集成密度和性能提高很快,其集成密度最高達(dá)500萬門/片以上,系統(tǒng)性能可達(dá)200mhz。由于fpga器件集成度高,方便易用,開發(fā)和上市周期短,在數(shù)字設(shè)計和電子生產(chǎn)中得到迅速普及和應(yīng)用,并一度在高密度的可編程邏輯器件領(lǐng)域中獨占鰲頭。但是而基于 sram編程的fpga,其編程信息需存放在外部存儲器上 ,需外部存儲器芯片 ,且使用方法復(fù)雜 ,保密性差,而其對于一個簡單的計算器而言,實用fpga有點大材小用,成本太高。1.2.2 方案二 采用stc89c52單片機(jī)是單片微型機(jī)的簡稱,故又稱為微控制器mcu(micro control un

7、it)。通常由單塊集成電路芯片組成,內(nèi)部包含有計算機(jī)的基本功能部件:中央處理器cpu,存儲器和i/o接口電路等。因此,單片機(jī)只要和適當(dāng)?shù)能浖巴獠吭O(shè)備相結(jié)合,便可成為一個單片機(jī)控制系統(tǒng)。單片機(jī)廣泛用于智能產(chǎn)品,智能儀表,測控技術(shù),智能接口等,具有操作簡單,實用方便,價格便宜等優(yōu)點,而其中at89s52以mcs-51為內(nèi)核,是單片機(jī)中最典型的代表,應(yīng)用于各種控制領(lǐng)域。1.2.3 方案比較及選擇通過以上兩種方案論證和比較,從設(shè)計的實用性,方便性和成本出發(fā),選擇了以stc89c52單片機(jī)作為中央處理單元進(jìn)行計算器的設(shè)計,這樣設(shè)計能夠?qū)崿F(xiàn)對六位浮點數(shù)的加減和三位浮點數(shù)的乘除運算。2 單元電路設(shè)計2.1

8、 工作原理利用矩陣鍵盤進(jìn)行按鍵的輸入,通過對矩陣鍵盤的掃描,獲取用戶的輸入,并實時的顯示在1602液晶上,每次獲取到輸入時,根據(jù)軟件設(shè)計的相應(yīng)方法對輸入進(jìn)行處理、運算,輸入結(jié)束后(以“=“為標(biāo)志),將最終的運算結(jié)果輸出的液晶上。系統(tǒng)組成及整體框圖如圖2.1所示。lcd液晶顯示屏模塊stc89c52主控制模塊(處理、運算)鍵盤模塊電源圖2.1 系統(tǒng)組成及總體框圖2.2 硬件電路設(shè)計2.2.1 單片機(jī)電路設(shè)計為使單片機(jī)正常工作,除電源供電部分外,還需提供晶振電路和復(fù)位電路。具體電路如下:圖2.2 單片機(jī)工作電路由圖2.2可知,9腳外接的是按鍵復(fù)位電路,18,19腳外接的是晶振電路,這樣,就構(gòu)成了單

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

10、成了對4*4的矩陣鍵盤的接線。同時,注意到按鍵數(shù)量還達(dá)不到要求,故增加了四個獨立按鍵s4,s9,s14,s19。他們依次接在p20p23口。可見,矩陣鍵盤相對來講更節(jié)省i/o口,但本著學(xué)習(xí)的目的,加之本設(shè)計并不需要太多的i/o口,故為充分學(xué)習(xí)和利用資源,在這里也設(shè)計了4個這樣的獨立按鍵。圖2.3 鍵盤模塊電路2.2.3 蜂鳴器提示電路蜂鳴器主要用于按鍵時發(fā)出聲音,提示當(dāng)前的按鍵操作,電路如圖2.5所示,三極管主要用于驅(qū)動蜂鳴器,因為單片機(jī)i/o的驅(qū)動能力有限。同時單片機(jī)i/o口還在這里還起到開關(guān)作用,為0時打開蜂鳴器通道,使蜂鳴器發(fā)聲。圖2.4 蜂鳴器提示電路2.2.4 液晶顯示電路lcd也是

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

12、掃描獨立鍵盤很好實現(xiàn),只需不停的檢測即可,出現(xiàn)低電平即出現(xiàn)按鍵,在經(jīng)過一定的延時消抖,再確認(rèn)判斷即可。矩陣鍵盤掃描程序,首先讀出p3的低四位,然后讀出p3口的高四位。然后確定鍵值并顯示緩存,最終將按鍵的值通過一個預(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á)式包含加、減、乘、除、括號等,必須按照相應(yīng)的優(yōu)先級運算,才可能得出正確的結(jié)果。

13、在這兒采用棧結(jié)構(gòu),可以有效的進(jìn)行表達(dá)式的處理。棧結(jié)構(gòu)具有“后進(jìn)先出”的固有屬性,借助這個屬性我們可以隨時對剛輸入的元素進(jìn)行操作,從而實現(xiàn)邊輸入邊計算。為了實現(xiàn)算符優(yōu)先算法??梢允褂脙蓚€工作棧。一個稱為optr,用以寄存運算符,另一個稱做opnd,用以寄存操作數(shù)或運算結(jié)果。1.首先置操作數(shù)棧為空棧,表達(dá)式起始符”#”為運算符棧的棧底元素;2.依次讀入表達(dá)式,若是操作符即進(jìn)opnd棧,若是運算符則和optr棧的棧頂運算符比較優(yōu)先權(quán)后作相應(yīng)的操作,直至整個表達(dá)式求值完畢(即optr棧的棧頂元素和當(dāng)前讀入的字符均為”#”)。在這里,相應(yīng)的處理指的是,如果當(dāng)前符號的優(yōu)先級比棧頂優(yōu)先級低,則將該符號繼續(xù)壓

14、入堆棧,不做其它操作;如果當(dāng)前符號的優(yōu)先級比棧頂優(yōu)先級高,則依次取出操作數(shù)棧的棧頂兩個數(shù)據(jù)和符號棧的棧頂符號進(jìn)行這兩個數(shù)的運算,運算結(jié)果數(shù)據(jù)再壓入操作數(shù)棧中。若優(yōu)先級相等,則彈出符號棧棧頂符號。算符間的優(yōu)先關(guān)系如下(#表示開始和結(jié)束):+-*/()#+-*/(#=表2.1 運算符優(yōu)先級表2.4 altium designer 原理圖設(shè)計及pcb制作2.4.1 原理圖設(shè)計圖2.6 原理圖設(shè)計(1)單片機(jī)部分圖2.7 原理圖設(shè)計(2)鍵盤、蜂鳴器部分2.4.2 pcb制作圖2.8 pcb設(shè)計(1)單片機(jī)部分圖2.9 原理圖設(shè)計(2)鍵盤、蜂鳴器部分注:在此并沒有布雙層板,紅色的線僅僅只是為了標(biāo)志出

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

16、經(jīng)打開,可以通過按鈕關(guān)閉聲音。如圖3.1所示,此時已經(jīng)打開聲音。圖3.1 整數(shù)運算3.2 浮點數(shù)運算圖3.2 浮點數(shù)運算由圖可以看出,可以進(jìn)行浮點數(shù)運算,還可以從第二行第一個字符,蜂鳴器處于關(guān)閉狀態(tài)。3.3 輸入出錯的情況輸入一個錯誤的表達(dá)式,如圖3.3所示。圖3.3 輸入錯誤的情況下再按“=”號,將會出現(xiàn)出錯畫面。如圖3.4所示。圖3.4 輸入錯誤的顯示由以上測試可知,整個設(shè)計運行正常,能夠正確的進(jìn)行運算和出錯提示。由此可得,整個設(shè)計是成功的。4 結(jié)論與心得體會總之,通過一系列仿真和設(shè)計,基于單片機(jī)的計算器設(shè)計還是比較成功的做出來了。一路下來還是比較坎坷,從原理到實物,從調(diào)試到調(diào)試成功,遇到

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

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

19、腳排阻 1個(9)680 1個;10k 2個;1k 1個;10k滑動變阻器 1個; 10 1個;(10) 開關(guān)1個(11) 5v有源蜂鳴器1個(12) 三極管s8550一個(13)排針若干,杜邦線若干附錄2 程序清單分9個文件: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)移動設(shè)置*/ delay_ms(5); lcd_write_com(0x0c); /*顯示開及光標(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)的鍵顯示相對應(yīng)的碼值 case 0xde:keyvalue = 1;bre

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

評論

0/150

提交評論