單片機(jī)課程設(shè)計(jì)計(jì)算器實(shí)驗(yàn)_第1頁
單片機(jī)課程設(shè)計(jì)計(jì)算器實(shí)驗(yàn)_第2頁
單片機(jī)課程設(shè)計(jì)計(jì)算器實(shí)驗(yàn)_第3頁
單片機(jī)課程設(shè)計(jì)計(jì)算器實(shí)驗(yàn)_第4頁
單片機(jī)課程設(shè)計(jì)計(jì)算器實(shí)驗(yàn)_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、燕山大學(xué)課 程 設(shè) 計(jì) 說 明 書題目: 計(jì)算器實(shí)驗(yàn) 學(xué)院(系):年級(jí)專業(yè):學(xué) 號(hào): 學(xué)生姓名: 指導(dǎo)教師: 教師職稱: 燕山大學(xué)課程設(shè)計(jì)(論文)任務(wù)書院(系):電氣工程學(xué)院 基層教學(xué)單位:自動(dòng)化儀表系學(xué) 號(hào)090103020059學(xué)生姓名樸瑞琦專業(yè)(班級(jí))09級(jí)儀表二班設(shè)計(jì)題目計(jì)算器實(shí)驗(yàn)設(shè)計(jì)技術(shù)參數(shù)1、 獨(dú)立完成設(shè)計(jì)任務(wù);2、 編程,上機(jī)調(diào)試;3、 連接硬件實(shí)驗(yàn)線路,實(shí)現(xiàn)所要求的功能;4、 完成設(shè)計(jì),提交課程設(shè)計(jì)報(bào)告。設(shè)計(jì)要求1、 利用實(shí)驗(yàn)儀上提供的顯示電路和鍵盤電路,做一個(gè)簡(jiǎn)單的計(jì)算器。2、 進(jìn)一步熟悉LED顯示電路和鍵盤掃描電路的工作原理和編程方法。3、 了解數(shù)據(jù)計(jì)算的基本方法。工作量軟

2、件編程與硬件調(diào)試相結(jié)合,繪制設(shè)計(jì)流程圖,并編程進(jìn)行硬件實(shí)現(xiàn)。工作計(jì)劃第一天:明確課程設(shè)計(jì)的任務(wù),繪制硬件電路,軟件流程圖;第二天:根據(jù)功能要求編寫程序;第三天:熟悉偉福單片機(jī)編程環(huán)境,讀程序修改軟件參數(shù)和硬件地址,調(diào)試程序;第四天:進(jìn)一步修改程序,查找錯(cuò)誤,進(jìn)行硬件調(diào)試;第五天:撰寫課程設(shè)計(jì)報(bào)告,完成答辯。參考資料1)單片機(jī)原理及應(yīng)用技術(shù) 張淑清編 國(guó)防工業(yè)出版社2)過程控制系統(tǒng)及儀表 邵裕森 巴筱云編3)單片機(jī)及應(yīng)用 李大友編 高等教育出版社4)機(jī)械量測(cè)量 機(jī)械工業(yè)出版社指導(dǎo)教師簽字張淑清基層教學(xué)單位主任簽字謝平說明:此表一式四份,學(xué)生、指導(dǎo)教師、基層教學(xué)單位、系部各一份。2012年 6月

3、29日 摘要單片機(jī)的出現(xiàn)是計(jì)算機(jī)制造技術(shù)高速發(fā)展的產(chǎn)物,它是嵌入式控制技術(shù)的核心,如今,它已廣泛地應(yīng)用到我們生活的各個(gè)領(lǐng)域,如電子、科技、通信、汽車、工業(yè)等。計(jì)算器在人們的日常中是比較的常見的電子產(chǎn)品之一,可是它還在發(fā)展之中,以后必將出現(xiàn)功能更加強(qiáng)大的計(jì)算器,基于這樣的理念,本次課程設(shè)計(jì)的任務(wù)是利用單片機(jī)設(shè)計(jì)一個(gè)計(jì)算器,能夠進(jìn)行多位簡(jiǎn)單的整數(shù)加、減、乘、除的運(yùn)算及具有清零的功能,同時(shí)還對(duì)其功能進(jìn)行了擴(kuò)展,增加了一些特殊運(yùn)算及錯(cuò)誤報(bào)警功能。它主要由MCS51單片機(jī)、A8255、數(shù)碼管顯示、鍵盤、蜂鳴器等模塊組成。本計(jì)算器是將鍵盤輸入信息經(jīng)處理通過緩存輸入數(shù)碼管顯示出來,鍵盤采用行列掃描式,數(shù)碼管

