單片機(jī)鍵盤輸入課程設(shè)計(jì)_第1頁
已閱讀1頁,還剩14頁未讀 繼續(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><b>  目 錄</b></p><p>  課程設(shè)計(jì)任務(wù)書................................2</p><p>  設(shè)計(jì)目的......................................2</p><p>  設(shè)計(jì)原理與分析............................

2、....2</p><p>  所選元件清單..................................6</p><p>  課程設(shè)計(jì)心得..................................7</p><p>  參考文獻(xiàn)......................................7</p><p>

3、  附錄.................................................8 第一章、課程設(shè)計(jì)任務(wù)書</p><p>  本設(shè)計(jì)以MCS-51系列單片機(jī)為核心,采用常用電子器件設(shè)計(jì)。要求能顯示出秒、分、時(shí)、天,可調(diào)整各個(gè)時(shí)間,采用LED八段數(shù)碼管顯示。</p><p>  第二章、課程設(shè)計(jì)目的</p><

4、p>  1、掌握51系列單片機(jī)編程原理</p><p> ?。?)掌握單片機(jī)C51語言程序編程的思想及方法,加深對(duì)單片機(jī)的更深層次的理解,熟悉單片機(jī)的內(nèi)部硬件資源。</p><p> ?。?)定時(shí)器中斷服務(wù)子程序和外中斷服務(wù)子程序各個(gè)程序段所實(shí)現(xiàn)的功能和編寫。</p><p> ?。?)通過此次課程設(shè)計(jì),學(xué)會(huì)怎么利用所學(xué)單片機(jī)知識(shí)獨(dú)立設(shè)計(jì)系統(tǒng),達(dá)到學(xué)于致用的目

5、的,加深了解C51設(shè)計(jì)編程思想及開發(fā)系統(tǒng)的一般過程,并不斷創(chuàng)新。</p><p>  2、掌握矩陣式鍵盤電路的接法及工作原理</p><p> ?。?)掌握矩陣式鍵盤的接法及工作原理。</p><p> ?。?)掌握鍵盤消抖的工作原理。</p><p>  3、掌握矩陣式鍵盤電路的接法及工作原理</p><p> ?。?/p>

6、1)掌握矩陣式鍵盤鍵盤掃描程序的編寫。</p><p> ?。?)掌握鍵盤消抖程序的編寫。</p><p>  4、掌握共陽八段碼顯示器連接,做成可調(diào)節(jié)的電子表,簡(jiǎn)單的了解單片機(jī)對(duì)顯示器的控制過程;能在此基礎(chǔ)上做成可調(diào)節(jié)的萬年歷。</p><p>  第三章、設(shè)計(jì)原理與分析</p><p>  1、實(shí)驗(yàn)硬件電路的原理與設(shè)計(jì)</p>

7、<p><b>  A.</b></p><p><b>  鍵盤掃描識(shí)別</b></p><p>  1、識(shí)別鍵的閉合,通常采用行掃描法和行反轉(zhuǎn)法。</p><p>  行掃描法是使鍵盤上某一行線為低電平,而其余行接高電平,然后讀取列值,如所讀列值中某位為低電平,表明有鍵按下,否則掃描下一行,直到掃完所有行

8、。</p><p>  行反轉(zhuǎn)法識(shí)別鍵閉合時(shí),要將行線接一并行口,先讓它工作于輸出方式,將列線也接到一個(gè)并行口,先讓它工作于輸入方式,程序使CPU通過輸出端口往各行線上全部送低電平,然后讀入列線值,如此時(shí)有某鍵被按下,則必定會(huì)使某一列線值為0。然后,程序?qū)蓚€(gè)并行端口進(jìn)行方式設(shè)置,使行線工作于輸入方式,列線工作于輸出方式,并將剛才讀得的列線值從列線所接的并行端口輸出,再讀取行線上的輸入值,那么,在閉合鍵所在的行線

9、上的值必定為0。這樣,當(dāng)一個(gè)鍵被按下時(shí),必定可以讀得一對(duì)唯一的行線值和列線值。</p><p>  2、程序設(shè)計(jì)時(shí),要學(xué)會(huì)靈活地對(duì)STC89C52的各端口進(jìn)行方式設(shè)置。可將各鍵對(duì)應(yīng)的鍵值(行線值、列線值)放在一個(gè)表中,將要顯示的0~F字符放在另一個(gè)表中,通過查表來確定按下的是哪一個(gè)鍵并正確顯示出來。</p><p>  3、利用實(shí)驗(yàn)箱上的STC89C52可編程并行接口芯片和矩陣鍵盤,編寫程

