單片機課程設計報告-簡易計算器_第1頁
已閱讀1頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  一、概述</b></p><p>  單片機課程設計是一門實踐課程,要求學生具有制作調試單片機最小系統(tǒng)及外設的能力,能夠掌握單片機內部資源的使用。</p><p>  單片機課程設計內容包括硬件設計、制作及軟件編寫、調試,學生在熟練掌握焊接技術的基礎上,能熟練使用單片機軟件開發(fā)環(huán)境Keil C51編程調試,并使用STC ISP調試工具采用

2、串口下載方式聯(lián)調制作的單片機最小系統(tǒng)。</p><p>  單片機課程設計題目包含基本部分及擴展部分,基本部分即單片機最小系統(tǒng)部分,擴展部分是對單片機內部資源及外部IO口的功能擴展,使制作的單片機系統(tǒng)具有一定的功能。</p><p><b>  二、實驗內容</b></p><p>  自制一個單片機最小系統(tǒng),包括串口下載、復位電路,采用外部小

3、鍵盤輸入數(shù)據(jù),能夠實現(xiàn)加法、乘法及一個科學計算,計算結果顯示在四位一體的數(shù)碼管上。</p><p><b>  三、硬件設計</b></p><p><b>  1 設計總體框圖</b></p><p><b>  2 實際電路</b></p><p><b> ?。?/p>

4、1)復位電路</b></p><p>  在單片機系統(tǒng)中,復位電路是非常關鍵的,當程序跑飛(運行不正常)或死機(停止運行)時,就需要進行復位。</p><p>  MCS-5l 系列單片機的復位引腳RST( 第9 管腳) 出現(xiàn)2個機器周期以上的高電平時,單片機就執(zhí)行復位操作。如果RST 持續(xù)為高電平,單片機就處于循環(huán)復位狀態(tài)。</p><p>  復位操

5、作通常有兩種基本形式:上電自動復位和開關復位。上電瞬間,電容兩端電壓不能突變,此時電容的負極和RESET 相連,電壓全部加在了電阻上,RESET 的輸入為高,芯片被復位。隨之+5V電源給電容充電,電阻上的電壓逐漸減小,最后約等于0,芯片正常工作。并聯(lián)在電容的兩端為復位按鍵,當復位按鍵沒有被按下的時候電路實現(xiàn)上電復位,在芯片正常工作后,通過按下按鍵使RST管腳出現(xiàn)高電平達到手動復位的效果。一般來說,只要RST 管腳上保持10ms 以上的高

6、電平,就能使單片機有效的復位。本次課程設計選用開關復位電路,設計如下:</p><p><b> ?。?)時鐘電路</b></p><p>  XTAL1(19 腳) :芯片內部振蕩電路輸入端。</p><p>  XTAL2(18 腳) :芯片內部振蕩電路輸出端。</p><p>  XTAL1 和XTAL2 是獨立的

7、輸入和輸出反相放大器,它們可以被配置為使用石英晶振的片內振蕩器,或者是器件直接由外部時鐘驅動。本次課程設計采用的是內時鐘模式,即采用利用芯片內部的振蕩電路,在XTAL1、XTAL2 的引腳上外接定時元件(一個石英晶體和兩個電容),內部振蕩器便能產(chǎn)生自激振蕩。一般來說晶振可以在1.2 ~ 12MHz 之間任選,甚至可以達到24MHz 或者更高,但是頻率越高功耗也就越大。在本次課程設計采用的11.0592M 的石英晶振。和晶振并聯(lián)的兩個電容

8、的大小對振蕩頻率有微小影響,可以起到頻率微調作用。當采用石英晶振時,電容可以在20 ~ 40pF 之間選擇(本實驗套件使用30pF);當采用陶瓷諧振器件時,電容要適當?shù)卦龃笠恍?,?0 ~ 50pF 之間。通常選取33pF 的陶瓷電容就可以了。具體電路如下:</p><p> ?。?)EA/VPP(31腳)的功能和接法</p><p>  51 單片機的EA/VPP(31 腳) 是內部和外

