找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 17119|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

單片機4*4鍵盤的電路設(shè)計以及源代碼課程設(shè)計報告

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:219228 發(fā)表于 2017-7-12 20:59 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式

單片機及接口課程設(shè)計報告

          專    業(yè): 電子信息工程

          班    級:    信息143

          姓    名:      楊榮慶

          學(xué)    號: 201427187   

          指導(dǎo)教師: 李恩玉、吳則舉、王辛杰

          時    間: 2017-01-02~2017-01-13

         通信與電子工程學(xué)院


目錄

  • 課程設(shè)計及任務(wù)要求
1.1設(shè)計任務(wù)…………………………………………………………………………2
1.2設(shè)計要求…………………………………………………………………………2
1.3設(shè)計目的…………………………………………………………………………2
  • 總體方案介紹
2.1鍵盤接口…………………………………………………………………………2
2.2顯示接口…………………………………………………………………………3
  • 硬件設(shè)計
3.1總體設(shè)計框圖…………………………………………………………………4
3.2部分硬件設(shè)計及其原理 …………………………………………………4
  • 軟件設(shè)計
4.1程序流程圖……………………………………………………………………6
4.2程序源代碼……………………………………………………………………7
  • 調(diào)試
5.1仿真結(jié)果截圖…………………………………………………………………11
5.2實物圖……………………………………………………………………………12
5.3設(shè)計及調(diào)試過程………………………………………………………………12
  • 總結(jié)
6.1在設(shè)計中遇到的困難………………………………………………………13
6.2課程設(shè)計總結(jié)…………………………………………………………………13
6.3收獲和體會 ……………………………………………………………………14




一 課程設(shè)計及任務(wù)要求

1.1 設(shè)計任務(wù)

鍵盤接口和顯示設(shè)計,設(shè)計并實現(xiàn)一4×4鍵盤的接口,并在兩個數(shù)碼管上顯示鍵盤所在的行與列。

1.2設(shè)計要求

① 掌握原理圖的畫法,在PROTEUS平臺上用單片機完成所選題目的原理圖設(shè)計;

② 在KEIL C平臺上使用C語言編程實現(xiàn)編程,并調(diào)試通過;

③ 在PROTEUS平臺上利用設(shè)計好的原理圖和調(diào)試好的程序完成整個仿真;

④ 在單片機最小系統(tǒng)板上實現(xiàn)仿真后軟硬件設(shè)計;

1.3設(shè)計目的

    為了進一步鞏固學(xué)習(xí)的理論知識,增強對所學(xué)知識的實際應(yīng)用能力和運用所學(xué)的知識解決實際問題的能力,進行本次課程設(shè)計。通過設(shè)計使我在鞏固所學(xué)知識的基礎(chǔ)之上具有初步的單片機系統(tǒng)設(shè)計與應(yīng)用能力。

① 通過本設(shè)計,綜合運用《單片機技術(shù)原理與應(yīng)用》、《DSP原理與應(yīng)用》《C語言程序設(shè)計》以及《數(shù)字電路》、《模擬電路》等課程的內(nèi)容,為以后從事電子產(chǎn)品設(shè)計、軟件編程、系統(tǒng)控制等工作奠定一定的基礎(chǔ)。

② 學(xué)會使用KEIL C和PROTEUS等軟件,用C語言或匯編語言編寫一個較完整的實用程序,并仿真運行,保證設(shè)計的正確性。

③ 了解單片機接口應(yīng)用開發(fā)的全過程:分析需求、設(shè)計原理圖、選用元器件、布線、編程、調(diào)試、撰寫報告等。

總體方案介紹

2.1鍵盤接口

    鍵盤可以分為獨立式和矩陣式兩類,每一類有可根據(jù)對鍵盤的譯碼方法分為編碼鍵盤和非編碼鍵盤兩種類型。編碼鍵盤是鍵盤按下直接獲取按鍵的鍵號,當有按鍵按下時,能直接得到按下鍵的鍵號,這種鍵盤使用方便,但硬件電路復(fù)雜,常常不被微型計算機采用。在非編碼鍵盤中,利用按鍵直接與單片機的I/O口線(或外部擴展的I/O口線)相連接,鍵盤按下時不能直接得到按鍵號,還要通過編寫程序判斷I/O口線的電平求得鍵號。因此,非編碼鍵盤硬件電路極為簡單。

