寧夏大學(xué)本科畢業(yè)設(shè)計基于單片機的簡易計算器的設(shè)計_第1頁
寧夏大學(xué)本科畢業(yè)設(shè)計基于單片機的簡易計算器的設(shè)計_第2頁
寧夏大學(xué)本科畢業(yè)設(shè)計基于單片機的簡易計算器的設(shè)計_第3頁
寧夏大學(xué)本科畢業(yè)設(shè)計基于單片機的簡易計算器的設(shè)計_第4頁
寧夏大學(xué)本科畢業(yè)設(shè)計基于單片機的簡易計算器的設(shè)計_第5頁
已閱讀5頁,還剩45頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 2017屆本科畢業(yè)設(shè)計題 目:基于單片機的簡易計算器的設(shè)計 類 型:設(shè)計 論文學(xué) 院: 機械工程學(xué)院 專 業(yè): 機械工程及自動化 年 級: 2013級 學(xué)生學(xué)號: 12013243606 學(xué)生姓名: 邱智信 指導(dǎo)教師: 梁云峰 2017 年 5 月 14 日摘 要單片機是采用超大規(guī)模集成電路技術(shù),把一臺計算機的主要部件集成在一個芯片上所構(gòu)成的一種集成電路芯片,因此單片機被稱為單片微型計算機。因為單片機體積小,價格經(jīng)濟,可靠性高,適用領(lǐng)域?qū)拸V以及其本身的指令系統(tǒng)等優(yōu)勢,在各個行業(yè),各個領(lǐng)域方面得到了廣泛應(yīng)用。本設(shè)計就是依據(jù)單片機的原理來進行簡單的計算器設(shè)計的。本設(shè)計采用STC89C52RC單片

2、機為核心,輸入采用4*4矩陣鍵盤,采用LCD1602液晶顯示屏顯示操作過程及結(jié)果。實現(xiàn)簡單的四則運算。采用C語言編程,keil uVision4和STC_ISP_V4.80軟件向單片機開發(fā)板內(nèi)部燒寫程序,進行硬件調(diào)試。關(guān)鍵字:單片機;矩陣鍵盤;LCD1602;計算器AbstractMicrocontroller is the use of ultra-large-scale integrated circuit technology, a computer's main components integrated in a chip formed by an integrated ci

3、rcuit chip, so the microcontroller is called single-chip microcomputer. Because of the small size of the microcontroller, the price economy, high reliability, wide field of application and its own command system and other advantages, in various industries, various fields have been widely used.The de

4、sign is based on the principle of the microcontroller to carry out a simple calculator design. The design uses STC89C52RC microcontroller as the core, the input using 4 * 4 matrix keyboard, LCD1602 LCD display operation process and results. To achieve a simple four operations. Using C language progr

5、amming, keil uVision4 and STC_ISP_V4.80 software to the microcontroller development board internal programming procedures for hardware debugging.Key words: Microcontroller; matrix keyboard; LCD1602; calculator目 錄第一章 緒論11.1單片機的工作原理11.2 本論文研究的目的和意義11.3 計算器的發(fā)展簡史2第二章 設(shè)計原理及要求32.1 設(shè)計方案的確定32.2 系統(tǒng)的設(shè)計方案32.3

6、系統(tǒng)的設(shè)計要求32.3.1 優(yōu)化硬件電路42.3.2 可靠性及抗干擾設(shè)計42.3.3 靈活的功能擴展4第三章 硬件模塊的設(shè)計53.1 單片機STC89C52RC53.1.1 STC89C52RC單片機的特點53.1.2 管腳說明63.1.3 振蕩器特性73.2 矩陣鍵盤模塊83.3 LCD1602顯示模塊83.3.1 顯示電路93.3.2 LCD1602主要技術(shù)參數(shù)103.3.3 引腳功能說明103.4 硬件接線圖11第四章 軟件設(shè)計及調(diào)試134.1 程序設(shè)計134.1.1 功能介紹134.1.2 主模塊功能的設(shè)計134.1.3 鍵盤掃描模塊程序的設(shè)計144.1.4 運算模塊程序的設(shè)計174.

7、1.5 顯示模塊程序的設(shè)計184.2 編寫程序194.2.1 keil軟件介紹194.2.2 編寫程序224.3 程序調(diào)試354.3.1 生成HEX文件354.3.2 下載HEX至開發(fā)板進行調(diào)試36第五章 結(jié)論38參考文獻39致謝40機械工程學(xué)院 寧夏大學(xué)本科畢業(yè)設(shè)計第一章 緒論1.1單片機的工作原理單片機由運算器、控制器、存儲器、輸入輸出設(shè)備構(gòu)成。 單片機自動完成賦予它的任務(wù)的過程,也就是單片機執(zhí)行程序的過程,即一條條執(zhí)行的指令的過程,所謂指令就是把要求單片機執(zhí)行的各種操作用的命令的形式寫下來,這是在設(shè)計人員賦予它的指令系統(tǒng)所決定的,一條指令對應(yīng)著一種基本操作;單片機所能執(zhí)行的全部指令,就是