9、部程序存儲器的選擇管腳。當EA 保持高電平時,單片機訪問內部程序存儲器;當EA 保持低電平時,則不管是否有內部程序存儲器,只訪問外部存儲器。</p><p>  對于現(xiàn)今的絕大部分單片機來說,其內部的程序存儲器(一般為flash)容量都很大,因此基本上不需要外接程序存儲器,而是直接使用內部的存儲器。</p><p>  在本實驗套件中,EA 管腳接到了VCC 上,只使用內部的程序存儲器。&

10、lt;/p><p><b> ?。?)鍵盤輸入電路</b></p><p>  在鍵盤中按鍵數(shù)量較多時,為了減少I/O口的占用,通常將按鍵排列成矩陣形式,如圖1所示。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接。這樣,一個端口(如P1口)就可以構成4*4=16個按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數(shù)越多,區(qū)別越明顯,比如再多加

11、一條線就可以構成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵)。由此可見,在需要的鍵數(shù)比較多時,采用矩陣法來做鍵盤是合理的。</p><p>  由于本次實驗是制作簡易計算器,按鍵需求較多,所以輸入設備選擇為一個矩陣鍵盤,具體電路設計如下:</p><p>  (5)數(shù)碼管顯示電路</p><p>  數(shù)碼管按段數(shù)可分為七段數(shù)碼管和八段數(shù)碼管,八段數(shù)碼管比七段數(shù)

12、碼管多一個發(fā)光二極管單元(多一個小數(shù)點顯示);按能顯示多少個“8”可分為1位、2位、3位、4位、5位、6位、7位等數(shù)碼管。</p><p>  按發(fā)光二極管單元連接方式可分為共陽極數(shù)碼管和共陰極數(shù)碼管。共陽數(shù)碼管是指將所有發(fā)光二極管的陽極接到一起形成公共陽極(COM)的數(shù)碼管,共陽數(shù)碼管在應用時應將公共極COM接到+5V,當某一字段發(fā)光二極管的陰極為低電平時,相應字段就點亮,當某一字段的陰極為高電平時,相應字段就

13、不亮。共陰數(shù)碼管是指將所有發(fā)光二極管的陰極接到一起形成公共陰極(COM)的數(shù)碼管,共陰數(shù)碼管在應用時應將公共極COM接到地線GND上,當某一字段發(fā)光二極管的陽極為高電平時,相應字段就點亮,當某一字段的陽極為低電平時,相應字段就不亮。</p><p>  本次課程設計采用共陰數(shù)碼管作為顯示設備,驅動芯片采用3態(tài)8位緩沖器芯片,具體型號為SN74LS244N,位選采用4個NPN三極管驅動,具體型號為S9013,具體電

14、路如下:</p><p><b>  四、軟件設計</b></p><p><b>  1 程序內容</b></p><p>  本次課程設計的程序包括:主程序(實現(xiàn)乘法,加法,科學計算等),延時子程序,鍵盤掃描子程序,數(shù)碼管顯示子程序。</p><p><b>  2 C語言程序<

15、/b></p><p><b>  見附錄</b></p><p>  五、Protues仿真</p><p><b>  具體仿真圖如下:</b></p><p>  需要說明的是,本次仿真主要檢驗程序是否正確,所以省去了復位電路,晶振電路,電源電路等。因為在仿真中這些電路沒有不會影響程序的

16、運行。這樣可以節(jié)省時間,避免做些無用功,同時電路看起來更簡潔,更易理解,把最關鍵的與程序有關的電路連接凸顯出來。</p><p><b>  六、設計總結</b></p><p>  在本次課程設計中我體會最深刻的就是“理想是豐滿的,現(xiàn)實是殘酷的”。平常在學習中,我們只學習了書本上理論的知識,知道原理。具體做起實物來問題百出!</p><p>

17、  在這次實驗中,困擾我很深的是數(shù)碼管的顯示問題,一直想用三極管來進行位選,實現(xiàn)動態(tài)顯示,但是電路連接好后三極管基極只要給一點電壓(大約超過0.7V左右),集電極和發(fā)射極就導通,從而導致數(shù)碼管一直導通,顯示出數(shù)字8,不受程序控制。剛出現(xiàn)這個問題的時候,我一直沒找出是軟件還是硬件問題。直到用萬用表測出基極電壓才找出問題。但是我換了基極電阻的大小,最后還是沒有沒有解決問題。</p><p>  最后我改變了硬件電路連

