單片機課程設計——簡單計算器的設計_第1頁
已閱讀1頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  《單片機與接口技術》</p><p><b>  課程設計報告</b></p><p><b>  目錄</b></p><p>  一﹑課程設計的目的和要求3</p><p><b>  1﹑設計目的3</b></p><p>

2、;  2﹑設計任務及要求3</p><p>  二﹑設計步驟及思路4</p><p><b>  1、設計的步驟4</b></p><p><b>  2﹑設計思路4</b></p><p>  三﹑硬件電路設計4</p><p><b>  1﹑總體設計

3、4</b></p><p>  2﹑單元電路的設計5</p><p><b>  3﹑總電路圖7</b></p><p><b>  四﹑軟件設計8</b></p><p><b>  五﹑調(diào)試說明11</b></p><p>  

4、1﹑未啟動仿真時,初始狀態(tài)11</p><p>  2﹑開啟仿真以后12</p><p>  3﹑計算過程演示12</p><p><b>  六﹑設計體會13</b></p><p><b>  七﹑參考文獻14</b></p><p><b>  八、

5、附錄14</b></p><p><b>  附錄一14</b></p><p><b>  附錄二14</b></p><p>  一﹑課程設計的目的和要求</p><p><b>  1﹑設計目的</b></p><p>  單片機

6、課程作為獨立的教學環(huán)節(jié),是自動化及相關專業(yè)集中實踐性環(huán)節(jié)系列之一,是學習完《單片機與接口技術》課程后,并在進行相關課程設計基礎上進行的一次綜合練習。</p><p>  單片機課程設計過程中,我們通過查閱資料,接口設計、程序設計、安裝調(diào)試等環(huán)節(jié),完成一個基于MCS-51系列單片機,涉及多種資源應用,并具有綜合應用功能的小應用課程設計,使我們不但能夠?qū)⒄n堂上學到的理論知識與實際應用結(jié)合起來,而且能夠?qū)﹄娮与娐珐p電子

7、元件等方面的知識進一步加深認識,同時在軟件編程﹑調(diào)試﹑相關儀器設備和相關軟件的使用技能等方面得到較全面的鍛煉和提高。</p><p>  課程設計以學生認知為主體,充分調(diào)動學生的積極性,重視學生自學能力的培養(yǎng),根據(jù)具體課題安排時間確定課題的設計、編程和調(diào)試內(nèi)容,分團隊開展課程設計活動,按時完成每部分工作。堅持獨立完成,實現(xiàn)課題規(guī)定的各項指標,并寫出設計報告。</p><p>  要求學生自

8、己查閱資料和充分利用所學知識,根據(jù)所要設計系統(tǒng)所要達到的功能,劃分軟硬件功能、選擇器件、編寫相關程序,用Proteus 在計算機上繪圖并用Keil進行程序編寫進行防真,再對整個系統(tǒng)做調(diào)試運行,有問題再進一步調(diào)試修改,直至達到設計的要求和取得滿意的效果,最后編寫系統(tǒng)說明書,其內(nèi)容包括系統(tǒng)的功能介紹,使用范圍,主要性能指標,使用方法,注意事項等。</p><p><b>  2﹑設計任務及要求</b&

9、gt;</p><p>  基于MCS—51系列單片機 AT89C51,設計一個簡單的電子計算器。</p><p>  1)通過4×4的矩陣鍵盤輸入數(shù)字及運算符;</p><p>  2)可以進行4位十進制數(shù)以內(nèi)的加法運算,如果計算結(jié)果超過4位十進制數(shù),則屏幕顯示E;</p><p>  3)可以進行加法以外的計算(乘、除、減);&

10、lt;/p><p><b>  4)其他功能。</b></p><p><b>  二﹑設計步驟及思路</b></p><p><b>  1、設計的步驟</b></p><p> ?。?)制定相應的設計方案;</p><p> ?。?)硬件的初步設計;&l

11、t;/p><p> ?。?)選擇設計所用元器件和參數(shù);</p><p> ?。?)在Proteus 7.5中設計和連接電路圖;</p><p> ?。?)軟件的初步設計;</p><p> ?。?)編寫程序?qū)崿F(xiàn)其功能;</p><p> ?。?)在keil_v4中進行調(diào)試運行;</p><p>  