8、該單片機的指令系統(tǒng),不同種類的單片機,其指令系統(tǒng)亦不同。為使單片機能自動完成某一特定任務(wù),必須把要解決的問題編成一系列指令(這些指令必須是選定單片機能識別和執(zhí)行的指令),這一系列指令的集合就成為程序,程序需要預(yù)先存放在具有存儲功能的部件存儲器中。存儲器由許多存儲單元(最小的存儲單位)組成,就像大樓房有許多房間組成一樣,指令就存放在這些單元里,單元里的指令取出并執(zhí)行就像大樓房的每個房間的被分配到了唯一一個房間號一樣,每一個存儲單元也必須被分配到唯一的地址號,該地址號稱為存儲單元的地址,這樣只要知道了存儲單元的地址,就可以找到這個存儲單元,其中存儲的指令就可以被取出,然后再被執(zhí)行。程序通常是順序執(zhí)

9、行的,所以程序中的指令也是一條條順序存放的,單片機在執(zhí)行程序時要能把這些指令一條條取出并加以執(zhí)行,必須有一個部件能追蹤指令所在的地址,這一部件就是程序計數(shù)器PC(包含在CPU中),在開始執(zhí)行程序時,給PC賦以程序中第一條指令所在的地址,然后取得每一條要執(zhí)行的命令,PC在中的內(nèi)容就會自動增加,增加量由本條指令長度決定,可能是1、2或3,以指向下一條指令的起始地址,保證指令順序執(zhí)行。1.2 本論文研究的目的和意義計算器為人們的學(xué)習(xí)、生活提供了很大的便利,市場大,應(yīng)用范圍廣,是辦公應(yīng)用不可缺少的器件。常見的計算其類型有:算數(shù)型計算器,能夠進行加減乘除等簡單的四則運算??茖W(xué)型計算器,能夠進行指數(shù)、對數(shù)

10、、平方、開方等的運算。程序計算器,可進行編程將較復(fù)雜的運算步驟存儲起來,再進行多次運算。一般的計算器包括顯示部分(顯示器)、鍵盤、存儲、控制等。分利用硬件和軟件設(shè)計的計算器更為實用,同時也是電子領(lǐng)域的一個重要課題。1.3 計算器的發(fā)展簡史算籌、算盤是人類最早使用的手動計算工具,最早的計算工具誕生于中國。中國古代最早采用的一種計算工具叫籌策,又被叫做算籌。這種算籌多使用竹子制成,也有用木頭,獸骨來充當材料的約二百七十枚一束,放在布袋里可隨身攜帶。直到今天仍在使用的珠算盤,是中國古代計算工具領(lǐng)域中的另一項重要發(fā)明,明代時使用的珠算盤已經(jīng)與現(xiàn)代的珠算盤幾乎完全一樣。17 世紀初,西方國家的計算工具有

11、了比較大的發(fā)展,英國數(shù)學(xué)家納皮爾發(fā)明了"納皮爾算籌",英國牧師奧卻德發(fā)明了圓柱型對數(shù)計算尺,這種計算尺不僅能做加減乘除、乘方、開方等運算,甚至可以計算三角函數(shù),指數(shù)函數(shù)和對數(shù)函數(shù),這些計算工具不僅帶動了計算器的發(fā)展,也為現(xiàn)代計算器發(fā)展奠定了良好的基礎(chǔ),成為現(xiàn)代社會應(yīng)用廣泛的計算工具。第二章 設(shè)計原理及要求2.1 設(shè)計方案的確定本設(shè)計是以STC89C52RC單片機為核心進行簡易計算器的設(shè)計,通過芯片STC89C52RC編程實現(xiàn)計算器的加減乘除(整除)但不能連加連減等連續(xù)計算的的簡單計算功能。本次設(shè)計的運算模塊由STC89C52RC單片機實現(xiàn),數(shù)據(jù)輸入模塊由4*4矩陣鍵盤實現(xiàn),

12、輸出數(shù)據(jù)模塊由LCD1602液晶顯示屏顯示電路實現(xiàn),再外加一個晶振電路和一個復(fù)位電路即可完成整個簡易計算器的設(shè)計。2.2 系統(tǒng)的設(shè)計方案本設(shè)計由以下幾部分組成: STC89C52RC單片機系統(tǒng)(運算模塊) 、鍵盤電路、顯示電路、晶振電路和復(fù)位電路構(gòu)成,計算器系統(tǒng)框圖如圖2.1所示。圖2.1 計算器系統(tǒng)框圖2.3 系統(tǒng)的設(shè)計要求為了更好的實現(xiàn)系統(tǒng)的功能,硬件電路的設(shè)計應(yīng)該遵循以下原則:2.3.1 優(yōu)化硬件電路采用軟件與硬件設(shè)計相互結(jié)合的方法。雖然采用軟件來實現(xiàn)一些硬件功能,可能會比單純使用硬件的相應(yīng)時間要長,而且還需要占用微處理器的時間,但是使用軟件來實現(xiàn)硬件功能可簡化硬件結(jié)構(gòu),提高電路的可靠性