18、接,決定直接把位選接到P2口,這樣雖然亮度沒有原來的強,但是由于有驅動芯片,亮度還是比較滿意,可以滿足要求。這樣就解決了之前的問題。</p><p>  在整個課程設計過程中,還遇到了其他的小問題,在這里不一一贅述了。</p><p>  這次課程設計題目看起來簡單,但還是從中學到了些有用的東西。尤其要感謝老師的嚴格要求,這樣加強了我把這次課程設計做好的動力。</p><

19、;p><b>  七、附錄</b></p><p><b>  1 C語言程序:</b></p><p>  #include<reg52.h> //52系列單片機頭文件</p><p>  #include<math.h></p><p>  #includ

20、e<intrins.h> </p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  #define cheng0</p><p>  #define jia1</p><p>  #def

21、ine kaifang 2</p><p>  sbit wei1=P3^0; //定義4個位選端口</p><p>  sbit wei2=P3^1;</p><p>  sbit wei3=P3^2;</p><p>  sbit wei4=P3^3;</p><p>  uchar code table

22、[]={ //數(shù)碼管編碼</p><p>  0x3f,0x06,0x5b,0x4f,</p><p>  0x66,0x6d,0x7d,0x07,</p><p>  0x7f,0x6f,0x77,0x7c,</p><p>  0x39,0x5e,0x79,0x71};</p><p>  void dela

23、yms(uint);</p><p>  void display(uint shi);</p><p>  uchar keyboard();</p><p>  uchar key_ok=0;</p><p>  uchar num_key=0;//按鍵號 </p><p>  uchar count=0;//按鍵

24、有效標識 </p><p>  void main()</p><p><b>  {</b></p><p>  uint a=0,num1=0,num2=0,num3=0,num_count=1;</p><p>  char fuhao=0;</p><p>  //while(1){di

25、splay(456);}</p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  a=keyboard();</p><p>  if(key_ok==1)</p><p><b>  {</b>

26、;</p><p><b>  key_ok=0;</b></p><p>  if(count==1&&a<10)</p><p><b>  {</b></p><p>  if(num_count==1)</p><p><b>  nu

27、m1=a*1;</b></p><p><b>  else </b></p><p><b>  num2=a*1;</b></p><p>  if(num_count==3)</p><p>  num_count=1;</p><p><b> 

28、 }</b></p><p>  else if(a<10)</p><p><b>  {</b></p><p>  if(num_count==1)</p><p>  num1=num1*10+a;</p><p><b>  else </b>

29、</p><p>  num2=num2*10+a;</p><p><b>  }</b></p><p><b>  if(a==11)</b></p><p><b>  {</b></p><p><b>  count=0;<

30、/b></p><p>  fuhao=cheng;</p><p>  if(num_count==3)</p><p><b>  {</b></p><p>  num1=num3;</p><p><b>  }</b></p><p>

31、  num_count=2;</p><p><b>  }</b></p><p>  else if(a==12)</p><p><b>  {</b></p><p><b>  count=0;</b></p><p>  fuhao

32、=jia;</p><p>  if(num_count==3)</p><p><b>  {</b></p><p>  num1=num3;</p><p><b>  }</b></p><p>  num_count=2;</p><p&

33、gt;<b>  }</b></p><p>  else if(a==13)</p><p><b>  {</b></p><p><b>  count=0;</b></p><p>  fuhao=kaifang;</p><p>  if(

34、num_count==3)</p><p><b>  {</b></p><p>  num1=num3;</p><p><b>  }</b></p><p>  if(fuhao==kaifang)</p><p>  num3=sqrt(num1);</p&g

35、t;<p>  num1=0;num2=0;</p><p>  num_count=3;</p><p><b>  }</b></p><p>  else if(a==16)</p><p><b>  {</b></p><p><b>

36、;  count=0;</b></p><p>  if(fuhao==cheng)</p><p>  num3=num1*num2;</p><p>  else if(fuhao==jia)</p><p>  num3=num1+num2;</p><p>  num1=0;num2=0;&l

37、t;/p><p>  num_count=3; </p><p><b>  }</b></p><p><b>  }</b></p><p>  if(num_count==1)</p><p>  display(num1);&

38、lt;/p><p>  else if(num_count==2)</p><p>  display(num2);</p><p>  else if(num_count==3)</p><p>  display(num3);</p><p><b>  }</b></p><

