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

下載本文檔

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

文檔簡介

1、<p><b>  1引言</b></p><p>  當今時代,是一個新技術(shù)層出不窮的時代。在電子領(lǐng)域,尤其是自動化智能控制領(lǐng)域,傳統(tǒng)的分立元件或數(shù)字邏輯電路構(gòu)成的控制系統(tǒng)正以前所未見的速度被單片機智能控制系統(tǒng)所取代。單片機具有體積小、功能強、成本低、應(yīng)用面廣等優(yōu)點,可以說,智能控制與自動控制的核心就是單片機。目前,一個學(xué)習(xí)與應(yīng)用單片機的高潮正在工廠、學(xué)校及企事業(yè)單位大規(guī)模地興起

2、。過去習(xí)慣于傳統(tǒng)電子領(lǐng)域的工程師、技術(shù)員正面臨著全新的挑戰(zhàn),如不能在較短時間內(nèi)學(xué)會單片機,勢必會被時代所遺棄,只有勇敢地面對現(xiàn)實,挑戰(zhàn)自我,加強學(xué)習(xí),爭取在較短的時間內(nèi)將單片機技術(shù)融會貫通,才能跟上時代的步伐。 </p><p>  它所給人帶來的方便也是不可否定的,它在一塊芯片內(nèi)集成了計算機的各種功能部件,構(gòu)成一種單片式的微型計算機。20世紀80年代以來,國際上單片機的發(fā)展迅速,其產(chǎn)品之多令人目不暇接,單片機應(yīng)

3、用不斷深入,新技術(shù)層出不窮。20世紀末,電子技術(shù)獲得了飛速的發(fā)展,在其推動下,現(xiàn)代電子產(chǎn)品幾乎滲透了社會的各個領(lǐng)域,有力地推動了社會生產(chǎn)力的發(fā)展和社會信息化程度的提高,同時也使現(xiàn)代電子產(chǎn)品性能進一步提高,產(chǎn)品更新?lián)Q代的節(jié)奏也越來越快。</p><p>  本設(shè)計是由單片機實現(xiàn)的模擬計算器,它不僅能實現(xiàn)數(shù)據(jù)的加減乘除運算,而且還能使數(shù)據(jù)及其計算結(jié)果在數(shù)碼管上顯示出來,能夠?qū)崿F(xiàn)0-256的數(shù)字四則運算。本設(shè)計是用單片

4、機AT89C51來控制,采用共陽極數(shù)碼顯示,軟件部分是由C語言來編寫的。設(shè)計任務(wù)</p><p>  利用鍵盤和數(shù)碼管設(shè)計一個簡單的數(shù)學(xué)計算器,可以完成簡單的如加,減,乘,除的四則運算,并將運算結(jié)果在數(shù)碼管上顯示出來。</p><p><b>  2.方案論證與設(shè)計</b></p><p>  根據(jù)功能和指標要求,本系統(tǒng)選用MCS 51 單片機

5、為主控機。通過擴展必要的外圍接口</p><p>  電路,實現(xiàn)對計算器的設(shè)計。具體設(shè)計考慮如下:</p><p> ?、儆捎谝O(shè)計的是簡單的計算器,可以進行四則運算,對數(shù)字的大小范圍要求不高,故</p><p>  我們采用可以進行四位數(shù)字的運算,選用8 個LED 數(shù)碼管顯示數(shù)據(jù)和結(jié)果。</p><p>  ②另外鍵盤包括數(shù)字鍵(0~9)、

6、符號鍵(+、-、×、÷)、清除鍵和等號鍵,故只需要16 個按鍵即可。系統(tǒng)模塊圖:</p><p><b>  2.1 輸入模塊:</b></p><p>  鍵盤掃描計算器輸入數(shù)字和其他功能按鍵要用到很多按鍵,如果采用獨立按鍵的方式,在這種情況下,編程會很簡單,但是會占用大量的I/O 口資源,因此在很多情況下都不采用這種方式。為此,我們引入了矩陣鍵

