版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、廣東工業(yè)大學(xué)單片機(jī)課程設(shè)計基于51單片機(jī)的簡易計算器設(shè)計【摘 要】單片機(jī)的出現(xiàn)是計算機(jī)制造技術(shù)高速發(fā)展的產(chǎn)物,它是嵌入式控制系統(tǒng)的核心,如今,它已廣泛的應(yīng)用到我們生活的各個領(lǐng)域,電子、科技、通信、汽車、工業(yè)等。本設(shè)計是基于51系列單片機(jī)來進(jìn)行的數(shù)字計算器系統(tǒng)設(shè)計,可以完成計算器的鍵盤輸入,進(jìn)行加、減、乘、除八位數(shù)范圍內(nèi)的基本四則運(yùn)算,并在LCD上顯示相應(yīng)的結(jié)果。設(shè)計電路采用AT89S51單片機(jī)為主要控制電路,利用4*4矩陣鍵盤作為計算器的數(shù)字以及運(yùn)算符的輸入。顯示采用字符LCD靜態(tài)顯示。軟件方面使用C語言編程,并用開發(fā)板制作并演示?!娟P(guān)鍵詞】計算器,單片機(jī),LCD,矩陣鍵盤 AbstractT
2、he emergence of computer chip manufacturing technology, rapid development of the product, which is the core of embedded control systems, and now, it has been widely applied to all areas of our lives, electronics, technology, communications, automotive, industrial and so on. The design is based
3、on the 51 computers for digital system design calculator, you can complete the calculator keyboard, to add, subtract, multiply, and divide within the scope of the basic six-digit arithmetic, and the corresponding results on the LCD display . AT89C51 microcontroller circuit design as the ma
4、in control circuit, use MM74C922 4 * 4 keypad as a calculator scan IC to read keyboard input. Character LCD display with a static display. Software using the C programming language, and use PROTUES simulation. Keywords: calculator,MCU,LCD, Matrix keyboard 目錄摘 要1一、系統(tǒng)總體設(shè)計11.1設(shè)計概述11
5、.2設(shè)計思路11.3系統(tǒng)總體模塊圖:21.4系統(tǒng)方案2二、硬件系統(tǒng)設(shè)計22.1主控芯片AT89S52單片機(jī)22.2 LCD1602液晶顯示屏32.3鍵盤接口電路42.4 清零、音樂開關(guān)、開方和多次方運(yùn)算功能模塊52.5電源模塊設(shè)計6三、軟件系統(tǒng)設(shè)計63.1總體設(shè)計63.2子程序設(shè)計83.2.1液晶顯示程序設(shè)計83.2.2 矩陣鍵盤掃描程序設(shè)計83.2.3 AC清零程序設(shè)計93.2.4 聲音開關(guān)子程序設(shè)計10四、系統(tǒng)功能測試104.1總體實(shí)物測試104.2 各項(xiàng)功能測試114.3 多次測試11五、總結(jié)12六、結(jié)束語12參考文獻(xiàn)13附錄14附1:計算器原理圖14附2:主程序清單14附3:鍵盤掃描子
6、程序21附4:LCD1602顯示程序24附5:LCD1602顯示字符表28附6: LCD接口信號說明29附7: LCD寫操作時序圖29一、系統(tǒng)總體設(shè)計1.1設(shè)計概述本設(shè)計使用AT89S52單片機(jī)作為主控芯片,通過計算機(jī)鍵盤進(jìn)行數(shù)據(jù)輸入,進(jìn)行相應(yīng)的加、減、乘、除的運(yùn)算,并在LCD上顯示相應(yīng)的結(jié)果,主要功能特點(diǎn)如下:(1)LCD的第一行顯示運(yùn)算式子,第二行顯示運(yùn)算結(jié)果,在任何時候按下AC清零按鍵時候,都必須退出當(dāng)前計算,返回初始狀態(tài),等下新的一次運(yùn)算。(2)當(dāng)運(yùn)算完第一次完整的計算以后,可以在不按任何按鍵的情況下,進(jìn)行新的一輪運(yùn)算,若運(yùn)算完一次運(yùn)算后繼續(xù)按運(yùn)算符按鍵,則利用之前一次的結(jié)果作為第一個
7、算數(shù),直接等待第二運(yùn)算數(shù)的輸入并完成計算,即可進(jìn)行連續(xù)運(yùn)算。(3)可根據(jù)用戶需要開啟或關(guān)閉按鍵聲音提示,即通過重復(fù)按聲音開關(guān)按鈕可關(guān)聲音或開聲音。(4)可進(jìn)行開方運(yùn)算、可進(jìn)行任意次方的運(yùn)算,即能進(jìn)行x的y次方的運(yùn)算。1.2設(shè)計思路根據(jù)課程要求和設(shè)計指標(biāo),本系統(tǒng)采用MCS-51系列單片機(jī)作為主控機(jī),通過拓展必要的外圍電路,實(shí)現(xiàn)對計算器的設(shè)計,具體設(shè)計思路如下:(1) 由于要顯示運(yùn)算式和結(jié)果,為了達(dá)到良好的顯示效果,本系統(tǒng)采用LCD1602液晶顯示屏作為顯示模塊。(2) 計算器一般包含數(shù)字鍵(09),符號鍵(、×、÷)、小數(shù)點(diǎn)按鍵,等號按鍵,故采用4*4矩陣鍵盤結(jié)合鍵盤掃描技術(shù)
8、容易達(dá)到要求,并且電路和程序也比較簡單。(3) 執(zhí)行過程:開機(jī)顯示0,等待按鍵輸入,當(dāng)鍵入數(shù)字,在LCD上顯示出來,計算器內(nèi)部吧數(shù)據(jù)儲存起來,并等待下一按鍵輸入,當(dāng)鍵入、×、÷運(yùn)算符,計算器在內(nèi)部進(jìn)行轉(zhuǎn)換,得到第一運(yùn)算數(shù),然后等待再次輸入數(shù)值,按等于號就在LCD上顯示結(jié)果,如果繼續(xù)按下、×、÷運(yùn)算符,則直接利用第一次運(yùn)算的結(jié)果進(jìn)行下一次運(yùn)算。(4) AC清零功能:在運(yùn)算的任何時候鍵入AC鍵,則把數(shù)據(jù)清零,等待下一次運(yùn)算。為了實(shí)現(xiàn)此功能,本系統(tǒng)采用AC按鍵外部中斷輸入,運(yùn)用中斷技術(shù),隨時對計算器進(jìn)行清零。(5) 音樂開關(guān)功能:由于在輸入的任何時候都有可能需
9、要開啟或關(guān)閉聲音提示,所以聲音開關(guān)按鍵也采用外部中斷輸入單片機(jī),運(yùn)用中斷技術(shù),隨時開或關(guān)聲音提示。(6) 開方和多次方運(yùn)算功能的實(shí)現(xiàn):采用獨(dú)立按鍵,再檢測運(yùn)算符的時候也檢測這兩個按鍵,一旦符合按下則進(jìn)行開方或者多次方運(yùn)算,程序可通過條用“math.h”頭文件中的sqrt和pow函數(shù)實(shí)現(xiàn)。(7) 錯誤提示:當(dāng)輸入超過范圍時,則停止輸入,等待輸入運(yùn)算符;當(dāng)除數(shù)為0時,計算器會在LCD上提示錯誤;當(dāng)被開方數(shù)小于0時,提示錯誤。鑒于本設(shè)計的計算器的難度以及功能的要求,在本設(shè)計中決定使用語言功能豐富、表達(dá)能力強(qiáng)、使用方便靈活、可移植性好的C語言編寫軟件,這樣有利于減輕工作量和代碼量,提高設(shè)計效率。若使用
10、匯編語言編寫程序,會出現(xiàn)匯編語言無法表達(dá)、移植困難等問題,而且對于開方和多次方的運(yùn)算,匯編語言難以表達(dá)和設(shè)計,這是設(shè)計是很不利。1.3系統(tǒng)總體模塊圖:圖1.1 系統(tǒng)總體框圖1.4系統(tǒng)方案經(jīng)過反復(fù)推敲最終確定系統(tǒng)采用以下方案:(1)采用AT89S52作為主控芯片;(2)顯示模塊使用LCD1602液晶顯示屏;(3)輸入模塊使用4*4矩陣鍵盤;(4)AC清零按鍵使用獨(dú)立按鍵并接入單片機(jī)外部中斷引腳;(5)聲音提示開關(guān)按鍵使用獨(dú)立按鍵并接入單片機(jī)外部中斷引腳;(6)平方和開方按鍵由開發(fā)板上的獨(dú)立按鍵實(shí)現(xiàn);(7)電源采用LM7805穩(wěn)壓電路。二、硬件系統(tǒng)設(shè)計2.1主控芯片AT89S52單片機(jī)AT89S5
11、2 是一種低功耗、高性能CMOS8位微控制器,具有 8K 在系統(tǒng)可編程 DIP封裝Flash 存儲器。使用Atmel 公司高密度非易失性存儲器技術(shù)制造,與工業(yè)80C51 產(chǎn)品指令和引腳完全兼容。片上Flash允許程序存儲器在系統(tǒng)可編程,亦適于常規(guī)編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng) 可編程Flash,使得AT89S52為眾多嵌入式控制應(yīng)用系統(tǒng)提 供高靈活、超有效的解決方案。 AT89S52具有以下標(biāo)準(zhǔn)功能: 8k字節(jié)Flash,256字節(jié)RAM, 32 位I/O 口線,看門狗定時器,2個數(shù)據(jù)指針,三個16 位定時器/計數(shù)器,一個6向量2級中斷結(jié)構(gòu),全雙工串行口,片內(nèi)晶振及時鐘電
12、路。另外,AT89S52 可降至0Hz 靜態(tài)邏 輯操作,支持2種軟件可選擇節(jié)電模式??臻e模式下,CPU 停止工作,允許RAM、定時器/計數(shù)器、串口、中斷繼續(xù)工 作。掉電保護(hù)方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié), 單片機(jī)一切工作停止,直到下一個中斷或硬件復(fù)位為止。AT89S52的最大優(yōu)點(diǎn)是可以在線編程,在調(diào)試程序的時候,可直接帶電燒錄程序,燒錄完成即可自動復(fù)位運(yùn)行,非常適合調(diào)試程序。而且AT89S52可編程一千多次以上,的確是一種價格低廉的開發(fā)芯片。單片機(jī)的最小系統(tǒng)設(shè)計:圖2.1 單片機(jī)最小系統(tǒng)2.2 LCD1602液晶顯示屏LCD1602,工業(yè)字符型液晶,能夠同時顯示16x02即32個字符(
13、16列2行),故簡稱1602。1602字符型LCD通常有14條引腳線或16條引腳線的LCD,多出來的2條線是背光電源線VCC(15腳)和地線GND(16腳),其控制原理與14腳的LCD完全一樣。1602液晶模塊內(nèi)部的字符發(fā)生存儲器(CGROM)已經(jīng)存儲了160個不同的點(diǎn)陣字符圖形,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號、和日文假名等,每一個字符都有一個固定的代碼,比如大寫的英文字母“A”的代碼是01000001B(41H),顯示時模塊把地址41H中的點(diǎn)陣字符圖形顯示出來,我們就能看到字母“A”。因?yàn)?602識別的是ASCII碼,試驗(yàn)可以用ASCII碼直接賦值,在單片機(jī)編程中還可以
14、用字符型常量或變量賦值,如'A。1602LCD 液晶具有功耗低、顯示內(nèi)容豐富、清晰,顯示信息量大,顯示速度較快,界面友好等而得到廣泛應(yīng)用,因此使用1602液晶顯示屏,可以方便的顯示多種字符,特別適用于單片機(jī)計算器的雙行顯示。液晶顯示模塊的設(shè)計:圖2.2 液晶顯示模塊2.3鍵盤接口電路計算器輸入數(shù)字和其他功能按鍵要用到很多按鍵,如果采用獨(dú)立按鍵的方式,在這種情況下,編程會很簡單,但是會占用大量的I/O 口資源,因此在很多情況下都不采用這種方式,而是采用矩陣鍵盤的方案。矩陣鍵盤采用四條I/O 線作為行線,四條I/O 線作為列線組成鍵盤,在行線和列線的每個交叉點(diǎn)上設(shè)置一個按鍵。這樣鍵盤上按鍵
15、的個數(shù)就為4×4個。這種行列式鍵盤結(jié)構(gòu)能有效地提高單片機(jī)系統(tǒng)中I/O 口的利用率。矩陣鍵盤的工作原理:計算器的鍵盤布局如圖2所示:一般有16個鍵組成,在單片機(jī)中正好可以用一個P口實(shí)現(xiàn)16個按鍵功能,這種形式在單片機(jī)系統(tǒng)中也最常用。矩陣鍵盤的設(shè)計:圖2.3 矩陣鍵盤2.4 清零、音樂開關(guān)、開方和多次方運(yùn)算功能模塊本設(shè)計要求在任何時候按下AC清零鍵,都必須退出當(dāng)前操作,數(shù)據(jù)清零,準(zhǔn)備下一次的運(yùn)算,故應(yīng)采用獨(dú)立鍵盤產(chǎn)生下降沿輸入給單片機(jī)外部中斷處理。對于聲音開關(guān)按鍵,由于要求隨時關(guān)閉或打開聲音提示,本設(shè)計也采用獨(dú)立按鍵產(chǎn)生下降沿輸入給單片機(jī)的外部中斷處理。而開方或多次方運(yùn)算,則可與矩陣鍵盤
16、一起檢測,也當(dāng)做一個運(yùn)算符處理。具體功能按鍵設(shè)計如下圖圖2.4 AC清零模塊圖中,AC為清零按鍵、KeyBeep為聲音開關(guān)按鍵、KeySqrt為開方按鍵、KeyPow為多次方按鍵。2.5電源模塊設(shè)計由于AT89S52和LCD1602都是采用5V供電,而且其他模塊功能也采用5V電平,本系統(tǒng)采用LM7805作為穩(wěn)壓芯片,經(jīng)過初級和次級的電容濾波,最終得到穩(wěn)定的5V電壓供給系統(tǒng)使用,其電路如下:圖2.5 5V穩(wěn)壓電路三、軟件系統(tǒng)設(shè)計3.1總體設(shè)計本系統(tǒng)采用大小循環(huán)嵌套方式的軟件設(shè)計思想,大循環(huán)則一直在運(yùn)行,使計算器一直處于工作狀態(tài),并不斷掃描按鍵,小循環(huán)用于識別數(shù)字是否輸入完,一旦檢測到輸入的是運(yùn)算
17、符,則轉(zhuǎn)換輸入數(shù)值并儲存起來,最后按下等于號以后則根據(jù)運(yùn)算符計算兩個數(shù)值的大小,并通過LCD顯示。軟件系統(tǒng)總框圖如下:圖3.1 總程序框圖3.2子程序設(shè)計3.2.1液晶顯示程序設(shè)計LCD1602在上電以后,應(yīng)該先等待50毫秒左右,讓其內(nèi)部芯片初始化后再對其進(jìn)行操作。在對其操作時,應(yīng)參考其時序圖,先把命令寫入其內(nèi)部寄存器設(shè)置它的工作方式和狀態(tài)。要顯示數(shù)據(jù)的時候,先設(shè)置好顯示坐標(biāo),再往里面寫入要顯示的ASCII碼,LCD則通過刷新和替換來顯示新的數(shù)據(jù)。其程序流程圖如下圖所示:3.2.2 矩陣鍵盤掃描程序設(shè)計由于矩陣鍵盤采用4行4列的結(jié)構(gòu),每一行每一列各對應(yīng)一個I/O口,故程序應(yīng)該逐行查詢,一旦查詢
18、到有某一行的按鍵被按下了,則根據(jù)讀取到的I/O總線口的數(shù)據(jù)即可查詢到是哪一列的按鍵被按下了,最后對應(yīng)行列返回一個按鍵值回主函數(shù)。其程序流程圖如下:圖3.3 矩陣鍵盤程序流程圖3.2.3 AC清零程序設(shè)計根據(jù)系統(tǒng)要求以及硬件結(jié)構(gòu),AC按鍵直接接入單片機(jī)外部中段0,則程序應(yīng)使用中斷來清除各數(shù)據(jù)存儲變量達(dá)到清零的目的,并把清零標(biāo)志位至1,在主程序中不斷查詢標(biāo)志位,若為1,則清零后。其程序框圖如右圖:3.2.4 聲音開關(guān)子程序設(shè)計根據(jù)要求,聲音開關(guān)使用外部中斷1來處理,當(dāng)按下聲音開關(guān)時,觸發(fā)單片機(jī)進(jìn)入外部中斷1,在中斷程序里,通過對聲音開關(guān)標(biāo)志位取反,在按鍵掃描過程中,加入對聲音標(biāo)志位的判斷,若為1,
19、則發(fā)出聲音,即可實(shí)現(xiàn)聲音提示功能。其程序框圖如右圖:四、系統(tǒng)功能測試4.1總體實(shí)物測試制作出來的系統(tǒng)實(shí)物圖如下:4.2 各項(xiàng)功能測試表4-2 各項(xiàng)功能測試加法測試:減法測試:乘法測試:除法測試:開方測試:多次方運(yùn)算測試:錯誤提示測試1:錯誤提示測試2:由以上測試結(jié)果可知,計算器的各項(xiàng)功能正常,基本能達(dá)到設(shè)計要求。下面將進(jìn)行多次測試,以檢驗(yàn)計算器的性能指標(biāo)。294.3 多次測試本測試由加、減、乘、除、開方、多次方運(yùn)算以及連續(xù)運(yùn)算、自動開始新一輪運(yùn)算、錯誤提示測試等組成,其測試結(jié)果如下表:表4-3多次測試數(shù)據(jù)測試次數(shù)第一運(yùn)算數(shù)運(yùn)算符號第二運(yùn)算數(shù)運(yùn)算結(jié)果實(shí)際結(jié)果1244+3.625247.62500
20、2247.62524557.554-5445745-5441187.44602-5441187.4463102.5*2424602460467/7.58.9333348.93333333358(無輸入)2.8284272.2842712566236367(無輸入)+1349498(無輸入)(無輸入)77969/0math error錯誤10-16(無輸入)math error錯誤結(jié)果分析:對比運(yùn)算結(jié)果和實(shí)際結(jié)果可知,進(jìn)行一般的整形運(yùn)算計算器能準(zhǔn)確無誤計算出來,但是當(dāng)進(jìn)行浮點(diǎn)運(yùn)算時候,會產(chǎn)生精度丟失或者是有尾數(shù)產(chǎn)生,這是因?yàn)?051單片機(jī)對的浮點(diǎn)運(yùn)算功能差,而且在keil開發(fā)環(huán)境中,float型
21、和double型浮點(diǎn)數(shù)的精度都是一樣的,其小數(shù)點(diǎn)的有效數(shù)字位數(shù)都是67位,這就決定了本設(shè)計的計算器的浮點(diǎn)數(shù)精度有限,只能通過小數(shù)點(diǎn)補(bǔ)償來減少浮點(diǎn)數(shù)運(yùn)算誤差。另外,由連續(xù)運(yùn)算、新一輪運(yùn)算測試、錯誤提示測試的結(jié)果以及運(yùn)算過程中的AC清零、聲音開關(guān)設(shè)置可見,本設(shè)計的計算器的功能基本能實(shí)現(xiàn)。但是,由實(shí)際操作可發(fā)現(xiàn)本設(shè)計存在以下不足:(1)某些按鍵不夠靈敏,導(dǎo)致需要按很多次才能輸入;(2)當(dāng)運(yùn)算式子超過屏幕范圍時,不能通過移動屏幕來完全顯示式子;(3)當(dāng)連續(xù)出現(xiàn)錯誤操作時,如連續(xù)輸入減號,程序不能自動復(fù)位,會產(chǎn)生連續(xù)錯誤;(4)沒有刪除輸入功能,當(dāng)輸入出錯時,只能通過清零后重新輸入;(5)沒有數(shù)據(jù)溢出提
22、示功能。五、總結(jié)經(jīng)過多次測量與調(diào)試,本計算器基本能實(shí)現(xiàn)設(shè)計要求中的功能。在設(shè)計的過程中,也遇到了不少的困難,例如在LCD上顯示任意位整數(shù),顯示任意位小數(shù),在輸入小數(shù)的時候小數(shù)點(diǎn)的處理問題,連續(xù)運(yùn)算的結(jié)果保存與清空問題等等。最后通過不斷的查閱資料,請教別人,修改程序,下載調(diào)試等過程,終于把遇到的問題逐一解決了。雖然某些問題解決得不夠完美,但是都是經(jīng)過自己的思考和努力解決的,在此過程自己也學(xué)到了很多東西,例如學(xué)會了矩陣鍵盤的掃描技術(shù)、LCD接口技術(shù)、LCD的顯示技術(shù)、中斷技術(shù)等等,這些技術(shù)對熟練單片機(jī)的使用以及單片機(jī)項(xiàng)目開發(fā)是非常有幫助的。在設(shè)計的過程中的思考解決問題的思路和方法對以后的工作和生活
23、都是非常有幫助的。六、結(jié)束語首先,感謝學(xué)校和老師安排這一次的單片機(jī)課程設(shè)計,在大學(xué)期間,做這類的課程設(shè)計是非常有必要的,特別是對我們大三的學(xué)生,有利于我們將理論與實(shí)踐聯(lián)系起來。在兩周的課程設(shè)計時間里,經(jīng)過努力拼搏,查閱了很多資料和文獻(xiàn),終于完成了基于單片機(jī)的計算器的設(shè)計。在設(shè)計的過程中,不僅鞏固了以前學(xué)過的理論知識,而且還學(xué)會了很多書本上沒有的知識,最重要的是把理論和實(shí)際結(jié)合起來,提高了自己的動手和獨(dú)立思考的能力。在本設(shè)計中,由于時間和能力有限,難免會有不足的地方還望老師批評指正,以便在以后的設(shè)計中改正。這次課程設(shè)計得以順利完成,少不了老師的指導(dǎo)和周圍同學(xué)的指教,在此表示深切的感謝!參考文獻(xiàn)1
24、 吳寧. 80X86/Pentium 微型計算機(jī)原理及應(yīng)用M. 北京:電子工業(yè)出版社,2004:1-249.2 蔡美琴. MCS-51系列單片機(jī)系統(tǒng)及其應(yīng)用M.北京:高等教育出版社,2003:1-169.3 肖金球. 單片機(jī)原理與接口技術(shù)M. 北京: 清華大學(xué)出版社, 2004:1-3234 郭天祥. 新概念51單片機(jī)C語言教程:入門、提高、開發(fā)、拓展全攻略.北京:電子工業(yè)出版社,2009 P225 譚浩強(qiáng). 從語言程序設(shè)計(第三版). 北京:清華大學(xué)出版社,2005:1-378.附錄附1:計算器原理圖附2:主程序清單#include<reg52.h>#include<mat
25、h.h>#include "lcd1602_8.h"uint temp,num;/鍵盤掃描數(shù)值uchar keynum1=0,keynum2=0,sign=0,i=0,j=0; /按鍵計數(shù),符號標(biāo)示uchar num18=0,num28=0; /按鍵存儲數(shù)組float ans1=0,ans2=0,ans=0,point=0; /運(yùn)算數(shù)據(jù)bit conflag=0; /繼續(xù)運(yùn)算標(biāo)志位bit newcalc=0;/新運(yùn)算標(biāo)志bit ac=0;/清零標(biāo)志,1為清零bit beepflag=0; /蜂鳴器標(biāo)志位bit sqrtflag1=0;/開方1標(biāo)志位bit sqrtfl
26、ag2=0;/開方2標(biāo)志位sbit keybeep=P33;/蜂鳴器開關(guān)按鍵sbit beep=P27; /蜂鳴器控制口sbit keysqrt=P34;/開方按鍵sbit keypow=P35;/任意次方按鍵uchar keyscan();void maininit(void);/*主程序*/void main(void)maininit();/初始化while(1)/整個系統(tǒng)大循環(huán),讓計算器一直處于工作狀態(tài)while(1)/第一運(yùn)算數(shù)掃描if(ac=1)break; /若清零,則退出輸入if(keyscan()!='N')&&(num>=0&&
27、amp;num<=9)|num='.') /記錄按下的數(shù)字if(newcalc=1) /新一次運(yùn)算開始lcdwrite_com(0x01);/清屏newcalc=0;lcd_setxy(0,0);if(keynum1<=7) /限制輸入位數(shù)if(num='.')lcdwrite_data('.');/顯示小數(shù)點(diǎn)elselcdwrite_num1(num);num1keynum1=num;keynum1+;else if(num='+'|num='-'|num='*'|num='/
28、'|num='='|num=''|keysqrt=0) if(keynum1=0&&num10=0) /若直接輸入運(yùn)算符而沒有輸入數(shù)字則執(zhí)行連續(xù)運(yùn)算here:ans1=ans;sign=num;lcdwrite_com(0x01);delayms(5);lcd_setxy(0,0);lcdwrite_float(ans1);if(sqrtflag2!=1&&num!='N')lcdwrite_data(num);break; for(i=0;keynum1>0;i+) /計算按下的數(shù)字的大小if(nu
29、m1i!='.')ans1=ans1*10+num1i;else if(num1i='.')break;keynum1-;for(keynum1-,i+,j=0;keynum1>0;j+,i+,keynum1-)point=point*10+num1i;for(;j>0;j-)point*=0.1;ans1=ans1+point;sqrtflag1=0; /清除開方標(biāo)志sqrtflag2=0;/清除開方標(biāo)志if(keysqrt=0) /計算開方delayms(5);if(keysqrt=0)if(beepflag=1) /若開聲音則每一次按鍵均鳴叫b
30、eep=0;delayms(100);beep=1;ans=sqrt(ans1);sqrtflag1=1;lcdwrite_data(0xe8);while(keysqrt=0);delayms(10);while(keysqrt=0);break;sign=num; /記住運(yùn)算符號lcdwrite_data(num);break; /輸入運(yùn)算符號則退出第一運(yùn)算數(shù)的輸入while(1)if(ac=1)break; /若清零,則退出輸入if(sqrtflag1=1) /若第一次按鍵為開方,則直接顯示結(jié)果break;if(keyscan()!='N')&&(num&
31、gt;=0&&num<=9)|num='.') /記錄按下的數(shù)字if(keynum2<=7)if(num='.')lcdwrite_data('.');/顯示小數(shù)點(diǎn)elselcdwrite_num1(num);num2keynum2=num;keynum2+;else if(num='='|keysqrt=0)sqrtflag2=0;/清除開方標(biāo)志if(keysqrt=0) /進(jìn)入開方 delayms(5);if(keysqrt=0)sqrtflag2=1; /開方標(biāo)志lcdwrite_data(0xe
32、8); /寫開方符號if(beepflag=1)/若開聲音則每一次按鍵均鳴叫beep=0;delayms(100);beep=1;while(keysqrt=0);delayms(10);while(keysqrt=0);point=0;for(i=0;keynum2>0;i+) /計算按下的數(shù)字的大小if(num2i!='.')ans2=ans2*10+num2i;else if(num2i='.')break;keynum2-;for(keynum2-,i+,j=0;keynum2>0;j+,i+,keynum2-)point=point*10+
33、num2i;for(;j>0;j-)point*=0.1;if(sqrtflag2!=1)lcdwrite_data(num);ans2=ans2+point;break;/輸入等于號則退出第二運(yùn)算數(shù)的輸入else if(num='+'|num='-'|num='*'|num='/'|num='')point=0;for(i=0;keynum2>0;i+) /計算按下的數(shù)字的大小if(num2i!='.')ans2=ans2*10+num2i;else if(num2i='.
34、39;)break;keynum2-;for(keynum2-,i+,j=0;keynum2>0;j+,i+,keynum2-)point=point*10+num2i;for(;j>0;j-)point*=0.1;lcdwrite_data(num);ans2=ans2+point;conflag=1;break; /進(jìn)行連續(xù)計算if(ac=1)ac=0;continue; /清零后進(jìn)行下一次運(yùn)算if(sign='+') /計算結(jié)果ans=ans1+ans2;if(sign='-')ans=ans1-ans2;if(sign='*'
35、)ans=ans1*ans2;if(sign='/')ans=ans1/ans2;if(sign='') /計算多次方ans=pow(ans1,ans2); if(sqrtflag2=1)/計算開方ans=sqrt(ans);lcd_setxy(1,0);if(ans2=0&&sign='/')|(ans<0&&(sqrtflag1=1|sqrtflag2=1)lcdwrite_string("math error");/ans2=0或被開方數(shù)小于0時提示錯誤 else lcdwrite_
36、float(ans);/顯示結(jié)果sqrtflag1=0,newcalc=1; /為新的一次運(yùn)算準(zhǔn)備ans1=0;ans2=0;for(i=0;i<8;i+)/清除按鍵緩存num1i=0;for(i=0;i<8;i+)num2i=0;if(conflag=1)conflag=0;goto here; /跳轉(zhuǎn)到連續(xù)運(yùn)算/*初始化程序*/void maininit(void)delayms(100); /等待液晶初始化lcd_init();lcd_setxy(0,0);lcdwrite_data('0');lcd_setxy(0,0);IT0=1;/下降沿觸發(fā)EX0=1;
37、/開外部中斷0IT1=1;/下降沿觸發(fā)EX1=1;/開外部中斷1EA=1; /開中斷/*清零中斷程序*/void EX0_int() interrupt 0if(beepflag=1)/若開聲音則每一次按鍵均鳴叫beep=0;delayms(100);beep=1;lcdwrite_com(0x01); /顯示清屏lcd_setxy(0,0);lcdwrite_data('0');lcd_setxy(0,0);num='N' /數(shù)字初始化keynum1=0,keynum2=0,sign=0; ans1=0,ans2=0,ans=0,point=0;conflag
38、=0,newcalc=0;ac=1;/*聲音中斷程序*/void EX1_int() interrupt 2beepflag=beepflag;if(beepflag=1) /若開聲音則每一次按鍵均鳴叫beep=0;delayms(100);beep=1;附3:鍵盤掃描子程序/*鍵盤掃描程序*/uchar keyscan()num='N'/若沒有按下任何按鍵,則返回'N' P1=0xfe;/掃描第一行temp=P1;temp=temp&0xf0;while(temp!=0xf0) /掃描列delayms(10);temp=P1;temp=temp&
39、;0xf0;while(temp!=0xf0) temp=P1;switch(temp)case 0xee:num='+'break;case 0xde:num='='break;case 0xbe:num='.'break;case 0x7e:num=0;break; while(temp!=0xf0) /等待松手temp=P1;temp=temp&0xf0; P1=0xfd;/掃描第二行 temp=P1;temp=temp&0xf0;while(temp!=0xf0) /掃描列delayms(10);temp=P1;temp=
40、temp&0xf0;while(temp!=0xf0) temp=P1;switch(temp)case 0xed:num='-'break;case 0xdd:num=3;break;case 0xbd:num=2;break;case 0x7d:num=1;break; while(temp!=0xf0)temp=P1;temp=temp&0xf0; /等待松手 P1=0xfb; /掃描第三行temp=P1;temp=temp&0xf0;while(temp!=0xf0) /掃描列delayms(10);temp=P1;temp=temp&0
41、xf0;while(temp!=0xf0)temp=P1;switch(temp)case 0xeb:num='*'break;case 0xdb:num=6;break;case 0xbb:num=5;break;case 0x7b:num=4;break; while(temp!=0xf0)/等待松手temp=P1;temp=temp&0xf0; P1=0xf7; /掃描第四行temp=P1;temp=temp&0xf0;while(temp!=0xf0) /掃描列delayms(10);temp=P1;temp=temp&0xf0;while(te
42、mp!=0xf0)temp=P1;switch(temp)case 0xe7:num='/'break;case 0xd7:num=9;break;case 0xb7:num=8;break;case 0x77:num=7;break; while(temp!=0xf0)temp=P1;temp=temp&0xf0; /等待松手 if(keypow=0)delayms(5);if(keypow=0)/powflag=1;num=''while(keypow=0); /掃描多次方按鍵delayms(5);while(keypow=0);if(beepfla
43、g=1&&num!='N') /若開聲音則每一次按鍵均鳴叫beep=0;delayms(100);beep=1;return num;附4:LCD1602顯示程序#include<reg52.h>#include"lcd1602_8.h"#include<math.h>/*延時1ms程序*/ void delayms(uint x) /12M延時1msunsigned int TempMS = x*110;while(TempMS-);/*寫命令*/void lcdwrite_com(uchar i) lcddata=
44、i; LCDRS=0; LCDRW=0; LCDEN=0; delayms(1); LCDEN=1;/*寫數(shù)據(jù)*/void lcdwrite_data(uchar i) lcddata=i; LCDRS=1; LCDRW=0; LCDEN=0; delayms(1); LCDEN=1;/*寫字符串*/void lcdwrite_string(uchar *s)while(*s)lcdwrite_data(*s);s+;/*設(shè)置lcd光標(biāo)值*/void lcd_setxy(uchar x,uchar y)uchar address;y&=0x0f;if(!x)address=0x80+y
45、;/0在第一行else address=0xc0+y;/1在第二行l(wèi)cdwrite_com(address);/*顯示1位數(shù)字*/void lcdwrite_num1(uint n)lcdwrite_data(n+48);/*顯示任意位數(shù)字*/void lcdwrite_num(long n)uchar length=0,j,a8=0,0,0,0,0,0,0,0;long nx;if(n=0)lcdwrite_data('0');return;if(n<0)lcdwrite_data('-');n=0-n; nx=n;for(j=0;j<8;j+)i
46、f(nx>=1)length+;nx/=10;nx=n;for(;length>0;length-)alength-1=nx%10+0x30;nx/=10;lcdwrite_string(a);/*顯示7位小數(shù)*/void lcdwrite_float(float n)uchar i=0;uint j=0;long nxtemp;if(n=0)lcdwrite_data('0');return;if(n<0)lcdwrite_data('-');n=0-n; nxtemp=n;n=n;/+0.000002;lcdwrite_num(nxtemp);if(n-nxtemp)>0.000009
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2020安全防溺水課件
- 《汽車展廳的布置》課件
- 《煤氣化工藝流程》課件
- 不等式證明課件
- 七年級復(fù)學(xué)安全教育課件
- 2021年煤礦安全生產(chǎn)管理人員機(jī)考題庫及答案解析
- 2021年育嬰師考試試題及答案1
- 《水滸傳之梁山好漢》課件
- 2025年高二化學(xué)寒假銜接講練 (人教版)寒假預(yù)習(xí)-第08講 有機(jī)化合物的結(jié)構(gòu)特點(diǎn)教師版
- 山東省淄博市2024-2025學(xué)年高三上學(xué)期期末摸底質(zhì)量檢測歷史試題(含答案)
- 紙箱紙板材料安全數(shù)據(jù)說明書(MSDS)
- 2022-2023小學(xué)二年級體育上冊期末考試試卷及答案
- 2023年運(yùn)維主管年終業(yè)務(wù)工作總結(jié)
- 電氣設(shè)備火災(zāi)現(xiàn)場處理措施
- 《格林童話》課外閱讀試題及答案
- “銷售技巧課件-讓你掌握銷售技巧”
- 2019北師大版高中英語選修一UNIT 2 單詞短語句子復(fù)習(xí)默寫單
- 房地產(chǎn)項(xiàng)目保密協(xié)議
- 2023年云南省初中學(xué)業(yè)水平考試 物理
- 【安吉物流股份有限公司倉儲管理現(xiàn)狀及問題和優(yōu)化研究15000字(論文)】
- 火災(zāi)自動報警系統(tǒng)施工及驗(yàn)收調(diào)試報告
評論
0/150
提交評論