對于4×4鍵盤,共有十六個按鍵。如果每個按鍵與單片機的一個引腳相連,就會占用16個引腳,這樣會使的單片機的接口不夠用(即使夠用,也是對單片機端口的極大浪費)。因此我們應(yīng)該行列式的接法。行列式非編碼鍵盤是一種把所有按鍵排列成行列矩陣的鍵盤。在這種鍵盤中,每根行線和列線的交叉處都接有一個按鍵,每當某個按鍵被按下時,與這個按鍵相連的行線和列線就會接通,否則是斷開狀態(tài)。。因此4×4行列式非編碼鍵盤只需4條行線和4條列線,總共占用8條I/O端口線。大大減少了I/O端口線的利用。

去除按鍵的抖動,當判別出可能有鍵按下時,軟件延時一段時間(10ms左右)再判別鍵盤的狀態(tài),若仍有鍵閉合,則認為鍵盤上有確定的鍵按下,否則是鍵抖動。

矩陣式鍵盤的線反轉(zhuǎn)法掃描,主要操作步驟為:(1)讓行線編程為輸入線,列線編程為輸出線,并使輸出線輸出為全低電平,則行線中電平由高變低的所在行為按鍵的所在行;(2)再把行線編程為輸出線,列線編程為輸入線,并使輸出線輸出為全低電平,則列線中電平由高變低的所在行為按鍵的所在列。綜合上述兩步的結(jié)果,可確定按鍵所在的行和列,從而識別出所按的鍵。

2.2顯示接口:

實現(xiàn)4×4鍵盤的接口需要用到單片機并編寫相應(yīng)的程序來識別鍵盤的十六個按鍵中哪個按鍵被按下。要求將被按下的按鍵顯示出來,因此可以用兩個數(shù)碼管來分別顯示被按下的按鍵的行與列。單片機控制LED數(shù)碼管有兩種顯示方式:靜態(tài)顯示和動態(tài)掃描顯示。靜態(tài)顯示方式就是指無論多少位LED數(shù)碼管,都同時處于顯示狀態(tài),多位LED數(shù)碼管工作于靜態(tài)顯示方式時,各位的共陰極(或共陽極)連接在一起并接地(或接+5V),每位數(shù)碼管的段碼線分別與一個單片機控制的8位I/O口鎖存器輸出相連,如果送往各個LED數(shù)碼管所顯示的字符的段碼一經(jīng)確定,則相應(yīng)的I/O口鎖存器鎖存的段碼輸出將維持不變,直至送入下一個顯示字符的段碼。因此,靜態(tài)顯示方式送往顯示無閃爍,亮度較高,軟件控制比較容易。動態(tài)顯示用于顯示位數(shù)較多時,將所有的LED數(shù)碼管顯示器的段碼線的相應(yīng)段并聯(lián)在一起,由一個8位I/O端口控制,而各顯示位的公共端分別由另一單獨的I/O端口線控制。 每隔一段時間逐位的輪流點亮各數(shù)碼管(掃描),由于數(shù)碼管的余暉和人眼的“視覺暫留”作用,只要控制好每位數(shù)碼管點亮顯示的時間和間隔,則可造成“多位同時亮”的假象。發(fā)光二極管從導(dǎo)通到發(fā)光有一定的延時,如果點亮?xí)r間太短,發(fā)光太弱,人眼無法看清;時間太長,產(chǎn)生閃爍現(xiàn)象,而且此時間越長,占用單片機的時間也越多。另外,顯示位數(shù)增多,也將占用單片機的大量時間,因此動態(tài)現(xiàn)實的實質(zhì)是以執(zhí)行程序的時間來換取I/O端口數(shù)目的減少。因此選用靜態(tài)顯示,并且選擇共陰極數(shù)碼管,直接接地,不需要上拉電阻,方便了電路的連接。


三 硬件設(shè)計
3.1總體設(shè)計框圖