7、盤的應(yīng)用,采用四條I/O 線作為行線,四條I/O 線作為列線組成鍵盤。在行線和列線的每個交叉點上設(shè)置一個按鍵。這樣鍵盤上按鍵的個數(shù)就為4×4個。這種行列式鍵盤結(jié)構(gòu)能有效地提高單片機系統(tǒng)中I/O 口的利用率。矩陣鍵盤的工作原理:計算器的鍵盤布局如圖2 所示:一般有16 個鍵組成,在單片機中正好可以用一個P 口實現(xiàn)16 個按鍵功能,這種形式在單片機系統(tǒng)中也最常用。</p><p>  由圖 3 矩陣鍵盤內(nèi)部

8、電路圖可以知道,當無按鍵閉合時,P10~P13 與P14~P17 之間開路。</p><p>  當有鍵閉合時,與閉合鍵相連的兩條I/O 口線之間短路。判斷有無按鍵按下的方法是:第一</p><p>  步,置列線P14~P17 為輸入狀態(tài),從行線P10~P13 輸出低電平,讀入列線數(shù)據(jù),若某一列</p><p>  線為低電平,則該列線上有鍵閉合。第二步,行線輪流

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

10、運算模塊:單片機控制</p><p>  AT89C51 單片機是在一塊芯片中集成了CPU、RAM、ROM、定時器/計數(shù)器和多功能I/O等一臺計算機所需要的基本功能部件。如果按功能劃分,它由如下功能部件組成,即微處理器(CPU)、數(shù)據(jù)存儲器(RAM)、程序存儲器(ROM/EPROM)、并行I/O 口、串行口、定時器/計數(shù)器、中斷系統(tǒng)及特殊功能寄存器(SFR)。[3][5]單片機是靠程序運行的,并且可以修改。通過不

11、同的程序?qū)崿F(xiàn)不同的功能,尤其是特殊的獨特的一些功能,通過使用單片機編寫的程序可以實現(xiàn)高智能,高效率,以及高可靠性!因此我們采用單片機作為計算器的主要功能部件,可以進行很快地實現(xiàn)運算功能。</p><p><b>  2.3 顯示模塊:</b></p><p>  LED 顯示發(fā)光二極管LED 是單片機應(yīng)用系統(tǒng)中的一宗簡單而常用的輸出設(shè)備,其在系統(tǒng)中的主要作用是顯示單片

12、機的輸出數(shù)據(jù)、狀態(tài)等。因而作為典型的外圍器件,LED 顯示單元是反映系統(tǒng)輸出和操作輸入的有效器件。LED 具備數(shù)字接口可以方便的和大年紀系統(tǒng)連接;它的優(yōu)點是價格低,壽命長,對電壓電流的要求低及容易實現(xiàn)多路等,因而在單片機應(yīng)用系統(tǒng)中獲得了廣泛的應(yīng)用。[2][4]通常的數(shù)碼顯示器是由7 段條形的LED 組成(如圖4 所示),點亮適當?shù)淖侄?,就可顯示出不同的數(shù)字。我們采用8 段數(shù)碼管,其中位于顯示器右下角的LED 作小數(shù)點用。LED 顯示器有

13、兩種不同的形式:共陰極和共陽極。本次設(shè)計采用共陰極接法(如圖5所示)。</p><p><b>  3、硬件原理 </b></p><p><b>  3.1 硬件連接</b></p><p>  圖3-1所示是簡易計算器電路原理圖。P3口用于鍵盤輸入,接4X4鍵值與鍵盤對應(yīng)表如圖表所示,P0口和P2口用于顯示,P2口用于

14、顯示數(shù)位值高位,P0用于顯示數(shù)位值的低位。</p><p>  鍵值 0 1 2 3 4 5 6 7 8 9 + - x / = ON/C</p><p>  功能 0 1 2 3 4 5 6 7 8 9 + - x / = 清零</p><p><b>  4、軟件設(shè)計</b>&

15、lt;/p><p>  在程序設(shè)計方法上,模塊化程序設(shè)計是單片機應(yīng)用中最常用的程序設(shè)計方法。設(shè)計的中心思想是把一個復(fù)雜應(yīng)用程序按整體功能劃分成若干相對獨立的程序模塊,各模塊可以單獨設(shè)計、編程和調(diào)試,然后組合起來。這種方法便于設(shè)計和調(diào)試,容易實現(xiàn)多個程序共存,但各個模塊之間的連接有一定的難度。根據(jù)需要我們可以采用自上而下的程序設(shè)計方法,此方法先從主程序開始設(shè)計,然后再編制各從屬程序和子程序,層層細化逐步求精,最終完成一