13、。因此,在設(shè)計過程中,在滿足可靠性和時效性的前提下,應(yīng)盡量采用軟件來實現(xiàn)硬件功能。2.3.2 可靠性及抗干擾設(shè)計根據(jù)可靠性設(shè)計理論,系統(tǒng)所使用的芯片數(shù)量越少,則系統(tǒng)的無故障時間越長。并且,芯片數(shù)量越少,地址和數(shù)據(jù)總線在電路板上受干擾的幾率就越小。因此,應(yīng)該在滿足功能的前提下,盡量使用少的芯片。2.3.3 靈活的功能擴展功能擴展是否靈活是衡量一個系統(tǒng)優(yōu)劣的重要指標之一。一次設(shè)計往往不能完全考慮到系統(tǒng)的各個方面,系統(tǒng)需要不斷完善以及進行功能升級。進行功能擴展時,應(yīng)該在原有設(shè)計的基礎(chǔ)上,通過修改軟件程序和少量硬件完成。對于本系統(tǒng)而言,就是要求在系統(tǒng)硬件不變的情況下,能夠通過修改軟件程序,完成功能的升

14、級和擴展。根據(jù)提出的系統(tǒng)設(shè)計方案,結(jié)合以上三條原則,確定了系統(tǒng)硬件的設(shè)計。計算器主要由以下一些功能模塊組成: 矩陣鍵盤模塊、運算模塊(單片機內(nèi)部)和LCD液晶顯示模塊等。本系統(tǒng)的硬件設(shè)計采用模塊設(shè)計的方法。LCD1602液晶顯示屏,4*4矩陣鍵盤以及STC89C52RC單片機為整個系統(tǒng)的核心,來實現(xiàn)簡易計算器的功能。簡易計算器主要包括:矩陣鍵盤電路,運算電路以及輸出顯示電路。第三章 硬件模塊的設(shè)計在簡易計算機的系統(tǒng)設(shè)計中主要用到的硬件:STC89C52RC單片機,LCD1602液晶顯示屏以及4*4矩陣鍵盤。3.1 單片機STC89C52RC本次設(shè)計采用STC89C52RC單片機,它兼容于MCS

15、51系列單片機,STC89C52RC是STC公司生產(chǎn)的一種低功耗、高性能CMOS8位微控制器,具有8K字節(jié)系統(tǒng)可編程Flash存儲器。STC89C52使用經(jīng)典的MCS-51內(nèi)核,但做了很多的改進使得芯片具有傳統(tǒng)51單片機不具備的功能。在單芯片上,擁有靈巧的8位CPU和在系統(tǒng)可編程Flash,使STC89C52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。STC89C52的引腳圖如3.1所示圖3.1 STC89C52RC引腳圖3.1.1 STC89C52RC單片機的特點STC89系列單片機是MCS-51系列單片機的派生產(chǎn)品,它們在指令系統(tǒng)、硬件結(jié)構(gòu)和片內(nèi)資源上與標準的8051單片機完全兼

16、容。它的特點如下:1.80C51核心處理單元2.64/32/16/8KB片內(nèi)Flash ROM,具有在應(yīng)用可編程(IAP)、在系統(tǒng)可編程(ISP)的功能,可實現(xiàn)遠程軟件升級,無需編程器。3.1K字節(jié)RAM4.雙DPTR數(shù)據(jù)指針5.支持12時鐘或6時鐘模式6.4個8位I/O口,P1口、P2口、P3口可直接驅(qū)動LED7.SPI(串行外接接口)和增強型UART8.有PCA(可編程計數(shù)器陣列),具有PWM的捕獲/比較功能9.3個16位定時器/計數(shù)器10.可編程看門狗定時器11.低EMI方式(ALE禁止)12.兼容TTL和COMS邏輯電平13.掉電模式和低功耗模式14.全靜態(tài)操作0Hz-24Hz3.1.

17、2 管腳說明Vss(20腳):接地電源。P0口(39腳-32腳):P0.0-P0.7。當不接外部存儲器,也不擴展I/O接口時,它可作為準雙向8位輸入/輸出接口。當接有外部存儲器或擴展I/O接口時,P0口為地址/數(shù)據(jù)分時復(fù)用端口。它分時VCC(40腳):接+5V電源正端。提供8位地址信息和8位雙向數(shù)據(jù)信息。 P1口(1腳-8腳):P1.0-P1.7,P1口是一個帶內(nèi)部提供上拉電阻的8位準雙向I/O口,在FLASH編程和校驗時,P1口作為第八位地址接收。P2口(21腳-28腳):P2.0-P2.7,可作為普通準雙向I/O接口。當構(gòu)成系統(tǒng)總線時,P2口作為高8位地址總線,傳送高8位地址信息。 P3口

18、(10腳-17腳):P3.0-P3.7,P3位雙功能端口,可以作為一般的準雙向I/O接口使用,而每一位都具有第2功能,并且P3口的每一條引腳均可獨立定義第1功能的輸入/輸出或第2功能。第2功能:P3.0 RXD(串行輸入口)P3.1 TXD(串行輸出口)P3.2 /INT0(外部中斷0請求輸入端,低電平有效)P3.3 /INT1(外部中斷1請求輸入,低電平有效)P3.4 T0(定時器/計數(shù)器0計數(shù)器脈沖輸入端)P3.5 T1(定時器/計數(shù)器1計數(shù)器脈沖輸入端)P3.6 /WR(外部數(shù)據(jù)存儲器寫選通信號輸出端,低電平有效)P3.7 /RD(外部數(shù)據(jù)存儲器寫選通信號輸出端,低電平有效)P3口同時為

