單片機課程設(shè)計---計算器實驗_第1頁
已閱讀1頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  課 程 設(shè) 計 說 明 書</p><p>  題目: 計算器實驗 </p><p>  學院(系): </p><p>  年級專業(yè): </p><p>  學 號: </p>

2、<p>  學生姓名: </p><p>  指導教師: </p><p>  教師職稱: </p><p>  課程設(shè)計(論文)任務書</p><p>  說明:此表一式四份,學生、指導教師、基層教學單位、系部各一

3、份。</p><p>  2012年 6月 29日 </p><p><b>  摘 要</b></p><p>  單片機的出現(xiàn)是計算機制造技術(shù)高速發(fā)展的產(chǎn)物,它是嵌入式控制技術(shù)的核心,如今,它已廣泛地應用到我們生活的各個領(lǐng)域,如電子、科技、通信、汽車、工業(yè)等。計算器在人們的日常中是比較的常見的電子產(chǎn)品之一,可是它還在發(fā)展之中,以后必將出現(xiàn)

4、功能更加強大的計算器,基于這樣的理念,本次課程設(shè)計的任務是利用單片機設(shè)計一個計算器,能夠進行多位簡單的整數(shù)加、減、乘、除的運算及具有清零的功能,同時還對其功能進行了擴展,增加了一些特殊運算及錯誤報警功能。它主要由MCS51單片機、A8255、數(shù)碼管顯示、鍵盤、蜂鳴器等模塊組成。本計算器是將鍵盤輸入信息經(jīng)處理通過緩存輸入數(shù)碼管顯示出來,鍵盤采用行列掃描式,數(shù)碼管采用動態(tài)掃描方式,計算功能通過軟件實現(xiàn),用C語言對單片機可編程芯片進行編程,實

5、現(xiàn)對計算器的設(shè)計。</p><p>  關(guān)鍵字:單片機、計算器、數(shù)碼管、鍵盤</p><p><b>  目錄</b></p><p><b>  摘 要3</b></p><p>  第一章 設(shè)計目標與設(shè)計方案4</p><p>  1.1 設(shè)計目標與實現(xiàn)方法4<

6、;/p><p>  1.2 方案設(shè)計4</p><p>  第2章 硬件模塊介紹6</p><p>  2.1 運算模塊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 動態(tài)顯示的工作原理11</p><p>  2.4 音頻控制模塊11</p><p>  第3章 軟件設(shè)計12</p><p>  3.1 基本功能設(shè)計12</p><p>  3.2 擴展功能設(shè)計18</p><p&g

8、t;  第4章 硬件電路28</p><p>  4.1 硬件電路28</p><p>  4.2 硬件電路連線28</p><p>  第5章 學習心得29</p><p><b>  參考資料30</b></p><p>  第一章 設(shè)計目標與設(shè)計方案</p><

9、p>  1.1 設(shè)計目標與實現(xiàn)方法</p><p><b>  1)設(shè)計目標:</b></p><p>  利用實驗儀上提供的顯示電路和鍵盤電路,做一個簡單的計算器。</p><p><b>  2)實現(xiàn)方法:</b></p><p>  為了滿足設(shè)計的基本要求,可以實現(xiàn)基本的運算(加減乘除)

10、,數(shù)據(jù)清零的功能。另外,還對計算器的功能進行了擴展,添加了一些特殊運算和錯誤報警的功能。我們采用基于MCS51單片機設(shè)計計算器,并用LED 數(shù)碼管顯示數(shù)據(jù),4*6 的矩陣鍵盤實現(xiàn)數(shù)據(jù)輸入,設(shè)計仿真和調(diào)試要用到WAVE軟件及實驗箱等。</p><p><b>  1.2 方案設(shè)計</b></p><p>  根據(jù)功能要求和指標要求,本系統(tǒng)選用MCS 51 單片機為主控機

11、,通過擴展必要的外圍接口電路,實現(xiàn)對計算器的設(shè)計。具體設(shè)計方案如下:</p><p> ?、偈紫葘崿F(xiàn)計算器的基本功能,即可以進行四則運算,對數(shù)字的大小范圍要求不高,故采用可以進行三位數(shù)字的運算,選用4*6的鍵盤實現(xiàn)數(shù)據(jù)輸入,用6 個LED 數(shù)碼管顯示數(shù)據(jù)。</p><p> ?、阪I盤包括數(shù)字鍵(0~9)、符號鍵(+、-、×、÷)、清除鍵和等號鍵,用A、B、C、D、E、F

