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