計(jì)算器單片機(jī)課程設(shè)計(jì)報告_第1頁
計(jì)算器單片機(jī)課程設(shè)計(jì)報告_第2頁
計(jì)算器單片機(jī)課程設(shè)計(jì)報告_第3頁
計(jì)算器單片機(jī)課程設(shè)計(jì)報告_第4頁
計(jì)算器單片機(jī)課程設(shè)計(jì)報告_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、前言當(dāng)今時代,是一個新技術(shù)層出不窮的時代。在電子領(lǐng)域,尤其是自動化智能控制領(lǐng)域,傳統(tǒng)的分立元件或數(shù)字邏輯電路構(gòu)成的控制系統(tǒng)正以前所未見的速度被單片機(jī)智能控制系統(tǒng)所取代。單片機(jī)具有體積小、功能強(qiáng)、成本低、應(yīng)用面廣等優(yōu)點(diǎn),可以說,智能控制與自動控制的核心就是單片機(jī)。目前,一個學(xué)習(xí)與應(yīng)用單片機(jī)的高潮正在工廠、學(xué)校及企事業(yè)單位大規(guī)模地興起。過去習(xí)慣于傳統(tǒng)電子領(lǐng)域的工程師、技術(shù)員正面臨著全新的挑戰(zhàn),如不能在較短時間內(nèi)學(xué)會單片機(jī),勢必會被時代所遺棄,只有勇敢地面對現(xiàn)實(shí),挑戰(zhàn)自我,加強(qiáng)學(xué)習(xí),爭取在較短的時間內(nèi)將單片機(jī)技術(shù)融會貫通,才能跟上時代的步伐。 2方案論證與設(shè)計(jì)根據(jù)功能和指標(biāo)要求,本系統(tǒng)選用mcs 5

2、1 單片機(jī)為主控機(jī)。通過擴(kuò)展必要的外圍接口電路,實(shí)現(xiàn)對計(jì)算器的設(shè)計(jì)。具體設(shè)計(jì)考慮如下:由于要設(shè)計(jì)的是簡單的計(jì)算器,可以進(jìn)行四則運(yùn)算,對數(shù)字的大小范圍要求不高,故我們采用可以進(jìn)行四位數(shù)字的運(yùn)算,選用8 個led 數(shù)碼管顯示數(shù)據(jù)和結(jié)果。另外鍵盤包括數(shù)字鍵(09)、符號鍵(+、-、)、清除鍵和等號鍵,故只需要16 個按鍵即可。系統(tǒng)模塊圖:2.1 輸入模塊:鍵盤掃描計(jì)算器輸入數(shù)字和其他功能按鍵要用到很多按鍵,如果采用獨(dú)立按鍵的方式,在這種情況下,編程會很簡單,但是會占用大量的i/o 口資源,因此在很多情況下都不采用這種方式。為此,我們引入了矩陣鍵盤的應(yīng)用,采用四條i/o 線作為行線,四條i/o 線作為

3、列線組成鍵盤。在行線和列線的每個交叉點(diǎn)上設(shè)置一個按鍵。這樣鍵盤上按鍵的個數(shù)就為44個。這種行列式鍵盤結(jié)構(gòu)能有效地提高單片機(jī)系統(tǒng)中i/o 口的利用率。矩陣鍵盤的工作原理:計(jì)算器的鍵盤布局如圖2 所示:一般有16 個鍵組成,在單片機(jī)中正好可以用一個p 口實(shí)現(xiàn)16 個按鍵功能,這種形式在單片機(jī)系統(tǒng)中也最常用。由圖 3 矩陣鍵盤內(nèi)部電路圖可以知道,當(dāng)無按鍵閉合時,p10p13 與p14p17 之間開路。當(dāng)有鍵閉合時,與閉合鍵相連的兩條i/o 口線之間短路。判斷有無按鍵按下的方法是:第一步,置列線p14p17 為輸入狀態(tài),從行線p10p13 輸出低電平,讀入列線數(shù)據(jù),若某一列線為低電平,則該列線上有鍵閉

4、合。第二步,行線輪流輸出低電平,從列線p14p17 讀入數(shù)據(jù),若有某一列為低電平,則對應(yīng)行線上有鍵按下。綜合一二兩步的結(jié)果,可確定按鍵編號。但是鍵閉合一次只能進(jìn)行一次鍵功能操作,因此須等到按鍵釋放后,再進(jìn)行鍵功能操作,否則按一次鍵,有可能會連續(xù)多次進(jìn)行同樣的鍵操作。2.2 運(yùn)算模塊:單片機(jī)控制at89c51 單片機(jī)是在一塊芯片中集成了cpu、ram、rom、定時器/計(jì)數(shù)器和多功能i/o等一臺計(jì)算機(jī)所需要的基本功能部件。如果按功能劃分,它由如下功能部件組成,即微處理器(cpu)、數(shù)據(jù)存儲器(ram)、程序存儲器(rom/eprom)、并行i/o 口、串行口、定時器/計(jì)數(shù)器、中斷系統(tǒng)及特殊功能寄存