圖3-1總電路圖

3.2部分硬件設(shè)計及其原理

圖3-2  4*4按鍵硬件圖

每個按鍵都有它的行值和列值,行值和列值的組合就是識別這個按鍵的編碼。矩陣的行線和列線分別通過兩并行接口和CPU通信。鍵盤的一端(列線)通過電阻接VCC,而接地是通過程序輸出數(shù)字“0”實現(xiàn)的。鍵盤處理程序的任務(wù)是:確定有無鍵按下,判斷哪一個鍵按下,還要消除按鍵在閉合或斷開時的抖動。兩個并行口中,一個輸出掃描碼,使按鍵逐行動態(tài)接地;另一個并行口輸入按鍵狀態(tài),由行掃描值和回饋信號共同形成鍵編碼而識別按鍵。


圖3-3 數(shù)碼管硬件圖

兩位數(shù)碼管靜態(tài)顯示,并且采用共陰極數(shù)碼管,直接接地,避免采用上拉電阻,與AT89C52的P2、P3口相連,按行列顯示按鍵,靜態(tài)顯示,顯示無閃爍,亮度較高,軟件控制較容易。

圖3-4 STC89C52芯片

(1)8位CPU

(2)數(shù)據(jù)存儲器(256RAM)程序存儲器(8KB Flash ROM)

(3)4個八位可編程并行I/O口(P0口、P1口、P2口、P3口)

(4)3個可編程的16位定時器/計數(shù)器(T0、T1、T2)

(5)1個全雙工的通用異步收發(fā)串行口(UART)

(6) 中斷系統(tǒng)具有6個中斷源、6個中斷向量

  • 特殊功能寄存器(SFR)32個

(8)1個看門狗定時器(WDT)


四 軟件設(shè)計

4.1程序流程圖

(在51hei附件里面)


  圖4-1 總程序流程圖

                 圖4-3  鍵盤掃描流程圖

4.2程序源代碼

五 調(diào)試

5.1仿真結(jié)果截圖

圖5-1 初始狀態(tài)數(shù)碼管顯示為“00”

圖5-2 第三行第四列按鍵按下,顯示為“34”

5.2實物圖

圖5-3 第三行第二列按鍵按下,顯示為“32”

圖5-4 第四行第三列按鍵按下,顯示為“43”

5.3設(shè)計及調(diào)試過程
  • 首先在keil軟件中編寫設(shè)計的程序,并通過編譯調(diào)試使程序能夠完全展現(xiàn)實驗要求,不斷修改直至沒有錯誤,編譯通過以后生成往單片機里下載的hex文件。
  • 打開proteus軟件,設(shè)計硬件電路,根據(jù)自己設(shè)計的電路原理圖選擇元器件,并按照電路原理圖布局和連線。
  • 電路連接好以后,并且檢查沒有任何錯誤,點擊STC89C52芯片,在“Program File”中選擇生成的hex文件,點擊OK,退出以后,點擊運行按鈕,調(diào)試電路是否能夠正常工作,并且檢查按鍵是否對應(yīng)數(shù)碼管上的數(shù)字。
六 總結(jié)
6.1設(shè)計中遇到的困難
  • 在編寫程序的時候,考慮用匯編語言還是C語言編寫,最后選擇了C語言,在之前的各種實驗及設(shè)計中都是用的C語言進行編程,對C語言的理解比較深刻,匯編語言是單片機的主要設(shè)計語言,但由于剛剛接觸到這一語言,對各種指令、尋址方式的理解不太深刻,用錯各種指令,相對比而言,C語言更加得心應(yīng)手。

在用C語言進行編程的時候,也遇見了許多的問題,各種函數(shù)的調(diào)用,實體名、變量名的定義,通過對C語言課本的查閱,在老師的幫助下都解決了。

  • 另外一個最大的難點就是在proteus中對原理圖的繪制,由于是第一次使用這個軟件,之前都是用的Multisim進行仿真,這次進行的是基于單片機的設(shè)計,所以在進行軟件仿真的時候有很大的困難,本次設(shè)計的大部分時間都用在了系統(tǒng)的仿真上,器件的選取、參數(shù)值的改動,還有最后下載完hex文件后的各種錯誤的修改。這些問題都對設(shè)計造成了很大的影響,通過對《單片機原理及應(yīng)用》附帶光盤的觀看,對proteus軟件的介紹及實際操作,使我對這個軟件有了一定的了解,通過上網(wǎng)查閱資料,了解了各種元器件的名稱及在軟件中的位置,通過不懈的努力,終于完成了設(shè)計的系統(tǒng)仿真。