10、序,做到在鍵盤上每按一個(gè)數(shù)字鍵(0~F),用發(fā)光二極管將該代碼顯示出來。</p><p><b>  B.</b></p><p><b>  顯示器的顯示原理:</b></p><p>  數(shù)碼管需要驅(qū)動(dòng)電路來驅(qū)動(dòng)數(shù)碼管的各個(gè)段碼才能顯示我們需要的數(shù)字。根據(jù)數(shù)碼管的驅(qū)動(dòng)方式不同,可以分為靜態(tài)驅(qū)動(dòng)和動(dòng)態(tài)驅(qū)動(dòng)兩種方式。<

11、;/p><p> ?、凫o態(tài)顯示驅(qū)動(dòng):靜態(tài)驅(qū)動(dòng)也稱直流驅(qū)動(dòng)。是指每個(gè)數(shù)碼管的第一個(gè)段碼都是由同一個(gè)單片機(jī)的I/O端口進(jìn)行驅(qū)動(dòng),或者使用如BCD碼二─十進(jìn)制譯碼器譯碼進(jìn)行驅(qū)動(dòng)。</p><p> ?、趧?dòng)態(tài)顯示驅(qū)動(dòng):動(dòng)態(tài)驅(qū)動(dòng)是數(shù)碼管是單片機(jī)中應(yīng)用最為廣泛的一種驅(qū)動(dòng)方式。動(dòng)態(tài)驅(qū)動(dòng)是將所有數(shù)碼管的八個(gè)顯示筆劃“a,b,c,d,e,f,g,dp”的同名端連在一起,另外為每個(gè)數(shù)碼管的公共極COM增加位選通控

12、制電路,各選通由各自獨(dú)立的I/O線控制,當(dāng)單片機(jī)輸出這形碼時(shí),所有數(shù)碼管都接收到相同的字形碼,哪個(gè)數(shù)碼管會(huì)顯示字形,取決于單片機(jī)對(duì)位選通COM端電路的控制,所以只要將需要顯示的數(shù)碼管的選通控制打開,該位就顯示出字形,沒有選通的數(shù)碼管就不會(huì)亮。通過分時(shí)輪流控制各個(gè)數(shù)碼管的COM端,就使各個(gè)數(shù)碼管輪流受控顯示,這就是動(dòng)態(tài)驅(qū)動(dòng)。在輪流顯示的過程中,每位數(shù)碼管的點(diǎn)亮?xí)r間為1~2ms。動(dòng)態(tài)顯示的效果和靜態(tài)顯示是一樣的,但能節(jié)省大量的I/O端口,而

13、且功耗更低。</p><p>  由于靜態(tài)顯示需要數(shù)據(jù)鎖存器等硬件,接口復(fù)雜一些,考慮時(shí)鐘顯示只有八位, 且系統(tǒng)沒有其它復(fù)雜的處理任務(wù),所以決定采用動(dòng)態(tài)掃描實(shí)現(xiàn)LED的顯示。 </p><p>  單片機(jī)采用易購的STC89C52系列,這種單片機(jī)具有足夠的空余硬件資源,可以實(shí)現(xiàn)其他的擴(kuò)展功能。時(shí)鐘計(jì)時(shí)器電路系統(tǒng)的總體設(shè)計(jì)框圖如圖1。</p><p><b>

14、;  2、實(shí)驗(yàn)步驟:</b></p><p>  時(shí)鐘計(jì)時(shí)器的硬件電路如圖2所示。該電路采用51單片機(jī)最小系統(tǒng),采用共陽八段數(shù)碼管LED顯示器,P0口輸出段碼數(shù)據(jù),P2.0~P2.5口作列掃描輸出;P1口接矩陣鍵盤,實(shí)現(xiàn)時(shí)間的調(diào)整。系統(tǒng)的功能由鍵盤上1、2、3鍵完成。</p><p><b>  如圖2</b></p><p>&l

15、t;b>  3、系統(tǒng)程序的設(shè)計(jì)</b></p><p><b>  (1)主程序</b></p><p>  本設(shè)計(jì)中計(jì)時(shí)采用定時(shí)器T0中斷完成。主程序循環(huán)調(diào)用顯示子程序和查鍵子程序,當(dāng)端口有開關(guān)按下時(shí),轉(zhuǎn)入相應(yīng)功能程序。其主程序流程如圖3。</p><p><b>  顯示子程序</b></p&g

