計算器單片機技術課程設計_第1頁
已閱讀1頁,還剩56頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  《單片機技術》課程設計說明書</p><p><b>  計算器</b></p><p>  學 院: </p><p>  學生姓名: </p><p>  指導教師: 職稱 </p><p>  專 業(yè): <

2、/p><p>  班 級: </p><p>  學 號: </p><p>  完成時間: </p><p>  湖南工學院《單片機技術》課程設計課題任務書</p><p>  學院: 專業(yè):</p>

3、;<p><b>  摘 要</b></p><p>  隨著社會的發(fā)展,科學的進步,人們的生活水平在逐步的提搞,尤其是微電子技術的發(fā)展,猶如雨后春筍般變化。單片機的應用已經越來越貼近生活,用單片機來實現(xiàn)一些電子設計也變得容易起來。計算器在人們的日常中是比較常見的電子產品之一??墒撬€在發(fā)展之中,以后必將出現(xiàn)功能更加強大的計算器?;谶@樣的理念,本次設計是用單片機來設計的計算

4、器。</p><p>  該設計以STC89C54RD+單片機為控制運算器,以4*4矩陣鍵盤和6個獨立按鍵控制,以LCD1602液晶顯示,以USB接口充電來供電。</p><p>  對于此計算器我用了23個按鍵,10個數(shù)字鍵,4個常用運算鍵,1個等號鍵,1個清零鍵,1個平方鍵,1個開方鍵,3個三角函數(shù)運算鍵,1個十進制轉十六進制按鍵和1個十六進制轉十進制按鍵。</p>&l

5、t;p>  該計算器上電后能自動顯示系統(tǒng)提示符“P.”,進入準備工作狀態(tài)。能實現(xiàn)基本的加、減、乘、除、平方、開方;還能實現(xiàn)三角函數(shù)運算和十進制、十六進制轉換運算。已符合設計要求,具有一定的推廣價值。</p><p>  關鍵詞:單片機;LCD1602液晶顯示;矩陣鍵盤;獨立式鍵盤</p><p><b>  目 錄</b></p><p&g

6、t;<b>  1 緒論1</b></p><p>  1.1 計算器研究意義1</p><p>  1.2 實現(xiàn)功能1</p><p>  1.3 工作原理2</p><p>  2 計算器硬件系統(tǒng)設計3</p><p>  2.1 STC89C54RD+單片機簡介3&l

7、t;/p><p>  2.2 電源模塊4</p><p>  2.3 復位模塊4</p><p>  2.4 時鐘模塊4</p><p>  2.5 下載模塊5</p><p>  2.6 顯示模塊5</p><p>  2.7 輸入模塊6</p><p&

8、gt;  2.8 電路原理圖7</p><p>  2.9 電路實物圖7</p><p>  2.10 元器件清單7</p><p>  3 計算器軟件系統(tǒng)設計7</p><p>  3.1 單片機資源使用8</p><p>  3.2 監(jiān)控函數(shù)模塊8</p><p>  

9、3.3 顯示模塊8</p><p>  3.4 鍵掃模塊9</p><p>  3.5 延時模塊9</p><p>  3.6 定時模塊10</p><p>  3.7 系統(tǒng)程序清單10</p><p>  4 實物調試11</p><p>  4.1 操作使用說明1

10、1</p><p>  4.2 測試過程11</p><p>  4.3 計算器誤差分析14</p><p>  4.4 設計體會14</p><p><b>  結束語16</b></p><p><b>  參考文獻17</b></p>&l

11、t;p><b>  致 謝18</b></p><p><b>  附 錄19</b></p><p>  附錄A 電路原理圖19</p><p>  附錄B 電路實物圖20</p><p>  附錄C 元器件清單21</p><p>  附錄D

12、程序清單22</p><p><b>  1 緒論 </b></p><p>  1.1 計算器研究意義</p><p>  中國古代最早采用的一種計算工具叫籌策,又被叫做算籌。這種算籌多用竹子制成,也有用木頭,獸骨充當材料的。約二百七十枚一束,放在布袋里可隨身攜帶。 直到今天仍在使用的珠算盤,是中國古代計算工具領域中的另一項發(fā)明,明代時

13、的珠算盤已經與現(xiàn)代的珠算盤幾乎相同。 17世紀初,西方國家的計算工具有了較大的發(fā)展,英國數(shù)學家納皮爾發(fā)明的“納皮爾算籌”,英國牧師奧卻德發(fā)明了圓柱型對數(shù)計算尺,這種計算尺不僅能做加減乘除、乘方、開方運算,甚至可以計算三角函數(shù),指數(shù)函數(shù)和對數(shù)函數(shù),這些計算工具不僅帶動了計算器的發(fā)展,也為現(xiàn)代計算器發(fā)展奠定了良好的基礎,成為現(xiàn)代社會應用廣泛的計算工具。</p><p>  隨著電子技術的不斷發(fā)展,計算器的功能也越來越

14、強大,已經不僅僅限于單純的數(shù)學運算和函數(shù)運算,各種功能強大的計算器在財務、銀行、工程、測繪等方面也得到了廣泛的應用。國內的計算器從產生到發(fā)展成熟,也經歷了一段過程。從簡單的計算到復雜的計算,從單功能到多功能。近年來國內的計算器呈現(xiàn)出新的特點,不僅設計精巧、緊湊,功能實用、簡練。包括:數(shù)據(jù)記錄、聲音提示、公式運算、財務計算、外幣兌換、解方程式、衡(計)量換算、 將數(shù)值轉換為中文大寫金額和英文 等,而且成本也減少了。而隨著計算機的普及,又出

