標(biāo)題: 單片機(jī)4*4鍵盤的電路設(shè)計(jì)以及源代碼課程設(shè)計(jì)報(bào)告 [打印本頁(yè)]

作者: 阿慶    時(shí)間: 2017-7-12 20:59
標(biāo)題: 單片機(jī)4*4鍵盤的電路設(shè)計(jì)以及源代碼課程設(shè)計(jì)報(bào)告

單片機(jī)及接口課程設(shè)計(jì)報(bào)告

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

          班    級(jí):    信息143

          姓    名:      楊榮慶

          學(xué)    號(hào): 201427187   

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

          時(shí)    間: 2017-01-02~2017-01-13

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


目錄

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




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

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

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

1.2設(shè)計(jì)要求

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

② 在KEIL C平臺(tái)上使用C語(yǔ)言編程實(shí)現(xiàn)編程,并調(diào)試通過(guò);

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

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

1.3設(shè)計(jì)目的

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

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

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

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

總體方案介紹

2.1鍵盤接口

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

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

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

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

2.2顯示接口:

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


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

圖3-1總電路圖

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

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

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


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

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

圖3-4 STC89C52芯片

(1)8位CPU

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

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

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

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

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

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

(8)1個(gè)看門狗定時(shí)器(WDT)


四 軟件設(shè)計(jì)

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實(shí)物圖

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

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

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

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

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

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

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

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

6.3收獲和體會(huì)

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

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

參考文獻(xiàn)

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

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

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

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

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

教師評(píng)語(yǔ):

單片機(jī)源程序如下:
  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í)函數(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. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼


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




作者: yuanhang1001    時(shí)間: 2017-7-13 09:43
編程有誤




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1