16、t;<p>  時(shí)間顯示子程序每次顯示8個(gè)連續(xù)內(nèi)存單元的十進(jìn)制BCD碼數(shù)據(jù),首地址在調(diào)用顯示程序時(shí)先指定。</p><p>  顯示時(shí),先取出內(nèi)存地址中的數(shù)據(jù),然后查得對(duì)應(yīng)的顯示用段碼從P0口輸出,P2口將對(duì)應(yīng)數(shù)碼管選中供電,就能顯示該地址單元的數(shù)據(jù)值。</p><p>  定時(shí)器T0中斷服務(wù)程序</p><p>  定時(shí)器T0用于時(shí)間計(jì)時(shí)。定時(shí)溢出中

17、斷周期設(shè)為50ms,中斷進(jìn)入后先進(jìn)行定時(shí)中斷初值校正,當(dāng)中斷累計(jì)20次(即50ms×20=1s)時(shí),對(duì)秒計(jì)數(shù)單元進(jìn)行加1操作。在計(jì)數(shù)單元中,采用十進(jìn)制BCD碼計(jì)數(shù),滿10進(jìn)位。</p><p>  T0中斷計(jì)時(shí)程序流程圖如圖4所示。</p><p><b>  調(diào)時(shí)功能程序</b></p><p>  調(diào)時(shí)功能程序的設(shè)計(jì)方法是:按下1

18、鍵,可以選擇要修改的位,按下按2鍵和3鍵鍵,對(duì)選中的位進(jìn)行加減操作,修改完成之后,再按下XW鍵對(duì)其它位進(jìn)行修改。具體如下:</p><p>  第一次按下1鍵時(shí),可以修改秒。</p><p>  第二次按下1鍵時(shí),可以修改分。</p><p>  第三次按下1鍵時(shí),可以修改時(shí)。</p><p>  第四次按下1鍵時(shí),退出子程序。</p&

19、gt;<p>  第四章、所選元件清單</p><p><b>  元件清單</b></p><p><b>  2、程序?qū)嶋H接線</b></p><p>  數(shù)碼管的不同筆段的組合構(gòu)成了不同字符的字形。為了獲得不同的字形,各筆段所加的電平也不同,因此各個(gè)字形所形成的編碼是不一樣的。例如,對(duì)于共陽極數(shù)碼管,如

20、果要顯示字符2,則筆段a、b、g、e、d發(fā)光,對(duì)應(yīng)的引腳為低電平;其余各筆段不發(fā)光,對(duì)應(yīng)的引腳為該電平。所以字符2的字形編碼gfedcba=10100100B=A4H。</p><p>  陰極數(shù)碼管的字形編碼與用陽極數(shù)碼管的字形編碼是邏輯“非”的關(guān)系。根據(jù)上述編碼方法可以得出數(shù)碼管顯示的字符與對(duì)應(yīng)的字形編碼的關(guān)系,如下表所示</p><p>  此次實(shí)驗(yàn)用的共陽數(shù)碼管,所以按照陽極數(shù)碼管

21、的字形編碼進(jìn)行設(shè)計(jì)。</p><p>  第五章、課程設(shè)計(jì)心得</p><p>  這次課程設(shè)計(jì)根據(jù)課題要求,復(fù)習(xí)了這學(xué)期所學(xué)的單片機(jī)內(nèi)容,通過查詢相關(guān)的資料,簡(jiǎn)要的了解一下。雖然老師上課講過,但并非聽懂了所有有關(guān)知識(shí)。根據(jù)課程設(shè)計(jì)的要求和自己通過參考有關(guān)資料擬的方案,寫好程序流程圖,在程序流程圖的基礎(chǔ)上,根據(jù)芯片的功能寫出相應(yīng)的程序,達(dá)到能夠?qū)崿F(xiàn)所要求的功能的目的。</p>

22、<p>  這次的單片機(jī)課程設(shè)計(jì)重點(diǎn)是理論與實(shí)際的相結(jié)合,不單單只是書上的一條條分離的指令。通過這次設(shè)計(jì)讓我更系統(tǒng)的了解了各個(gè)指令以及單片機(jī)的擴(kuò)展內(nèi)容,。</p><p>  學(xué)習(xí)任何知識(shí),僅從理論上去求知,而不去實(shí)踐、探索是不夠的,所以在學(xué)期末單片機(jī)課程設(shè)計(jì)是很及時(shí)、很必要的。這樣不僅能加深我們對(duì)單片機(jī)的更深理解,而且還及時(shí)、真正的做到了學(xué)以致用。</p><p>  剛開始

