欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 17752|回復: 1
收起左側

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

[復制鏈接]
ID:219228 發表于 2017-7-12 20:59 | 顯示全部樓層 |閱讀模式

單片機及接口課程設計報告

          專    業: 電子信息工程

          班    級:    信息143

          姓    名:      楊榮慶

          學    號: 201427187   

          指導教師: 李恩玉、吳則舉、王辛杰

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

         通信與電子工程學院


目錄

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




一 課程設計及任務要求

1.1 設計任務

鍵盤接口和顯示設計,設計并實現一4×4鍵盤的接口,并在兩個數碼管上顯示鍵盤所在的行與列。

1.2設計要求

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

② 在KEIL C平臺上使用C語言編程實現編程,并調試通過;

③ 在PROTEUS平臺上利用設計好的原理圖和調試好的程序完成整個仿真;

④ 在單片機最小系統板上實現仿真后軟硬件設計;

1.3設計目的

    為了進一步鞏固學習的理論知識,增強對所學知識的實際應用能力和運用所學的知識解決實際問題的能力,進行本次課程設計。通過設計使我在鞏固所學知識的基礎之上具有初步的單片機系統設計與應用能力。

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

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

③ 了解單片機接口應用開發的全過程:分析需求、設計原理圖、選用元器件、布線、編程、調試、撰寫報告等。

總體方案介紹

2.1鍵盤接口

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

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

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

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

2.2顯示接口:

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


三 硬件設計
3.1總體設計框圖

1.001.jpg

圖3-1總電路圖

3.2部分硬件設計及其原理

1.002.jpg

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

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


1.003.jpg

圖3-3 數碼管硬件圖

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

1.004.jpg

圖3-4 STC89C52芯片

(1)8位CPU

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

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

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

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

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

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

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


四 軟件設計

4.1程序流程圖

(在51hei附件里面)


  圖4-1 總程序流程圖

1.043.jpg

                 圖4-3  鍵盤掃描流程圖

4.2程序源代碼

五 調試

5.1仿真結果截圖

1.044.jpg

圖5-1 初始狀態數碼管顯示為“00”

1.045.jpg

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

5.2實物圖
1.046.jpg

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

1.047.jpg

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

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

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

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

6.2課程設計總結

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

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

6.3收獲和體會

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

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

參考文獻

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

[2] 陳峰. DSP原理與系統設計 [M]. 北京:電子工業出版社,2010

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

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

[5] 童詩白. 模擬電子技術基礎 [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. //****************主函數*****************//
  12. void main()
  13. {
  14. while(1)
  15. {
  16. keyscan();
  17. display(num);
  18. }
  19. }
  20. //***************延時函數***************//
  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黑下載附件…………
復制代碼


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



回復

使用道具 舉報

ID:219299 發表于 2017-7-13 09:43 | 顯示全部樓層
編程有誤
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表