39、p><b>  }</b></p><p>  void delayms(int t)</p><p><b>  {</b></p><p><b>  int x,y;</b></p><p>  for(x=0;x<t;x++)</p>

40、<p>  for(y=0;y<t;y++);</p><p><b>  }</b></p><p>  void display(uint a) //顯示子函數(shù)</p><p><b>  {</b></p><p>  uchar qian,bai,shi,ge; <

41、/p><p>  qian=a/1000;</p><p>  bai=a/100%10;</p><p>  shi=a%100/10;</p><p><b>  ge=a%10;</b></p><p>  P1=table[ge];</p><p>  delayms(

42、5); </p><p>  P3=0xf7; </p><p>  delayms(2); </p><p><b>  P3=0xfF;</b></p><p>  delayms(3);</p><p>  if(a>=10)</p><

43、;p><b>  {</b></p><p>  P1=table[shi];</p><p><b>  P3=0xfB;</b></p><p>  delayms(2);</p><p><b>  P3=0xfF;</b></p><p>

44、  delayms(3);</p><p><b>  }</b></p><p>  if(a>=100)</p><p><b>  {</b></p><p>  P1=table[bai];</p><p><b>  P3=0xfD;</b&

45、gt;</p><p>  delayms(2);</p><p><b>  P3=0xff;</b></p><p>  delayms(3);</p><p><b>  }</b></p><p>  if(a>=1000)</p><p&

46、gt;<b>  {</b></p><p>  P1=table[qian];</p><p><b>  P3=0xfE;</b></p><p>  delayms(2);</p><p><b>  P3=0xfF;</b></p><p> 

47、 delayms(3);</p><p><b>  }</b></p><p>  /*不完善的顯示判斷程序,不如上面的好</p><p>  if(a>=1000)</p><p><b>  {</b></p><p>  P3=0xf0;</p>

48、;<p>  P1=table[qian];</p><p>  //wei1=1;</p><p><b>  P3=0xf8;</b></p><p>  delayms(5);</p><p><b>  P3=0xf0;</b></p><p>  

49、P1=table[bai];</p><p><b>  //wei2=1;</b></p><p><b>  P3=0xf4;</b></p><p>  delayms(5);</p><p><b>  P3=0xf0;</b></p><p>

50、  P1=table[shi];</p><p><b>  //wei3=1;</b></p><p><b>  P3=0xf2;</b></p><p>  delayms(5);</p><p><b>  P3=0xf0;</b></p><p&g

51、t;  P1=table[ge];</p><p><b>  //wei4=1;</b></p><p><b>  P3=0XF1;</b></p><p>  delayms(5);</p><p><b>  }</b></p><p>  el

52、se if(a>=100)</p><p><b>  {</b></p><p><b>  wei1=0;</b></p><p>  P1=table[bai];</p><p><b>  wei2=1;</b></p><p>  del

53、ayms(5);</p><p><b>  wei2=0;</b></p><p>  P1=table[shi];</p><p><b>  wei3=1;</b></p><p>  delayms(5);</p><p><b>  wei3=0;<

54、/b></p><p>  P1=table[ge];</p><p><b>  wei4=1;</b></p><p>  delayms(5);</p><p><b>  }</b></p><p>  else if(a>=10)</p>

55、<p><b>  {</b></p><p><b>  wei2=0;</b></p><p>  P1=table[shi];</p><p><b>  wei3=1;</b></p><p>  delayms(5);</p><p>

56、;<b>  wei3=0;</b></p><p>  P1=table[ge];</p><p><b>  wei4=1;</b></p><p>  delayms(5);</p><p><b>  }</b></p><p><b>

57、;  else </b></p><p><b>  {</b></p><p><b>  wei3=0;</b></p><p>  P1=table[ge];</p><p><b>  wei4=1;</b></p><p>  de

58、layms(5);</p><p><b>  }</b></p><p><b>  */</b></p><p><b>  }</b></p><p>  //矩陣鍵盤.無按鍵動作時其返回值num_key=0,否則返回按鍵號num_key****檢測高四位 </p