4、采用動(dòng)態(tài)掃描方式,計(jì)算功能通過軟件實(shí)現(xiàn),用C語言對(duì)單片機(jī)可編程芯片進(jìn)行編程,實(shí)現(xiàn)對(duì)計(jì)算器的設(shè)計(jì)。關(guān)鍵字:?jiǎn)纹瑱C(jī)、計(jì)算器、數(shù)碼管、鍵盤目錄摘要3第一章設(shè)計(jì)目標(biāo)與設(shè)計(jì)方案41.1 設(shè)計(jì)目標(biāo)與實(shí)現(xiàn)方法41.2 方案設(shè)計(jì)4第2章硬件模塊介紹62.1 運(yùn)算模塊62.2 輸入模塊7鍵盤的原理82.3 顯示模塊92.3.1 LED的顯示原理92.3.2 動(dòng)態(tài)顯示的工作原理112.4 音頻控制模塊11第3章軟件設(shè)計(jì)123.1 基本功能設(shè)計(jì)123.2 擴(kuò)展功能設(shè)計(jì)18第4章硬件電路284.1 硬件電路284.2 硬件電路連線28第5章學(xué)習(xí)心得29參考資料30第一章設(shè)計(jì)目標(biāo)與設(shè)計(jì)方案1.1 設(shè)計(jì)目標(biāo)與實(shí)現(xiàn)方法1)

5、設(shè)計(jì)目標(biāo):利用實(shí)驗(yàn)儀上提供的顯示電路和鍵盤電路,做一個(gè)簡(jiǎn)單的計(jì)算器。2)實(shí)現(xiàn)方法:為了滿足設(shè)計(jì)的基本要求,可以實(shí)現(xiàn)基本的運(yùn)算(加減乘除),數(shù)據(jù)清零的功能。另外,還對(duì)計(jì)算器的功能進(jìn)行了擴(kuò)展,添加了一些特殊運(yùn)算和錯(cuò)誤報(bào)警的功能。我們采用基于MCS51單片機(jī)設(shè)計(jì)計(jì)算器,并用LED 數(shù)碼管顯示數(shù)據(jù),4*6的矩陣鍵盤實(shí)現(xiàn)數(shù)據(jù)輸入,設(shè)計(jì)仿真和調(diào)試要用到WAVE軟件及實(shí)驗(yàn)箱等。1.2 方案設(shè)計(jì)根據(jù)功能要求和指標(biāo)要求,本系統(tǒng)選用MCS 51 單片機(jī)為主控機(jī),通過擴(kuò)展必要的外圍接口電路,實(shí)現(xiàn)對(duì)計(jì)算器的設(shè)計(jì)。具體設(shè)計(jì)方案如下:首先實(shí)現(xiàn)計(jì)算器的基本功能,即可以進(jìn)行四則運(yùn)算,對(duì)數(shù)字的大小范圍要求不高,故采用可以進(jìn)行三

6、位數(shù)字的運(yùn)算,選用4*6的鍵盤實(shí)現(xiàn)數(shù)據(jù)輸入,用6個(gè)LED 數(shù)碼管顯示數(shù)據(jù)。鍵盤包括數(shù)字鍵(09)、符號(hào)鍵(+、-、×、÷)、清除鍵和等號(hào)鍵,用A、B、C、D、E、F鍵分別代表“+”、“-”、“*”、“/”、“=”、“清零”的功能。擴(kuò)展功能:用剩余八個(gè)鍵分別實(shí)現(xiàn)求方、取余、排列、比較、組合、平均數(shù)、開方、平方的功能,用8255擴(kuò)展芯片及蜂鳴器實(shí)現(xiàn)錯(cuò)誤報(bào)警的功能。根據(jù)需要我們可以采用自上而下的程序設(shè)計(jì)方法,此方法先從主程序開始設(shè)計(jì),然后再編制各子程序,層層細(xì)化,逐步求精,最終完成一個(gè)復(fù)雜程序的設(shè)計(jì)。程序流程圖如下:第2章 硬件模塊介紹2.1 運(yùn)算模塊MCS-51 單片機(jī)是在一塊