6.2課程設(shè)計總結(jié)

通過本次課程設(shè)計,我運用所學(xué)知識,完成了整個課程設(shè)計的內(nèi)容,從電路原理圖的設(shè)計到硬件電路圖的連接,再到程序的編寫、電路原理圖的仿真,最后通過焊接完成了實物的設(shè)計,在這次課程設(shè)計中,運用了許多課程的內(nèi)容,通過查閱資料,以及與同學(xué)的探討,最終完成了4×4鍵盤的設(shè)計及按鍵的顯示。  

通過本次單片機與接口課程設(shè)計,我學(xué)會了使用proteus軟件和keil軟件,基本上完成了所設(shè)計的課題,設(shè)計出了4×4鍵盤的接口,并且在兩個數(shù)碼管上能夠顯示鍵盤所在的行值與列值。通過本次課設(shè),首先,使我能夠綜合運用《單片機技術(shù)原理與應(yīng)用》、《DSP原理與應(yīng)用》《C語言程序設(shè)計》以及《數(shù)字電路》、《模擬電路》等課程中學(xué)到的知識做一些電路的仿真,其次,使我對C語言有了更好的掌握和運用,用其進行軟件編程更加得心應(yīng)手。初步掌握了keil 和proteus等軟件,可以用C語言編寫一個完整的程序,并且能夠在proteus中完成電路圖的設(shè)計,且能夠使程序與電路圖吻合,達到設(shè)計的目的,實現(xiàn)設(shè)計的要求,本次課設(shè)使我了解單片機接口應(yīng)用開發(fā)的全過程:分析需求、設(shè)計原理圖、選用元器件、布線、編程、調(diào)試、撰寫報告等。

6.3收獲和體會

這次課設(shè),使我認識到:無論是設(shè)計硬件電路還是編寫相應(yīng)的軟件程序,我們應(yīng)該極其認真的進行設(shè)計,在這個過程中哪怕是出現(xiàn)一個小小的錯誤,都會導(dǎo)致不能仿真出正確的結(jié)果甚至根本不會出結(jié)果。本專業(yè)要求我們應(yīng)該有基本的專業(yè)知識和較強的動手操作能力。因此能夠熟練使用proteus和keil等軟件對于我們未來的就業(yè)非常重要。本次課設(shè)僅僅使我們對proteus和keil等軟件有了一個簡單的了解,我們應(yīng)該利用業(yè)余時間了解一些對我們專業(yè)有用的軟件,做到能夠掌握并熟練使用。課余時間多多做一些電路的仿真,這對我們將來找工作有很大的方便。

通過這次課程設(shè)計我發(fā)現(xiàn)了自己有很大的不足,書本上的知識固然重要,但是真正應(yīng)用到實際當中才是最主要的,F(xiàn)在學(xué)習(xí)專業(yè)知識,只是為運用到實際中打下堅實的基礎(chǔ),我們應(yīng)該多鍛煉自己的動手能力,多練習(xí)自己的焊接技術(shù)、排版能力、接線技巧等,這對以后的工作將會是一個巨大的幫助,通過本次課程設(shè)計,對我各方面都具有一定的影響,在以后的學(xué)習(xí)生活中,我會更加努力的去學(xué)習(xí)各種關(guān)于專業(yè)的知識,充實自己,使自己有充分的的提高。

參考文獻

[1] 張毅剛. 單片機原理及應(yīng)用 [M]. 北京:高等教育出版社,2016

[2] 陳峰. DSP原理與系統(tǒng)設(shè)計 [M]. 北京:電子工業(yè)出版社,2010

[3] 張敏霞. C語言程序設(shè)計教程 [M]. 北京:電子工業(yè)出版社,2013