19、閃爍編程和編程校驗接收一些控制信號。RST(9腳):復(fù)位輸入。當振蕩器復(fù)位器件時,要保持RST腳兩個機器周期的高電平時間。ALE/PROG(30腳):地址鎖存允許信號,當訪問外部存儲器時,在每個機器周期內(nèi)ALE信號會出現(xiàn)兩個正脈沖,用于鎖存出現(xiàn)在P0口的低8位地址信息,在不訪問外部存儲器時,ALE端仍以上述頻率(振蕩器頻率的1/6)周期性的輸出正脈沖信號,此信號可作為外部其他部件的時鐘脈沖或用于定時目的。 /PSEN(29腳):片外程序存儲器讀選通信號輸出端,低電平有效。當從外部存儲器讀取指令或讀取常數(shù)期間,每個機器周期PSEN兩次有效。訪問外部數(shù)據(jù)存儲器期間,PSEN信號將不出現(xiàn)。/EA(3

20、1腳):EA為訪問外部程序存儲器控制信號,低電平有效。當EA為高電平時,單片機訪問片內(nèi)程序存儲器4KB(52系列為8KB),若超出此范圍,自動轉(zhuǎn)去執(zhí)行外部程序存儲器的程序。當EA端為低電平時,無論片內(nèi)有無程序存儲器,均只訪問外部程序存儲器。 XTAL1(19腳):外接石英晶體振蕩器的一端。XTAL2(18腳):外接石英晶體振蕩器的另一端。3.1.3 振蕩器特性XTAL1和XTAL2分別為反向放大器的輸入和輸出。該反向放大器可以配置為片內(nèi)振蕩器。石晶振蕩和陶瓷振蕩均可采用。如采用外部時鐘源驅(qū)動器件,XTAL2應(yīng)不接。輸入至內(nèi)部時鐘信號要通過一個二分頻觸發(fā)器,因此對外部時鐘信號的脈寬無任何要求,但

21、必須保證脈沖的高低電平要求的寬度。3.2 矩陣鍵盤模塊在計算器使用過程中,輸入數(shù)字和其他功能是要用到很多次按鍵,如果用獨立按鍵,雖然變成會簡單很多,但是要占用大量I/O口資源,所以一般都不采用這種方式,而是采用矩陣鍵盤。矩陣鍵盤采用四條I/O口作為行線,四條I/O口作為列線,在行線與列線的每個交叉點上設(shè)置一個按鍵。這樣使用8個I/O口便可實現(xiàn)4*4的矩陣鍵盤,可以有效地提高I/O口的利用率。鍵盤可分為兩類:編碼鍵盤和非編碼鍵盤。編碼鍵盤是較多按鍵( 20個以上)和專用驅(qū)動芯片的組合;當按下某個按鍵時,它能夠處理按鍵抖動、連擊等問題,直接輸出按鍵的編碼,無需系統(tǒng)軟件干預(yù)。通用計算機使用的鍵盤就是

22、編碼鍵盤。在智能儀器中,使用并行接口芯片8279或串行接口HD7279均可以組成編碼鍵盤,同時還可以兼顧數(shù)碼管的顯示驅(qū)動,其相關(guān)的接口電路和接口軟件均可在芯片資料中得到。當系統(tǒng)功能比較復(fù)雜,按鍵數(shù)量很多時,采用編碼鍵盤可以簡化軟件設(shè)計。而非編碼鍵盤成本低廉。從簡易和成本角度出發(fā),本設(shè)計選用的是非編碼鍵盤。如圖3.2 所示。一般由16個鍵組成,在單片機中正好可以用一個P口實現(xiàn)16個按鍵功能,這種形式在單片機系統(tǒng)中也最常用。圖3.2 矩陣鍵盤內(nèi)部電路3.3 LCD1602顯示模塊本設(shè)計采用LCD液晶顯示器來顯示輸入輸出數(shù)據(jù)。通過D0-D7引腳向LCD寫指令字或?qū)憯?shù)據(jù)以使LCD實現(xiàn)不同的功能或顯示相

23、應(yīng)數(shù)據(jù)。LCD引腳圖如圖3.4所示。圖3.4 LCD1602引腳圖LCD分為帶背光和不帶背光兩種,帶背光比不帶背光的厚,在實際使用中是否帶背光差別不大,在本設(shè)計中采用帶背光LCD,量和尺寸差別如圖3.5所示。圖3.5 LCD帶背光與不帶背光尺寸對比圖3.3.1 顯示電路當系統(tǒng)需要顯示少量數(shù)據(jù)時,采用LCD液晶顯示屏是一種經(jīng)濟實用的方法。P0口作為液晶顯示的數(shù)據(jù)端口,P1.0、P1.1以及P1.5三個口作為其控制端,控制LCD液晶顯示屏顯示輸出數(shù)據(jù)。顯示電路圖如圖3.6所示。圖3.6 LCD顯示電路圖3.3.2 LCD1602主要技術(shù)參數(shù)顯示容量:16×2個字符芯片工作電壓:4.5-5

