新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 單片機關(guān)鍵技術(shù)基礎(chǔ)詳解(五)

單片機關(guān)鍵技術(shù)基礎(chǔ)詳解(五)

作者: 時間:2012-03-20 來源:網(wǎng)絡(luò) 收藏

被廣泛應(yīng)用于工業(yè)控制,家電,消費電子,醫(yī)療電子,儀表測量等領(lǐng)域,為應(yīng)廣大初級電子工程師/愛好者之需,電子發(fā)燒友網(wǎng)隆重策劃整合推出《》系列文章,以后會陸續(xù)推出其他章節(jié),敬請廣大工程師朋友繼續(xù)關(guān)注和留意。應(yīng)廣大工程師網(wǎng)友對前面章節(jié)熱烈反響,電子發(fā)燒友網(wǎng)會再接再厲為各位工程師網(wǎng)友推出更多精品系列文章,以饗讀者。

本文引用地址:http://m.butianyuan.cn/article/171841.htm

  參閱相關(guān)系列章節(jié)

  單片機技術(shù)(一)

  單片機技術(shù)(二)

  單片機關(guān)鍵技術(shù)基礎(chǔ)詳解(三)

  單片機關(guān)鍵技術(shù)基礎(chǔ)詳解(四)

  一、單片機矩陣鍵盤原理與結(jié)構(gòu)

  矩陣式結(jié)構(gòu)的鍵盤識別要復(fù)雜一些,列線通過電阻接正電源,并將行線所接的單片機的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當(dāng)按鍵沒有按下時,所有的輸入端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態(tài)就可得知是否有鍵按下了。

  

  在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接。這樣,一個端口(如P1口)就可以構(gòu)成4*4=16個按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數(shù)越多,區(qū)別越明顯,比如再多加一條線就可以構(gòu)成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵)。由此可見,在需要的鍵數(shù)比較多時,采用矩陣法來做鍵盤是合理的。

  《1》確定矩陣式鍵盤上何鍵被按下介紹一種“行掃描法”。

  行掃描法 行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識別方法,如上圖所示鍵盤,介紹過程如下。

  1、判斷鍵盤中有無鍵按下 將全部行線Y0-Y3置低電平,然后檢測列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。

  2、判斷閉合鍵所在的位置 在確認(rèn)有鍵按下后,即可進(jìn)入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態(tài)。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。

  《2》確定矩陣式鍵盤上何鍵被按下介紹一種“高低電平翻轉(zhuǎn)法”。

  首先讓P1口高四位為1,低四位為0,。若有按鍵按下,則高四位中會有一個1翻轉(zhuǎn)為0,低四位不會變,此時即可確定被按下的鍵的行位置。

  然后讓P1口高四位為0,低四位為1,。若有按鍵按下,則低四位中會有一個1翻轉(zhuǎn)為0,高四位不會變,此時即可確定被按下的鍵的列位置。

  最后將上述兩者進(jìn)行或運算即可確定被按下的鍵的位置。

  二、什么是格雷碼

  格雷碼(Gray code),又叫循環(huán)二進(jìn)制碼或反射二進(jìn)制碼 在數(shù)字系統(tǒng)中只能識別0和1,各種數(shù)據(jù)要轉(zhuǎn)換為二進(jìn)制代碼才能進(jìn)行處理,格雷碼是一種無權(quán)碼,采用絕對編碼方式,典型格雷碼是一種具有反射特性和循環(huán)特性的單步自補碼,它的循環(huán)、單步特性消除了隨機取數(shù)時出現(xiàn)重大誤差的可能,它的反射、自補特性使得求反非常方便。格雷碼屬于可靠性編碼,是一種錯誤最小化的編碼方式

  簡介

  因為,自然二進(jìn)制碼可以直接由數(shù)/模轉(zhuǎn)換器轉(zhuǎn)換成模擬信號,但某些情況,例如從十進(jìn)制的3轉(zhuǎn)換成4時二進(jìn)制碼的每一位都要變,使數(shù)字電路產(chǎn)生很大的尖峰電流脈沖。而格雷碼則沒有這一缺點,它是一種數(shù)字排序系統(tǒng),其中的所有相鄰整數(shù)在它們的數(shù)字表示中只有一個數(shù)字不同。它在任意兩個相鄰的數(shù)之間轉(zhuǎn)換時,只有一個數(shù)位發(fā)生變化。它大大地減少了由一個狀態(tài)到下一個狀態(tài)時邏輯的混淆。另外由于最大數(shù)與最小數(shù)之間也僅一個數(shù)不同,故通常又叫格雷反射碼或循環(huán)碼。

  2、格雷碼對照表

  

  下表為幾種自然二進(jìn)制碼與格雷碼的對照表:

  一般的,普通二進(jìn)制碼與格雷碼可以按以下方法互相轉(zhuǎn)換:

  二進(jìn)制碼-》格雷碼(編碼):從最右邊一位起,依次將每一位與左邊一位異或(XOR),作為對應(yīng)格雷碼該位的值,最左邊一位不變(相當(dāng)于左邊是0);

  格雷碼-〉二進(jìn)制碼(解碼):從左邊第二位起,將每位與左邊一位解碼后的值異或,作為該位解碼后的值(最左邊一位依然不變)。

  數(shù)學(xué)(計算機)描述:

  原碼:p[n:0];格雷碼:c[n:0](n∈N);編碼:c=G(p);解碼:p=F(c);

  書寫時按從左向右標(biāo)號依次減小,即MSB-》LSB,編解碼也按此順序進(jìn)行

  編碼:

  。..。..。..。..。..。...c[n]=p[n],

  。..。..。..。..。..。...c[i]=p[i] XOR p[i+1] (i∈N,n-1≥i≥0);

  解碼:

  。..。..。..。..。..。...p[n]=c[n],

  。..。..。..。..。..。...P[i]=c[i] XOR p[i+1] (i∈N, n-1≥i≥0)。

  Gray Code是由貝爾實驗室的Frank Gray在20世紀(jì)40年代提出的(是1880年由法國工程師Jean-Maurice-Emlle

  Baudot發(fā)明的),用來在使用PCM(Pusle Code Modulation)方法傳送訊號時避免出錯,并于1953年3月17日取得美國專利。由定義可知,Gray Code的編碼方式不是唯一的,這里討論的是最常用的一種。

  用異或乘除法實現(xiàn)二進(jìn)制碼與格雷碼互相轉(zhuǎn)換

  如果在二進(jìn)制運算中忽略進(jìn)位、退位,那么加減運算都變成了異或(XOR)。

  用異或代替加減進(jìn)行二進(jìn)制豎式乘除,稱為異或乘除,它的特點是無進(jìn)退位。

  由于沒有退位,異或除法將變得更像多項式除法。

  如:10101除以11將變成1100余1,而不是111。

  二進(jìn)制轉(zhuǎn)格雷碼:

  只要異或乘以二分之三,即二進(jìn)制的1.1,然后忽略小數(shù)部分;也可以理解成異或乘以三(即11),再右移一位。

  格雷碼轉(zhuǎn)二進(jìn)制:

  異或乘以三分之二,即除以1.1,忽略余數(shù);或者左移一位,再異或除以三,忽略余數(shù)。

  格雷碼轉(zhuǎn)二進(jìn)制方法

  二進(jìn)位碼第n位 = 二進(jìn)位碼第(n+1)位+格雷碼第n位。因為二進(jìn)位碼和格雷碼皆有相同位數(shù),所以二進(jìn)位碼可從最高位的左邊位元取0,以進(jìn)行計算。(注:遇到1+1時結(jié)果視為0)

  例如: 格雷碼0111,為4位數(shù),所以其所轉(zhuǎn)為之二進(jìn)位碼也必為4位數(shù),因此可取轉(zhuǎn)成之二進(jìn)位碼第五位為0,即0 b3 b2 b1 b0。

  0+0=0,所以b3=0

  0+1=1,所以b2=1

  1+1取0,所以b1=0

  0+1取1,所以b0=1

  因此所轉(zhuǎn)換為之二進(jìn)位碼為0101

  格雷碼轉(zhuǎn)換快速方法

 ?。僭O(shè)以二進(jìn)制為0的值做為格雷碼的0)

  G:格雷碼 B:二進(jìn)位碼

  G(N) = B(n+1) XOR B(n)

  

  

  