15、現(xiàn)了軟件計算器,軟件計算器的功能更加強大,而且計算的位數(shù)增加,更加精確,而且懂得計算機的人可以借助軟件來設計各種不同的計算器,實現(xiàn)功能裁剪,因此非常靈活。軟件計算器的缺點是攜帶不便。真正來說國內計算器的設計是以實用為前提的。</p><p>  而國外的計算器的發(fā)展已經發(fā)展到各行各業(yè),外設大多凝集了其它產品的功能,而且許多功能讓人覺得實在離譜。把實用性和科學應用聯(lián)合起來才能適應更多的應用場合,因此決定設計一個實用

16、性和科學性相結合的計算器作為我的研究課題。</p><p>  在檢測系統(tǒng)設計中熟悉并了解將作為單片機為控制核心,并輔以矩陣鍵盤和獨立式鍵盤以實現(xiàn)課題所要求的功能。本課題主要要求掌握計算器相應的軟硬件實現(xiàn)方法。扎實掌握并運用課題相關的學科理論知識,根據(jù)實際電路盡量設計制作出完美的計算器,以實現(xiàn)理論與實踐的統(tǒng)一。</p><p><b>  1.2 實現(xiàn)功能</b>&

17、lt;/p><p>  計算器在上電或按鍵復位之后能自動顯示系統(tǒng)提示符“P”,進入準備工作狀態(tài)。</p><p>  計算器能實現(xiàn)基本的加、減、乘、除、平方、開方。</p><p><b>  實現(xiàn)三角函數(shù)運算。</b></p><p>  能十進制、十六進制轉換運算。</p><p><b&g

18、t;  1.3 工作原理</b></p><p>  設計一個計算器,設計中采用的是STC89C54RD+ 單片機用軟件實現(xiàn)數(shù)據(jù)信號的輸出。該單片機是一個微型計算機,包括中央處理器 CPU,RAM,ROM,I/O 接口電路、定時計數(shù)器、串行通訊等,是計算器設計的核心。總體原理為:利用 STC89C54RD+ 單片機構造多功能處理,可進行計時以及監(jiān)控外部中斷系統(tǒng),通過C語言對單片機的編程即可進行運算傳

19、送信號,并可以通過鍵盤進行各種功能的轉換,當輸出的信號通過顯示器顯示輸出的信息。硬件系統(tǒng)以STC89C54RD+單片機為控制核心,輔以LCD1602液晶顯示、鍵盤輸入模塊等電路實現(xiàn)計算器的基本功能;軟件系統(tǒng)包括包含延時模塊、鍵掃模塊、顯示模塊、定時模塊、監(jiān)控函數(shù)模塊??傮w設計框圖如圖1所示。</p><p>  圖1 總體硬件電路框圖</p><p>  2 計算器硬件系統(tǒng)設計<

20、/p><p>  2.1 STC89C54RD+單片機簡介</p><p>  以STC89C54RD+單片機為控制核心,外擴外圍電路,完成計算器所需要的外圍電路。顯示模塊,輸入模塊,復位模塊等。STC89C54RD+單片機內部配以基本單元:即三個定時/計數(shù)器、5個中斷源??捎删幊虂韺崿F(xiàn)根據(jù)定時、計數(shù)時計數(shù)溢出而產生的中斷申請信號中斷功能,并由LCD1602液晶對被測值進行顯示。STC89C

21、54RD+系列單片機,具有反應速度極快,工作效率特高的特點。</p><p>  STC89C54RD+單片機的基本特點是低功耗、高性能,片內由4KB可編程/擦除只讀存儲器的8位COMS微控制器組成,通過結合高密度、非易失存儲技術來保證單片機引腳與相應指令系統(tǒng)的高兼容度。由于芯片里FLASH的存在,因此可以通過通用的非易失存儲編程器實現(xiàn)在線編程以及重復編程等功能。在通常情況下,當系統(tǒng)掉電時,數(shù)據(jù)存儲器的內容立即會

22、被保存下來,而此時單片機其他一切都會停止工作,直到產生下一個中斷或硬件復位信號整個系統(tǒng)才會重新開始工作。</p><p>  STC89C54RD+的內部特點:具有40個引腳、8K片內程序存儲器空間、256B的隨機存取數(shù)據(jù)存儲器,32個外部雙向輸入/輸出I/O口,5個中斷優(yōu)先級2層中斷嵌套中斷,2個16位可編程定時計數(shù)器,2個狗(WDT)電路,片內時鐘振蕩器。STC89C54RD+引腳圖如圖2所示。</p&

23、gt;<p>  圖2 STC89C54RD+引腳圖</p><p><b>  2.2 電源模塊</b></p><p>  電源電路是給計算器提供電源,此電路包括一個發(fā)光二極管、電阻、導線組成。光二極管的作用主要是:運用二極管的單向導電特性來提示電源是否接通或觀察電源是否一直保持通電正常、穩(wěn)定,并且100Ω的電阻與二極管串聯(lián),其作用是保護二極管不