12、(8)硬件和軟件聯(lián)合調(diào)試。</p><p><b>  2﹑設計思路</b></p><p>  根據(jù)功能和要求,本系統(tǒng)選用MCS-51系列單片機為主控機。通過擴展必要的外圍接口電路,實現(xiàn)對計算器的設計。具體設計如下:</p><p>  (1)由于要設計的是簡單的計算器,可以進行四則運算,為了得到較好的顯示效果,采用LCD 顯示數(shù)據(jù)和結(jié)果。&

13、lt;/p><p> ?。?)另外鍵盤包括數(shù)字鍵(0~9)、符號鍵(+、-、×、÷)、清除鍵和等號鍵,故只需要16個按鍵即可,設計中采用集成的計算鍵盤。</p><p> ?。?)執(zhí)行過程:開機顯示零,等待鍵入數(shù)值,當鍵入數(shù)字,通過LCD顯示出來,當鍵入+、-、*、/運算符,計算器在內(nèi)部執(zhí)行數(shù)值轉(zhuǎn)換和存儲,并等待再次鍵入數(shù)值,當再鍵入數(shù)值后將顯示鍵入的數(shù)值,按等號就會在LC

14、D上輸出運算結(jié)果。</p><p>  (4)錯誤提示:當除數(shù)為0﹑計算得到的結(jié)果小于0或大于計算器的表示范圍時,計算器會在LCD上顯示E。</p><p><b>  三﹑硬件電路設計</b></p><p><b>  1﹑總體設計</b></p><p>  本設計選用AT89C52單片機為主

15、控單元。顯示部分采用LCD液晶顯示,按鍵部分采用4*4鍵盤。</p><p><b>  2﹑單元電路的設計</b></p><p><b>  1)、時鐘電路</b></p><p>  時鐘是單片機的心臟,單片機各功能部件的運行都是以時鐘頻率為基準,有條不紊的一拍一拍地工作。因此,時鐘頻率直接影響單片機的速度,時鐘電路

16、的質(zhì)量也直接影響單片機系統(tǒng)的穩(wěn)定性。常用的時鐘電路有兩種方式:一種是內(nèi)部時鐘方式,另一種為外部時鐘方式。本處用的是內(nèi)部時鐘方式。電路如圖2:</p><p>  圖2 內(nèi)部時鐘電路</p><p><b>  2)、復位電路</b></p><p>  MCS-51單片機的復位是由外部的復位電路來實現(xiàn)的。</p><p&g

17、t;  上電復位:上電復位電路是—種簡單的復位電路,只要在RST復位引腳接一個電容到VCC,接一個電阻到地就可以了。上電復位是指在給系統(tǒng)上電時,復位電路通過電容加到RST復位引腳一個短暫的高電平信號,這個復位信號隨著VCC對電容的充電過程而回落,所以RST引腳復位的高電平維持時間取決于電容的充電時間。為了保證系統(tǒng)安全可靠的復位,RST引腳的高電平信號必須維持足夠長的時間。電路圖如圖3:</p><p><b

18、>  圖3 復位電路</b></p><p>  3)、LCD顯示模塊</p><p>  本設計采用LCD液晶顯示器來顯示輸出數(shù)據(jù)。通過D0-D7引腳向LCD寫指令字或?qū)憯?shù)據(jù)以使LCD實現(xiàn)不同的功能或顯示相應數(shù)據(jù)。</p><p>  LCD功能以及控制命令:</p><p><b>  表1</b>

19、</p><p>  圖4 LCD顯示圖</p><p><b>  4)、鍵盤接口電路</b></p><p><b>  計算器所需按鍵有:</b></p><p>  數(shù)字鍵:‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’,‘0’;</p><p&