24、.5V工作電流:2.0mA(5.0V)模塊最佳工作電壓:5.0V字符尺寸:2.95×4.35(W×H)mm3.3.3 引腳功能說明LCD采用標準的14腳(無背光)或16腳(有背光)接口,各引腳接口說明如表3.1所示。表3.1 LCD1602引腳接口說明表編號符號引腳說明1VSS電源接地2VDD電源正極3VEE液晶顯示偏壓4RS數(shù)據(jù)/命令選擇5R/W讀/寫選擇表3.1續(xù)表編號符號引腳說明6E使能信號78D0D1數(shù)據(jù)數(shù)據(jù)9D2數(shù)據(jù)10D3數(shù)據(jù)11D4數(shù)據(jù)12D5數(shù)據(jù)13D6數(shù)據(jù)14D7數(shù)據(jù)15BLA背光源正極16BLK背光源負極第1腳:VSS為地電源。第2腳:VDD接+5V電源

25、。第3腳:VEE為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地時對比度最高,對比度過高時會產(chǎn)生“鬼影”,使用時可以通過一個10K的電位器調(diào)整對比度。第4腳:數(shù)據(jù)/命令選擇端,高電平時選擇數(shù)據(jù)寄存器,低電平時選擇指令寄存器。第5腳:R/W為讀/寫選擇端,高電平進行讀操作,低電平進行寫操作。當RS和R/W共同為低電平時可以寫入指令或者顯示地址,當RS為低電平、R/W為高電平時可以讀忙信號,當RS為高電平、R/W為低電平時可以寫入數(shù)據(jù)。第6腳:E端為使能端,當E為高電平時,讀取液晶模塊信息,當E端由高電平跳變成低電平時,液晶模塊執(zhí)行寫操作。第714腳:D0D7為8位雙向數(shù)據(jù)線。第15腳:背光源

26、正極。第16腳:背光源負極。3.4 硬件接線圖本設(shè)計的硬件接線圖如圖3.7所示。圖3.7 硬件接線圖第四章 軟件設(shè)計及調(diào)試本設(shè)計需要單片機硬件電路及軟件編程相結(jié)合,在單片機的應(yīng)用系統(tǒng)程序設(shè)計時,常用的是匯編語言和C語言。本設(shè)計采用C語言進行程序的編寫。C語言是一種編譯型程序設(shè)計語言,它兼顧了多種高級語言的特點,并具備了匯編語言的功能。C語言是為了能夠勝任系統(tǒng)程序設(shè)計的要求而開發(fā)的,因此具有很強的表達能力,能夠用于描述系統(tǒng)軟件各方面的特性。它具有較高的可移植性,提供了種類豐富的運算符和數(shù)據(jù)類型,極大地方便了程序設(shè)計。同時它具有豐富的庫函數(shù)、運算速度快、編譯效率高,且可以直接實現(xiàn)對系統(tǒng)硬件的控制。

27、它具有完善的模塊程序結(jié)構(gòu),因此在軟件開發(fā)中可以采用模塊化程序設(shè)計方法。目前,使用C語言進行程序設(shè)計以成為軟件開發(fā)的主流。在軟件程序編寫完成后用硬件調(diào)試法調(diào)試。4.1 程序設(shè)計第一步先進行簡易計算器的程序設(shè)計。4.1.1 功能介紹本次設(shè)計的簡易計算器,其功能主要如下:1.鍵盤輸入;2.顯示數(shù)值;3.加、減、乘、除(整除)四則運算;4.不能進行連續(xù)運算。4.1.2 主模塊功能的設(shè)計主模塊是系統(tǒng)軟件的主框架。結(jié)構(gòu)化程序設(shè)計一般有“自上而下”和“自下而上”兩種方式,“自上而下”法的核心救世主框架的構(gòu)建。它的合理與否關(guān)系到程序最終功能實現(xiàn)的多少與好壞。本設(shè)計的主要功能是計算器。在軟件設(shè)計中程序分別要完成

28、鍵盤輸入檢測、LCD初始化及顯示、算術(shù)運算和錯誤處理及輸出等功能。對主程序進行初始化,其他的程序選擇模塊式的方式。首先對每個模塊進行調(diào)試,當模塊調(diào)試成功后,逐一地加入主程序中,最后完成整個軟件部分的設(shè)計。本設(shè)計的主模塊的程序流程圖如圖4.1所示。圖4.1 系統(tǒng)流程圖4.1.3 鍵盤掃描模塊程序的設(shè)計我們在使用按鍵的時候有這樣一種使用經(jīng)驗,當需要多個按鍵的時候,如果做成獨立按鍵會大量占用IO 口,因此我們引入了矩陣按鍵,使用了8個IO 口來實現(xiàn)16個按鍵。鍵盤掃描子程序應(yīng)具有以下功能:1.判斷有無鍵按下,若有則計算鍵值。其方法為:行輸出口輸出全為0,讀列輸出口信息,若列值為全1,則說明無鍵按下;