24、會因為電流突然變大而被燒壞。電源電路是采用USB接口來供電,如圖3所示。</p><p><b>  圖3 電源電路</b></p><p><b>  2.3 復位模塊</b></p><p>  復位電路的作用是按下復位鍵可以使顯示界面回到最開始的地方。課程設計按鍵復位電路由一個電阻一個電容和一個按鍵組成,大小分別

25、為10µF,1k,200Ω,1KΩ電阻一端接電源,另一端接電容的正極接到單片機的復位引腳,按鍵與10µF電容并聯(lián),當按鍵按下時,1kΩ電阻與VCC直接相連,在RST產生復位所需的高電平。當按鍵松開的,VCC給電容充電,RST仍為高電平,而當電容充電完成后,相當于短路,則為低電平,正常工作。復位電路如圖4所示。</p><p><b>  圖4 復位電路</b></

26、p><p><b>  2.4 時鐘模塊</b></p><p>  晶振電路的作用是產生單片機所必須的時鐘頻率。單片機工作所需的同步時鐘信號由由以下兩種方法獲得,第一:由單片機片內時鐘電路結合外部晶振、電容產生;第二:直接從單片機外部引入脈沖信號。設計中用第一方法,有石英晶體和微調電容(一般取值30pF左右)組成,石英晶體產生震蕩,單片機振蕩電路產生的脈沖信號稱振蕩信

27、號,它的頻率等于石英晶體的振蕩頻率(fosc),簡稱晶振頻率,振蕩脈沖信號還不是單片機工作所需的時鐘信號,時鐘信號必須由振蕩脈沖信號經單片機片內時鐘電路的處理后才能產生。</p><p>  課程設計晶振電路主要由振蕩電路和分頻電路組成。其中振蕩電路由高增益反相器以及并聯(lián)外接的石英晶體和電容構成產生振蕩脈沖。而分頻電路則用于把振蕩脈沖分頻,已得到所需的時鐘信號。振蕩電路由單片機芯片的XTAL1端輸入,XTAL2端

28、輸出。此時同時并接一個石英晶體振蕩器以及兩個30pF電容。而STC89C54RD+中自帶有分頻電路所以不需要外接電路對脈沖信號進行分頻。晶振頻率是12MHz。如圖5所示。</p><p><b>  圖5 時鐘電路</b></p><p><b>  2.5 下載模塊</b></p><p>  由于STC89C54R

29、D+支持flash在線寫入、擦除,所以下載電路是必不可少的部分。由下載口進行單片機與電腦的連接。并由下載電路產生電源提供給單片機工作。主要是由P30、P31兩個引腳下載,實現(xiàn)計算機與單片機的通信。</p><p><b>  2.6 顯示模塊</b></p><p>  發(fā)光二極管LED是單片機應用系統(tǒng)中的一宗簡單而常用的輸出設備,其在系統(tǒng)中的主要作用是顯示單片機的

30、輸出數(shù)據(jù)、狀態(tài)等。因而作為典型的外圍器件,LED顯示單元是反映系統(tǒng)輸出和操作輸入的有效器件。LED具備數(shù)字接口可以方便的和大年紀系統(tǒng)連接;它的優(yōu)點是價格低,壽命長,對電壓電流的要求低及容易實現(xiàn)多路等,因而在單片機應用系統(tǒng)中獲得了廣泛的應用。</p><p>  液晶LCD1602顯示器用于輸入信號以及運算結果的顯示。它是一種專門用來顯示字母、數(shù)字、符號等的點陣型液晶模塊。它由若干個5X7或者5X11等點陣字符位組

31、成,每個點陣字符位都可以顯示一個字符,每位之間有一個點距的間隔,每行之間也有間隔,起到了字符間距和行間距的作用。 1602型LCD基本操作程序如表1所示。</p><p>  表1 LCD1602基本操作程序</p><p>  電路主要由電位器、可變換串行及并行通信方式的短接電路、供電電路構成,具體電路如圖6所示。</p><p>  圖6 LCD1602顯示

32、電路</p><p><b>  2.7 輸入模塊</b></p><p>  輸入模塊的作用是給單片機系統(tǒng)提供輸入信號。通過外部按鍵使單片機接收信號,課程設計采用的是4*4的矩陣鍵盤和6個獨立式鍵盤。在矩陣式鍵盤中,行連接線和列連接線分別占用4條I/O口線,共連接16個按鍵。行線連接的接口為輸入口,用于輸入按鍵的行位置信息,列線連接的接口為輸出口,用于輸出掃描電平

33、,當按鍵按下鍵時由高電平變?yōu)榈碗娖?,如圖7所示。6個獨立式鍵盤按鍵的一端并接在一起接地。當按下某個鍵,該鍵處變?yōu)榈碗娖?。如圖8所示。</p><p>  圖7 4*4矩陣式鍵盤</p><p>  圖8 6個獨立式鍵盤</p><p>  2.8 電路原理圖</p><p>  電路原理圖見附錄A。</p><p&g

34、t;  2.9 電路實物圖</p><p>  電路實物圖見附錄B。</p><p>  2.10 元器件清單</p><p>  元器件清單見附錄C。</p><p>  3 計算器軟件系統(tǒng)設計</p><p>  應用C語言編來編寫課題程序,它由監(jiān)控函數(shù)、液晶顯示、鍵掃、延時、定時等模塊組成。具體程序見附錄D。

