版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 課 程 設(shè) 計(jì) 說 明 書</p><p> 題目: 計(jì)算器實(shí)驗(yàn) </p><p> 學(xué)院(系): </p><p> 年級(jí)專業(yè): </p><p> 學(xué) 號(hào): </p>
2、<p> 學(xué)生姓名: </p><p> 指導(dǎo)教師: </p><p> 教師職稱: </p><p> 課程設(shè)計(jì)(論文)任務(wù)書</p><p> 說明:此表一式四份,學(xué)生、指導(dǎo)教師、基層教學(xué)單位、系部各一
3、份。</p><p> 2012年 6月 29日 </p><p><b> 摘 要</b></p><p> 單片機(jī)的出現(xiàn)是計(jì)算機(jī)制造技術(shù)高速發(fā)展的產(chǎn)物,它是嵌入式控制技術(shù)的核心,如今,它已廣泛地應(yīng)用到我們生活的各個(gè)領(lǐng)域,如電子、科技、通信、汽車、工業(yè)等。計(jì)算器在人們的日常中是比較的常見的電子產(chǎn)品之一,可是它還在發(fā)展之中,以后必將出現(xiàn)
4、功能更加強(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ù)碼管采用動(dòng)態(tài)掃描方式,計(jì)算功能通過軟件實(shí)現(xiàn),用C語言對(duì)單片機(jī)可編程芯片進(jìn)行編程,實(shí)
5、現(xiàn)對(duì)計(jì)算器的設(shè)計(jì)。</p><p> 關(guān)鍵字:?jiǎn)纹瑱C(jī)、計(jì)算器、數(shù)碼管、鍵盤</p><p><b> 目錄</b></p><p><b> 摘 要3</b></p><p> 第一章 設(shè)計(jì)目標(biāo)與設(shè)計(jì)方案4</p><p> 1.1 設(shè)計(jì)目標(biāo)與實(shí)現(xiàn)方法4<
6、;/p><p> 1.2 方案設(shè)計(jì)4</p><p> 第2章 硬件模塊介紹6</p><p> 2.1 運(yùn)算模塊6</p><p> 2.2 輸入模塊7</p><p> 2.2.1鍵盤的原理8</p><p> 2.3 顯示模塊9</p><p>
7、 2.3.1 LED的顯示原理9</p><p> 2.3.2 動(dòng)態(tài)顯示的工作原理11</p><p> 2.4 音頻控制模塊11</p><p> 第3章 軟件設(shè)計(jì)12</p><p> 3.1 基本功能設(shè)計(jì)12</p><p> 3.2 擴(kuò)展功能設(shè)計(jì)18</p><p&g
8、t; 第4章 硬件電路28</p><p> 4.1 硬件電路28</p><p> 4.2 硬件電路連線28</p><p> 第5章 學(xué)習(xí)心得29</p><p><b> 參考資料30</b></p><p> 第一章 設(shè)計(jì)目標(biāo)與設(shè)計(jì)方案</p><
9、p> 1.1 設(shè)計(jì)目標(biāo)與實(shí)現(xiàn)方法</p><p><b> 1)設(shè)計(jì)目標(biāo):</b></p><p> 利用實(shí)驗(yàn)儀上提供的顯示電路和鍵盤電路,做一個(gè)簡(jiǎn)單的計(jì)算器。</p><p><b> 2)實(shí)現(xiàn)方法:</b></p><p> 為了滿足設(shè)計(jì)的基本要求,可以實(shí)現(xiàn)基本的運(yùn)算(加減乘除)
10、,數(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)箱等。</p><p><b> 1.2 方案設(shè)計(jì)</b></p><p> 根據(jù)功能要求和指標(biāo)要求,本系統(tǒng)選用MCS 51 單片機(jī)為主控機(jī)
11、,通過擴(kuò)展必要的外圍接口電路,實(shí)現(xiàn)對(duì)計(jì)算器的設(shè)計(jì)。具體設(shè)計(jì)方案如下:</p><p> ①首先實(shí)現(xiàn)計(jì)算器的基本功能,即可以進(jìn)行四則運(yùn)算,對(duì)數(shù)字的大小范圍要求不高,故采用可以進(jìn)行三位數(shù)字的運(yùn)算,選用4*6的鍵盤實(shí)現(xiàn)數(shù)據(jù)輸入,用6 個(gè)LED 數(shù)碼管顯示數(shù)據(jù)。</p><p> ?、阪I盤包括數(shù)字鍵(0~9)、符號(hào)鍵(+、-、×、÷)、清除鍵和等號(hào)鍵,用A、B、C、D、E、F
12、鍵分別代表“+”、“-”、“*”、“/”、“=”、“清零”的功能。</p><p> ?、蹟U(kuò)展功能:用剩余八個(gè)鍵分別實(shí)現(xiàn)求方、取余、排列、比較、組合、平均數(shù)、開方、平方的功能,用8255擴(kuò)展芯片及蜂鳴器實(shí)現(xiàn)錯(cuò)誤報(bào)警的功能。</p><p> 根據(jù)需要我們可以采用自上而下的程序設(shè)計(jì)方法,此方法先從主程序開始設(shè)計(jì),然后再編制各子程序,層層細(xì)化,逐步求精,最終完成一個(gè)復(fù)雜程序的設(shè)計(jì)。程序流程圖
13、如下:</p><p> 第2章 硬件模塊介紹</p><p><b> 2.1 運(yùn)算模塊</b></p><p> MCS-51 單片機(jī)是在一塊芯片中集成了CPU、RAM、ROM、定時(shí)器/計(jì)數(shù)器和多功能I/O等一臺(tái)計(jì)算機(jī)所需要的基本功能部件。如果按功能劃分,它由如下功能部件組成,即微處理器(CPU)、數(shù)據(jù)存儲(chǔ)器(RAM)、程序存儲(chǔ)器(R
14、OM/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所示:</p><p> MCS—51引腳配置圖T</p><
15、;p><b> 2.2 輸入模塊</b></p><p> 計(jì)算器的數(shù)據(jù)輸入由鍵盤來實(shí)現(xiàn)。鍵盤是由若干個(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)單所
16、需按鍵較少時(shí),可采用獨(dú)立式非編碼鍵盤,而當(dāng)系統(tǒng)操作較復(fù)雜,需要按鍵較多時(shí),可采用矩陣式非編碼鍵盤。如果采用獨(dú)立按鍵的方式,會(huì)占用大量的I/O 口資源,故我們采用矩陣式鍵盤輸入。采用四條I/O 線作為行線,六條I/O 線作為列線組成鍵盤。在行線和列線的每個(gè)交叉點(diǎn)上設(shè)置一個(gè)按鍵,這樣鍵盤上按鍵的個(gè)數(shù)就為4×6個(gè)。這種行列式鍵盤結(jié)構(gòu)能有效地提高單片機(jī)系統(tǒng)中I/O 口的利用率,如圖2—1所示:</p><p>
17、 圖2-1 矩陣式鍵盤</p><p> 2.2.1鍵盤的原理</p><p> 如圖2—2所示,采用列掃描法來識(shí)別按鍵。每個(gè)按鍵都有它的行值和列值,行值和列值的組合就是識(shí)別這個(gè)按鍵的編碼。矩陣的行線和列線分別通過兩并行接口和CPU通信。鍵盤的一端(列線)通過電阻接VCC,而接地是通過程序輸出數(shù)字“0”實(shí)現(xiàn)的。鍵盤處理程序的任務(wù)是:確定有無鍵按下,判斷哪一個(gè)鍵按下,鍵的功能是什么?還
18、要消除按鍵在閉合或斷開時(shí)的抖動(dòng)。兩個(gè)并行口中,一個(gè)輸出掃描碼,使按鍵逐行動(dòng)態(tài)接地;另一個(gè)并行口輸入按鍵狀態(tài),由行掃描值和回饋信號(hào)共同形成鍵編碼而識(shí)別按鍵,通過軟件查表,查出該鍵的功能。</p><p> 當(dāng)無按鍵閉合時(shí),P10~P13 與P14~P17 之間開路;當(dāng)有鍵閉合時(shí),與閉合鍵相連的兩條I/O 口線之間短路。判斷有無按鍵按下的方法是:第一步,置列線P14~P17 為輸入狀態(tài),從行線P10~P13 輸出低
19、電平,讀入列線數(shù)據(jù),若某一列線為低電平,則該列線上有鍵閉合。第二步,行線輪流輸出低電平,從列線P14~P17 讀入數(shù)據(jù),若有某一列為低電平,則對(duì)應(yīng)行線上有鍵按下。綜合一二兩步的結(jié)果,可確定按鍵編號(hào)。但是鍵閉合一次只能進(jìn)行一次鍵功能操作,因此須等到按鍵釋放后,再進(jìn)行鍵功能操作,否則按一次鍵,有可能會(huì)連續(xù)多次進(jìn)行同樣的鍵操作。</p><p><b> 圖2—2 鍵盤結(jié)構(gòu)</b></p&
20、gt;<p><b> 2.3 顯示模塊</b></p><p> 發(fā)光二極管LED 是單片機(jī)應(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)用
21、系統(tǒng)中獲得了廣泛的應(yīng)用,所以在此設(shè)計(jì)中我首先選用了LED作為顯示器件。</p><p> 2.3.1 LED的顯示原理</p><p> LED顯示器的結(jié)構(gòu)及其段名如圖2—3所示,連同小數(shù)點(diǎn)在內(nèi),共有8個(gè)LED燈,點(diǎn)亮合適的字段,即能顯示0—9的數(shù)字和某些字符、符號(hào)。這種顯示器有兩種形式:一種是發(fā)光二極管的陰極連在一起的共陰極顯示器,另一種是陽極連在一起的共陽極顯示器。共陽數(shù)碼管是指將
22、所有發(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、/p><p> 圖2—3 LED段碼</p><p> 為了顯示數(shù)字或符號(hào),要為L(zhǎng)ED顯示器提供代碼,即字形代碼。七段發(fā)光二極管,再加上一個(gè)小數(shù)點(diǎn)位,共計(jì)8段,因此提供的字形代碼的長(zhǎng)度正好是一個(gè)字節(jié)。簡(jiǎn)易計(jì)算器用到的數(shù)字0~9的共陰極字形代碼如下表2—1所示:</p><p> 表2-1 0—9七段數(shù)碼管共陰極字形代碼</p><p>
24、 2.3.2 動(dòng)態(tài)顯示的工作原理</p><p> 點(diǎn)亮顯示器的方法有靜態(tài)和動(dòng)態(tài)兩種,這里顯示位數(shù)較多,采用動(dòng)態(tài)顯示較合適,如圖2—4所示,所謂動(dòng)態(tài)顯示,就是用掃描的方法一位一位輪流點(diǎn)亮顯示器的各位,該方法只需一個(gè)8位段輸出口和一個(gè)8位掃描輸出口,后者的作用是依次接通各位LED。對(duì)于顯示器的每一位來說,每隔一段時(shí)間點(diǎn)亮一次,利用人眼的視覺暫留效應(yīng)可以看到整個(gè)動(dòng)態(tài)顯示,但必須保證掃描速度足夠快,字符才不閃爍。 &
25、lt;/p><p> 圖2—4 數(shù)碼管的動(dòng)態(tài)顯示</p><p> 2.4 音頻控制模塊</p><p> 如圖2—5所示為音頻放大濾波電路,端口輸入的方波經(jīng)放大濾波后,驅(qū)動(dòng)揚(yáng)聲器發(fā)聲。聲音的頻率由端口輸入時(shí)延時(shí)控制,不同頻率的脈沖控制喇叭發(fā)出不同的音調(diào)。</p><p> 圖2—5 音頻放大濾波電路</p><p&g
26、t;<b> 第3章 軟件設(shè)計(jì)</b></p><p> 3.1 基本功能設(shè)計(jì)</p><p><b> 1、實(shí)驗(yàn)現(xiàn)象:</b></p><p> 可以實(shí)現(xiàn)基本的運(yùn)算——加減乘除以及數(shù)據(jù)清零的功能,用A、B、C、D、E、F鍵分別代表“+”、“-”、“*”、“/”、“=”、“清零”。</p><p
27、><b> 2、程序流程圖</b></p><p> 數(shù)據(jù)送顯示緩沖子程序框圖如下:</p><p><b> 是</b></p><p> 數(shù)據(jù)送顯示緩沖子程序框圖</p><p> 運(yùn)算主程序框圖如下:</p><p><b> 運(yùn)算主程序流程
28、圖</b></p><p> 3、基本功能實(shí)現(xiàn)程序:</p><p> #define LEDLen 6 //設(shè)置LED顯示位數(shù)為六位</p><p> #define PB1 2</p><p> #define PB0 1</p><p> xdata unsigned char OUT
29、BIT _at_ 0x9002; // 位控制口</p><p> xdata unsigned char OUTSEG _at_ 0x9004; // 段控制口</p><p> xdata unsigned char IN _at_ 0x9001; // 鍵盤行碼讀回口</p><p> unsigned char LEDBuf[LED
30、Len];</p><p> unsigned char LEDMAP[] = {</p><p> 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,</p><p> 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71</p><p> };
31、 // 共陰極數(shù)碼管字形代碼</p><p> void Delay(unsigned char CNT) // 延時(shí)子程序</p><p><b> {</b></p><p> unsigned char i;</p><p> while (CNT-- !=0)</p>
32、<p> for (i=100; i !=0; i--);</p><p><b> }</b></p><p> void DisplayLED() // 逐位顯示數(shù)碼管</p><p><b> {</b></p><p> unsigned char i, j;&
33、lt;/p><p> unsigned char Pos;</p><p> unsigned char LED;</p><p> Pos = 0x20;</p><p> for (i = 0; i < LEDLen; i++) {</p><p> OUTBIT = 0; // trun of
34、f all LED</p><p> LED = LEDBuf[i];</p><p> OUTSEG = LED; // 段選</p><p> OUTBIT = Pos; // trun on one LED 位選</p><p> Delay(1); </p><p> Pos &g
35、t;>= 1;</p><p><b> }</b></p><p><b> }</b></p><p> unsigned char KeyTable[] = {</p><p> 0x16, 0x15, 0x14, 0xff,</p><p> 0x13
36、, 0x12, 0x11, 0x10,</p><p> 0x0d, 0x0c, 0x0b, 0x0a,</p><p> 0x0e, 0x03, 0x06, 0x09,</p><p> 0x0f, 0x02, 0x05, 0x08,</p><p> 0x00, 0x01, 0x04, 0x07</p><p&
37、gt; }; // 鍵盤各鍵代碼</p><p> unsigned char TestKey() // 檢查鍵盤是否有鍵按下</p><p><b> {</b></p><p> OUTBIT = 0;</p><p> return (~IN & 0x0f); }</p>&
38、lt;p> unsigned char GetKey() // 得到按下鍵的數(shù)值</p><p> { unsigned char Pos;</p><p> unsigned char i;</p><p> unsigned char k;</p><p><b> i = 6;</b><
39、/p><p> Pos = 0x20;</p><p><b> do {</b></p><p> OUTBIT = ~ Pos;</p><p> Pos >>= 1;</p><p> k = ~IN & 0x0f;</p><p> }
40、while ((--i != 0) && (k == 0));</p><p> if (k != 0) {</p><p><b> i *= 4;</b></p><p> if (k & 2)</p><p><b> i += 1;</b></p>
41、<p> else if (k & 4)</p><p><b> i += 2;</b></p><p> else if (k & 8)</p><p><b> i += 3;</b></p><p> OUTBIT = 0;</p>&l
42、t;p> do Delay(10); while (TestKey());</p><p> return(KeyTable[i]); // 將被按下鍵的代碼返回給主程序</p><p> } else return(0xff); // 如果沒有鍵按下,返回清零代碼0xff</p><p><b> }</b></p&g
43、t;<p> #define ADD 0x0a // 宏定義,各運(yùn)算對(duì)應(yīng)相應(yīng)鍵的代碼</p><p> #define SUB 0x0b</p><p> #define MUL 0x0c</p><p> #define DIV 0x0d</p><p> #define EQU 0x0e</p
44、><p> #define CLR 0x0f</p><p> void DisplayResult(signed int Result) // 計(jì)算結(jié)果逐位送入顯示緩沖區(qū)中</p><p><b> {</b></p><p> unsigned char i;</p><p> if
45、(Result >= 0) { // 數(shù)值大于0</p><p><b> // 不顯示符號(hào)位</b></p><p> LEDBuf[0] = 0;</p><p><b> } else {</b></p><p> // 在符號(hào)位顯示 ‘-’</p><p&g
46、t; LEDBuf[0] = 0x40;</p><p> Result = - Result; }</p><p> LEDBuf[1] = 0;</p><p> LEDBuf[2] = 0;</p><p> LEDBuf[3] = 0;</p><p> LEDBuf[4] = 0;</p
47、><p> // 數(shù)值對(duì)10取模,所得結(jié)果為最低位</p><p> LEDBuf[5] = LEDMAP[Result % 10]; Result = Result / 10;</p><p><b> i = 4;</b></p><p> // 如果數(shù)值除以10后不等于0,繼續(xù)向高位顯示</p>
48、<p> while (Result != 0) {</p><p> LEDBuf[i--] = LEDMAP[Result % 10]; Result = Result / 10; }</p><p><b> }</b></p><p> void main()</p><p> { s
49、igned int Last, Result; // 定義整型變量Last,Result分別存放第一個(gè)運(yùn)算數(shù),第二個(gè)運(yùn)算數(shù)和結(jié)果</p><p> unsigned char OP;</p><p> unsigned char Key; // 定義字符型變量OP,Key分別存放上一運(yùn)算符、當(dāng)前輸入鍵</p><p> Last = 0;
50、 // 給變量賦初值</p><p> Result = 0;</p><p> OP = ADD;</p><p> DisplayResult(Result); // 將0送到顯示緩沖區(qū)</p><p> while (1) {</p><p> while
51、(!TestKey()) DisplayLED(); // 用于顯示按下的數(shù)及結(jié)果</p><p><b> // 讀取鍵碼</b></p><p> Key = GetKey(); // 得到按下鍵的代碼</p><p> if ( (Key >= 0) && (Key &
52、lt;= 9) ) { // 是數(shù)字鍵</p><p> Result = Result*10 + Key; // 輸入數(shù)值</p><p> // 數(shù)值送顯示緩沖</p><p> DisplayResult(Result); // 數(shù)值送顯示緩沖</p><p> } else if (Key == CL
53、R) { // 是清零鍵</p><p> Last = 0;</p><p> Result = 0;</p><p> OP = ADD; // 狀態(tài)清零</p><p> DisplayResult(Result); // 數(shù)值送顯示緩沖</p><p> } els
54、e if ( (Key==ADD) || (Key==SUB) || (Key==MUL) || (Key==DIV) || (Key=EQU) ) { // 是功能鍵</p><p> switch (OP) { //上一按鍵是?</p><p><b> case ADD:</b></p><p> Result = Last
55、 + Result;</p><p><b> break;</b></p><p><b> case SUB:</b></p><p> Result = Last - Result;</p><p><b> break;</b></p><p
56、><b> case MUL:</b></p><p> Result = Last * Result;</p><p><b> break;</b></p><p><b> case DIV:</b></p><p> Result = Last / Re
57、sult; // 根據(jù)上一鍵進(jìn)行相應(yīng)的運(yùn)算,計(jì)算最后結(jié)果</p><p> break; }</p><p> if (Key == EQU) { // 功能鍵是‘=’</p><p><b> Last = 0;</b></p><p> OP = ADD; //
58、 重新賦初值</p><p> } else { // 是其它功能鍵</p><p> // 保存結(jié)果, 保存按鍵功能</p><p> Last = Result;</p><p> OP = Key; }</p><p> DisplayResult(Result); //將
59、結(jié)果送顯示緩沖</p><p> Result = 0; // 等待下一個(gè)數(shù)值輸入.</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p&g
60、t; 3.2 擴(kuò)展功能設(shè)計(jì)</p><p> 1、實(shí)驗(yàn)現(xiàn)象:除了可以進(jìn)行加減乘除的基本運(yùn)算外,還可進(jìn)行求方、取余、排列、比較、組合、平均數(shù)、開方、平方運(yùn)算;當(dāng)輸入、輸出超過顯示范圍時(shí),蜂鳴器會(huì)發(fā)聲報(bào)警,起到提示作用。</p><p><b> 2、程序流程圖:</b></p><p><b> 擴(kuò)展后程序流程圖</b&g
61、t;</p><p><b> 3、擴(kuò)展后的程序:</b></p><p> #include <reg51.h></p><p> #include <math.h></p><p> #define mode 0x82;</p><p> #define LE
62、DLen 6 //設(shè)置LED顯示位數(shù)為六位</p><p> #define PB1 2</p><p> #define PB0 1</p><p> xdata unsigned char Control _at_ 0x8003;</p><p> xdata unsigned char Speaker _at_ 0x800
63、0;</p><p> xdata unsigned char OUTBIT _at_ 0x9002; // 位控制口</p><p> xdata unsigned char OUTSEG _at_ 0x9004; // 段控制口</p><p> xdata unsigned char IN _at_ 0x9001; // 鍵盤行碼讀回
64、口</p><p> unsigned char LEDBuf[LEDLen];</p><p> unsigned char LEDMAP[] = {</p><p> 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,</p><p> 0x7f, 0x6f, 0x77, 0x7c, 0
65、x39, 0x5e, 0x79, 0x71</p><p> }; // 共陰極數(shù)碼管字形代碼</p><p> void Delay(unsigned char CNT) // 延時(shí)子程序</p><p><b> {</b></p><p> unsigned char i;&l
66、t;/p><p> while (CNT-- !=0)</p><p> for (i=100; i !=0; i--);</p><p><b> }</b></p><p> void DisplayLED() // 逐位顯示數(shù)碼管</p><p><b> {</
67、b></p><p> unsigned char i, j;</p><p> unsigned char Pos;</p><p> unsigned char LED;</p><p> Pos = 0x20;</p><p> for (i = 0; i < LEDLen; i++) {&
68、lt;/p><p> OUTBIT = 0; // trun off all LED</p><p> LED = LEDBuf[i];</p><p> OUTSEG = LED; // 段選</p><p> OUTBIT = Pos; // trun on one LED 位選</p><p&g
69、t; Delay(1); </p><p> Pos >>= 1;</p><p><b> }</b></p><p><b> }</b></p><p> unsigned char KeyTable[] = {</p><p> 0x
70、16, 0x15, 0x14, 0xff,</p><p> 0x13, 0x12, 0x11, 0x10,</p><p> 0x0d, 0x0c, 0x0b, 0x0a,</p><p> 0x0e, 0x03, 0x06, 0x09,</p><p> 0x0f, 0x02, 0x05, 0x08,</p><
71、;p> 0x00, 0x01, 0x04, 0x07</p><p> }; // 鍵盤各鍵代碼</p><p> unsigned char TestKey() // 檢查鍵盤是否有鍵按下</p><p><b> {</b></p><p> OUTBIT = 0;</p><
72、;p> return (~IN & 0x0f); }</p><p> unsigned char GetKey() // 得到按下鍵的數(shù)值</p><p> { unsigned char Pos;</p><p> unsigned char i;</p><p> unsigned char k;<
73、/p><p><b> i = 6;</b></p><p> Pos = 0x20;</p><p><b> do {</b></p><p> OUTBIT = ~ Pos;</p><p> Pos >>= 1;</p><p&g
74、t; k = ~IN & 0x0f;</p><p> } while ((--i != 0) && (k == 0));</p><p> if (k != 0) {</p><p><b> i *= 4;</b></p><p> if (k & 2)</p>
75、<p><b> i += 1;</b></p><p> else if (k & 4)</p><p><b> i += 2;</b></p><p> else if (k & 8)</p><p><b> i += 3;</b>
76、</p><p> OUTBIT = 0;</p><p> do Delay(10); while (TestKey());</p><p> return(KeyTable[i]); // 將被按下鍵的代碼返回給主程序</p><p> } else return(0xff); // 如果沒有鍵按下,返回清零代碼0xff<
77、;/p><p><b> }</b></p><p> #define ADD 0x0a // 宏定義,各運(yùn)算對(duì)應(yīng)相應(yīng)鍵的代碼</p><p> #define SUB 0x0b</p><p> #define MUL 0x0c</p><p> #define DIV 0
78、x0d</p><p> #define EQU 0x0e</p><p> #define CLR 0x0f</p><p> #define qf 0xff</p><p> #define qy 0x14</p><p> #define jc 0x15</p><p>
79、 #define bj 0x16</p><p> #define zh 0x10</p><p> #define pys 0x11</p><p> #define kf 0x12</p><p> #define pf 0x13</p><p> void DisplayResult(signed
80、int Result) // 計(jì)算結(jié)果逐位送入顯示緩沖區(qū)中</p><p><b> {</b></p><p> unsigned char i;</p><p> if (Result >= 0) { // 數(shù)值大于0</p><p><b> // 不顯示符號(hào)位</b><
81、/p><p> LEDBuf[0] = 0;</p><p><b> } else {</b></p><p> // 在符號(hào)位顯示 ‘-’</p><p> LEDBuf[0] = 0x40;</p><p> Result = - Result; }</p><
82、p> LEDBuf[1] = 0;</p><p> LEDBuf[2] = 0;</p><p> LEDBuf[3] = 0;</p><p> LEDBuf[4] = 0;</p><p> // 數(shù)值對(duì)10取模,所得結(jié)果為最低位</p><p> LEDBuf[5] = LEDMAP[Resu
83、lt % 10]; Result = Result / 10;</p><p><b> i = 4;</b></p><p> // 如果數(shù)值除以10后不等于0,繼續(xù)向高位顯示</p><p> while (Result != 0) {</p><p> LEDBuf[i--] = LEDMAP[Result
84、 % 10]; Result = Result / 10; }</p><p><b> }</b></p><p> unsigned char PulseCNT;</p><p> unsigned char Pulse;</p><p> unsigned ToneHigh, ToneLow;</
85、p><p> code unsigned int Tone=64778;</p><p> void Timer() interrupt 1</p><p><b> {</b></p><p><b> TR0 = 0;</b></p><p> TH0 = Tone
86、High;</p><p> TL0 = ToneLow;</p><p><b> TR0 = 1;</b></p><p> Speaker = Pulse;</p><p><b> Pulse ++;</b></p><p> PulseCNT--;<
87、/p><p><b> }</b></p><p> void main()</p><p> { signed int Last, Result,i; // 定義整型變量Last,Result分別存放第一個(gè)運(yùn)算數(shù),第二個(gè)運(yùn)算數(shù)和結(jié)果</p><p> unsigned int ttttt,x;</p&
88、gt;<p> unsigned char OP;</p><p> unsigned char Key; // 定義字符型變量OP,Key分別存放上一運(yùn)算符、當(dāng)前輸入鍵</p><p> Last = 0; // 給變量賦初值</p><p> Result = 0;</p>&
89、lt;p> OP = ADD;</p><p><b> ttttt=1;</b></p><p><b> x=0;</b></p><p> Control = mode;</p><p> Pulse = 0;</p><p> TMOD =
90、0x01; // 方式 1 , 記時(shí)器</p><p> IE = 0x82; // EA=1, IT0 = 1</p><p> DisplayResult(Result); // 將0送到顯示緩沖區(qū)</p><p> while (1) {</p><p> while (!TestKey()) Display
91、LED(); // 用于顯示按下的數(shù)及結(jié)果</p><p><b> // 讀取鍵碼</b></p><p> Key = GetKey(); // 得到按下鍵的代碼</p><p> if ( (Key >= 0) && (Key <= 9) ) { // 是數(shù)字鍵&
92、lt;/p><p> Result = Result*10 + Key; // 輸入數(shù)值</p><p> if (Result<0){</p><p> ToneHigh = Tone >> 8;</p><p> ToneLow = Tone & 0xff;</p><p>
93、 TH0 = ToneHigh;</p><p> TL0 = ToneLow;</p><p><b> TR0 = 1;</b></p><p> PulseCNT = 200;</p><p> while (PulseCNT != 0) ; // 發(fā) 100 個(gè)脈沖</p>&l
94、t;p> Speaker = 0;</p><p> TR0 = 0; }</p><p> DisplayResult(Result); // 數(shù)值送顯示緩沖</p><p> } else if (Key == CLR) { // 是清零鍵</p><p> Last = 0;</p>
95、<p> Result = 0;</p><p> OP = ADD; // 狀態(tài)清零</p><p> DisplayResult(Result); // 數(shù)值送顯示緩沖</p><p> } else if ( (Key==ADD) || (Key==SUB) || (Key==MUL) || (Key==DIV
96、) || (Key=EQU) ||(Key==qf)||(Key==qy)||(Key==jc)||(Key==bj)||(Key==zh)||(Key==pys)||(Key==kf)||(Key==pf) )) { // 是功能鍵</p><p> switch (OP) { //上一按鍵是?</p><p><b> case ADD:</b><
97、;/p><p> Result = Last + Result;</p><p> if (Result<0){</p><p> ToneHigh = Tone >> 8;</p><p> ToneLow = Tone & 0xff;</p><p> TH0 = ToneHigh
98、;</p><p> TL0 = ToneLow;</p><p><b> TR0 = 1;</b></p><p> PulseCNT = 200;</p><p> while (PulseCNT != 0) ; // 發(fā) 100 個(gè)脈沖</p><p> Speaker
99、 = 0;</p><p> TR0 = 0; }</p><p><b> break;</b></p><p><b> case SUB:</b></p><p> Result = Last - Result;</p><p><b> break
100、;</b></p><p><b> case MUL:</b></p><p> Result = Last * Result;</p><p> if (Result<0){</p><p> ToneHigh = Tone >> 8;</p><p>
101、 ToneLow = Tone & 0xff;</p><p> TH0 = ToneHigh;</p><p> TL0 = ToneLow;</p><p><b> TR0 = 1;</b></p><p> PulseCNT = 200;</p><p> while
102、(PulseCNT != 0) ; // 發(fā) 100 個(gè)脈沖</p><p> Speaker = 0;</p><p> TR0 = 0; }</p><p><b> break;</b></p><p><b> case DIV:</b></p><p&
103、gt; Result = Last / Result; // 根據(jù)上一鍵進(jìn)行相應(yīng)的運(yùn)算,計(jì)算最后結(jié)果</p><p><b> break; </b></p><p><b> case qf:</b></p><p> for (i=Result;i>0;i--) {</p><p
104、> ttttt= ttttt*Last; }</p><p> Result=ttttt;</p><p> if (Result<0){</p><p> ToneHigh = Tone >> 8;</p><p> ToneLow = Tone & 0xff;</p><
105、;p> TH0 = ToneHigh;</p><p> TL0 = ToneLow;</p><p><b> TR0 = 1;</b></p><p> PulseCNT = 200;</p><p> while (PulseCNT != 0) ; // 發(fā) 100 個(gè)脈沖</p&g
106、t;<p> Speaker = 0;</p><p> TR0 = 0; }</p><p><b> break;</b></p><p><b> case qy:</b></p><p> Result = Last % Result;</p><
107、p><b> break;</b></p><p><b> case jc:</b></p><p> ttttt=Last-1;</p><p> for(i=0;i<Result-1;i++) {</p><p> Last=Last*ttttt;</p>
108、<p><b> ttttt--;}</b></p><p> Result=Last;</p><p> if (Result<0){</p><p> ToneHigh = Tone >> 8;</p><p> ToneLow = Tone & 0xff;</p
109、><p> TH0 = ToneHigh;</p><p> TL0 = ToneLow;</p><p><b> TR0 = 1;</b></p><p> PulseCNT = 200;</p><p> while (PulseCNT != 0) ; // 發(fā) 100 個(gè)脈
110、沖</p><p> Speaker = 0;</p><p> TR0 = 0; }</p><p><b> break;</b></p><p><b> case bj:</b></p><p> if(Last<Result)</p>
111、<p> Result=Last;</p><p><b> break;</b></p><p><b> case zh:</b></p><p><b> x=Result;</b></p><p> ttttt=Last-1;</p>
112、<p> for(i=0;i<Result-1;i++)</p><p> {Last=Last*ttttt/x;</p><p><b> ttttt--;</b></p><p><b> x--; }</b></p><p> Result = Last ;</
113、p><p> if (Result<0){</p><p> ToneHigh = Tone >> 8;</p><p> ToneLow = Tone & 0xff;</p><p> TH0 = ToneHigh;</p><p> TL0 = ToneLow;</p>
114、<p><b> TR0 = 1;</b></p><p> PulseCNT = 200;</p><p> while (PulseCNT != 0) ; // 發(fā) 100 個(gè)脈沖</p><p> Speaker = 0;</p><p> TR0 = 0; }</p>
115、<p><b> break;</b></p><p> case pys:</p><p> Result=Last+Result;</p><p> Result=Result/2;</p><p><b> break;</b></p><p>
116、;<b> case kf:</b></p><p> Result=sqrt(Result);</p><p><b> break;</b></p><p><b> case pf:</b></p><p> Result=Result*Result;</
117、p><p> if (Result<0){</p><p> ToneHigh = Tone >> 8;</p><p> ToneLow = Tone & 0xff;</p><p> TH0 = ToneHigh;</p><p> TL0 = ToneLow;</p>
118、<p><b> TR0 = 1;</b></p><p> PulseCNT = 200;</p><p> while (PulseCNT != 0) ; // 發(fā) 100 個(gè)脈沖</p><p> Speaker = 0;</p><p> TR0 = 0; }</p>
119、<p><b> break;</b></p><p><b> }</b></p><p> if (Key == EQU) { // 功能鍵是‘=’</p><p><b> Last = 0;</b></p><p> OP = ADD;
120、 // 重新賦初值</p><p> } else { // 是其它功能鍵</p><p> // 保存結(jié)果, 保存按鍵功能</p><p> Last = Result;</p><p> OP = Key; }</p><p> DisplayResult
121、(Result); //將結(jié)果送顯示緩沖</p><p> Result = 0; // 等待下一個(gè)數(shù)值輸入.</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b><
122、;/p><p><b> 第4章 硬件電路</b></p><p><b> 4.1 硬件電路</b></p><p><b> 硬件電路圖</b></p><p> 4.2 硬件電路連線</p><p><b> 第5章 學(xué)習(xí)心得<
123、;/b></p><p> 本次單片機(jī)課程設(shè)計(jì)已接近尾聲了,在這一周的時(shí)間里,我們團(tuán)隊(duì)基本完成了我們的課題,即利用單片機(jī)設(shè)計(jì)一個(gè)簡(jiǎn)單的計(jì)算器,取得了較為理想的實(shí)驗(yàn)結(jié)果。在這期間,雖然遇到了一些困難,但通過老師和學(xué)長(zhǎng)的指導(dǎo)和與同學(xué)的交流,以及查閱相關(guān)資料,從剛開始的迷茫到慢慢地有了清晰的思路并動(dòng)手設(shè)計(jì)、操作,從而順利地完成了這次課程設(shè)計(jì)。</p><p> 通過這次課程設(shè)計(jì),我不僅
124、加深了對(duì)單片機(jī)基本知識(shí)的理解和掌握,還初步學(xué)習(xí)了關(guān)于軟件編程的一些基本知識(shí)和偉福實(shí)驗(yàn)箱的使用方法等,強(qiáng)化了自己原有的知識(shí)體系,擴(kuò)展了思維,還提高了動(dòng)手實(shí)踐和獨(dú)立思考的能力,培養(yǎng)了創(chuàng)新精神。在這次課程設(shè)計(jì)的設(shè)計(jì)過程中,我意識(shí)到自己掌握的知識(shí)還不足,某些方面的能力還是不夠。這也讓我再次認(rèn)識(shí)到知識(shí)的重要性,活到老,學(xué)到老,只有不斷的充實(shí)自己、完善自己的知識(shí)理論體系,才能夠更好的勝任自己以后的工作。這次課程設(shè)計(jì)為我們以后的深入學(xué)習(xí)和發(fā)展打下了良
125、好的基礎(chǔ),我將從中吸取經(jīng)驗(yàn)教訓(xùn),找到自己的不足,從而進(jìn)一步提高自己,做出更好的設(shè)計(jì)。</p><p> 作為一名工科學(xué)生,這樣的課程設(shè)計(jì)是非常有意義的。希望學(xué)校以后能更多的安排這樣的課程設(shè)計(jì),鍛煉我們的創(chuàng)新實(shí)踐能力。</p><p><b> 參考資料</b></p><p> 1)《單片機(jī)原理及應(yīng)用技術(shù)》 張淑清編 國(guó)防工業(yè)出版社<
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)計(jì)算器課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--計(jì)算器
- 單片機(jī)課程設(shè)計(jì)-計(jì)算器
- 課程設(shè)計(jì)-單片機(jī)計(jì)算器
- 單片機(jī)課程設(shè)計(jì)——計(jì)算器設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--簡(jiǎn)易計(jì)算器
- 單片機(jī)課程設(shè)計(jì)簡(jiǎn)易計(jì)算器
- 單片機(jī)課程設(shè)計(jì)-簡(jiǎn)易計(jì)算器
- 單片機(jī)課程設(shè)計(jì)簡(jiǎn)易計(jì)算器
- 單片機(jī)課程設(shè)計(jì)報(bào)告---計(jì)算器
- 單片機(jī)課程設(shè)計(jì)--簡(jiǎn)易計(jì)算器
- 基于單片機(jī)的計(jì)算器設(shè)計(jì)-單片機(jī)課程設(shè)計(jì)
- 單片機(jī)系統(tǒng)設(shè)計(jì)課程設(shè)計(jì)--計(jì)算器
- 51單片機(jī)計(jì)算器設(shè)計(jì)課程設(shè)計(jì)
- 課程設(shè)計(jì)---單片機(jī)簡(jiǎn)易計(jì)算器設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告---簡(jiǎn)易計(jì)算器
- 單片機(jī)課程設(shè)計(jì)報(bào)告計(jì)算器2
- 單片機(jī)課程設(shè)計(jì)報(bào)告-簡(jiǎn)易計(jì)算器
- 計(jì)算器單片機(jī)技術(shù)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--簡(jiǎn)易數(shù)字計(jì)算器
評(píng)論
0/150
提交評(píng)論