三、AVR單片機開發(fā)經(jīng)驗

  AVR與傳統(tǒng)類型的單片機相比,除了必須能實現(xiàn)原來的一些基本的功能,其在結(jié)構(gòu)體系、功能部件、性能和可靠性等多方面有很大的提高和改善。

  但使用更好的器件只是為設(shè)計實現(xiàn)一個好的系統(tǒng)創(chuàng)造了一個好的基礎(chǔ)和可能性,如果還采用和沿襲以前傳統(tǒng)的硬件和軟件設(shè)計思想和方法的話,是不能用好AVR的,甚至也不能真正的了解AVR的特點和長處。

  功能越好的器件,需要具備更高技術(shù)和能力的人來使用和駕馭它。就象一部好的F1賽車,只有具備高超技術(shù)的駕駛員才能充分體會到車的特點,并能最大限度的發(fā)揮出車的性能。

  AVR具有上手入門快,開發(fā)方便簡單的特點,但要充分體會和發(fā)揮AVR的優(yōu)點,還需要應(yīng)用工程師本身的硬軟件設(shè)計開發(fā)能力的不斷學(xué)習(xí)、實踐提高。

  “外行看熱鬧,內(nèi)行看門道”,對于有一定基礎(chǔ)的嵌入式和單片機系統(tǒng)設(shè)計開發(fā)的工程師,不妨先簡單嘗試一下AVR。

  開發(fā)環(huán)境與工具:PC+下載線+實際的系統(tǒng)板