29、若不全為1,則說明有鍵按下,并計算鍵值。2.消除按鍵的抖動。在按鍵的使用過程中,通常按鍵所用的開關(guān)都是機械彈性開關(guān),當機械觸點斷開、閉合時,由于機械觸點的彈性作用,一個按鍵開關(guān)在閉合時不會馬上就穩(wěn)定的接通,在斷開時也不會一下子徹底斷開,而是在閉合和斷開的瞬間伴隨了一連串的抖動,如圖4.2 所示。圖4.2 按鍵抖動狀態(tài)圖按鍵穩(wěn)定閉合時間長短是由操作人員決定的,通常都會在100ms 以上,刻意快速按的話能達到40-50ms 左右,很難再低了。抖動時間是由按鍵的機械特性決定的,一般是都會在10ms 以下,為了確保程序?qū)Π存I的一次閉合或者一次斷開只響應(yīng)一次,必須進行按鍵的消抖處理。當檢測到按鍵狀態(tài)變化

30、時,不是立即去響應(yīng)動作,而是先等待閉合或斷開穩(wěn)定后再進行處理。按鍵消抖可分為硬件消抖和軟件消抖。硬件消抖就是在按鍵上并聯(lián)一個電容,如圖4.3所示,利用電容的充放電特性來對動過程中產(chǎn)生的電壓毛刺進行平滑處理,從而實現(xiàn)消抖。但實際應(yīng)用中,這種方式的效果往往不是很好,而且還增加了成本和電路復(fù)雜度。所以實際中使用的并不多。圖4.3 電容消抖3.判斷按鍵是否釋放。計算出閉合鍵的鍵值后,在判斷按鍵是否釋放。若按鍵未釋放則等待;若鍵已釋放,則再延時消抖。4.命令處理。根據(jù)閉合鍵的鍵值,程序應(yīng)該完成該鍵所設(shè)定的功能。鍵盤掃描模塊程序的流程圖如圖4.4所示。圖4.4 鍵盤掃描模塊程序流程圖4.1.4 運算模塊程

31、序的設(shè)計在此模塊中要實現(xiàn)“加”、“減”、“乘”、“除”四種整數(shù)的運算,我們需要定義三個數(shù):a,b,c,類型為長整形(-2147483648+2147483648);其中a為第一個數(shù),b為第二個數(shù),c為兩數(shù)運算的結(jié)果。在本次設(shè)計中不考慮溢出。運算模塊流程圖如圖4.5所示。圖4.5 運算模塊流程圖4.1.5 顯示模塊程序的設(shè)計在本設(shè)計中,LCD1602液晶只顯示字符,不需要顯示漢字或圖形,且需要顯示的字符在LCD1602液晶模塊內(nèi)置的字符發(fā)生存儲器里都有,在編寫程序時,只需要查表就可得到相應(yīng)字符的代碼。顯示程序的流程圖如圖4.6所示。 圖4.6 顯示模塊流程圖4.2 編寫程序4.2.1 keil軟

32、件介紹編寫程序我們會用到Keil軟件。對于單片機程序來說,每個功能程序,都必須要有一個配套的工程文件(Project),因此我們首先要新建一個工程,打開我們的Keil 軟件后,點擊:Project->New uVision Project.然后會出現(xiàn)一個新建工程的界面,如圖4.7 所示。圖4.7 新建工程界面然后保存到我們已經(jīng)建好的文件夾內(nèi),系統(tǒng)會自動保存成計算器.uvproj文件。下一步選擇單片機型號,選擇Intel公司名下的80/87C52來代替STC89C52RC單片機。確定之后建立編寫代碼的文件,點擊,點擊File->New,新建一個文件,也就是我們編寫程序的平臺。然后點F

33、ile->Save 或者直接點擊那個Save 的快捷鍵,可以保存文件并且命名為計算器.C,這個地方必須加上.C 了,因為如果寫匯編語言,這個地方的擴展名是.ASM,頭文件就是.H 等等,我們編寫的是C語言程序,這個地方必須自己添加文件的擴展名.C,如圖4.8 所示。圖4.8 保存文件然后把文件添加到所建立的工程中去,鼠標右鍵點Source Group 1,點Add Files to GroupSource Group 1,如圖4.9所示。圖4.9 添加文件接下來就可以編寫多.C程序文件了,分別保存三個.C文件,分別是LCD1602.C;Keyboard.C;main.c。4.2.2 編寫

34、程序/*LCD1602.c 文件程序代碼*/#include <reg52.h>#define LCD1602_DB P0sbit LCD1602_RS = P10;sbit LCD1602_RW = P11;sbit LCD1602_E = P15;void LcdWaitReady() /等待液晶準備好unsigned char sta;LCD1602_DB = 0xFF;LCD1602_RS = 0;LCD1602_RW = 1;doLCD1602_E = 1;sta = LCD1602_DB; /讀取狀態(tài)字LCD1602_E = 0; while (sta & 0x

35、80); /bit7 等于1 表示液晶正忙,重復(fù)檢測直到其等于0 為止void LcdWriteCmd(unsigned char cmd) /寫入命令函數(shù)LcdWaitReady();LCD1602_RS = 0;LCD1602_RW = 0;LCD1602_DB = cmd;LCD1602_E = 1;LCD1602_E = 0;void LcdWriteDat(unsigned char dat) /寫入數(shù)據(jù)函數(shù)LcdWaitReady();LCD1602_RS = 1;LCD1602_RW = 0;LCD1602_DB = dat;LCD1602_E = 1;LCD1602_E = 0