23、進(jìn)行課程設(shè)計(jì)的時(shí)候,我表現(xiàn)出了極大的熱情。上網(wǎng)查資料、詢問高年級(jí)同學(xué)的經(jīng)驗(yàn),我時(shí)刻猜測(cè)著我會(huì)從中獲得什么,這是一個(gè)難得的鍛煉機(jī)會(huì)。</p><p>  通過實(shí)踐,我領(lǐng)悟到了很多以前不知道的東西,可以說是受益匪淺。雖然時(shí)間不是很長(zhǎng),但是還是有不少長(zhǎng)進(jìn),這不僅是局限在程序設(shè)計(jì)的功能實(shí)現(xiàn)上,更多的是對(duì)程序設(shè)計(jì)的技巧的追求上</p><p><b>  第六章 參考文獻(xiàn)</b>

24、;</p><p>  [1]樓然苗,李光飛編著.單片機(jī)課程設(shè)計(jì)指導(dǎo).北京航空航天大學(xué)出版社</p><p>  [2]田立,田清,代方震編著.51單片機(jī)C語言程序設(shè)計(jì)快速入門.人民郵電出版社</p><p>  [3]翻紅崗,魏學(xué)海,任思璟.51單片機(jī)自學(xué)筆記.北京航空航天大學(xué)出版社</p><p><b>  附錄:程序<

25、/b></p><p>  #include<reg52.h> </p><p>  #define uint unsigned int</p><p>  #define uchar unsigned char </p><p>  uchar miao,fen,shi,m,f,s,num,num1,num2; </

26、p><p>  uchar code table1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};</p><p>  void delay(uint z) </p><p><b>  {</b></p><p><b>  uint x,y;<

27、/b></p><p>  for(x=z;x>0;x--) </p><p>  for(y=110;y>0;y--); </p><p><b>  } </b></p><p>  void xiansi( uchar aa,uchar bb,uchar cc) </p><p

28、><b>  { </b></p><p><b>  P2=0xdb; </b></p><p><b>  P0=0xbf; </b></p><p>  delay(1); </p><p>  P0=0xff; // num2++; </p><

29、;p>  if(num1==1&num2==0|num1==1&num2==1) </p><p><b>  { </b></p><p><b>  P2=0xff;</b></p><p>  P0=table1[aa%10]; </p><p>  delay(1);

30、</p><p><b>  P0=0xff;</b></p><p><b>  P2=0xff; </b></p><p>  P0=table1[aa/10]; </p><p>  delay(1); </p><p><b>  P0=0xff; <

31、/b></p><p><b>  } </b></p><p><b>  else </b></p><p><b>  { </b></p><p><b>  P2=0x7f; </b></p><p>  P0=ta

32、ble1[aa%10]; </p><p><b>  delay(1);</b></p><p><b>  P0=0xff; </b></p><p><b>  P2=0xbf;</b></p><p>  P0=table1[aa/10]; </p>&l

33、t;p>  delay(1); </p><p><b>  P0=0xff; </b></p><p><b>  } </b></p><p>  if(num1==2&num2==0|num1==2&num2==1) </p><p><b>  { </

34、b></p><p><b>  P2=0xff; </b></p><p>  P0=table1[bb/10]; </p><p>  delay(1); </p><p><b>  P0=0xff;</b></p><p><b>  P2=0xff;

35、 </b></p><p>  P0=table1[bb%10];</p><p>  delay(1); </p><p><b>  P0=0xff; </b></p><p><b>  } </b></p><p><b>  else <

36、/b></p><p><b>  {</b></p><p><b>  P2=0xf7; </b></p><p>  P0=table1[bb/10]; </p><p>  delay(1); </p><p><b>  P0=0xff; </

37、b></p><p><b>  P2=0xef; </b></p><p>  P0=table1[bb%10]; </p><p>  delay(1); </p><p><b>  P0=0xff; </b></p><p><b>  } </

38、b></p><p>  if(num1==3&num2==0|num1==3&num2==1) </p><p><b>  { </b></p><p><b>  P2=0xff; </b></p><p>  P0=table1[cc/10]; </p>

39、<p>  delay(1); </p><p><b>  P0=0xff;</b></p><p><b>  P2=0xff; </b></p><p>  P0=table1[cc%10]; </p><p>  delay(1); </p><p><

40、;b>  P0=0xff; </b></p><p><b>  } </b></p><p><b>  else </b></p><p>  { P2=0xfe;</p><p>  P0=table1[cc/10]; </p><p>  delay

41、(1); </p><p><b>  P0=0xff;</b></p><p><b>  P2=0xfd; </b></p><p>  P0=table1[cc%10]; </p><p>  delay(1); </p><p><b>  P0=0xff;

42、 </b></p><p><b>  }</b></p><p>  //if(num2==256)num2=1; </p><p><b>  }</b></p><p>  void jishi( ) </p><p><b>  { </b

43、></p><p>  if(num==20) </p><p><b>  { </b></p><p><b>  num=0; </b></p><p><b>  miao++; </b></p><p>  if(miao==60) &l

44、t;/p><p><b>  { </b></p><p><b>  miao=0; </b></p><p><b>  fen++; </b></p><p>  if(fen==60) </p><p><b>  { </b>

45、</p><p><b>  fen=0; </b></p><p><b>  shi++; </b></p><p>  if(shi==24) </p><p><b>  shi=0; </b></p><p><b>  } <

46、/b></p><p><b>  } </b></p><p>  if(miao==0&fen==0);</p><p><b>  } </b></p><p>  xiansi(miao,fen,shi); </p><p><b>  } &