35、</p><p>  3.1 單片機資源使用</p><p>  P1: 基本輸入輸出口;</p><p>  P2.7:E(1602液晶);</p><p>  P2.6:RW(1602液晶);</p><p>  P2.5:RS(1602液晶);</p><p>  P2.4:T0(定時/

36、計數(shù)器);</p><p>  3.2 監(jiān)控函數(shù)模塊</p><p>  監(jiān)控函數(shù) ,用于設置上電或復位后能自動顯示系統(tǒng)提示符“P”,調用各個主要模塊,主要實現(xiàn)計算器的加、減、乘、除、開方、平方等功能。相關程序流程圖如圖9所示,具體程序見附錄D。</p><p>  圖9 監(jiān)控函數(shù)流程圖</p><p><b>  3.3 顯

37、示模塊</b></p><p>  液晶顯示是通過在主程序中調用相關的液晶功能函數(shù)來執(zhí)行相應功能,經過液晶接在單片機上的P2部分管腳,通過液晶功能函數(shù)LCD1602的調用對液晶進行操作,將各類指令寫入液晶模塊,用來驅動液晶以實現(xiàn)不同的顯示功能。簡單來說,就是用作LCD1602液晶屏顯示,將顯示的數(shù)據(jù)傳送至LCD1602模塊化函數(shù)中,將需要顯示的內容顯示在LCD1602液晶屏上。相關程序流程圖如圖10所

38、示,詳細程序見附錄D。</p><p>  圖10 液晶顯示流程圖</p><p><b>  3.4 鍵掃模塊</b></p><p>  當有操作按鍵按下時,單片機首先會先判斷鍵值,然后依據(jù)判斷出的鍵值來執(zhí)行相應的鍵功能程序,并由液晶顯示操作狀態(tài)。相關程序流程圖如圖11所示,詳細程序見附錄D。</p><p> 

39、 圖11 按鍵程序流程圖</p><p><b>  3.5 延時模塊</b></p><p>  延時模塊用于延時,等待等需要的調用。</p><p><b>  3.6 定時模塊</b></p><p>  定時器0,以工作方式1工作,采用中斷方式。</p><p>

40、;  3.7 系統(tǒng)程序清單</p><p>  課題軟件系統(tǒng)程序清單見附錄D。</p><p><b>  4 實物調試</b></p><p>  4.1 操作使用說明</p><p>  該設計利用4*4矩陣鍵盤和6個獨立按鍵作為數(shù)據(jù)和命令的輸入裝置,LCD1602液晶為顯示器,實現(xiàn)的運算有加、減、乘、除、平方

41、SQU、開方SQR、三角函數(shù)(sin、cos、tan)、十進制轉十六進制DEC、十六進制轉十進制HEX。</p><p>  采用4*4矩陣鍵盤和6個獨立按鍵作為輸入端,實現(xiàn)數(shù)據(jù)輸入功能。設計鍵盤的各個按鍵功能如表2所示。</p><p>  表2 按鍵功能設置</p><p>  如表2所示,此計算器我用了23個按鍵,10個數(shù)字鍵,4個常用運算鍵,1個等號鍵,1

42、個清零鍵,1個平方鍵,1個開方鍵,3個三角函數(shù)運算鍵,1個十進制轉十六進制按鍵和1個十六進制轉十進制按鍵。</p><p>  當計算器上電后能自動顯示系統(tǒng)提示符“P.”,進入準備工作狀態(tài)。這時輸入數(shù)字,液晶屏會顯示輸入的數(shù)據(jù),輸入完數(shù)據(jù)后按下功能鍵,再按“=”鍵,屏幕上顯示出計算的結果。如果要再次計算,按下復位鍵,重新初始化。</p><p><b>  4.2 測試過程&l

43、t;/b></p><p>  界面顯示以及測試的結果:各層界面顯示以及測試的結果與示波器所測得圖形及參數(shù)為:</p><p>  (1)當上電顯示后,顯示的是系統(tǒng)提示符“P.”,進入準備工作狀態(tài)。如圖12所示。</p><p>  圖12 上電顯示界面</p><p>  當輸入12加27后,得出計算結果39。如圖13所示</

44、p><p>  圖13 計算結果顯示界面</p><p> ?。?)當輸入數(shù)字765,按下十進制轉十六進制DEC功能鍵后,計算的的數(shù)據(jù)為2FD。如圖14所示。</p><p>  圖14 計算結果顯示界面</p><p> ?。?)當輸入數(shù)字2,按下平方SQU功能鍵后,計算的數(shù)據(jù)為4。如圖15所示。</p><p> 

45、 圖15 計算結果顯示界面</p><p>  (5)當輸入數(shù)字8乘11時,計算的數(shù)據(jù)為88。如圖16所示。</p><p>  圖16 計算結果顯示界面 </p><p>  4.3 計算器誤差分析</p><p>  計算器的計算功能有精度上的誤差,不適用保留小數(shù)點的計算,因為不能約到整數(shù)。</p><p>

46、<b>  誤差分析:</b></p><p>  (1)硬件電路中焊接時,不能做到所有器件的線路都很合理,在操作是會有相互影響。</p><p>  (2)程序參數(shù)設計不夠合理,以及計算過程中沒有保留小數(shù)點,計算量多的話導致不精準,主要是精確度不高。   </p><p> ?。?)實驗用的元器件,如芯片易受溫度的影響,實驗時間過長,即會產生