7、芯片中集成了CPU、RAM、ROM、定時(shí)器/計(jì)數(shù)器和多功能I/O等一臺(tái)計(jì)算機(jī)所需要的基本功能部件。如果按功能劃分,它由如下功能部件組成,即微處理器(CPU)、數(shù)據(jù)存儲(chǔ)器(RAM)、程序存儲(chǔ)器(ROM/EPROM)、并行I/O 口、串行口、定時(shí)器/計(jì)數(shù)器、中斷系統(tǒng)及特殊功能寄存器(SFR)。單片機(jī)是靠程序運(yùn)行的,并且可以修改。通過不同的程序?qū)崿F(xiàn)不同的功能,尤其是特殊的獨(dú)特的一些功能,通過使用單片機(jī)編寫的程序可以實(shí)現(xiàn)高智能,高效率,以及高可靠性!因此我們采用單片機(jī)作為計(jì)算器的主要功能部件,可以進(jìn)行很快地實(shí)現(xiàn)運(yùn)算功能,如圖2-1所示:MCS51引腳配置圖T2.2 輸入模塊計(jì)算器的數(shù)據(jù)輸入由鍵盤來實(shí)現(xiàn)

8、。鍵盤是由若干個(gè)按鍵組成的開關(guān)矩陣,它是最簡(jiǎn)單的單片機(jī)輸入設(shè)備,通過鍵盤可輸入數(shù)據(jù)和命令,實(shí)現(xiàn)簡(jiǎn)單的人機(jī)對(duì)話。鍵盤根據(jù)其結(jié)構(gòu)不同可分為編碼式鍵盤和非編碼式鍵盤兩種。非編碼式鍵盤靠軟件識(shí)別,節(jié)省硬件,通常采用這種鍵盤。根據(jù)鍵盤與單片機(jī)接法不同,非編碼鍵盤又分為獨(dú)立式和矩陣式兩種。當(dāng)系統(tǒng)操作較簡(jiǎn)單所需按鍵較少時(shí),可采用獨(dú)立式非編碼鍵盤,而當(dāng)系統(tǒng)操作較復(fù)雜,需要按鍵較多時(shí),可采用矩陣式非編碼鍵盤。如果采用獨(dú)立按鍵的方式,會(huì)占用大量的I/O 口資源,故我們采用矩陣式鍵盤輸入。采用四條I/O 線作為行線,六條I/O 線作為列線組成鍵盤。在行線和列線的每個(gè)交叉點(diǎn)上設(shè)置一個(gè)按鍵,這樣鍵盤上按鍵的個(gè)數(shù)就為4&

9、#215;6個(gè)。這種行列式鍵盤結(jié)構(gòu)能有效地提高單片機(jī)系統(tǒng)中I/O 口的利用率,如圖21所示:圖2-1 矩陣式鍵盤2.2.1鍵盤的原理如圖22所示,采用列掃描法來識(shí)別按鍵。每個(gè)按鍵都有它的行值和列值,行值和列值的組合就是識(shí)別這個(gè)按鍵的編碼。矩陣的行線和列線分別通過兩并行接口和CPU通信。鍵盤的一端(列線)通過電阻接VCC,而接地是通過程序輸出數(shù)字“0”實(shí)現(xiàn)的。鍵盤處理程序的任務(wù)是:確定有無鍵按下,判斷哪一個(gè)鍵按下,鍵的功能是什么?還要消除按鍵在閉合或斷開時(shí)的抖動(dòng)。兩個(gè)并行口中,一個(gè)輸出掃描碼,使按鍵逐行動(dòng)態(tài)接地;另一個(gè)并行口輸入按鍵狀態(tài),由行掃描值和回饋信號(hào)共同形成鍵編碼而識(shí)別按鍵,通過軟件查表