12、鍵分別代表“+”、“-”、“*”、“/”、“=”、“清零”的功能。</p><p>  ③擴展功能:用剩余八個鍵分別實現(xiàn)求方、取余、排列、比較、組合、平均數(shù)、開方、平方的功能,用8255擴展芯片及蜂鳴器實現(xiàn)錯誤報警的功能。</p><p>  根據(jù)需要我們可以采用自上而下的程序設(shè)計方法,此方法先從主程序開始設(shè)計,然后再編制各子程序,層層細化,逐步求精,最終完成一個復雜程序的設(shè)計。程序流程圖

13、如下:</p><p>  第2章 硬件模塊介紹</p><p><b>  2.1 運算模塊</b></p><p>  MCS-51 單片機是在一塊芯片中集成了CPU、RAM、ROM、定時器/計數(shù)器和多功能I/O等一臺計算機所需要的基本功能部件。如果按功能劃分,它由如下功能部件組成,即微處理器(CPU)、數(shù)據(jù)存儲器(RAM)、程序存儲器(R

14、OM/EPROM)、并行I/O 口、串行口、定時器/計數(shù)器、中斷系統(tǒng)及特殊功能寄存器(SFR)。單片機是靠程序運行的,并且可以修改。通過不同的程序?qū)崿F(xiàn)不同的功能,尤其是特殊的獨特的一些功能,通過使用單片機編寫的程序可以實現(xiàn)高智能,高效率,以及高可靠性!因此我們采用單片機作為計算器的主要功能部件,可以進行很快地實現(xiàn)運算功能,如圖2-1所示:</p><p>  MCS—51引腳配置圖T</p><

15、;p><b>  2.2 輸入模塊</b></p><p>  計算器的數(shù)據(jù)輸入由鍵盤來實現(xiàn)。鍵盤是由若干個按鍵組成的開關(guān)矩陣,它是最簡單的單片機輸入設(shè)備,通過鍵盤可輸入數(shù)據(jù)和命令,實現(xiàn)簡單的人機對話。鍵盤根據(jù)其結(jié)構(gòu)不同可分為編碼式鍵盤和非編碼式鍵盤兩種。非編碼式鍵盤靠軟件識別,節(jié)省硬件,通常采用這種鍵盤。根據(jù)鍵盤與單片機接法不同,非編碼鍵盤又分為獨立式和矩陣式兩種。當系統(tǒng)操作較簡單所

16、需按鍵較少時,可采用獨立式非編碼鍵盤,而當系統(tǒng)操作較復雜,需要按鍵較多時,可采用矩陣式非編碼鍵盤。如果采用獨立按鍵的方式,會占用大量的I/O 口資源,故我們采用矩陣式鍵盤輸入。采用四條I/O 線作為行線,六條I/O 線作為列線組成鍵盤。在行線和列線的每個交叉點上設(shè)置一個按鍵,這樣鍵盤上按鍵的個數(shù)就為4×6個。這種行列式鍵盤結(jié)構(gòu)能有效地提高單片機系統(tǒng)中I/O 口的利用率,如圖2—1所示:</p><p>

17、  圖2-1 矩陣式鍵盤</p><p>  2.2.1鍵盤的原理</p><p>  如圖2—2所示,采用列掃描法來識別按鍵。每個按鍵都有它的行值和列值,行值和列值的組合就是識別這個按鍵的編碼。矩陣的行線和列線分別通過兩并行接口和CPU通信。鍵盤的一端(列線)通過電阻接VCC,而接地是通過程序輸出數(shù)字“0”實現(xiàn)的。鍵盤處理程序的任務是:確定有無鍵按下,判斷哪一個鍵按下,鍵的功能是什么?還

18、要消除按鍵在閉合或斷開時的抖動。兩個并行口中,一個輸出掃描碼,使按鍵逐行動態(tài)接地;另一個并行口輸入按鍵狀態(tài),由行掃描值和回饋信號共同形成鍵編碼而識別按鍵,通過軟件查表,查出該鍵的功能。</p><p>  當無按鍵閉合時,P10~P13 與P14~P17 之間開路;當有鍵閉合時,與閉合鍵相連的兩條I/O 口線之間短路。判斷有無按鍵按下的方法是:第一步,置列線P14~P17 為輸入狀態(tài),從行線P10~P13 輸出低