47、誤差。   </p><p><b>  4.4 設計體會</b></p><p>  通過做計算器的課程設計,我收獲良多。我大體總結了以下幾點:</p><p> ?。?)基本功要過硬,不能馬虎經常犯小錯誤。提高自己找錯糾錯能力,通常錯誤總是那幾種,多練習就熟練了。</p><p> ?。?)要善于查找資料,提高自己

48、的資料查詢能力,要善于利用網絡來獲得知識,獲得幫助。開始著手程序設計時,有些功能感覺無從下手,都不知道要干什么,這些問題這要找到相關的資料就會得到提示從而理解所要解決問題的大致方向。有了明確的目的,就可以發(fā)揮自己的頭腦來完成它了。 </p><p> ?。?)要善于思考,程序中有些實現(xiàn)難點和最初完成程序時免不了的許多不足就需要自己根據(jù)代碼認真思考來解決。只有這樣才能糾正程序的不足,并使其更加人性化。 </p

49、><p>  這次課程設計讓我們學到了很多,不僅鞏固了C語言知識,而且也培養(yǎng)了我們的動手能力,令我們的創(chuàng)造性思維得到拓展。期待今后有更多類似的鍛煉機會。 </p><p>  通過這次課程設計,可以明顯的感覺到它彌補了課程教學的和實驗中知識的深度和廣度方面的不足,也讓我們進一步掌握了程序設計的基本方法和編程技巧,同時也鞏固所學理論知識,似然花費了不止一點點的時間和精力,不過那確實挺值得的,既讓

50、我們認識到自己知識方面的缺陷,又培養(yǎng)了我獨立分析問題、解決問題的能力。 </p><p>  課程設計是需要大量時間去動手練習才能體驗到它的內涵的,同時還需要用心地投入,時間和情感花下去之后,的確感受到有所收獲,增加了對編程的興趣。通過這次課程設計,掌握了對話框的相關操作,也體會到書寫代碼一定要仔細,有時候一小點拼寫錯誤會浪費很多調試程序的時間??傊@次課程設計學到了很多,通過實踐真正的做到了學有所用。<

51、/p><p><b>  結束語</b></p><p>  通過這次設計,攻克了許多難題。從LCD1602的使用,到各個數(shù)字如何入,這些是我們學過,但是還不是太懂的。而且許多芯片并不像我們想象的那么難,只要知道讀寫程序序,只要知道命令字,就可以很容易使用這些芯片了,并不是我們要學一個才能用一個,只要我們有說明書,我們可以很好的使用很大部分器件。對于51單片機,我一直是用

52、匯編的,但對于此次設計我完全用C語言,因為C語言的可讀性很好,層次分明,而不像匯編都是在寄存器器間操作,很煩瑣,對于寫太長的程序很不好寫,而且用C語言我們可以用到C語言函數(shù)庫,這是個很好的東西,也可以用到變量,而不像匯編只能用到寄存器,這樣有助于運用。</p><p>  最后要說的是這次程序寫得有點痛苦,剛開始的時候無從下手,不知道怎么開始寫。所以對于程序流程圖是個很重要的東西,我們應該先考慮功能,考慮好主流程

53、,再從主流程出發(fā),再到各個基本模塊,寫程序不是很難,難的是你要如何寫。所以最先做個詳細的分析,結構分析,再著手寫程序,這樣各部分就很好的銜接下去了,而不是一個頭就扎到程序里去,這樣做不好。只有明確的任務才能寫的更好。</p><p>  萬事開頭難,只要你去做,你就會發(fā)現(xiàn)這個沒有你想象中的那么難,你不去做,就會覺得很難。而且這次設計對我來說是一次寶貴的經驗,不是說寫這個程序有多難,硬件設計有多難,而是我對于設計流

54、程的掌握,如果我再做一個設計我會知道首先該如何做,而不是像現(xiàn)在這樣在摸索,這是一個很好的開始。</p><p><b>  參考文獻</b></p><p>  [1] 常喜茂,孔英會,付小寧.C51基礎與應用實例.北京:電子工業(yè)出版社,2009.1.</p><p>  [2] 陳志旺,陳志茹,閻巍山.51系列單片機系統(tǒng)設計與實踐。北京:電子

55、工業(yè)出版社,2009.</p><p>  [3] 戴佳,戴衛(wèi)恒.51單片機C語言應用程序設計實例精講.北京:電子工業(yè)出版社,2005.</p><p>  [4] 劉文濤.單片機語言C51單片機典型應用設計.北京:人民郵電出版社,2005.</p><p>  [5] 邊春元.C51單片機典型模塊設計與應用.北京:機械工業(yè)出版社,2006.</p>

56、<p><b>  致 謝</b></p><p>  本次課程設計得到班導凌老師的熱心指導,在這里對凌老師表示最衷心的感謝。凌老師平易近人,對學生的設計進度和學習很關心。在畢業(yè)設計的前期,首先給我們介紹了不少有用的資料和書籍;在硬件設計等方面給予悉心的指導;在調試的過程中凌老師給每個出現(xiàn)的問題給予及時的指導。在寫課程設計的階段,凌老師讓我們提前給她評審,不論內容字體,還是格式上

