2023年全國(guó)碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩32頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論