19、電平,讀入列線數(shù)據(jù),若某一列線為低電平,則該列線上有鍵閉合。第二步,行線輪流輸出低電平,從列線P14~P17 讀入數(shù)據(jù),若有某一列為低電平,則對應行線上有鍵按下。綜合一二兩步的結(jié)果,可確定按鍵編號。但是鍵閉合一次只能進行一次鍵功能操作,因此須等到按鍵釋放后,再進行鍵功能操作,否則按一次鍵,有可能會連續(xù)多次進行同樣的鍵操作。</p><p><b>  圖2—2 鍵盤結(jié)構(gòu)</b></p&

20、gt;<p><b>  2.3 顯示模塊</b></p><p>  發(fā)光二極管LED 是單片機應用系統(tǒng)中的一宗簡單而常用的輸出設(shè)備,其在系統(tǒng)中的主要作用是顯示單片機的輸出數(shù)據(jù)、狀態(tài)等。因而作為典型的外圍器件,LED 顯示單元是反映系統(tǒng)輸出和操作輸入的有效器件。LED 具備數(shù)字接口可以方便的和大年紀系統(tǒng)連接;它的優(yōu)點是工作電壓低,響應速度快,價格低,壽命長等,因而在單片機應用

21、系統(tǒng)中獲得了廣泛的應用,所以在此設(shè)計中我首先選用了LED作為顯示器件。</p><p>  2.3.1 LED的顯示原理</p><p>  LED顯示器的結(jié)構(gòu)及其段名如圖2—3所示,連同小數(shù)點在內(nèi),共有8個LED燈,點亮合適的字段,即能顯示0—9的數(shù)字和某些字符、符號。這種顯示器有兩種形式:一種是發(fā)光二極管的陰極連在一起的共陰極顯示器,另一種是陽極連在一起的共陽極顯示器。共陽數(shù)碼管是指將

22、所有發(fā)光二極管的陽極接到一起形成公共陽極(COM)的數(shù)碼管。共陽數(shù)碼管在應用時應將公共極COM接到+5V,當某一字段發(fā)光二極管的陰極為低電平時,相應字段就點亮。當某一字段的陰極為高電平時,相應字段就不亮。。共陰數(shù)碼管是指將所有發(fā)光二極管的陰極接到一起形成公共陰極(COM)的數(shù)碼管。共陰數(shù)碼管在應用時應將公共極COM接到地線GND上,當某一字段發(fā)光二極管的陽極為高電平時,相應字段就點亮。當某一字段的陽極為低電平時,相應字段就不亮。<

23、/p><p>  圖2—3 LED段碼</p><p>  為了顯示數(shù)字或符號,要為LED顯示器提供代碼,即字形代碼。七段發(fā)光二極管,再加上一個小數(shù)點位,共計8段,因此提供的字形代碼的長度正好是一個字節(jié)。簡易計算器用到的數(shù)字0~9的共陰極字形代碼如下表2—1所示:</p><p>  表2-1 0—9七段數(shù)碼管共陰極字形代碼</p><p> 

24、 2.3.2 動態(tài)顯示的工作原理</p><p>  點亮顯示器的方法有靜態(tài)和動態(tài)兩種,這里顯示位數(shù)較多,采用動態(tài)顯示較合適,如圖2—4所示,所謂動態(tài)顯示,就是用掃描的方法一位一位輪流點亮顯示器的各位,該方法只需一個8位段輸出口和一個8位掃描輸出口,后者的作用是依次接通各位LED。對于顯示器的每一位來說,每隔一段時間點亮一次,利用人眼的視覺暫留效應可以看到整個動態(tài)顯示,但必須保證掃描速度足夠快,字符才不閃爍。 &

25、lt;/p><p>  圖2—4 數(shù)碼管的動態(tài)顯示</p><p>  2.4 音頻控制模塊</p><p>  如圖2—5所示為音頻放大濾波電路,端口輸入的方波經(jīng)放大濾波后,驅(qū)動揚聲器發(fā)聲。聲音的頻率由端口輸入時延時控制,不同頻率的脈沖控制喇叭發(fā)出不同的音調(diào)。</p><p>  圖2—5 音頻放大濾波電路</p><p&g