57、的問題都一一指出。待人平和、工作認真、治學嚴謹,給我留下很深刻的印象。更重要的是,她善于與學生溝通,不僅在畢業(yè)設計上給我及時的指導,更為我大學最后階段的學習提出了許多寶貴的意見。這一切都在潛移默化地影響著我,為我以后進入工作崗位樹立了良好的榜樣。 </p><p>  最后向所有幫助和關心過我的人表示衷心感謝!</p><p><b>  附 錄</b></p

58、><p>  附錄A 電路原理圖 </p><p>  附錄B 電路實物圖</p><p>  附錄C 元器件清單</p><p><b>  附錄D 程序清單</b></p><p>  /**********************************</p><

59、p><b>  程 序 名:計算器</b></p><p><b>  編 寫 者:李月潔</b></p><p><b>  指導老師:凌云</b></p><p>  時 間:2016.12.20</p><p>  班 級:電氣本1405班</p&

60、gt;<p>  功 能:計算器能進行加、減、乘、除、開方、平方、三角函數(shù)(sin、cos、tan)、十進制與十六進制的轉換等運算。</p><p>  說 明:LCD SCLK(E)連至P27,SID(RW)連至P26,CS(RS)連至P25</p><p>  型 號:STC89C54RD+ 使用晶振為12MHz</p><p&

61、gt;  *******************************************************************/</p><p>  #include <reg51.h></p><p>  #include <math.h></p><p>  #include <stdlib.h></p

62、><p>  #define uint unsigned int</p><p>  #define uchar unsigned char</p><p>  #define K 3.1415926/180</p><p>  sbit RS=P2^5;</p><p>  sbit RW=P2^6;</p>

63、<p>  sbit EN=P2^7; //使能信號</p><p>  sbit BEEP=P2^4;</p><p>  sbit SQUARE=P2^0;//開方是16號鍵</p><p>  sbit COS=P2^1;</p><p>  sbit SIN=P2^2;</p><p>  sbi

64、t TAN=P2^3;</p><p>  sbit HEX=P3^6;</p><p>  sbit DEC=P3^7;</p><p>  #define GPIO_KEY P1</p><p>  uchar code keycode[16]={0xEE,0XDE,0XBE,0X7E,0XED,0XDD,0XBD,0X7D,0XEB,0

65、XDB,0XBB,0X7B,0XE7,0XD7,0XB7,0X77};//待查詢的按鍵值</p><p>  uchar dat[16]="p.";</p><p>  uchar result[16]=" ";</p><p>  uchar opr[4]="\n";</p><p&g

66、t;  int result_size=0;</p><p>  int opr_flag=0;</p><p>  int count=0;</p><p>  char hex[16]={'0','1','2','3','4','5','6','

67、;7','8','9','A','B','C','D','E','F'};</p><p>  void delay(uint z);</p><p>  void init();</p><p>  void write_comm

68、and(uchar com);//寫指令</p><p>  void write_data(uchar date);//寫數(shù)據(jù)</p><p>  void show_word(int row,int size,char* dat);</p><p>  void show_value(int row,int size,char* str);</p>

69、<p>  int keyscan();</p><p>  uchar getkey(int value);</p><p>  uchar* getValue(uchar* temp);</p><p>  double func_calc(uchar* key,int flag);</p><p>  char* decTo

70、Hex(char* d,int count,int* s);</p><p>  int hexToDec(char* h,int count);</p><p>  int getIntegerSize(double n);</p><p>  char* ftoa(double num,int iSize,int dSize);</p><p

71、>  void clear()</p><p><b>  {</b></p><p>  write_command(0x01);//清屏</p><p><b>  }</b></p><p>  uchar busy_check()//忙檢查(有返回值)</p><p

72、><b>  {</b></p><p>  uchar temp;</p><p>  RS=0;//選擇命令寄存器</p><p>  RW=1;//讀操作選擇</p><p>  EN=1; //一個高脈沖讀走</p><p><b>  delay(1);</b>

73、;</p><p>  temp=P0;//讀回P0的值</p><p><b>  EN=0;</b></p><p>  return temp;//返回值</p><p><b>  }</b></p><p>  void main()</p><

74、p><b>  {</b></p><p>  int statu=0;</p><p>  int KeyValue;</p><p><b>  int i=0;</b></p><p>  double temp;</p><p><b>  int s

75、ize;</b></p><p>  uchar key[16]="\n";</p><p>  uchar screen[16]="\n";</p><p>  init();//初始化</p><p><b>  BEEP=0;</b></p>&l

76、t;p>  write_command(0x80);</p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  KeyValue=keyscan();</p><p>  if(KeyValue!=0)//如果有鍵按下</p>

77、<p><b>  {</b></p><p><b>  count++;</b></p><p>  if(count==1)//第一次按下時,清屏</p><p><b>  {</b></p><p><b>  clear();</b&g

78、t;</p><p><b>  }</b></p><p>  if(KeyValue>0 && KeyValue<16)//如果按鍵號在1到16之間就顯示在第一行</p><p><b>  {</b></p><p>  key[count-1]=getkey(Ke

79、yValue);</p><p><b>  }</b></p><p>  if(KeyValue>0 && KeyValue<15 && opr_flag==0)//沒有按下等號之前,更新顯示輸入的字符</p><p><b>  {</b></p><

80、p><b>  clear();</b></p><p>  show_word(1,count,key);</p><p><b>  }</b></p><p>  else if(KeyValue>0 && KeyValue<15 && opr_flag==1)//等

81、號按下后,清屏,標志置0,顯示第一行</p><p><b>  {</b></p><p><b>  clear();</b></p><p>  opr_flag=0;</p><p>  show_word(1,count,key);</p><p><b&g

82、t;  }</b></p><p>  if(KeyValue>15 && KeyValue<23)//如果按下的是第16到22號鍵</p><p><b>  {</b></p><p>  count--;//不記錄該鍵</p><p>  switch (KeyValue)&

83、lt;/p><p><b>  {</b></p><p>  case 16:opr[0]='S';opr[1]='Q';opr[2]='U';opr[3]='(';opr_flag=4;break;//squre</p><p>  case 17:opr[0]='S

84、9;;opr[1]='Q';opr[2]='R';opr[3]='(';opr_flag=5;break;//squre root</p><p>  case 18:opr[0]='s';opr[1]='i';opr[2]='n';opr[3]='(';opr_flag=6;break;//sin&l

85、t;/p><p>  case 19:opr[0]='c';opr[1]='o';opr[2]='s';opr[3]='(';opr_flag=7;break;//cos</p><p>  case 20:opr[0]='t';opr[1]='a';opr[2]='n';opr[3

86、]='(';opr_flag=8;break;//tan</p><p>  case 21:opr[0]='H';opr[1]='E';opr[2]='X';opr[3]='(';opr_flag=9;break;//hex</p><p>  case 22:opr[0]='D';opr[1

87、]='E';opr[2]='C';opr[3]='(';opr_flag=10;break;//dec</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(opr_flag>=4)//如果opr_flag==4,顯示