20、gt;  功能鍵:‘+’,‘-’,‘*’,‘/’,‘=’,‘C(清零)’。 </p><p>  共計16個按鍵,采用4*4矩陣鍵盤,鍵盤的行和列之間都有公共端相連,四行和四列的8個公共端分別接P1.0~P1.7,這樣掃描P1口就可以完成對矩陣鍵盤的掃描,通過對16個按鍵進行編碼,從而得到鍵盤的口地址,對比P1口的掃描結(jié)果和各按鍵的地址,我們就可以得到是哪個鍵按下,從而完成鍵盤掃描的功能。</p>

21、<p>  圖5 矩陣鍵盤布局圖</p><p><b>  3﹑總電路圖</b></p><p><b>  圖6 總電路圖</b></p><p><b>  四﹑軟件設計</b></p><p>  現(xiàn)實生活中人們熟知的計算器,其功能主要如下:鍵盤輸入;數(shù)值

22、顯示;加﹑減﹑乘﹑除四則運算;對錯誤的控制及提示。</p><p>  針對上述功能,計算器軟件程序要完成以下模塊的設計:LCD顯示設計﹑鍵盤設計﹑算術運算程序設計。</p><p>  編程語言當中,匯編語言比較接近底層,編程效率高;C語言則比較靈活,在編寫算法中要方便一些,因此在本設計中我選用C語言??傮w設計流程圖如下圖。</p><p>  圖7 總程序流程

23、圖</p><p>  LCD顯示模塊﹑鍵盤模塊﹑計算模塊流程圖分別如圖8﹑圖9﹑圖10。</p><p>  圖8 LCD顯示流程圖</p><p>  圖9 鍵盤識別程序流程圖</p><p>  圖10 運算程序流程圖</p><p><b>  五﹑調(diào)試說明</b></p>

24、;<p><b>  仿真結(jié)果和分析:</b></p><p>  1﹑未啟動仿真時,初始狀態(tài);</p><p><b>  圖11</b></p><p><b>  2﹑開啟仿真以后</b></p><p><b>  圖12 </b>&

25、lt;/p><p><b>  3﹑計算過程演示</b></p><p>  1)、4位十進制以內(nèi)加法運算:1234+5678=6192;</p><p><b>  圖13</b></p><p>  5555+6666=12221,計算結(jié)果超過4位數(shù),LCD顯示E。</p><p

26、><b>  圖14</b></p><p>  2)、減法運算:789-456=333</p><p><b>  圖15</b></p><p>  減法運算結(jié)果小于0,456-789= -333,LCD顯示E</p><p><b>  圖16</b></p&

27、gt;<p>  3)、除法運算:56/8=7</p><p><b>  圖17</b></p><p>  除數(shù)為0,258/0,LCD顯示E</p><p><b>  圖18</b></p><p>  4)、乘法運算:25*69=1725</p><p&g

28、t;<b>  圖19</b></p><p>  運算結(jié)果超過4位數(shù):1000*100=100000,LCD顯示E</p><p><b>  圖20</b></p><p><b>  六﹑設計體會</b></p><p>  在課本上了解到單片機具有體積小﹑可靠性高﹑性價

29、比高等優(yōu)點,主要應用于工業(yè)檢測與控制﹑智能儀器儀表﹑家用電器和機電一體化產(chǎn)品等領域。雖然知道單片機具有這些優(yōu)點和應用范圍,卻不知道怎樣去設計和應用,通過這兩周的課程設計,加深了我對單片機小應用系統(tǒng)設計的認識,熟悉了單片機在控制系統(tǒng)中的運用。將所學的理論知識與實際應用結(jié)合起來,對自己如何使用已有知識及獲取相關資料方面的能力又有了提高。但本次課程設計體會最深的是單片機學的不夠扎實。</p><p>  根據(jù)老師的參考

30、電路設計完硬件電路后就感覺無從下手了,從圖書館和網(wǎng)上查閱了很多相關資料,但由于自己基礎知識不夠扎實,不能舉一反三,軟件設計部分還是感覺很困難;看著有同學運行出來自己就急了,找一些看著差不多的程序盲目去運行,結(jié)果當然是什么都沒有還浪費了一些時間,最后只有靜下心來認真看找的資料,相互對比看看與自己的有何不同,別人的顯示﹑鍵盤掃面是怎么設計的,才有所明白。在選用編程語言方面一開始還在匯編語言和C語言間徘徊,后來經(jīng)老師提示及建議選用了C語言,因