[4] 閆石. 數(shù)字電子技術(shù)基礎(chǔ) [M]. 北京: 高等教育出版社,1998

[5] 童詩白. 模擬電子技術(shù)基礎(chǔ) [M]. 北京: 高等教育出版社,2015                                                                                                                                      

教師評語:

單片機源程序如下:
  1. #include
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uchar num,temp;
  5. uchar keyscan();
  6. void delay(uint z);
  7. void display(uchar aa);
  8. uchar code table[]={0x3f,0x06,0x5b,0x4f,
  9.                     0x66,0x6d,0x7d,0x07,
  10.                     0x7f,0x6f};
  11. //****************主函數(shù)*****************//
  12. void main()
  13. {
  14. while(1)
  15. {
  16. keyscan();
  17. display(num);
  18. }
  19. }
  20. //***************延時函數(shù)***************//
  21. void delay(uint z)
  22. {
  23. uint x,y;
  24. for(x=z;x>0;x--)
  25. for(y=100;y>0;y--);
  26. }
  27. //***************鍵盤掃描***************//
  28. uchar keyscan()
  29. {
  30. P1=0xfe;
  31. temp=P1;
  32. temp=temp&0xf0;
  33. while(temp!=0xf0)
  34. {
  35. delay(2);
  36. temp=P1;
  37. temp=temp&0xf0;
  38. while(temp!=0xf0)
  39. {
  40. temp=P1;
  41. switch(temp)
  42. {
  43. case 0xee:num=11;
  44. break;
  45. case 0xde:num=12;
  46. break;
  47. case 0xbe:num=13;
  48. break;
  49. case 0x7e:num=14;
  50. break;
  51. }
  52. while(temp!=0xf0)
  53. {
  54. temp=P1;
  55. temp=temp&0xf0;
  56. }
  57. }
  58. }
  59. P1=0xfd;
  60. temp=P1;
  61. temp=temp&0xf0;
  62. while(temp!=0xf0)
  63. {
  64. delay(2);
  65. temp=P1;
  66. temp=temp&0xf0;
  67. while(temp!=0xf0)
  68. {
  69. temp=P1;
  70. switch(temp)
  71. {
  72. case 0xed:num=21;
  73. break;
  74. case 0xdd:num=22;
  75. break;
  76. case 0xbd:num=23;
  77. break;
  78. case 0x7d:num=24;
  79. break;
  80. }
  81. while(temp!=0xf0)
  82. {
  83. temp=P1;
  84. temp=temp&0xf0;
  85. }
  86. }
  87. }
  88. P1=0xfb;
  89. temp=P1;
  90. temp=temp&0xf0;
  91. while(temp!=0xf0)
  92. {
  93. delay(2);
  94. temp=P1;
  95. temp=temp&0xf0;
  96. while(temp!=0xf0)
  97. {
  98. temp=P1;
  99. switch(temp)
  100. {
  101. case 0xeb:num=31;
  102. break;
  103. case 0xdb:num=32;
  104. break;
  105. case 0xbb:num=33;
  106. break;
  107. case 0x7b:num=34;
  108. break;
  109. }
  110. while(temp!=0xf0)
  111. {
  112. temp=P1;
  113. temp=temp&0xf0;
  114. }
  115. }
  116. }
  117. P1=0xf7;
  118. temp=P1;
  119. temp=temp&0xf0;
  120. while(temp!=0xf0)
  121. {
  122. delay(2);
  123. temp=P1;
  124. temp=temp&0xf0;
  125. while(temp!=0xf0)
  126. {
  127. temp=P1;
  128. switch(temp)
  129. {
  130. case 0xe7:num=41;
  131. break;
  132. case 0xd7:num=42;
  133. break;
  134. case 0xb7:num=43;
  135. break;
  136. case 0x77:num=44;
  137. break;
  138. }
  139. ……………………

  140. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼


完整論文下載(word格式 可編輯):
楊榮慶.docx (686.28 KB, 下載次數(shù): 35)



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:219299 發(fā)表于 2017-7-13 09:43 | 只看該作者
編程有誤
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表