88、相應的符號到第一行</p><p><b>  {</b></p><p>  show_word(1,4,opr);</p><p><b>  }</b></p><p>  if(KeyValue>0 && KeyValue<15 && opr_f

89、lag>=4)</p><p><b>  {</b></p><p><b>  clear();</b></p><p>  show_word(1,4,opr);</p><p>  show_value(1,count,key);</p><p><b&g

90、t;  }</b></p><p>  if(KeyValue==15 && opr_flag<4)//'='鍵被按下</p><p><b>  {</b></p><p>  show_word(2,result_size,getValue(key));</p><p&

91、gt;  result_size=0;</p><p><b>  }</b></p><p>  else if(KeyValue==15 && opr_flag>=4 && opr_flag<10)</p><p><b>  {</b></p><p&g

92、t;  temp=func_calc(key,opr_flag);</p><p>  result_size=getIntegerSize(temp);</p><p>  ftoa(temp,result_size,3);</p><p>  show_word(2,result_size+4,result);</p><p><b

93、>  }</b></p><p>  else if(KeyValue==15 && opr_flag==10)</p><p><b>  {</b></p><p>  decToHex(key,count-1,&size);</p><p>  //show_word(2,

94、size,result);</p><p>  show_word(2,size,decToHex(key,count-1,&size));</p><p>  //show_word(2,5,"ok");</p><p><b>  }</b></p><p><b>  }<

95、;/b></p><p><b>  }</b></p><p><b>  }</b></p><p>  //十進制轉十六進制</p><p>  char* decToHex(char* d,int count,int *s)</p><p><b> 

96、 {</b></p><p><b>  int i;</b></p><p>  int temp=0;</p><p><b>  int size;</b></p><p>  int rem;//remainder</p><p>  for(i=0;i&

97、lt;count;i++)</p><p><b>  {</b></p><p><b>  temp*=10;</b></p><p>  temp+=d[i]-'0';</p><p><b>  }</b></p><p><

98、;b>  i=0;</b></p><p>  while(temp>0)</p><p><b>  {</b></p><p>  result[i++]=hex[temp%16];</p><p><b>  temp/=16;</b></p><p

99、><b>  }</b></p><p><b>  size=i;</b></p><p><b>  *s=size;</b></p><p>  for(i=0;i<size-i-1;i++)//反序</p><p><b>  {</b>

100、;</p><p>  temp=result[i];</p><p>  result[i]=result[size-i-1];</p><p>  result[size-1-i]=temp;</p><p><b>  }</b></p><p>  return result;</p

101、><p><b>  }</b></p><p>  //十六進制轉十進制</p><p>  int hexToDec(char* h,int count)</p><p><b>  {</b></p><p><b>  int dec;</b><

102、;/p><p><b>  int i=0;</b></p><p>  int temp=0;</p><p>  for(i=0;i<count;i++)</p><p><b>  {</b></p><p><b>  temp*=16;</b>

103、;</p><p>  temp+=h[i]-'0';</p><p><b>  }</b></p><p>  return temp;</p><p><b>  }</b></p><p>  //計算整形數(shù)據(jù)的位數(shù)</p><p&

104、gt;  int getIntegerSize(double n)</p><p><b>  {</b></p><p>  int count=0;</p><p><b>  int temp;</b></p><p><b>  if(n<0)</b></p

105、><p><b>  temp=-n;</b></p><p><b>  else</b></p><p><b>  temp=n;</b></p><p><b>  do</b></p><p><b>  {<

106、/b></p><p><b>  temp/=10;</b></p><p><b>  count++;</b></p><p>  }while(temp>0);</p><p>  return count;</p><p><b>  }<

107、;/b></p><p>  //浮點強制轉換成字符串函數(shù)</p><p>  char* ftoa(double num,int iSize,int dSize)</p><p><b>  {</b></p><p><b>  int i=0;</b></p><p&