5、器(sfr)。35單片機(jī)是靠程序運(yùn)行的,并且可以修改。通過不同的程序?qū)崿F(xiàn)不同的功能,尤其是特殊的獨(dú)特的一些功能,通過使用單片機(jī)編寫的程序可以實(shí)現(xiàn)高智能,高效率,以及高可靠性!因此我們采用單片機(jī)作為計(jì)算器的主要功能部件,可以進(jìn)行很快地實(shí)現(xiàn)運(yùn)算功能。2.3 顯示模塊:led 顯示發(fā)光二極管led 是單片機(jī)應(yīng)用系統(tǒng)中的一宗簡單而常用的輸出設(shè)備,其在系統(tǒng)中的主要作用是顯示單片機(jī)的輸出數(shù)據(jù)、狀態(tài)等。因而作為典型的外圍器件,led 顯示單元是反映系統(tǒng)輸出和操作輸入的有效器件。led 具備數(shù)字接口可以方便的和大年紀(jì)系統(tǒng)連接;它的優(yōu)點(diǎn)是價格低,壽命長,對電壓電流的要求低及容易實(shí)現(xiàn)多路等,因而在單片機(jī)應(yīng)用系統(tǒng)中

6、獲得了廣泛的應(yīng)用。24通常的數(shù)碼顯示器是由7 段條形的led 組成(如圖4 所示),點(diǎn)亮適當(dāng)?shù)淖侄?,就可顯示出不同的數(shù)字。我們采用8 段數(shù)碼管,其中位于顯示器右下角的led 作小數(shù)點(diǎn)用。led 顯示器有兩種不同的形式:共陰極和共陽極。本次設(shè)計(jì)采用共陰極接法(如圖5所示)。3、硬件原理 3.1 硬件連接 圖3-1所示是簡易計(jì)算器電路原理圖。p3口用于鍵盤輸入,接4x4鍵值與鍵盤對應(yīng)表如圖表所示,p0口和p2口用于顯示,p2口用于顯示數(shù)位值高位,p0用于顯示數(shù)位值的低位。 鍵值 0 1 2 3 4 5 6 7 8 9 + - x / = on/c 功能 0 1 2 3 4 5 6 7 8 9 +

7、- x / = 清零4、軟件設(shè)計(jì)在程序設(shè)計(jì)方法上,模塊化程序設(shè)計(jì)是單片機(jī)應(yīng)用中最常用的程序設(shè)計(jì)方法。設(shè)計(jì)的中心思想是把一個復(fù)雜應(yīng)用程序按整體功能劃分成若干相對獨(dú)立的程序模塊,各模塊可以單獨(dú)設(shè)計(jì)、編程和調(diào)試,然后組合起來。這種方法便于設(shè)計(jì)和調(diào)試,容易實(shí)現(xiàn)多個程序共存,但各個模塊之間的連接有一定的難度。根據(jù)需要我們可以采用自上而下的程序設(shè)計(jì)方法,此方法先從主程序開始設(shè)計(jì),然后再編制各從屬程序和子程序,層層細(xì)化逐步求精,最終完成一個復(fù)雜程序的設(shè)計(jì)。這種方法比較符合人們的日常思維,缺點(diǎn)是一級的程序錯誤會對整個程序產(chǎn)生影響。功能流程圖如下:程序流程圖程序:#includeat89x52.h /頭文件/-

8、預(yù)定義模塊-/*預(yù)定義數(shù)組*/字形碼 0 1 2 3 4 5 6 7const unsigned char key_number=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07/ 8 9 + - * / = ce,0x7f,0x6f,0xf0,0xc0,0xf6,0xd2,0x89,0xb9;/掃描鍵碼 0 1 2 3 4 5 6 7const unsigned char key_value=0x7e,0xbe,0xde,0xee,0x7d,0xbd,0xdd,0xed/ 8 9 a b c d e f,0x7b,0xbb,0xdb,0xeb,0x77,0xb7