10、,查出該鍵的功能。當(dāng)無按鍵閉合時(shí),P10P13 與P14P17 之間開路;當(dāng)有鍵閉合時(shí),與閉合鍵相連的兩條I/O 口線之間短路。判斷有無按鍵按下的方法是:第一步,置列線P14P17 為輸入狀態(tài),從行線P10P13 輸出低電平,讀入列線數(shù)據(jù),若某一列線為低電平,則該列線上有鍵閉合。第二步,行線輪流輸出低電平,從列線P14P17 讀入數(shù)據(jù),若有某一列為低電平,則對(duì)應(yīng)行線上有鍵按下。綜合一二兩步的結(jié)果,可確定按鍵編號(hào)。但是鍵閉合一次只能進(jìn)行一次鍵功能操作,因此須等到按鍵釋放后,再進(jìn)行鍵功能操作,否則按一次鍵,有可能會(huì)連續(xù)多次進(jìn)行同樣的鍵操作。圖22 鍵盤結(jié)構(gòu)2.3 顯示模塊發(fā)光二極管LED 是單片機(jī)

11、應(yīng)用系統(tǒng)中的一宗簡(jiǎn)單而常用的輸出設(shè)備,其在系統(tǒng)中的主要作用是顯示單片機(jī)的輸出數(shù)據(jù)、狀態(tài)等。因而作為典型的外圍器件,LED 顯示單元是反映系統(tǒng)輸出和操作輸入的有效器件。LED 具備數(shù)字接口可以方便的和大年紀(jì)系統(tǒng)連接;它的優(yōu)點(diǎn)是工作電壓低,響應(yīng)速度快,價(jià)格低,壽命長(zhǎng)等,因而在單片機(jī)應(yīng)用系統(tǒng)中獲得了廣泛的應(yīng)用,所以在此設(shè)計(jì)中我首先選用了LED作為顯示器件。2.3.1 LED的顯示原理LED顯示器的結(jié)構(gòu)及其段名如圖23所示,連同小數(shù)點(diǎn)在內(nèi),共有8個(gè)LED燈,點(diǎn)亮合適的字段,即能顯示09的數(shù)字和某些字符、符號(hào)。這種顯示器有兩種形式:一種是發(fā)光二極管的陰極連在一起的共陰極顯示器,另一種是陽極連在一起的共陽

12、極顯示器。共陽數(shù)碼管是指將所有發(fā)光二極管的陽極接到一起形成公共陽極(COM)的數(shù)碼管。共陽數(shù)碼管在應(yīng)用時(shí)應(yīng)將公共極COM接到+5V,當(dāng)某一字段發(fā)光二極管的陰極為低電平時(shí),相應(yīng)字段就點(diǎn)亮。當(dāng)某一字段的陰極為高電平時(shí),相應(yīng)字段就不亮。共陰數(shù)碼管是指將所有發(fā)光二極管的陰極接到一起形成公共陰極(COM)的數(shù)碼管。共陰數(shù)碼管在應(yīng)用時(shí)應(yīng)將公共極COM接到地線GND上,當(dāng)某一字段發(fā)光二極管的陽極為高電平時(shí),相應(yīng)字段就點(diǎn)亮。當(dāng)某一字段的陽極為低電平時(shí),相應(yīng)字段就不亮。圖23 LED段碼為了顯示數(shù)字或符號(hào),要為L(zhǎng)ED顯示器提供代碼,即字形代碼。七段發(fā)光二極管,再加上一個(gè)小數(shù)點(diǎn)位,共計(jì)8段,因此提供的字形代碼的長(zhǎng)

13、度正好是一個(gè)字節(jié)。簡(jiǎn)易計(jì)算器用到的數(shù)字09的共陰極字形代碼如下表21所示:顯示字形gfgdcba段碼001111113fh1000011006h210110115bh310011114fh4110011066h511011016dh611111017dh7000011107h811111117fh9110011167hA111011177hB11111007chC011100139hD10111105ehE111100179hF111000171h表2-1 09七段數(shù)碼管共陰極字形代碼2.3.2 動(dòng)態(tài)顯示的工作原理點(diǎn)亮顯示器的方法有靜態(tài)和動(dòng)態(tài)兩種,這里顯示位數(shù)較多,采用動(dòng)態(tài)顯示較合適,如圖24