47、lt;/b></p><p>  void init(void) </p><p><b>  { </b></p><p>  TMOD=0x01; </p><p>  TH0=0x3c; </p><p>  TL0=0xb0; </p><p><b&g

48、t;  TH1=0x3c;</b></p><p>  TL1=0xb0; </p><p><b>  EA=1; </b></p><p><b>  ET0=1; </b></p><p><b>  TR0=1; </b></p><p&

49、gt;<b>  ET1=1; </b></p><p><b>  TR1=1; </b></p><p><b>  } </b></p><p>  void key()</p><p><b>  {</b></p><p>

50、;<b>  P1=0xfe; </b></p><p>  if(P1==0xee) </p><p>  { delay(10); </p><p>  if(P1==0xee) </p><p><b>  { </b></p><p>  while(P1==0xee

51、)xiansi(miao,fen,shi); </p><p><b>  num1++; </b></p><p><b>  TR0=0; </b></p><p>  if(num1==4)</p><p><b>  {</b></p><p>

52、<b>  num1=0;</b></p><p><b>  TR0=1;</b></p><p><b>  } </b></p><p>  xiansi(miao,fen,shi); </p><p><b>  } </b></p>

53、<p><b>  } </b></p><p>  if(num1!=0) </p><p><b>  { </b></p><p>  if(P1==0xde) //時(shí)間加 </p><p><b>  { </b></p><p> 

54、 delay(10); </p><p>  if(P1==0xde) </p><p><b>  { </b></p><p>  while(P1==0xde)xiansi(miao,fen,shi); </p><p>  switch(num1) </p><p><b>  

55、{ </b></p><p>  case 1 : miao++; </p><p>  if(miao==60)miao=0; </p><p><b>  break; </b></p><p>  case 2 : fen++; </p><p>  if(fen==60)fen

56、=0; </p><p><b>  break; </b></p><p>  case 3 : shi++; </p><p>  if(shi==24)shi=0; </p><p><b>  break; </b></p><p><b>  } <

57、/b></p><p><b>  } </b></p><p><b>  }</b></p><p>  if(P1==0xbe);//時(shí)間減</p><p><b>  { </b></p><p>  delay(10); </p&g

58、t;<p>  if(P1==0xbe) </p><p><b>  { </b></p><p>  while(P1==0xbe)</p><p>  xiansi(miao,fen,shi); </p><p>  switch(num1) </p><p><b>

59、;  {</b></p><p>  case 1 : miao--; </p><p>  if(miao==-1)</p><p><b>  miao=59; </b></p><p><b>  break; </b></p><p>  case 2 :

60、 fen--; </p><p>  if(fen==-1)</p><p><b>  fen=59; </b></p><p><b>  break; </b></p><p>  case 3 : shi--; </p><p>  if(shi==-1)</p

61、><p><b>  shi=23;</b></p><p><b>  break; </b></p><p><b>  } </b></p><p><b>  }</b></p><p><b>  }</b&g

62、t;</p><p><b>  } </b></p><p><b>  } </b></p><p>  void main() </p><p><b>  {</b></p><p><b>  init(); </b>&l

63、t;/p><p><b>  while(1) </b></p><p><b>  { </b></p><p><b>  jishi(); </b></p><p><b>  key(); </b></p><p><b&

64、gt;  } </b></p><p><b>  } </b></p><p>  void zhongduan() interrupt 1 </p><p><b>  { </b></p><p><b>  TH0=0x3c;</b></p>

65、<p>  TL0=0xb0; </p><p><b>  num++; </b></p><p><b>  } </b></p><p>  void zhongduan1() interrupt 3 </p><p><b>  { </b></p>

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(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)論