26、t;<b>  第3章 軟件設(shè)計</b></p><p>  3.1 基本功能設(shè)計</p><p><b>  1、實驗現(xiàn)象:</b></p><p>  可以實現(xià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>  運算主程序框圖如下:</p><p><b>  運算主程序流程

28、圖</b></p><p>  3、基本功能實現(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) // 延時子程序</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 // 宏定義,各運算對應相應鍵的代碼</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) // 計算結(jié)果逐位送入顯示緩沖區(qū)中</p><p><b>  {</b></p><p>  unsigned char i;</p><p>  if

45、(Result >= 0) { // 數(shù)值大于0</p><p><b>  // 不顯示符號位</b></p><p>  LEDBuf[0] = 0;</p><p><b>  } else {</b></p><p>  // 在符號位顯示 ‘-’</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ù)值對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分別存放第一個運算數(shù),第二個運算數(shù)和結(jié)果</p><p>  unsigned char OP;</p><p>  unsigned char Key; // 定義字符型變量OP,Key分別存放上一運算符、當前輸入鍵</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ù)上一鍵進行相應的運算,計算最后結(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; // 等待下一個數(shù)值輸入.</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p&g

60、t;  3.2 擴展功能設(shè)計</p><p>  1、實驗現(xiàn)象:除了可以進行加減乘除的基本運算外,還可進行求方、取余、排列、比較、組合、平均數(shù)、開方、平方運算;當輸入、輸出超過顯示范圍時,蜂鳴器會發(fā)聲報警,起到提示作用。</p><p><b>  2、程序流程圖:</b></p><p><b>  擴展后程序流程圖</b&g

61、t;</p><p><b>  3、擴展后的程序:</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) // 延時子程序</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 // 宏定義,各運算對應相應鍵的代碼</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) // 計算結(jié)果逐位送入顯示緩沖區(qū)中</p><p><b>  {</b></p><p>  unsigned char i;</p><p>  if (Result >= 0) { // 數(shù)值大于0</p><p><b>  // 不顯示符號位</b><

81、/p><p>  LEDBuf[0] = 0;</p><p><b>  } else {</b></p><p>  // 在符號位顯示 ‘-’</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ù)值對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分別存放第一個運算數(shù),第二個運算數(shù)和結(jié)果</p><p>  unsigned int ttttt,x;</p&

88、gt;<p>  unsigned char OP;</p><p>  unsigned char Key; // 定義字符型變量OP,Key分別存放上一運算符、當前輸入鍵</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 , 記時器</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 個脈沖</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 個脈沖</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 個脈沖</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ù)上一鍵進行相應的運算,計算最后結(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 個脈沖</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 個脈

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 個脈沖</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 個脈沖</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; // 等待下一個數(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章 學習心得<

123、;/b></p><p>  本次單片機課程設(shè)計已接近尾聲了,在這一周的時間里,我們團隊基本完成了我們的課題,即利用單片機設(shè)計一個簡單的計算器,取得了較為理想的實驗結(jié)果。在這期間,雖然遇到了一些困難,但通過老師和學長的指導和與同學的交流,以及查閱相關(guān)資料,從剛開始的迷茫到慢慢地有了清晰的思路并動手設(shè)計、操作,從而順利地完成了這次課程設(shè)計。</p><p>  通過這次課程設(shè)計,我不僅

124、加深了對單片機基本知識的理解和掌握,還初步學習了關(guān)于軟件編程的一些基本知識和偉福實驗箱的使用方法等,強化了自己原有的知識體系,擴展了思維,還提高了動手實踐和獨立思考的能力,培養(yǎng)了創(chuàng)新精神。在這次課程設(shè)計的設(shè)計過程中,我意識到自己掌握的知識還不足,某些方面的能力還是不夠。這也讓我再次認識到知識的重要性,活到老,學到老,只有不斷的充實自己、完善自己的知識理論體系,才能夠更好的勝任自己以后的工作。這次課程設(shè)計為我們以后的深入學習和發(fā)展打下了良

125、好的基礎(chǔ),我將從中吸取經(jīng)驗教訓,找到自己的不足,從而進一步提高自己,做出更好的設(shè)計。</p><p>  作為一名工科學生,這樣的課程設(shè)計是非常有意義的。希望學校以后能更多的安排這樣的課程設(shè)計,鍛煉我們的創(chuàng)新實踐能力。</p><p><b>  參考資料</b></p><p>  1)《單片機原理及應用技術(shù)》 張淑清編 國防工業(yè)出版社<

溫馨提示

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

評論

0/150

提交評論