14、所示,所謂動(dòng)態(tài)顯示,就是用掃描的方法一位一位輪流點(diǎn)亮顯示器的各位,該方法只需一個(gè)8位段輸出口和一個(gè)8位掃描輸出口,后者的作用是依次接通各位LED。對(duì)于顯示器的每一位來說,每隔一段時(shí)間點(diǎn)亮一次,利用人眼的視覺暫留效應(yīng)可以看到整個(gè)動(dòng)態(tài)顯示,但必須保證掃描速度足夠快,字符才不閃爍。圖24 數(shù)碼管的動(dòng)態(tài)顯示2.4 音頻控制模塊如圖25所示為音頻放大濾波電路,端口輸入的方波經(jīng)放大濾波后,驅(qū)動(dòng)揚(yáng)聲器發(fā)聲。聲音的頻率由端口輸入時(shí)延時(shí)控制,不同頻率的脈沖控制喇叭發(fā)出不同的音調(diào)。圖25 音頻放大濾波電路第3章 軟件設(shè)計(jì)3.1 基本功能設(shè)計(jì)1、實(shí)驗(yàn)現(xiàn)象:可以實(shí)現(xiàn)基本的運(yùn)算加減乘除以及數(shù)據(jù)清零的功能,用A、B、C、

15、D、E、F鍵分別代表“+”、“-”、“*”、“/”、“=”、“清零”。2、程序流程圖數(shù)據(jù)送顯示緩沖子程序框圖如下:開始顯示位上移數(shù)值為0?數(shù)值<0否是無符號(hào)位符號(hào)位顯示“-”數(shù)值對(duì)10取模,送顯示最低位數(shù)值除以10數(shù)值對(duì)10取模,送顯示位否返回 是數(shù)據(jù)送顯示緩沖子程序框圖運(yùn)算主程序框圖如下:開始初始化參數(shù)LED顯示有鍵輸入讀取鍵碼鍵碼是?數(shù)字鍵清零鍵功能鍵輸入數(shù)值狀態(tài)清零數(shù)值送顯示緩沖根據(jù)上次功能鍵和輸入的數(shù)據(jù)計(jì)算結(jié)果本次功能鍵?是?是“=”其它鍵計(jì)算最后結(jié)果保存結(jié)果和功能鍵結(jié)果送顯示緩沖等待數(shù)值輸入運(yùn)算主程序流程圖3、基本功能實(shí)現(xiàn)程序:#define LEDLen 6/設(shè)置LED顯示位

16、數(shù)為六位#define PB1 2#define PB0 1xdata unsigned char OUTBIT _at_ 0x9002; / 位控制口xdata unsigned char OUTSEG _at_ 0x9004; / 段控制口xdata unsigned char IN _at_ 0x9001; / 鍵盤行碼讀回口unsigned char LEDBufLEDLen;unsigned char LEDMAP = 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e,

17、 0x79, 0x71; / 共陰極數(shù)碼管字形代碼void Delay(unsigned char CNT) / 延時(shí)子程序 unsigned char i; while (CNT- !=0) for (i=100; i !=0; i-);void DisplayLED() / 逐位顯示數(shù)碼管 unsigned char i, j; unsigned char Pos; unsigned char LED; Pos = 0x20; for (i = 0; i < LEDLen; i+) OUTBIT = 0; / trun off all LED LED = LEDBufi; OUTSE

18、G = LED; / 段選 OUTBIT = Pos; / trun on one LED 位選 Delay(1); Pos >>= 1; unsigned char KeyTable = 0x16, 0x15, 0x14, 0xff, 0x13, 0x12, 0x11, 0x10, 0x0d, 0x0c, 0x0b, 0x0a, 0x0e, 0x03, 0x06, 0x09, 0x0f, 0x02, 0x05, 0x08, 0x00, 0x01, 0x04, 0x07; / 鍵盤各鍵代碼unsigned char TestKey() / 檢查鍵盤是否有鍵按下 OUTBIT = 0

