|
隨著社會的發展,科學的進步,人們的生活水平在逐步地提高,尤其是微電子技術的發展猶如雨后春筍般的變化。電子產品的更新速度快就不足驚奇了。計算器在人們的日常中是比較常見的電子產品之一,如何使計算器技術更加的成熟。充分利用已有的軟件和硬件條件,設計出更出色的計算器,使其更好地為各個行業服務,成了如今電子領域重要的研究課題。 現如今,人們的日常生活中已經離不開計算器了,社會的各個角落都有它的身膨,比如商店、辦公室、學校。因此設計一款簡單實用的計算器會有很大的實際意義。
1.2設計目的 - 為了培養學生在查閱資料、復習、學習知識的基礎上,進行包括光、機、電系統的設計、計算、仿真、編程、調試等多個環節的綜合能力培養;
- 是對學生進行設計前的一次大型練兵,進一步培養學生獨立地分析、解決實際問題的實際能力。
- 培養學生用專業的、簡潔的文字,清晰的圖表來表達自己設計思想的能力。
1.3 設計要求 1. 系統通過4×4的矩陣鍵盤輸入數字及運算符。 2. 可以進行多位十進制數以內的運算(包括加,減,乘,除,冪次方,對數等功能),如果計算結果超過顯示范圍,則屏幕顯示E。 3. 可顯示輸入時的數字及結果; 4. 設計控制電路總體方案; 5. 電路的設計、仿真與調試。 2 總體設計方案分析 2.1 系統組成 本設計是一個可以進行多位十進制數以內的運算(包括加,減,乘,除,冪次方,對數等功能)的計算器,系統結構框圖如圖2.1。它的硬件電路主要由五部分組成,一個AT89C51單片機芯片、一個八位共陽極的數碼管、一個四乘四的矩陣鍵盤、手動清零電路和起振電路。軟件程序主要由四部分組成:主程序、矩陣鍵盤掃描程序、算術運算程序和顯示程序。 在硬件的選擇和連接上,單片機選擇AT89C51,數碼管選擇共陽機八位數碼管,鍵盤4*4矩陣鍵盤。數碼管的A,B,C,D,E,F,G,DP分別依次與單片機的P0.0—P0.7管腳相連,P0口做為單片機的字碼控制端,數碼管的1,2,3,4,5,6,7,8各引腳分別與單片機的P2.0—P2.7管腳相連,鍵盤的第0行到第3行依次與單片機的P1.1—P1.3,鍵盤的第0列到第3列依次與單片機的P1.4—P1.7,AT89C51接12MHZ晶振。 
圖 2.1 系統結構框圖 2.2 系統基本功能 1.計算器可顯示8位數字,開機運行時,只有數碼管最低位顯示為“0”,其余位全部不顯示。 2.第一次按下時,顯示“D1”;第二次按下時,顯示“D1D2”;第三次按下時,顯示“D1D2D3”,8個全顯示完畢,再按下按鍵下時,顯示E。 3.可以設置計算范圍,對計算結果在該范圍內的兩個無符號數進行+、-、*、/、^、對數運算,并顯示計算結果。輸入數字或結果超出設定范圍時,屏幕顯示E;做減法運算時,當被減數<減數時,屏幕顯示E;做除法運算時,除數為0時,屏幕顯示E,以提示使用者輸入錯誤,應清零后重新輸入。 4.在進行加、乘、除運算時,可直接按符號鍵進行運算,若需要進行減、冪方、對數運算時,按運算符之前要先按“shift”鍵進行轉換,再進行運算。 5.運算時,按清零鍵清零,終止本次運行,必須重新輸入數據,運算過程中,如果運算的表達式是加、減、乘、除、冪方、對數混合運算,可以連續運算,無需按等號鍵,混合運算過程運算符不設優先級。 3 硬件電路設計 3.1 主控芯片 AT89C51單片機簡介 AT89C51是一種帶4K字節FLASH存儲器(FPEROM-Flash Programmable and Erasable Read Only Memory)的低電壓、高性能CMOS 8位微處理器,俗稱單片機,如圖3.1。 單片機的可擦除只讀存儲器可以反復擦除1000次。該器件采用ATMEL高密度非易失存儲器制造技術制造,與工業標準的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃速存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C051是它的一種精簡版本。AT89C51單片機為很多嵌入式控制系統提供了一種靈活性高且價廉的方案。 AT89C51 提供以下標準功能:4k字節Flash閃速存儲器,128字節內部RAM,32 個I/O 口線,兩個16位定時/計數器,一個5向量兩級中斷結構,一個全雙工串行通信口,片內振蕩器及時鐘電路。同時,AT89C51可降至0Hz的靜態邏輯操作,并支持兩種軟件可選的節電工作模式。空閑方式停止CPU的工作,但允許RAM,定時/計數器,串行通信口及中斷系統繼續工作。掉電方式保存RAM中的內容,但振蕩器停止工作并禁止其它所有部件工作直到下一個硬件復位。 
圖 3.1 AT89C51單片機結構圖 3.2顯示模塊 7seg-mpx8-ca是共陽極數碼管顯示器,如圖3.2。它左下側的ABCDEFG DP是LED數碼管顯示器的I/O口,是段選信號,右下側的12345678是它的位選信號,從左到右分別是第一位到第八位,段選信號與位選信號分別接到單片機的不同輸出口。本次設計中段選信號接到了P0口,位選信號接到了P2口。 共陽極的字形顯示代碼為: Uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x86 }. 位選信號代碼為: uchar Digits[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; 當選中第一位時,段選信號就執行從0到9的顯示。 
圖3.2 七段數碼管顯數器 3.3鍵盤接口電路 采用4*4矩陣鍵盤。如圖3.3。采用軟件識別鍵值并執行相應的操作,鍵盤的第0行到第3行依次與單片機的P1.0—P1.3管腳相連,鍵盤的第0列到第3列依次與單片機的P1.4—P1.7管腳相連,計算機輸入數字和其他功能按鍵時要用到很多按鍵,如果采用獨立按鍵的方式,編程會很簡單,但是會占用大量的I/O口資源,因此在很多情況下都不采用這樣的方式,而是采用矩陣鍵盤的方式。矩陣鍵盤采用四條I/O線作為行線,四條I/O線作為列線組成鍵盤,在行線和列線的每個交叉點上設置一個按鍵。這樣鍵盤上按鍵的數量就為4*4個。這樣行列式鍵盤結構能有效的提高單片機系統中I/O口的利用率。一般有16個鍵組成,在單片機中正好有一個P端口實現16個按鍵功能,這種形式在單片機系統中最常用。 按鍵識別是通過逐行掃描進行判斷。某一行中如果有低電平產生,則辨別該低電平產生于哪一列,從而得到按鍵的行列地址,給按鍵賦值。 按鍵識別后,如果是數字鍵則直接放入數碼管顯示緩沖區,如果再次有數字鍵按下,則應將緩存區的數字向高位移一位,將剛輸入的數放入最低位,并且記錄按鍵次數,每輸入一個鍵值都調用顯示程序顯示出來,如果是運算符,則執行相應的運算,然后再調用顯示程序顯示結果。 
圖3.3 矩陣鍵盤結構圖 3.4 算術運算模塊 算術運算模塊,在任何時候按下清零鍵,都必須退出當前操作,重新進行運算。每次運算結束也要按下清零鍵后,再進行重新操作。運算模塊由鍵盤和顯示器組成。由于按鍵不足,設計一個轉換鍵,可以對運算符進行轉換,將“+”和“-”、“*”和“^”、“/”和“log”利用“shift”進行轉換,實現六個運算符的運算。 3.5 總設計圖 將以上模塊連接起來,總設計圖如圖3.4。 
圖3.4 總設計圖 4 軟件設計模塊 軟件程序主要由四部分組成:主程序、鍵盤掃描程序、算術運算模塊程序和顯示程序,總程序設計圖如圖4.1。 圖4.1 總程序設計圖 4.1 顯示程序設計 采用動態顯示,由八位共陽極數碼管通過P0口,P2口與單片機相連,P0口做字碼控制端,P2口做數碼管的位控制端,動態顯示是每次數碼管只顯示一位,由于人的視覺停留是0.05到0.2秒之間,當數碼管依次點亮各個位時,使循環的頻率高于人的視覺停留時間,人們就會認為數碼管是同時點亮的,就可以達到動態顯示的效果。其中位控制是哪個數碼管亮,段控制是數碼管亮數字幾。本設計的難點是鍵盤識別和數值顯示,因為這里邊涉及到鍵盤輸入的數值在內部要轉換成10進制運算,運算結果要轉換成各個位的顯示數字輸出。 4.2 矩陣鍵盤掃描程序設計 矩陣鍵盤采用4行4列結構,每行每列各對應一個I/O口。本設計鍵盤的第0行到第3行依次與單片機的P1.0—P1.3管腳相連,鍵盤的第0列到第3列依次與單片機的P1.4—P1.7管腳相連,程序運行時依次掃描各行,查詢是否有鍵按下,如果有則進入鍵盤識別處理程序,實現相應的運算,然后通過數碼管輸出結果,如果沒有按鍵就調用顯示程序顯示一個0,等待按鍵按下,在進入按鍵掃描程序,這樣循環執行。按鍵識別是根據按鍵時得到的列代碼與行代碼組合,來判斷是哪個鍵的。當鍵盤按鍵按下時它的那一行、那一列的端口為低電平。因此,只要掃描行、列端口是否都為低電平就可以確定是哪個鍵被按下。 鍵掃程序的過程為:開始時,先判斷是否有鍵閉合,無鍵閉合時,返回繼續判斷,有鍵閉合時,先去抖動,然后確定是否有鍵按下,若無鍵按下,則返回繼續判斷是否有鍵閉合,若有鍵按下,則判斷鍵號,然后釋放,若釋放按鍵完畢,則返回,若沒有釋放按鍵,則返回繼續釋放。流程圖如圖4.2。 圖4.2 矩陣鍵盤掃描程序設計 4.3 算術運算模塊設計 程序的過程為:先判斷輸入的運算符是+、-、*、/、^、log 中的哪一個,只要把各運算符分別做成模塊,用到時調用即可。若是“+”、“*”、“log”或“^”,則要判斷運算結果是否溢出,溢出則顯示“E”,沒溢出就顯示運算結果,若是“/”,則要先判斷除數是否為零,為零就顯示錯誤信息,輸出“E”,不為零則顯示運算結果,若是“-”,被減數小于減數,結果應為負數,但因為是無符號運算,輸出‘E’,否則直接顯示運算結果。其流程圖如圖4.3所示。 圖4.3 算術運算程序設計流程圖 5 實驗結果及分析 5.1乘法運算超出范圍(溢出值999999) 計算5400*200=1080000,溢出,顯示“E”。 鍵入第一個操作數5400,顯示如圖5.1: 圖5.1 鍵入5400 乘以第二個操作數200,如圖5.2: 圖5.2 鍵入200 顯示結果(超出范圍),如圖5.3: 圖5.3 結果溢出 5.2 冪方運算 計算3^6=729,結果正確。 輸入3,如圖5.4: 圖5.4 輸入3 輸入冪次6,如圖5.5: 圖5.5 輸入冪次6 顯示結果729,結果正確。如圖5.6: 圖5.6 顯示結果729 5.3 除法運算( 除數為0時,顯示錯誤信息“E”)
除數為0,如圖5.7: 圖5.7 鍵入除數為0 顯示結果“E”,如圖5.8: 圖5.8 顯示結果“E” 5.4 減法運算(被減數小于減數時) 鍵入被減數1000,如圖5.9: 圖5.9 顯示1000 鍵入減數3000,如圖5.10: 圖 5.10 鍵入減數3000 顯示結果“E”,如圖5.11: 圖5.11 顯示結果 5.5 連續運算 800*20/400+60=100 鍵入800,如圖5.12: 圖5.12 鍵入800 鍵入乘數20,如圖5.13: 圖5.13 鍵入20 按下除號時顯示上一步運算結果,并繼續進行下一步運算,如圖5.14: 圖5.14 顯示上一步計算結果 繼續鍵入除數400,如圖5.15: 圖5.15 鍵入除數400 繼續加上60,如圖5.16: 圖5.16 加60 顯示結果100,如圖5.17: 圖5.17 顯示結果 6 評述與心得 本次的設計要求實現多位十進制數計算器系統設計,我主要負責報告的整合和程序的調試。總體來說,整個設計并不復雜,通過分析題目、查閱資料、比較不同方案,經過多次調試與測試也基本實現了要求的內容,但在實現過程中還是遇到了不少問題。整個設計包括主控芯片、顯示模塊、輸入模塊、運算模塊。首先用protues連接電路時要注意各端口對應,電路圖盡量做到簡潔,整齊,確保連接正確。然后在輸入模塊我們采用4*4矩陣鍵盤,難點在于矩陣鍵盤掃描程序,要明確按鍵原理,并合理規范按鍵,按鍵分配上,我們提出用轉換鍵“shift”實現對運算符的轉換,達到在按鍵有限的條件下,最大程度的實現多種運算功能,結果較為滿意。除此之外,整個設計除過主程序還包括顯示程序、算數運算程序等模塊,算數運算模塊里面又涉及各個運算符的相應程序,整個程序的調試測試比較麻煩。在最初程序中,由于無符號整形字節的范圍限制,結果最大只能到65535,超過后將不能顯示正確答案。最后調整為長整型后,范圍擴大至2^32,可自由設定計算器的溢出值,使得結果在超過溢出值后顯示“E”。對于除法,除數為0時,使顯示結果為“E”給出錯誤提示。對減數運算結果為負時,使顯示結果為“E”給出錯誤提示。并實現連續運算功能,可顯示中間結果。顯示模塊采用共陽極數碼管,通過查詢數字和相關字母對應的碼表,編寫程序,實現輸入模塊到主控芯片內部,芯片到數碼管的一系列字符-數字、數字-字符的轉化。多次調試后有了較為理想的結果,基本實現了老師的要求,但仍有不足,比如只能進行無符號整形的運算;最多只能進行八位十進制數的混合運算;當連續出現錯誤操作時,如連續輸入減號,程序不能自動復位,會產生連續錯誤;沒有刪除輸入功能,當輸入出錯時,只能通過清零后重新輸入。這些都局限了該計算器系統的使用,也認識到了自己的能力還需要很大的提高。 同時,本次為期兩周的設計讓我對單片機軟件與硬件的常用設計有了更深入的了解,包括單片機需按照統一節拍工作,而晶振是給單片機提供工作信號脈沖的。這個脈沖就是單片機的工作速度。晶振頻率的大小決定了單片機速度的快慢。而一般晶振電路都有這兩個小電容的,它是振蕩回路交聯電容,如果沒這兩個電容的話,振蕩部分會因為沒有回路而停振,電路不能正常工作。對單片機的內部結構及接口相應的功能也有了更深的理解記憶,對keil和proteus軟件的使用也有了進本的掌握。 通過查閱資料,快速查找有效信息,提高了自己的文獻檢索能力。設計過程中的分析、組成電路、排查錯誤、調試測試、提高改進,也進一步鍛煉了自己的思維,小組工作中,提高了自己的交流能力和團隊合作意識,綜合能力得到提升,并取得了較為不錯的測試結果,比較滿意,感謝隊友,也感謝老師給我們提供這樣的機會,讓我們認識自我,提升自我。以后我會繼續努力,多多學習跟專業有關的知識,把理論與實踐相結合,融會貫通,舉一反三。
仿真程序下載: http://www.denmoz.com/bbs/dpj-191483-1.html
|