9、,0xd7,0xe7;/數(shù)碼管各顯示位: 0位 1位 2位 3位 4位const unsigned char display_bit5=0xfe,0xfd,0xfb,0xf7,0xef;/十進(jìn)制轉(zhuǎn)換權(quán)值const int bcd_right5=1,10,100,1000,10000;unsigned char buffer_number5; /輸入數(shù)據(jù)緩沖區(qū)unsigned char buffer_dis5; /計(jì)算結(jié)果顯示緩沖區(qū)unsigned long int buffer_opera5; /輸入數(shù)據(jù)十進(jìn)制轉(zhuǎn)換緩沖區(qū)/*預(yù)定義變量*/unsigned char const null=0xf

10、f;unsigned char opera=0x00; /輸入數(shù)據(jù)轉(zhuǎn)換指針unsigned char count=0x00; /鍵盤輸入指針unsigned char enter_number=0x01; /輸入數(shù)據(jù)顯示和計(jì)算結(jié)果顯示開關(guān)unsigned char ptr_i=0x00; /運(yùn)算結(jié)果轉(zhuǎn)換指針unsigned char buffer_control; /控制鍵緩沖區(qū)unsigned char key_bcd; /按鍵的十進(jìn)制值unsigned char scan_key; /當(dāng)前掃描到的鍵值unsigned char temp_c; /臨時變量unsigned char ptr_

11、c; /十進(jìn)制轉(zhuǎn)化指針unsigned char account; /四則運(yùn)算標(biāo)志unsigned long int result=0x00; /當(dāng)前計(jì)算結(jié)果unsigned long int rlt; /前一個輸入的數(shù)的十進(jìn)制值unsigned long int sec_rlt; /后一個輸入的數(shù)的十進(jìn)制值unsigned long int c_n; /當(dāng)前轉(zhuǎn)換的運(yùn)算結(jié)果/*名稱: 初始化運(yùn)行環(huán)境功能: 初始化各寄存器與端口狀態(tài)參數(shù): 無返回值:無*/void deviceinit(void)tl0=0xbf; /置定時器中斷時間為20msth0=0x63;tmod=0x01; /設(shè)定定時器

12、/計(jì)數(shù)器0工作方式為1ie=0x82; /允許全局中斷,允許定時器/計(jì)數(shù)器0溢出中斷tr0=0x01; /啟動定時器/計(jì)數(shù)器0/*名稱: 延時模塊功能: 延時參數(shù): unsigned char i返回值:無*/void delay(unsigned char i)int j;while(i-)!=0) for(j=0;j=0x6f;j+);/*名稱: 清除模塊功能: 清除當(dāng)前已經(jīng)輸入的數(shù)據(jù)通過輸入緩沖區(qū)中的數(shù)乘以它們各自對應(yīng)的權(quán)值再求和參數(shù): 參數(shù)為1時,清除輸入數(shù)據(jù)緩沖區(qū)參數(shù)為2時,清除十進(jìn)制轉(zhuǎn)化緩沖區(qū)返回值:無*/void clear(unsigned char clr_pid)temp_

13、c=0x00;for(temp_c;temp_c=4;temp_c+)if(clr_pid=1) /參數(shù)為1時,輸入數(shù)據(jù)緩沖區(qū)全部置0count=0x00; /按鍵次數(shù)置0buffer_numbertemp_c=0x00;if(clr_pid=2) /參數(shù)為2時,輸入數(shù)據(jù)緩沖區(qū)全部置0opera=0x00; /輸入數(shù)的個數(shù)置0buffer_operatemp_c=0x00;/*名稱: 數(shù)據(jù)處理模塊功能: 將輸入的數(shù)據(jù)轉(zhuǎn)化為10進(jìn)制數(shù)通過輸入緩沖區(qū)中的數(shù)乘以它們各自對應(yīng)的權(quán)值再求和參數(shù): 無返回值:無*/void bcdconvert(void)temp_c=0x00;ptr_c=opera-1

14、;if(opera !=0)while(temp_c=result) result=rlt-result;else /如果被減數(shù)比減數(shù)小buffer_control=0xc0;result=(rlt-result-0x01);break;case 0x02: /乘法result*=rlt;break;case 0x03: /除法result=rlt/result;break;convert(); /調(diào)用計(jì)算結(jié)果處理函數(shù)clear(2); /清除計(jì)算結(jié)果/*名稱: 控制鍵處理模塊功能: 對各個控制鍵進(jìn)行對應(yīng)的操作參數(shù): 無返回值:無*/void control(void)clear(1); /清