108、gt;<b>  int j=0;</b></p><p>  double decimal;</p><p>  int temp=(int)num;</p><p><b>  int a;</b></p><p>  decimal=num-temp;</p><p>

109、  if(num>=0)</p><p><b>  {</b></p><p>  for(i=0;i<iSize;i++)</p><p><b>  {</b></p><p>  a=temp/pow(10,iSize-i-1);</p><p>  te

110、mp%=(int)pow(10,iSize-i-1);</p><p>  result[i]=a+'0';</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else</b></p>&l

111、t;p><b>  {</b></p><p>  result[0]='-';</p><p>  temp=-temp;</p><p>  for(i=1;i<iSize+1;i++)</p><p><b>  {</b></p><p>

112、  a=temp/pow(10,iSize-i);</p><p>  temp%=(int)pow(10,iSize-i);</p><p>  result[i]=a+'0';</p><p><b>  }</b></p><p><b>  }</b></p>

113、<p>  if(decimal!=0)</p><p><b>  {</b></p><p>  result[i++]='.';</p><p>  if(decimal<0)</p><p>  decimal=-decimal;</p><p>  tem

114、p=(int)(pow(10,dSize)*decimal);</p><p>  for(j=0;j<dSize;j++)</p><p><b>  {</b></p><p>  a=temp/pow(10,dSize-j-1);</p><p>  temp%=(int)pow(10,dSize-j-1);

115、</p><p>  result[i+j]=a+'0';</p><p><b>  }</b></p><p><b>  }</b></p><p>  else if(decimal==0)</p><p><b>  {</b>

116、;</p><p>  result[i]=' ';</p><p>  result[i+1]=' ';</p><p>  result[i+2]=' ';</p><p>  result[i+3]=' ';</p><p><b>  }

117、</b></p><p>  return result;</p><p><b>  }</b></p><p>  //平方、開方、正弦、余弦、正切計算函數(shù)</p><p>  double func_calc(uchar* key,int flag)</p><p><b&

118、gt;  {</b></p><p><b>  int i;</b></p><p>  int value=0;</p><p>  double temp;</p><p>  double decimal;</p><p>  int integer;</p>&

119、lt;p><b>  int tmp;</b></p><p>  if(flag>=4 && flag<=8)</p><p><b>  {</b></p><p>  for(i=0;key[i]!='=';i++)</p><p><b

120、>  {</b></p><p>  value*=10;</p><p>  value+=key[i]-'0';</p><p><b>  }</b></p><p>  switch(flag)</p><p><b>  {</b>

121、</p><p>  case 4:temp=value*value;break;</p><p>  case 5:temp=sqrt(value);break;</p><p>  case 6:temp=sin(value*K);break;</p><p>  case 7: temp=cos(value*K);break;&l

122、t;/p><p>  case 8: temp=tan(value*K);break;</p><p>  default: break;</p><p><b>  }</b></p><p><b>  }</b></p><p>  else if(flag==9) /

123、/hex to dec</p><p><b>  {</b></p><p>  temp=hexToDec(key,count-1);</p><p><b>  }</b></p><p>  return temp;</p><p><b>  }<

124、/b></p><p>  //鍵值轉換成字符函數(shù)</p><p>  uchar getkey(int value)</p><p><b>  {</b></p><p>  uchar temp;</p><p>  switch(value)</p><p>

125、<b>  {</b></p><p>  case 1:temp='0';break;</p><p>  case 2:temp='1';break;</p><p>  case 3:temp='2';break;</p><p>  case 4:temp='

126、;3';break;</p><p>  case 5:temp='4';break;</p><p>  case 6:temp='5';break;</p><p>  case 7:temp='6';break;</p><p>  case 8:temp='7';

127、break;</p><p>  case 9:temp='8';break;</p><p>  case 10:temp='9';break;</p><p>  case 11:temp='+';break;</p><p>  case 12:temp='-';break

128、;</p><p>  case 13:temp='*';break;</p><p>  case 14:temp='/';break;</p><p>  case 15:temp='=';break;</p><p>  default :break;</p><p&g

129、t;<b>  }</b></p><p>  return temp;</p><p><b>  }</b></p><p>  uchar* getValue(uchar* temp)</p><p><b>  {</b></p><p><

130、;b>  int i=0;</b></p><p>  //int flag=0;</p><p>  int left_Val=0;</p><p>  int right_Val=0;</p><p>  char operator;</p><p><b>  int val;<

131、;/b></p><p>  int val_tmp;</p><p>  for(i=0;temp[i]!='=';i++)</p><p><b>  {</b></p><p>  if(temp[i]=='+'||temp[i]=='-'||temp[i]==

132、'*'||temp[i]=='/')</p><p><b>  {</b></p><p>  opr_flag=2;</p><p>  operator=temp[i];</p><p><b>  }</b></p><p>  if(

133、temp[i]>='0' && temp[i]<='9' && opr_flag!=2)</p><p><b>  {</b></p><p>  left_Val*=10;</p><p>  left_Val+=temp[i]-'0';</p

134、><p><b>  }</b></p><p>  else if(temp[i]>='0' && temp[i]<='9' && opr_flag==2)</p><p><b>  {</b></p><p>  righ

溫馨提示

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

評論

0/150

提交評論