19、; return (IN & 0x0f); unsigned char GetKey() / 得到按下鍵的數(shù)值unsigned char Pos; unsigned char i; unsigned char k; i = 6; Pos = 0x20; do OUTBIT = Pos; Pos >>= 1; k = IN & 0x0f; while (-i != 0) && (k = 0); if (k != 0) i *= 4; if (k & 2) i += 1; else if (k & 4) i += 2; else if (

20、k & 8) i += 3; OUTBIT = 0; do Delay(10); while (TestKey(); return(KeyTablei); / 將被按下鍵的代碼返回給主程序 else return(0xff); / 如果沒有鍵按下,返回清零代碼0xff#define ADD 0x0a / 宏定義,各運(yùn)算對(duì)應(yīng)相應(yīng)鍵的代碼#define SUB 0x0b#define MUL 0x0c#define DIV 0x0d#define EQU 0x0e#define CLR 0x0fvoid DisplayResult(signed int Result) / 計(jì)算結(jié)果逐位送入

21、顯示緩沖區(qū)中 unsigned char i; if (Result >= 0) / 數(shù)值大于0 / 不顯示符號(hào)位 LEDBuf0 = 0; else / 在符號(hào)位顯示 - LEDBuf0 = 0x40; Result = - Result; LEDBuf1 = 0; LEDBuf2 = 0; LEDBuf3 = 0; LEDBuf4 = 0; / 數(shù)值對(duì)10取模,所得結(jié)果為最低位 LEDBuf5 = LEDMAPResult % 10; Result = Result / 10; i = 4; / 如果數(shù)值除以10后不等于0,繼續(xù)向高位顯示 while (Result != 0) LE

22、DBufi- = LEDMAPResult % 10; Result = Result / 10; void main()signed int Last, Result;/ 定義整型變量Last,Result分別存放第一個(gè)運(yùn)算數(shù),第二個(gè)運(yùn)算數(shù)和結(jié)果 unsigned char OP; unsigned char Key; / 定義字符型變量OP,Key分別存放上一運(yùn)算符、當(dāng)前輸入鍵 Last = 0; / 給變量賦初值 Result = 0; OP = ADD; DisplayResult(Result); / 將0送到顯示緩沖區(qū) while (1) while (!TestKey() Dis

23、playLED(); / 用于顯示按下的數(shù)及結(jié)果 / 讀取鍵碼 Key = GetKey(); / 得到按下鍵的代碼 if ( (Key >= 0) && (Key <= 9) ) / 是數(shù)字鍵Result = Result*10 + Key;/ 輸入數(shù)值 / 數(shù)值送顯示緩沖 DisplayResult(Result);/ 數(shù)值送顯示緩沖 else if (Key = CLR) / 是清零鍵Last = 0; Result = 0; OP = ADD;/ 狀態(tài)清零DisplayResult(Result); / 數(shù)值送顯示緩沖 else if ( (Key=ADD)

24、 | (Key=SUB) | (Key=MUL) | (Key=DIV) | (Key=EQU) ) / 是功能鍵 switch (OP) /上一按鍵是? case ADD: Result = Last + Result; break; case SUB: Result = Last - Result; break; case MUL: Result = Last * Result; break; case DIV: Result = Last / Result; / 根據(jù)上一鍵進(jìn)行相應(yīng)的運(yùn)算,計(jì)算最后結(jié)果 break; if (Key = EQU) / 功能鍵是=Last = 0; OP =

25、 ADD;/ 重新賦初值 else / 是其它功能鍵 / 保存結(jié)果, 保存按鍵功能 Last = Result; OP = Key; DisplayResult(Result); /將結(jié)果送顯示緩沖Result = 0;/ 等待下一個(gè)數(shù)值輸入. 3.2 擴(kuò)展功能設(shè)計(jì)1、實(shí)驗(yàn)現(xiàn)象:除了可以進(jìn)行加減乘除的基本運(yùn)算外,還可進(jìn)行求方、取余、排列、比較、組合、平均數(shù)、開方、平方運(yùn)算;當(dāng)輸入、輸出超過顯示范圍時(shí),蜂鳴器會(huì)發(fā)聲報(bào)警,起到提示作用。2、程序流程圖:開始初始化參數(shù)LED顯示有鍵輸入讀取鍵碼鍵碼是?數(shù)字鍵清零鍵功能鍵輸入數(shù)值狀態(tài)清零根據(jù)上次功能鍵和輸入的數(shù)據(jù)計(jì)算結(jié)果本次功能鍵?是?是“=”其它鍵計(jì)

26、算最后結(jié)果保存結(jié)果和功能鍵等待數(shù)值輸入是否超范圍?報(bào)警數(shù)值送顯示緩沖是否超范圍否是報(bào)警結(jié)果送顯示緩沖否是擴(kuò)展后程序流程圖3、擴(kuò)展后的程序:#include <reg51.h>#include <math.h>#define mode 0x82;#define LEDLen 6 /設(shè)置LED顯示位數(shù)為六位#define PB1 2#define PB0 1xdata unsigned char Control _at_ 0x8003;xdata unsigned char Speaker _at_ 0x8000;xdata unsigned char OUTBIT _at

27、_ 0x9002; / 位控制口xdata unsigned char OUTSEG _at_ 0x9004; / 段控制口xdata unsigned char IN _at_ 0x9001; / 鍵盤行碼讀回口unsigned char LEDBufLEDLen;unsigned char LEDMAP = 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71; / 共陰極數(shù)碼管字形代碼void Delay(unsigned char CNT) / 延時(shí)子

28、程序 unsigned char i; while (CNT- !=0) for (i=100; i !=0; i-);void DisplayLED() / 逐位顯示數(shù)碼管 unsigned char i, j; unsigned char Pos; unsigned char LED; Pos = 0x20; for (i = 0; i < LEDLen; i+) OUTBIT = 0; / trun off all LED LED = LEDBufi; OUTSEG = LED; / 段選 OUTBIT = Pos; / trun on one LED 位選 Delay(1); P

29、os >>= 1; unsigned char KeyTable = 0x16, 0x15, 0x14, 0xff, 0x13, 0x12, 0x11, 0x10, 0x0d, 0x0c, 0x0b, 0x0a, 0x0e, 0x03, 0x06, 0x09, 0x0f, 0x02, 0x05, 0x08, 0x00, 0x01, 0x04, 0x07; / 鍵盤各鍵代碼unsigned char TestKey() / 檢查鍵盤是否有鍵按下 OUTBIT = 0; return (IN & 0x0f); unsigned char GetKey() / 得到按下鍵的數(shù)值u

30、nsigned char Pos; unsigned char i; unsigned char k; i = 6; Pos = 0x20; do OUTBIT = Pos; Pos >>= 1; k = IN & 0x0f; while (-i != 0) && (k = 0); if (k != 0) i *= 4; if (k & 2) i += 1; else if (k & 4) i += 2; else if (k & 8) i += 3; OUTBIT = 0; do Delay(10); while (TestKey(

31、); return(KeyTablei); / 將被按下鍵的代碼返回給主程序 else return(0xff); / 如果沒有鍵按下,返回清零代碼0xff#define ADD 0x0a / 宏定義,各運(yùn)算對(duì)應(yīng)相應(yīng)鍵的代碼#define SUB 0x0b#define MUL 0x0c#define DIV 0x0d#define EQU 0x0e#define CLR 0x0f#define qf 0xff#define qy 0x14#define jc 0x15#define bj 0x16#define zh 0x10#define pys 0x11#define kf 0x12#d

32、efine pf 0x13void DisplayResult(signed int Result) / 計(jì)算結(jié)果逐位送入顯示緩沖區(qū)中 unsigned char i; if (Result >= 0) / 數(shù)值大于0 / 不顯示符號(hào)位 LEDBuf0 = 0; else / 在符號(hào)位顯示 - LEDBuf0 = 0x40; Result = - Result; LEDBuf1 = 0; LEDBuf2 = 0; LEDBuf3 = 0; LEDBuf4 = 0; / 數(shù)值對(duì)10取模,所得結(jié)果為最低位 LEDBuf5 = LEDMAPResult % 10; Result = Resul

33、t / 10; i = 4; / 如果數(shù)值除以10后不等于0,繼續(xù)向高位顯示 while (Result != 0) LEDBufi- = LEDMAPResult % 10; Result = Result / 10; unsigned char PulseCNT;unsigned char Pulse;unsigned ToneHigh, ToneLow;code unsigned int Tone=64778;void Timer() interrupt 1 TR0 = 0; TH0 = ToneHigh; TL0 = ToneLow; TR0 = 1; Speaker = Pulse;

34、 Pulse +; PulseCNT-;void main()signed int Last, Result,i; / 定義整型變量Last,Result分別存放第一個(gè)運(yùn)算數(shù),第二個(gè)運(yùn)算數(shù)和結(jié)果unsigned int ttttt,x; unsigned char OP; unsigned char Key; / 定義字符型變量OP,Key分別存放上一運(yùn)算符、當(dāng)前輸入鍵 Last = 0; / 給變量賦初值 Result = 0; OP = ADD; ttttt=1; x=0; Control = mode; Pulse = 0; TMOD = 0x01; / 方式 1 , 記時(shí)器 IE =

35、0x82; / EA=1, IT0 = 1 DisplayResult(Result); / 將0送到顯示緩沖區(qū) while (1) while (!TestKey() DisplayLED(); / 用于顯示按下的數(shù)及結(jié)果 / 讀取鍵碼 Key = GetKey(); / 得到按下鍵的代碼 if ( (Key >= 0) && (Key <= 9) ) / 是數(shù)字鍵Result = Result*10 + Key;/ 輸入數(shù)值if (Result<0) ToneHigh = Tone >> 8; ToneLow = Tone & 0xff

36、; TH0 = ToneHigh; TL0 = ToneLow; TR0 = 1; PulseCNT = 200; while (PulseCNT != 0) ; / 發(fā) 100 個(gè)脈沖 Speaker = 0; TR0 = 0; DisplayResult(Result);/ 數(shù)值送顯示緩沖 else if (Key = CLR) / 是清零鍵Last = 0; Result = 0; OP = ADD;/ 狀態(tài)清零DisplayResult(Result); / 數(shù)值送顯示緩沖 else if ( (Key=ADD) | (Key=SUB) | (Key=MUL) | (Key=DIV)

37、| (Key=EQU) |(Key=qf)|(Key=qy)|(Key=jc)|(Key=bj)|(Key=zh)|(Key=pys)|(Key=kf)|(Key=pf) ) / 是功能鍵 switch (OP) /上一按鍵是? case ADD: Result = Last + Result;if (Result<0) ToneHigh = Tone >> 8; ToneLow = Tone & 0xff; TH0 = ToneHigh; TL0 = ToneLow; TR0 = 1; PulseCNT = 200; while (PulseCNT != 0) ;

38、/ 發(fā) 100 個(gè)脈沖 Speaker = 0; TR0 = 0; break; case SUB: Result = Last - Result; break; case MUL: Result = Last * Result; if (Result<0) ToneHigh = Tone >> 8; ToneLow = Tone & 0xff; TH0 = ToneHigh; TL0 = ToneLow; TR0 = 1; PulseCNT = 200; while (PulseCNT != 0) ; / 發(fā) 100 個(gè)脈沖 Speaker = 0; TR0 = 0

39、; break; case DIV: Result = Last / Result; / 根據(jù)上一鍵進(jìn)行相應(yīng)的運(yùn)算,計(jì)算最后結(jié)果 break; case qf: for (i=Result;i>0;i-) ttttt= ttttt*Last; Result=ttttt; if (Result<0) ToneHigh = Tone >> 8; ToneLow = Tone & 0xff; TH0 = ToneHigh; TL0 = ToneLow; TR0 = 1; PulseCNT = 200; while (PulseCNT != 0) ; / 發(fā) 100 個(gè)

40、脈沖 Speaker = 0; TR0 = 0; break; case qy: Result = Last % Result; break; case jc: ttttt=Last-1; for(i=0;i<Result-1;i+) Last=Last*ttttt; ttttt-; Result=Last; if (Result<0) ToneHigh = Tone >> 8; ToneLow = Tone & 0xff; TH0 = ToneHigh; TL0 = ToneLow; TR0 = 1; PulseCNT = 200; while (PulseCNT != 0) ; / 發(fā) 100 個(gè)脈沖 Speaker = 0; TR0 = 0; break; case bj: if(Last<Result) Result=Last; break; case zh: x=Result; ttttt=Last-1; for(i=0;i<Result-1;i+) Last=Last*ttttt/x; ttttt-; x-; Result = Last ;if (Result<0) ToneHigh = Tone >> 8; ToneLow

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論