PC上的開發(fā)軟件:

  AVR Studio(Free)匯編+匯編調(diào)試+高級語言調(diào)試+軟件仿真

  ICC、CVAVR、BASCOM-AVR 高級語言程序開發(fā)+程序下載。其中一個購買正版全功能,作為主要的開發(fā)環(huán)境,其它使用DEMO版,作為輔助及參考。

  AVR ISP下載線:

  STK200 And STK200+ And STK300 ISP Programmer。通過PC的打印機口,采用ISP技術(shù)將系統(tǒng)運行代碼(HEX、BIN)和數(shù)據(jù)寫入AVR芯片的Flash和EEProm中,編程AVR的配置熔絲位和加密位。支持決大多數(shù)的AVR芯片、以及ATMEL的51兼容芯片89S8252、89S52等。在ICC、CVAVR、BASCOM-AVR、BASCOM-8051中都內(nèi)含對該下載線的支持程序。免費專用的下載程序:SLISP、PonyProg2000等。

  盡量不使用仿真器的建議:

  在開發(fā)和調(diào)試系統(tǒng)程序時,有許多人完全依賴于仿真器,一旦離開了仿真器時就感覺無從下手。其實,由于AVR的Flash存貯器可方便的使用ISP技術(shù)在線的多次擦寫,因此建議盡量不使用(依賴)仿真器來開發(fā)和調(diào)試程序。

  在實際開發(fā)過程中,程序的調(diào)試可以從下幾方面入手:

  現(xiàn)在的高級語言編譯器(如C編譯器)可以產(chǎn)生效率很高的機器代碼,因此建議大家盡量使用高級語言編寫系統(tǒng)程序。

  使用Atmel公司提供AVR Studio軟件模擬仿真環(huán)境,以及其他的軟件模擬仿真環(huán)境(BASCOM-AVR)。

  盡可能使用高級語言編寫系統(tǒng)程序。

  利用目標(biāo)板上的LED、LCD或異步串口。見附件“沒有仿真器的情況下如何開發(fā)AVR”的介紹。

  提高硬件設(shè)計的合理性:

  盡量合理和充分使用AVR片內(nèi)的資源,如EEPROM、A/D、內(nèi)部的RC振蕩源。

  盡量采用串口通信連接的外圍器件,大容量的存儲器、LCD控制器、打印機、不用8279(LED數(shù)碼管+鍵盤)而使用7279等。除了必須外擴RAM(如語音和圖象),一般不提倡使用并行擴展(573+譯碼電路),減小硬件和連線以及PCB板上錯誤的出現(xiàn)概率,同時也提高了系統(tǒng)的可靠性。并行擴展向串行擴展是發(fā)展趨勢。現(xiàn)在有大量的新的外圍器件采用高速的串行接口,如A/D、D/A、RTC、存儲器等。

  盡量使用以及在目標(biāo)板上預(yù)留ISP程序下載接口,或使用IAP技術(shù)。

  優(yōu)點:ISP接口與I/O的兼容性比JETAG好。

  缺點:不能在線調(diào)試

  注意和掌握AVR配置熔絲位的使用:

  。 系統(tǒng)晶振的選擇

  .BOD的使用

  。啟動延時.Mega8的PC6引腳,RESET與通用I/O的轉(zhuǎn)換

  .JETAG接口和通用I/O的轉(zhuǎn)換

  。啟動向量的轉(zhuǎn)換,BOOT-LOAT區(qū)大小的設(shè)置

  提高硬件可靠性的考慮:

  。盡量采用片內(nèi)晶體、采用低頻率的系統(tǒng)時鐘、振蕩電路的輸出小幅度。

  。選擇合適的啟動延時參數(shù)

  。使用BOD、片內(nèi)的看門狗

  。合理休眠方式的使用

  。不用I/O口設(shè)定輸出低電平

  。利用內(nèi)部的EEProm和寄存器MCUCSR判斷復(fù)位標(biāo)志,進(jìn)行不同的處理

  提高軟件設(shè)計的能力和水平:

  盡量合理采用高級語言設(shè)計編寫系統(tǒng)程序。有許多人認(rèn)為使用匯編寫程序比較精簡,而用高級語言開發(fā)會浪費很多程序空間,其實這是一種誤解。對一個有經(jīng)驗的,而且非常熟悉某種單片機的匯編高手而言,他是能寫出比高級語言更精簡的代碼。而對匯編不是很熟的開發(fā)者、或突然更換了一種新的單片機,您能保證一定可以寫出比高級語言更簡練的代碼嗎?

  高級語言的優(yōu)越性是匯編語言不能比的:

  。程序移植方便

  。程序的堅固性

  。數(shù)學(xué)運算的支持

  。條理清晰的結(jié)構(gòu)化編程,程序的可維護性。

  ??蓞f(xié)同開發(fā)軟件,開發(fā)周期短。

  現(xiàn)在的高級語言編譯器(如C編譯器)已可以產(chǎn)生代碼效率很高的機器代碼,因此建議大家能用高級語言實現(xiàn)的程序盡可能使用高級語言寫,在對速度和時序要求特嚴(yán)的場合可以采用混合編程的方法來解決。

  更深入和全面的掌握各種串行通信協(xié)議的規(guī)程:

  嵌入式系統(tǒng)目前以大量的使用串行接口外圍芯片和各種通信接口,如RS232、兩線(I2C)、三線(SPI)、單總線、USB、CAN、TCP/IP等。開發(fā)人員和程序員應(yīng)了解低層協(xié)議,熟悉硬件怎樣和如何實現(xiàn)低層協(xié)議,如何定義可靠的上層應(yīng)用協(xié)議,以及低層協(xié)議驅(qū)動同上層應(yīng)用協(xié)議之間的接口設(shè)計(中間層軟件的實現(xiàn))等。

  硬件工程師的軟件編寫能力要提高,采用標(biāo)準(zhǔn)程序編寫方式、完善的軟件整體框架的設(shè)計、良好的數(shù)據(jù)結(jié)構(gòu)和程序結(jié)構(gòu)系統(tǒng)。(計算機軟件專業(yè)的程序設(shè)計員對硬件不熟悉、大部分是在操作系統(tǒng)支持下編寫軟件,對低層接口和協(xié)議的驅(qū)動層以及接口也不了解,往往也編寫不出好的單片機系統(tǒng)程序。)

  通信接口的編寫應(yīng)盡量

  。采用中斷+緩沖區(qū),

  。分層+結(jié)構(gòu)化設(shè)計,

  。盡量不使用輪循方式(降低AVR的效率)。參見URAT(RS232)驅(qū)動+中間層軟件示例。

tcp/ip相關(guān)文章:tcp/ip是什么



上一頁 1 2 3 下一頁

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