36、;void LcdShowStr(unsigned char x, unsigned char y, const unsigned char *str) /顯示字符串,屏幕起始坐標(x,y),字符串指針strunsigned char addr;/由輸入的顯示坐標計算顯示RAM 的地址if (y = 0)addr = 0x00 + x; /第一行字符地址從0x00 起始elseaddr = 0x40 + x; /第二行字符地址從0x40 起始/由起始顯示RAM 地址連續(xù)寫入字符串LcdWriteCmd(addr | 0x80); /寫入起始地址while (*str != '0'

37、;) /連續(xù)寫入字符串數(shù)據(jù),直到檢測到結(jié)束符LcdWriteDat(*str);str+;void LcdAreaClear(unsigned char x, unsigned char y, unsigned char len) /區(qū)域清除,清除從(x,y)坐標起始的len 個字符位unsigned char addr;/由輸入的顯示坐標計算顯示RAM 的地址if (y = 0)addr = 0x00 + x; /第一行字符地址從0x00 起始elseaddr = 0x40 + x; /第二行字符地址從0x40 起始/由起始顯示RAM 地址連續(xù)寫入字符串LcdWriteCmd(addr |

38、0x80); /寫入起始地址while (len-) /連續(xù)寫入空格LcdWriteDat(' ');void LcdFullClear()LcdWriteCmd(0x01); /清屏void LcdInit() /液晶初始化函數(shù)LcdWriteCmd(0x38); /16*2 顯示,5*7 點陣,8 位數(shù)據(jù)接口LcdWriteCmd(0x0C); /顯示器開,光標關(guān)閉LcdWriteCmd(0x06); /文字不動,地址自動+1LcdWriteCmd(0x01); /清屏LcdShowStr(15, 1, "0");/在右下角顯示0/*keyboard.c

39、 文件程序代碼*/#include <reg52.h>sbit KEY_IN_1 = P24; /矩陣按鍵的掃描輸入引腳1sbit KEY_IN_2 = P25; /矩陣按鍵的掃描輸入引腳2sbit KEY_IN_3 = P26; /矩陣按鍵的掃描輸入引腳3sbit KEY_IN_4 = P27; /矩陣按鍵的掃描輸入引腳4sbit KEY_OUT_1 = P23; /矩陣按鍵的掃描輸出引腳1sbit KEY_OUT_2 = P22; /矩陣按鍵的掃描輸出引腳2sbit KEY_OUT_3 = P21; /矩陣按鍵的掃描輸出引腳3sbit KEY_OUT_4 = P20; /矩陣按

40、鍵的掃描輸出引腳4const unsigned char code KeyCodeMap44 = /矩陣按鍵編號到PC 標準鍵盤鍵碼的映射表 '1', '2', '3', 0x26 , /數(shù)字鍵1、數(shù)字鍵2、數(shù)字鍵3、+ '4', '5', '6', 0x25 , /數(shù)字鍵4、數(shù)字鍵5、數(shù)字鍵6、- '7', '8', '9', 0x28 , /數(shù)字鍵7、數(shù)字鍵8、數(shù)字鍵9、* 0x1B, '0', 0x0D, 0x27 / 歸零鍵、數(shù)

41、字鍵0、回車鍵、/;unsigned char pdata KeySta44 = /全部矩陣按鍵的當前狀態(tài)1, 1, 1, 1,1, 1, 1, 1,1, 1, 1, 1,1, 1, 1, 1;unsigned char step = 0; /操作步驟unsigned char oprt = 0; /運算類型signed long num1 = 0; /操作數(shù)1signed long num2 = 0; /操作數(shù)2signed long result = 0; /運算結(jié)果extern void LcdFullClear();extern void LcdShowStr(unsigned cha

42、r x, unsigned char y, const unsigned char *str);extern void LcdAreaClear(unsigned char x, unsigned char y, unsigned char len);unsigned char NumToString(unsigned char *str, signed long num) /整型數(shù)轉(zhuǎn)換為字符串,字符串指針str,待轉(zhuǎn)換數(shù)num,返回值為字符串長度unsigned char i, len;unsigned char buf12;if (num < 0) /如果為負數(shù),則首先輸出符號到指針

43、上,并取其絕對值*str = '-'str+;num = -num;i = 0; /先轉(zhuǎn)換為低位在前的十進制數(shù)組do bufi = num % 10;num /= 10;i+; while (num > 0);len = i; /i 最后的值就是有效字符的個數(shù)while (i > 0) /然后將數(shù)組值轉(zhuǎn)換為ASCII 碼反向拷貝到接收指針上i-;*str = bufi + '0'str+;return len; /返回轉(zhuǎn)換后的字符串長度void ShowOprt(unsigned char y, unsigned char type) /顯示運算符,

44、顯示位置y,運算符類型typeswitch (type)case 0: LcdShowStr(0, y, "+"); break;case 1: LcdShowStr(0, y, "-"); break;case 2: LcdShowStr(0, y, "*"); break;case 3: LcdShowStr(0, y, "/"); break;default: break;void Reset() /計算器復(fù)位函數(shù)num1 = 0;num2 = 0;step = 0;LcdFullClear();void N