15、除顯示緩沖區(qū)/*等號處理*/if(buffer_control=0x89) calculate(); /調(diào)用計(jì)算函數(shù)/*清除鍵處理*/else if(buffer_control=0xb9)clear(1); /清除已輸入的數(shù)clear(2); /清除當(dāng)前也轉(zhuǎn)化的值ptr_i=0x00; /清除顯示指針result=rlt=0x00; /清除元算結(jié)果/*運(yùn)算符號處理*/elsebcdconvert(); /將先前輸入的數(shù)轉(zhuǎn)化為10進(jìn)制數(shù)rlt=result; /保存轉(zhuǎn)化的結(jié)果result=0x00; /清除上一次轉(zhuǎn)化的結(jié)果,準(zhǔn)備下一次轉(zhuǎn)化switch(buffer_control)case 0

16、xf0: /加法account=0x00;break;case 0xc0: /減法account=0x01;break;case 0xf6: /乘法account=0x02; /乘法運(yùn)算標(biāo)志break;case 0xd2: /除法account=0x03; /除法運(yùn)算標(biāo)志break;default:break;/*名稱: 按鍵判斷模塊功能: 判斷是否有鍵被按下參數(shù): 無返回值:有鍵按下則返回1沒有鍵按下則返回0*/unsigned char keydown(void)temp_c=0x00;p2=0xf0;temp_c=p2;if(temp_c!=0xf0)return 1; /有鍵按下返回1

17、elsereturn 0; /沒有鍵按下返回0/*名稱: 按鍵處理函模塊功能: 獲取當(dāng)前按鍵參數(shù): 無返回值:返回當(dāng)前按鍵的字形碼如果沒有鍵按下,返回null*/unsigned char keypress (void)if(keydown()=1) /判斷是否有鍵按下delay(30); /延時消抖/*掃描當(dāng)前被按下的鍵值*/p2=0xf0; /掃描低4位scan_key=p2; /記錄掃描結(jié)果p2=0x0f; /掃描高四位temp_c=p2; /記錄掃描結(jié)果scan_key=temp_c; /兩結(jié)果相異或得鍵值/*當(dāng)有鍵被按下時關(guān)閉顯示*/do p1=0xff; /如果有鍵按下,關(guān)閉顯示w

18、hile(keydown()=1); /等待按鍵釋放,如果有鍵按下,則不顯示任何數(shù)delay(30); /延時消抖/*當(dāng)有鍵按下后開始掃描所按下的鍵*/for(key_bcd=0;key_bcd=15;key_bcd+) /查找鍵值對應(yīng)的字符碼 if(key_valuekey_bcd=scan_key) /如果找到對應(yīng)的鍵值ptr_i=0x00; /清除運(yùn)算結(jié)果顯示指針,開始顯示輸入的數(shù)據(jù)/*判斷是數(shù)字鍵還是控制鍵*/if(key_bcd=0x09) /小于10的鍵為數(shù)字鍵enter_number=0x01; /設(shè)置輸入數(shù)據(jù)顯示標(biāo)志if(count=0x04) /如果緩沖區(qū)未滿buffer_n

19、umbercount=key_numberkey_bcd; /當(dāng)前鍵送緩沖區(qū)buffer_operaopera=key_bcd; /保存當(dāng)前按鍵的十進(jìn)制值opera+; /指針自加count+;else /如果緩沖區(qū)溢出count=0x00;clear(1); /清楚緩沖區(qū)buffer_number0=key_numberkey_bcd; /緩沖區(qū)初始位存入當(dāng)前鍵的字符碼buffer_operaopera=key_bcd; /保存當(dāng)前按鍵的十進(jìn)制值opera+;count+;return key_numberkey_bcd; /返回對應(yīng)的數(shù)字字符值else /大于9的鍵為控制鍵buffer_c

20、ontrol=key_numberkey_bcd; /控制鍵送控制緩沖區(qū)control(); /調(diào)用控制鍵處理函數(shù)elsereturn null; /如果沒有鍵按下,返回null/*名稱: 數(shù)碼管顯示模塊功能: 在數(shù)碼管上顯示輸入的數(shù)據(jù)和計(jì)算后的結(jié)果參數(shù): 無返回值:無*/void display(void)unsigned char m=0; /顯示字符指針unsigned char n=0; /顯示位指針;while(keypress()=null) /當(dāng)有鍵被按下時開始顯示/*顯示當(dāng)前輸入的數(shù)據(jù)*/if(enter_number=0x01) /顯示輸入中的數(shù)據(jù) if(m!=count) /字符指針在界線內(nèi)if(n=count-1) /顯示位未越界p1=display_bitn; /設(shè)置顯示位p0=buffer_numberm; /在數(shù)碼管上顯示字符delay(0x02); /延時消抖n+;m+;else /顯示位越界n=0;else /字符指針越界m=0;/*顯示運(yùn)算后的結(jié)果*/else /顯示運(yùn)算的結(jié)果 if(m!=ptr_i) /字符指針在界

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論