59、><p>  unsigned char keyboard() </p><p><b>  { </b></p><p>  // unsigned char num_key=0;//按鍵號 </p><p>  unsigned char temp=0;//讀取P2口線數(shù)據(jù) </p><p&

60、gt;  static unsigned char temp_code=0;//用于保存按鍵值 </p><p>  static unsigned char temp_circle=0xFE;//保存P2線上的循環(huán)掃描值 </p><p>  static unsigned char num_check=0;//低電平計數(shù) </p><p>  static un

61、signed char key_flag=0;//按鍵有效標識 </p><p>  P2=temp_circle;//0xFX </p><p>  temp=P2;//讀取P2口線數(shù)據(jù)</p><p>  if(temp!=temp_circle)//有按鍵動作 </p><p><b>  { </b></p

62、><p>  num_check++;//低電平計數(shù)|逢低電平加1 </p><p>  if(num_check==5)//連續(xù)10次(10ms)低電平有效 </p><p><b>  { </b></p><p>  key_flag=1;//按鍵有效標識置1 </p><p>  temp_c

63、ode=temp;//保存按鍵值 </p><p><b>  } </b></p><p><b>  } </b></p><p>  else//松手OR無按鍵動作,此時應該改變掃描線 </p><p><b>  { </b></p><p> 

64、 num_check=0; </p><p>  if(key_flag==1)//按鍵有效判斷 </p><p><b>  { </b></p><p>  key_flag=0; </p><p><b>  count++;</b></p><p><b>

65、  key_ok=1;</b></p><p>  switch(temp_code)//讀取按鍵號 </p><p><b>  { </b></p><p><b>  //P2^0線 </b></p><p>  case 0xEE: num_key=4; </p>

66、<p><b>  break; </b></p><p>  case 0xDE: num_key=3; </p><p><b>  break; </b></p><p>  case 0xBE: num_key=2; </p><p><b>  break; </

67、b></p><p>  case 0x7E: num_key=1; </p><p><b>  break; </b></p><p><b>  //P2^1線 </b></p><p>  case 0xED: num_key=8; </p><p><b

68、>  break; </b></p><p>  case 0xDD: num_key=7; </p><p><b>  break; </b></p><p>  case 0xBD: num_key=6; </p><p><b>  break; </b></p>

69、;<p>  case 0x7D: num_key=5; </p><p><b>  break; </b></p><p><b>  //P2^2線 </b></p><p>  case 0xEB: num_key=12; </p><p><b>  break;

70、</b></p><p>  case 0xDB: num_key=11; </p><p><b>  break; </b></p><p>  case 0xBB: num_key=0; </p><p><b>  break; </b></p><p>

71、  case 0x7B: num_key=9; </p><p><b>  break; </b></p><p><b>  //P2^3線 </b></p><p>  case 0xE7: num_key=16; </p><p><b>  break; </b>&l

72、t;/p><p>  case 0xD7: num_key=15; </p><p><b>  break; </b></p><p>  case 0xB7: num_key=14; </p><p><b>  break; </b></p><p>  case 0x77

73、: num_key=13; </p><p><b>  break; </b></p><p>  } </p><p><b>  } </b></p><p>  temp_circle=_crol_(temp_circle,1);//改變掃描線 </p>

74、;<p>  if(temp_circle==0xEF) </p><p><b>  { </b></p><p>  temp_circle=0xFE; </p><p><b>  } </b></p><p><b>  } </b></p>

75、<p>  return(num_key);//返回按鍵號 </p><p><b>  } </b></p><p><b>  2焊接電路板實物圖</b></p><p><b>  3 芯片引腳圖</b></p><p><b>  51單片機引腳圖

溫馨提示

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

評論

0/150

提交評論