45、umKeyAction(unsigned char n) /數(shù)字鍵動作函數(shù),按鍵輸入的數(shù)值nunsigned char len;unsigned char str12;if (step > 1) /如計算已完成,則重新開始新的計算Reset();if (step = 0) /輸入第一操作數(shù)num1 = num1*10 + n; /輸入數(shù)值累加到原操作數(shù)上len = NumToString(str, num1); /新數(shù)值轉(zhuǎn)換為字符串LcdShowStr(16-len, 1, str); /顯示到液晶第二行上else /輸入第二操作數(shù)num2 = num2*10 + n;len = Num

46、ToString(str, num2);LcdShowStr(16-len, 1, str);void OprtKeyAction(unsigned char type) /運算符按鍵動作函數(shù),運算符類型typeunsigned char len;unsigned char str12;if (step = 0) /第二操作數(shù)尚未輸入時響應(yīng),即不支持連續(xù)操作len = NumToString(str, num1); /第一操作數(shù)轉(zhuǎn)換為字符串LcdAreaClear(0, 0, 16-len); /清除第一行左邊的字符位LcdShowStr(16-len, 0, str); /字符串靠右顯示在第

47、一行ShowOprt(1, type); /在第二行顯示操作符LcdAreaClear(1, 1, 14); /清除第二行中間的字符位LcdShowStr(15, 1, "0"); /在第二行最右端顯示0oprt = type; /記錄操作類型step = 1;void GetResult() /計算結(jié)果unsigned char len;unsigned char str12;if (step = 1) /第二操作數(shù)已輸入時才執(zhí)行計算step = 2;switch (oprt) /根據(jù)運算符類型計算結(jié)果,未考慮溢出問題case 0: result = num1 + num

48、2; break;case 1: result = num1 - num2; break;case 2: result = num1 * num2; break;case 3: result = num1 / num2; break;default: break;len = NumToString(str, num2); /原第二操作數(shù)和運算符顯示在第一行ShowOprt(0, oprt);LcdAreaClear(1, 0, 16-1-len);LcdShowStr(16-len, 0, str);len = NumToString(str, result); /計算結(jié)果和等號顯示在第二行L

49、cdShowStr(0, 1, "=");LcdAreaClear(1, 1, 16-1-len);LcdShowStr(16-len, 1, str);void KeyAction(unsigned char keycode) /按鍵動作函數(shù),根據(jù)鍵碼執(zhí)行相應(yīng)動作if (keycode>='0') && (keycode<='9') /顯示輸入的字符NumKeyAction(keycode - '0');else if (keycode = 0x26) /向上鍵,+OprtKeyAction(0)

50、;else if (keycode = 0x28) /向下鍵,-OprtKeyAction(1);else if (keycode = 0x25) /向左鍵,*OprtKeyAction(2);else if (keycode = 0x27) /向右鍵,÷OprtKeyAction(3);else if (keycode = 0x0D) /回車鍵,計算結(jié)果GetResult();else if (keycode = 0x1B) /Esc 鍵,清除Reset();LcdShowStr(15, 1, "0");void KeyDrive() /按鍵動作驅(qū)動函數(shù)unsi

51、gned char i, j;static unsigned char pdata backup44 = /按鍵值備份,保存前一次的值1, 1, 1, 1,1, 1, 1, 1,1, 1, 1, 1,1, 1, 1, 1;for (i=0; i<4; i+) /循環(huán)掃描4*4 的矩陣按鍵for (j=0; j<4; j+)if (backupij != KeyStaij) /檢測按鍵動作if (backupij != 0) /按鍵按下時執(zhí)行動作KeyAction(KeyCodeMapij); /調(diào)用按鍵動作函數(shù)backupij = KeyStaij;void KeyScan() /

52、按鍵掃描函數(shù)unsigned char i;static unsigned char keyout = 0; /矩陣按鍵掃描輸出計數(shù)器static unsigned char keybuf44 = /按鍵掃描緩沖區(qū),保存一段時間內(nèi)的掃描值0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF;/將一行的4 個按鍵值移入緩沖區(qū)keybufkeyout0 = (keybufkeyout0 << 1) | KEY_IN_1;keybufkeyout1 = (ke

53、ybufkeyout1 << 1) | KEY_IN_2;keybufkeyout2 = (keybufkeyout2 << 1) | KEY_IN_3;keybufkeyout3 = (keybufkeyout3 << 1) | KEY_IN_4;/消抖后更新按鍵狀態(tài)for (i=0; i<4; i+) /每行4 個按鍵,所以循環(huán)4 次if (keybufkeyouti & 0x0F) = 0x00) /連續(xù)4 次掃描值為0,即16ms(4*4ms)內(nèi)都只檢測到按下狀態(tài)時,可認為按鍵已按下KeyStakeyouti = 0;else if (

54、keybufkeyouti & 0x0F) = 0x0F) /連續(xù)4 次掃描值為1,即16ms(4*4ms)內(nèi)都只檢測到彈起狀態(tài)時,可認為按鍵已彈起KeyStakeyouti = 1;/執(zhí)行下一次的掃描輸出keyout+;keyout &= 0x03;switch (keyout)case 0: KEY_OUT_4 = 1; KEY_OUT_1 = 0; break;case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break;case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0; break;case 3: KEY_OUT_3 = 1; KEY_OUT_4 = 0; break;default: break;/*main.c 文件程序代碼*/#include <reg52.h>void ConfigTimer0(

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論