31、為C語言比較靈活,在編寫算法中要方便一些。程序要盡量做到由各個子程序組成,有些程序后面最好加上注釋這樣在程序出錯的檢測過程中可以更容易查找到,也更簡潔,更明白易懂。</p><p>  設計過程中最重要的是自己動手,雖然會遇到許多問題,但只有自己動手才能去發(fā)現(xiàn)問題﹑解決問題,這也是課程設計的一個目的。這次的單片機課程設計重點是理論與實際相結(jié)合。該設計從頭到尾都是自己動手,熟悉了整個設計過程,更充分的鍛煉了自己。&

32、lt;/p><p>  在此要感謝老師對我的指導及同學對我的幫助,在整個設計過程中我懂得了很多東西,相信這將會對我以后的學習工作生活有一定的影響。雖然這次設計還不是很完善,但在設計中所學到的東西是這次設計最大的收獲,在以后的學習中我會更加努力,爭取做的更好。</p><p><b>  七﹑參考文獻</b></p><p>  【1】吳亦鋒,陳德為

33、.單片機原理與接口技術[M].北京:電子工業(yè)出版社,2010.</p><p><b>  八、附錄</b></p><p><b>  附錄一</b></p><p>  圖21 系統(tǒng)硬件電路原理圖</p><p><b>  附錄二</b></p><p

34、><b>  程序清單:</b></p><p>  #include"reg51.h"</p><p>  #include"absacc.h"</p><p>  #include"intrins.h"</p><p>  #define com XB

35、YTE[0x0000]//LCD送命令</p><p>  #define dat XBYTE[0x0002]//LCD送數(shù)據(jù)</p><p>  unsigned char code tab[]="0123456789.";</p><p>  unsigned char w,yi,yd,suan,d,h;</p>&l

36、t;p>  unsigned long z1,pd;</p><p>  float z3,z2;</p><p>  void ys(){</p><p>  unsigned char i,j;</p><p>  for(i=0;i<10;i++)</p><p>  for(j=0;j<100

37、;j++);}</p><p>  /****************************************/</p><p>  /************LCD初始化*******************/</p><p>  /****************************************/</p><p>