16、個復(fù)雜程序的設(shè)計。這種方法比較符合人們的日常思維,缺點是一級的程序錯誤會對整個程序產(chǎn)生影響。功能流程圖如下:</p><p><b>  程序流程圖</b></p><p><b>  程序:</b></p><p>  #include"at89x52.h" //頭文件</p><

17、p>  //---------------------預(yù)定義模塊---------------------------//</p><p>  //*********************預(yù)定義數(shù)組***************************//</p><p>  //字形碼 0 1 2 3 4 5 6 7</p><p>  const uns

18、igned char KEY_NUMBER[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07</p><p>  // 8 9 + - * / = CE</p><p>  ,0x7f,0x6f,0xF0,0xC0,0xF6,0xD2,0x89,0xB9};</p><p>  //掃描鍵碼 0 1 2 3 4 5 6 7<

19、/p><p>  const unsigned char KEY_VALUE[]={0x7e,0xbe,0xde,0xee,0x7d,0xbd,0xdd,0xed</p><p>  // 8 9 A B C D E F</p><p>  ,0x7b,0xbb,0xdb,0xeb,0x77,0xb7,0xd7,0xe7};</p><p>  

20、//數(shù)碼管各顯示位: 0位 1位 2位 3位 4位</p><p>  const unsigned char DISPLAY_BIT[5]={0xFE,0xFD,0xFB,0xF7,0xEF};</p><p><b>  //十進制轉(zhuǎn)換權(quán)值</b></p><p>  const int bcd_right[5]={1,10,100,100

21、0,10000};</p><p>  unsigned char buffer_number[5]; //輸入數(shù)據(jù)緩沖區(qū)</p><p>  unsigned char buffer_dis[5]; //計算結(jié)果顯示緩沖區(qū)</p><p>  unsigned long int buffer_opera[5]; //輸入數(shù)據(jù)十進制轉(zhuǎn)換緩沖區(qū)</p>

22、<p>  //*******************預(yù)定義變量***************************//</p><p>  unsigned char const NULL=0xFF;</p><p>  unsigned char opera=0x00; //輸入數(shù)據(jù)轉(zhuǎn)換指針</p><p>  unsigned char count

23、=0x00; //鍵盤輸入指針</p><p>  unsigned char enter_number=0x01; //輸入數(shù)據(jù)顯示和計算結(jié)果顯示開關(guān)</p><p>  unsigned char ptr_i=0x00; //運算結(jié)果轉(zhuǎn)換指針</p><p>  unsigned char buffer_control; //控制鍵緩沖區(qū)</p>

24、<p>  unsigned char key_bcd; //按鍵的十進制值</p><p>  unsigned char scan_key; //當前掃描到的鍵值</p><p>  unsigned char temp_c; //臨時變量</p><p>  unsigned char ptr_c; //十進制轉(zhuǎn)化指針</p><

25、p>  unsigned char account; //四則運算標志</p><p>  unsigned long int result=0x00; //當前計算結(jié)果</p><p>  unsigned long int rlt; //前一個輸入的數(shù)的十進制值</p><p>  unsigned long int sec_rlt; //后一個輸入的數(shù)的

26、十進制值</p><p>  unsigned long int c_n; //當前轉(zhuǎn)換的運算結(jié)果</p><p>  /*******************************************************</p><p>  名稱: 初始化運行環(huán)境</p><p>  功能: 初始化各寄存器與端口狀態(tài)</p&

27、gt;<p><b>  參數(shù): 無</b></p><p><b>  返回值:無</b></p><p>  *******************************************************/</p><p>  void DeviceInit(void)</p>

28、<p><b>  {</b></p><p>  TL0=0xBF; //置定時器中斷時間為20ms</p><p><b>  TH0=0x63;</b></p><p>  TMOD=0x01; //設(shè)定定時器/計數(shù)器0工作方式為1</p><p>  IE=0x82; //允許

29、全局中斷,允許定時器/計數(shù)器0溢出中斷</p><p>  TR0=0x01; //啟動定時器/計數(shù)器0</p><p><b>  }</b></p><p>  /*******************************************************</p><p><b>  名稱

30、: 延時模塊</b></p><p><b>  功能: 延時</b></p><p>  參數(shù): unsigned char i</p><p><b>  返回值:無</b></p><p>  ********************************************

31、***********/</p><p>  void Delay(unsigned char i)</p><p><b>  {</b></p><p><b>  int j;</b></p><p>  while((i--)!=0)</p><p>  { for(

32、j=0;j<=0x6f;j++);}</p><p><b>  }</b></p><p>  /*******************************************************</p><p><b>  名稱: 清除模塊</b></p><p>  功能:

33、清除當前已經(jīng)輸入的數(shù)據(jù)</p><p>  通過輸入緩沖區(qū)中的數(shù)乘以它們各自對應(yīng)的權(quán)值再求和</p><p>  參數(shù): 參數(shù)為1時,清除輸入數(shù)據(jù)緩沖區(qū)</p><p>  參數(shù)為2時,清除十進制轉(zhuǎn)化緩沖區(qū)</p><p><b>  返回值:無</b></p><p>  ***********

34、********************************************/</p><p>  void Clear(unsigned char clr_pid)</p><p><b>  {</b></p><p>  temp_c=0x00;</p><p>  for(temp_c;temp_c&

35、lt;=4;temp_c++)</p><p><b>  {</b></p><p>  if(clr_pid==1) //參數(shù)為1時,輸入數(shù)據(jù)緩沖區(qū)全部置0</p><p><b>  {</b></p><p>  count=0x00; //按鍵次數(shù)置0</p><p&g

36、t;  buffer_number[temp_c]=0x00;</p><p><b>  }</b></p><p>  if(clr_pid==2) //參數(shù)為2時,輸入數(shù)據(jù)緩沖區(qū)全部置0</p><p><b>  {</b></p><p>  opera=0x00; //輸入數(shù)的個數(shù)置0&

37、lt;/p><p>  buffer_opera[temp_c]=0x00;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  /*******************

38、************************************</p><p>  名稱: 數(shù)據(jù)處理模塊</p><p>  功能: 將輸入的數(shù)據(jù)轉(zhuǎn)化為10進制數(shù)</p><p>  通過輸入緩沖區(qū)中的數(shù)乘以它們各自對應(yīng)的權(quán)值再求和</p><p><b>  參數(shù): 無</b></p><

39、p><b>  返回值:無</b></p><p>  *******************************************************/</p><p>  void BcdConvert(void)</p><p><b>  {</b></p><p>  

40、temp_c=0x00;</p><p>  ptr_c=opera-1;</p><p>  if(opera !=0)</p><p><b>  {</b></p><p>  while(temp_c<=ptr_c) //當前位乘以對應(yīng)的權(quán)值再加上前一次的計算值</p><p>  

41、{ //將輸入數(shù)據(jù)緩沖區(qū)中的數(shù)轉(zhuǎn)化為對應(yīng)的十進制數(shù)</p><p>  buffer_opera[ptr_c-temp_c]*=bcd_right[temp_c];</p><p>  result+=buffer_opera[ptr_c-temp_c];</p><p><b>  temp_c++;</b></p><p

42、><b>  }</b></p><p>  Clear(2); //轉(zhuǎn)化完成,將十進制轉(zhuǎn)換緩沖區(qū)清0</p><p><b>  }</b></p><p><b>  }</b></p><p>  /*********************************

43、**********************</p><p>  名稱: 計算結(jié)果處理模塊</p><p>  功能: 按位分解計算結(jié)果,留待顯示</p><p>  將要轉(zhuǎn)化的數(shù)除以10后取余數(shù),就可以將其按位分解</p><p><b>  轉(zhuǎn)化的結(jié)果是反向的</b></p><p><

44、b>  參數(shù): 無</b></p><p><b>  返回值:無</b></p><p>  *******************************************************/</p><p>  void Convert(void)</p><p><b> 

45、 {</b></p><p>  c_n=result;</p><p>  //將計算結(jié)果反向分解,用于顯示</p><p><b>  do</b></p><p>  { //除10取余</p><p>  buffer_dis[ptr_i]=c_n%10;</p>

46、;<p><b>  c_n/=10;</b></p><p><b>  ptr_i++;</b></p><p><b>  }</b></p><p>  while(c_n!=0x00);</p><p><b>  }</b><

47、;/p><p>  /*******************************************************</p><p>  名稱: 四則運算模塊</p><p>  功能: 對先后輸入的兩個數(shù)按規(guī)則進行四則運算</p><p><b>  參數(shù): 無</b></p><p&g

48、t;<b>  返回值:無</b></p><p>  *******************************************************/</p><p>  void Calculate(void)</p><p><b>  {</b></p><p>  BcdC

49、onvert(); //將要運算的數(shù)轉(zhuǎn)化成10進制數(shù)</p><p>  enter_number=0x00; //設(shè)置運算結(jié)果顯示標志</p><p>  switch(account)</p><p><b>  {</b></p><p>  case 0x00: //加法,將前后輸入的兩個數(shù)相加</p>

50、;<p>  result+=rlt;</p><p><b>  break;</b></p><p>  case 0x01: //減法</p><p>  if(rlt>=result)</p><p>  result=rlt-result;</p><p>  els

51、e //如果被減數(shù)比減數(shù)小</p><p><b>  {</b></p><p>  buffer_control=0xC0;</p><p>  result=~(rlt-result-0x01);</p><p><b>  }</b></p><p><b>

52、;  break;</b></p><p>  case 0x02: //乘法</p><p>  result*=rlt;</p><p><b>  break;</b></p><p>  case 0x03: //除法</p><p>  result=rlt/result;&

53、lt;/p><p><b>  break;</b></p><p><b>  }</b></p><p>  Convert(); //調(diào)用計算結(jié)果處理函數(shù)</p><p>  Clear(2); //清除計算結(jié)果</p><p><b>  }</b>

54、</p><p>  /*******************************************************</p><p>  名稱: 控制鍵處理模塊</p><p>  功能: 對各個控制鍵進行對應(yīng)的操作</p><p><b>  參數(shù): 無</b></p><p>

55、;<b>  返回值:無</b></p><p>  *******************************************************/</p><p>  void Control(void)</p><p><b>  {</b></p><p>  Clear(1

56、); //清除顯示緩沖區(qū)</p><p>  //*********************等號處理*********************//</p><p>  if(buffer_control==0x89)</p><p>  Calculate(); //調(diào)用計算函數(shù)</p><p>  //*******************

57、**清除鍵處理*******************//</p><p>  else if(buffer_control==0xB9)</p><p><b>  {</b></p><p>  Clear(1); //清除已輸入的數(shù)</p><p>  Clear(2); //清除當前也轉(zhuǎn)化的值</p>

58、<p>  ptr_i=0x00; //清除顯示指針</p><p>  result=rlt=0x00; //清除元算結(jié)果</p><p><b>  }</b></p><p>  //********************運算符號處理******************//</p><p><b

59、>  else</b></p><p><b>  {</b></p><p>  BcdConvert(); //將先前輸入的數(shù)轉(zhuǎn)化為10進制數(shù)</p><p>  rlt=result; //保存轉(zhuǎn)化的結(jié)果</p><p>  result=0x00; //清除上一次轉(zhuǎn)化的結(jié)果,準備下一次轉(zhuǎn)化<

60、;/p><p>  switch(buffer_control)</p><p><b>  {</b></p><p>  case 0xF0: //加法</p><p>  account=0x00;</p><p><b>  break;</b></p>&

61、lt;p>  case 0xC0: //減法</p><p>  account=0x01;</p><p><b>  break;</b></p><p>  case 0xF6: //乘法</p><p>  account=0x02; //乘法運算標志</p><p><b&g

62、t;  break;</b></p><p>  case 0xD2: //除法</p><p>  account=0x03; //除法運算標志</p><p><b>  break;</b></p><p><b>  default:</b></p><p&g

63、t;<b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  /**************************************

64、*****************</p><p>  名稱: 按鍵判斷模塊</p><p>  功能: 判斷是否有鍵被按下</p><p><b>  參數(shù): 無</b></p><p>  返回值:有鍵按下則返回1</p><p><b>  沒有鍵按下則返回0</b>&

65、lt;/p><p>  *******************************************************/</p><p>  unsigned char KeyDown(void)</p><p><b>  {</b></p><p>  temp_c=0x00;</p>&l

66、t;p><b>  P2=0xf0;</b></p><p>  temp_c=P2;</p><p>  if(temp_c!=0xf0)</p><p>  return 1; //有鍵按下返回1</p><p><b>  else</b></p><p>  r

67、eturn 0; //沒有鍵按下返回0</p><p><b>  }</b></p><p>  /*******************************************************</p><p>  名稱: 按鍵處理函模塊</p><p>  功能: 獲取當前按鍵</p>

68、<p><b>  參數(shù): 無</b></p><p>  返回值:返回當前按鍵的字形碼</p><p>  如果沒有鍵按下,返回NULL</p><p>  *******************************************************/</p><p>  unsigned

69、char KeyPress (void)</p><p><b>  {</b></p><p>  if(KeyDown()==1) //判斷是否有鍵按下</p><p><b>  {</b></p><p>  Delay(30); //延時消抖</p><p>  /

70、/**************掃描當前被按下的鍵值***********************//</p><p>  P2=0xF0; //掃描低4位</p><p>  scan_key=P2; //記錄掃描結(jié)果</p><p>  P2=0x0F; //掃描高四位</p><p>  temp_c=P2; //記錄掃描結(jié)果</p

71、><p>  scan_key^=temp_c; //兩結(jié)果相異或得鍵值</p><p>  //**************當有鍵被按下時關(guān)閉顯示*********************//</p><p><b>  do{</b></p><p>  P1=0xFF; //如果有鍵按下,關(guān)閉顯示</p>

72、<p>  }while(KeyDown()==1); //等待按鍵釋放,如果有鍵按下,則不顯示任何數(shù)</p><p>  Delay(30); //延時消抖</p><p>  //**********當有鍵按下后開始掃描所按下的鍵***************//</p><p>  for(key_bcd=0;key_bcd<=15;key_

73、bcd++) //查找鍵值對應(yīng)的字符碼</p><p><b>  {</b></p><p>  if(KEY_VALUE[key_bcd]==scan_key) //如果找到對應(yīng)的鍵值</p><p><b>  {</b></p><p>  ptr_i=0x00; //清除運算結(jié)果顯示指針,

74、開始顯示輸入的數(shù)據(jù)</p><p>  //*****************判斷是數(shù)字鍵還是控制鍵****************//</p><p>  if(key_bcd<=0x09) //小于10的鍵為數(shù)字鍵</p><p><b>  {</b></p><p>  enter_number=0x01;

75、 //設(shè)置輸入數(shù)據(jù)顯示標志</p><p>  if(count<=0x04) //如果緩沖區(qū)未滿</p><p><b>  {</b></p><p>  buffer_number[count]=KEY_NUMBER[key_bcd]; //當前鍵送緩沖區(qū)</p><p>  buffer_opera[ope

76、ra]=key_bcd; //保存當前按鍵的十進制值</p><p>  opera++; //指針自加</p><p><b>  count++;</b></p><p><b>  }</b></p><p>  else //如果緩沖區(qū)溢出</p><p><b

77、>  {</b></p><p>  count=0x00;</p><p>  Clear(1); //清楚緩沖區(qū)</p><p>  buffer_number[0]=KEY_NUMBER[key_bcd]; //緩沖區(qū)初始位存入當前鍵的字符碼</p><p>  buffer_opera[opera]=key_bcd;

78、 //保存當前按鍵的十進制值</p><p><b>  opera++;</b></p><p><b>  count++;</b></p><p><b>  }</b></p><p>  return KEY_NUMBER[key_bcd]; //返回對應(yīng)的數(shù)字字符值

79、</p><p><b>  }</b></p><p>  else //大于9的鍵為控制鍵</p><p><b>  {</b></p><p>  buffer_control=KEY_NUMBER[key_bcd]; //控制鍵送控制緩沖區(qū)</p><p>  Co

80、ntrol(); //調(diào)用控制鍵處理函數(shù)</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b&g

81、t;  else</b></p><p>  return NULL; //如果沒有鍵按下,返回NULL</p><p><b>  }</b></p><p>  /*******************************************************</p><p>  名稱: 數(shù)

82、碼管顯示模塊</p><p>  功能: 在數(shù)碼管上顯示輸入的數(shù)據(jù)和計算后的結(jié)果</p><p><b>  參數(shù): 無</b></p><p><b>  返回值:無</b></p><p>  ***************************************************

83、****/</p><p>  void Display(void)</p><p><b>  {</b></p><p>  unsigned char m=0; //顯示字符指針</p><p>  unsigned char n=0; //顯示位指針;</p><p>  while(Ke

84、yPress()==NULL) //當有鍵被按下時開始顯示</p><p><b>  {</b></p><p>  //****************顯示當前輸入的數(shù)據(jù)*******************//</p><p>  if(enter_number==0x01) //顯示輸入中的數(shù)據(jù)</p><p>

85、<b>  {</b></p><p>  if(m!=count) //字符指針在界線內(nèi)</p><p><b>  {</b></p><p>  if(n<=count-1) //顯示位未越界</p><p><b>  {</b></p><p

86、>  P1=DISPLAY_BIT[n]; //設(shè)置顯示位</p><p>  P0=buffer_number[m]; //在數(shù)碼管上顯示字符</p><p>  Delay(0x02); //延時消抖</p><p><b>  n++;</b></p><p><b>  m++;</b>

87、;</p><p><b>  }</b></p><p>  else //顯示位越界</p><p><b>  n=0;</b></p><p><b>  }</b></p><p>  else //字符指針越界</p><

88、p><b>  m=0;</b></p><p><b>  }</b></p><p>  //****************顯示運算后的結(jié)果*********************//</p><p>  else //顯示運算的結(jié)果</p><p><b>  {</

89、b></p><p>  if(m!=ptr_i) //字符指針在界線內(nèi)</p><p><b>  {</b></p><p>  if(n<=ptr_i-1) //顯示位未越界</p><p><b>  {</b></p><p>  P1=DISPLAY_

90、BIT[ptr_i-n-1]; //設(shè)置顯示位</p><p>  P0=KEY_NUMBER[buffer_dis[m]]; //在數(shù)碼管上顯示字符</p><p>  Delay(0x02); //延時消抖</p><p><b>  n++;</b></p><p><b>  m++;</b>

91、;</p><p><b>  }</b></p><p>  else //顯示位越界</p><p><b>  n=0;</b></p><p><b>  }</b></p><p>  else //字符指針越界</p><

92、p><b>  m=0;</b></p><p><b>  Clear(1);</b></p><p><b>  }</b></p><p>  //*******************顯示運算操作符***********************//</p><p>

93、;  P1=0xDF; //打開運算符號顯示位</p><p>  P0=buffer_control; //顯示當前運算符號</p><p>  Delay(0x02);</p><p><b>  }</b></p><p><b>  }</b></p><p>  /

94、*******************************************************</p><p><b>  名稱: 主函數(shù)</b></p><p>  功能: 應(yīng)用程序入口</p><p><b>  參數(shù): 無</b></p><p><b>  返回值:

95、無</b></p><p>  *******************************************************/</p><p>  void main()</p><p><b>  {</b></p><p>  DeviceInit(); //調(diào)用系統(tǒng)初始化函數(shù)</

96、p><p><b>  while(1)</b></p><p><b>  ;</b></p><p><b>  }</b></p><p>  /*******************************************************</p>

97、<p>  名稱: 定時器中斷模塊</p><p>  功能: 調(diào)用鍵盤監(jiān)視模塊獲取鍵盤輸入</p><p>  調(diào)用顯示模塊來顯示輸入與輸出</p><p><b>  參數(shù): 無</b></p><p><b>  返回值:無</b></p><p>  *

98、******************************************************/</p><p>  void timer0_over(void) interrupt 1</p><p><b>  {</b></p><p>  TL0=0xBF; //中斷間隔為20ms</p><p>

99、<b>  TH0=0x63;</b></p><p>  KeyPress(); //調(diào)用鍵盤掃描程序</p><p>  Display(); //調(diào)用顯示函數(shù)</p><p><b>  }</b></p><p><b>  5. 總結(jié)</b></p>&

100、lt;p>  通過該計算器的設(shè)計我深入學(xué)習(xí)數(shù)碼管掃描和鍵盤控制,提高對了51系列單片機的實際應(yīng)用能力。同時也掌握應(yīng)用程序控制51系列單片機進行簡單的數(shù)學(xué)運算。提高了對51系列單片機的編程能力。這門課是最能理論聯(lián)系實際的課,我們的目的是做出東西,為了這我們需要學(xué)關(guān)于這方面的各種知識,從被動性的接受知識變成了主動性的尋找知識。這種模式才是學(xué)習(xí)的最好方式。在此制作過程中我們經(jīng)歷挫折,經(jīng)歷困惑,但有目標在前,我們不能也不想放棄,只有在克服

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論