38、  void INIT(){</p><p><b>  com=0x3c;</b></p><p><b>  ys();</b></p><p><b>  com=0x0c;</b></p><p><b>  ys();</b></p>

39、<p><b>  com=0x01;</b></p><p><b>  ys();</b></p><p><b>  com=0x04;</b></p><p><b>  ys();</b></p><p><b>  co

40、m=0x8f;</b></p><p><b>  ys();</b></p><p><b>  }</b></p><p>  /****************************************/</p><p>  /*************顯示程序*******

41、************/</p><p>  /****************************************/</p><p>  void sip(){</p><p>  unsigned char qq,q;</p><p>  if(yd<=3){INIT();pd=z1;yd++;</p>

42、<p>  if((d==1)&(pd<10)){dat=tab[pd];ys();dat=tab[10];ys();dat='0';d=0;}</p><p>  else if(yd==1){</p><p><b>  qq=pd%10;</b></p><p>  dat=tab[qq];<

43、/p><p><b>  }</b></p><p>  else {for(q=0;q<yd;q++){</p><p><b>  qq=pd%10;</b></p><p>  if((q==1)&(d==1)){dat=tab[10];ys();d=0;}</p>&

44、lt;p>  dat=tab[qq];</p><p><b>  pd=pd/10;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p&

45、gt;  else if(yd==100){INIT();dat='0';yd=0;}</p><p>  else if(yd==101){</p><p>  INIT();//超出范圍顯示E</p><p>  com=0x06;ys();</p><p>  com=0x8f;ys();</p>

46、<p><b>  dat='E';</b></p><p><b>  yd=101;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  /*************

47、***************************/</p><p>  /*************運算結(jié)果*******************/</p><p>  /****************************************/</p><p>  void fruit(){</p><p>  unsigne

48、d char j;</p><p>  z3=(float)z1;</p><p>  switch(suan){</p><p>  case '+':z1=(unsigned long)z2+z3;break;</p><p>  case '-':z1=(unsigned long)z2-z3;break

49、;</p><p>  case '*':z1=(unsigned long)z2*z3;break;</p><p>  case '/':z1=(unsigned long)z2/z3*10;j=z1%10;if(j==0){z1/=10;}else {d=1;}break;</p><p><b>  }</b&

50、gt;</p><p>  if((z1>=0)&(z1<10)){yd=0;}//數(shù)值范圍</p><p>  else if((z1>=10)&(z1<100)){yd=1;}</p><p>  else if((z1>=100)&(z1<1000)){yd=2;}</p>&l

51、t;p>  else if((z1>=1000)&(z1<10000)){yd=3;}</p><p>  else yd=101; //超出范圍</p><p><b>  }</b></p><p>  /****************************************/</p&

52、gt;<p>  /*************鍵值定義*******************/</p><p>  /****************************************/</p><p>  void split(){</p><p>  switch(pd){</p><p><b> 

53、 //數(shù)字鍵</b></p><p>  case 0:pd=7;if(h==1){h=0;z1=0;}if(z1<1000000){z1=z1*10+pd;}break;</p><p>  case 1:pd=8;if(h==1){h=0;z1=0;}if(z1<1000000){z1=z1*10+pd;}break;</p><p> 

54、 case 2:pd=9;if(h==1){h=0;z1=0;}if(z1<1000000){z1=z1*10+pd;}break;</p><p>  case 4:pd=4;if(h==1){h=0;z1=0;}if(z1<1000000){z1=z1*10+pd;}break;</p><p>  case 5:pd=5;if(h==1){h=0;z1=0;}if(z1&

55、lt;1000000){z1=z1*10+pd;}break;</p><p>  case 6:pd=6;if(h==1){h=0;z1=0;}if(z1<1000000){z1=z1*10+pd;}break;</p><p>  case 8:pd=1;if(h==1){h=0;z1=0;}if(z1<1000000){z1=z1*10+pd;}break;</p&

56、gt;<p>  case 9:pd=2;if(h==1){h=0;z1=0;}if(z1<1000000){z1=z1*10+pd;}break;</p><p>  case 10:pd=3;if(h==1){h=0;z1=0;}if(z1<1000000){z1=z1*10+pd;}break;</p><p>  case 13:pd=0;if(h==1)

57、{h=0;z1=0;}if(z1<1000000){z1=z1*10+pd;}break;</p><p><b>  //功能鍵</b></p><p>  case 3:suan='/';z2=z1;h=1;yd=100;break;</p><p>  case 7:suan='*';z2=z1;h=

58、1;yd=100;break;</p><p>  case 11:suan='-';z2=z1;h=1;yd=100;break;</p><p>  case 12:pd=0;yd=100;z1=0;h=1;d=0;break;</p><p>  case 14:fruit();break;</p><p>  case

59、 15:suan='+';z2=z1;h=1;yd=100;break;</p><p><b>  }sip();</b></p><p><b>  }</b></p><p>  /****************************************/</p><p&g

60、t;  /*************判斷按鍵*******************/</p><p>  /****************************************/</p><p>  void key(){</p><p><b>  ys();</b></p><p>  w=P1&

61、0xf0;</p><p>  while(w!=0xf0){</p><p>  switch(w){</p><p>  case 0xe0:pd=yi*4+0;break;</p><p>  case 0xd0:pd=yi*4+1;break;</p><p>  case 0xb0:pd=yi*4+2;bre

62、ak;</p><p>  case 0x70:pd=yi*4+3;break;</p><p>  }split();while(w!=0xf0){w=P1&0xf0;}</p><p><b>  }</b></p><p><b>  }</b></p><p>

63、;  void main(){</p><p>  INIT();dat='0';</p><p><b>  while(1){</b></p><p>  for(yi=0;yi<4;yi++){</p><p>  P1=_crol_(0xfe,yi);</p><p>

64、;  w=P1&0xf0;</p><p>  if(w!=0xf0){key();}</p><p><b>  ys();</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b&g

溫馨提示

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

評論

0/150

提交評論