矩陣形式的經(jīng)典力學方程_第1頁
矩陣形式的經(jīng)典力學方程_第2頁
矩陣形式的經(jīng)典力學方程_第3頁
矩陣形式的經(jīng)典力學方程_第4頁
矩陣形式的經(jīng)典力學方程_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

矩陣形式的經(jīng)典力學方程(完整版)實用資料(可以直接使用,可編輯完整版實用資料,歡迎下載)

矩陣形式的經(jīng)典力學方程(完整版)實用資料(可以直接使用,可編輯完整版實用資料,歡迎下載)矩陣形式的經(jīng)典力學方程盧新平(閩江學院物理學與電子信息工程系,福建福州350108)摘要:本文探討矩陣在力學中的運用,給出矩陣形式的經(jīng)典力學方程:[A|F>=[A|>,該方程形式簡單,計算方便,用途廣泛。關鍵詞:矩陣;位形空間;廣義坐標。中圖分類號:O316文獻標識碼:A文章編號:ClassicalMechanicsEquationviatheMatrixLuXin-ping(PhysicsandElectronicsInformationEngineeringDepartmentofMinjiangUniversity,FuzhouFujian350108)Abstract:Inthispaper,wedevelopanewclassicalmechanicsequationviathematrix:[A|F>=[A|>.Theresultsshowedthatthisequationissimple,convenientanduseful.KeyWords:Matrix;Configurationspace;Generalizedcoordinate.物理學是優(yōu)美的,它的美表現(xiàn)在基本物理規(guī)律的簡潔性和普適性。然而,物理學的簡潔性是隱蔽的,它具有深奧而含蓄的內(nèi)在美。不懂得它的語言,是很難領會到的。用矩陣語言表述力學方程,不僅在形式上具有極大的簡潔性,而且計算方便。當前科學計算中,幾乎無處不用矩陣運算。MATLAB(“矩陣實驗室”的縮寫)是集數(shù)值計算、符號運算以及圖形處理等強大功能于一體的優(yōu)秀的計算機計算軟件,它是以矩陣運算為基礎的交互式程序語言。在MATLAB中,每一個變量代表一個矩陣;所有的運算都對矩陣有效,包括加減乘除和函數(shù)運算,而且只要鍵入算式,立即就得到結果,頗為方便?;谏鲜隹紤],本文研究矩陣在經(jīng)典力學中的運用,試圖探討與欣賞理想約束系統(tǒng)運動方程的簡潔之美。1.矩陣符號約定當某一矢量用慣性參考系中的直角坐標基矢i1、i2、…展開時,可以省略基矢符號,記為左矢行矩陣<|形式,也可以記為右矢列矩陣|>形式;當空格中符號相同時,它們是互為轉(zhuǎn)置矩陣。投影方向矢記為(|;左乘投影矩陣記為[|。我們采用計算機軟件MATLAB語言:矩陣的值寫在方括號內(nèi),n行m列矩陣的所有元素也可在一個方括號內(nèi)一字排開,同一行各元素之間用逗號分開,不同的行則以分號隔開。例如,三維空間中質(zhì)點位形矢可表為<x|=[x1,x2,x2]或:|x>=[x1,x2,x2]T=[x1;x2;x3]2.矩陣形式的動力學方程2.1.質(zhì)點和質(zhì)點系動力學方程在慣性系中質(zhì)點系和質(zhì)點(視為N=1的質(zhì)點系)矢量式動力學方程為:收稿日期:2005-07-23基金項目:閩江學院力學教改與力學精品課程建設資助。作者簡介:盧新平(1950~),男,福建閩侯人,閩江學院物理學與電子信息工程系副教授。|P>=|>=|F>+|R>(1)式中:|F>=[F1;…;F3N]為主動力,|R>為約束力;|P>=[p1;…;p3N]為質(zhì)點系的動量。矢量方程(1)可沿任意方向(e|投影:(e||P>=(e|>=(e|F>+(e|R>(2)設N質(zhì)點系統(tǒng)自由度為s,則系統(tǒng)在x-空間位形可用s個廣義坐標q:q1,…,qs表出:<x|=[x1(q1,…,qs,t),…,x3N(q1,…,qs,t)]廣義坐標qj的基向量可用x-空間坐標基矢表為:(qj|=<x|=[](3a)或(qj|=<|=[](3b)系統(tǒng)的s個廣義坐標基向量(q1|,…,(qs|可合寫為一個s行左乘投影矩陣:[A|=(4)傳統(tǒng)的質(zhì)點系統(tǒng)力學之所以能夠得出一系列重要的結果,是因為尋找到了一個正確的出發(fā)點:把力區(qū)分為內(nèi)力與外力。在此,我們?yōu)榱说贸隽硪恍┬碌慕Y果,也尋找到了另一個正確的出發(fā)點:把力區(qū)分為主動力與約束力。粗略地說,約束就是對質(zhì)點系運動的限制;理想約束力是那些不做功的力,有(qj|R>=0(參見文獻[1].),系統(tǒng)沿(qj|方向的投影方程可表為:(qj|>=(qj|F>(j=1,2,…,s)(5a)這s個獨立方程可用一個矩陣方程簡潔地表為:[A|>=[A|F>(5b)其中:|P>=[p1;…;p3N]為系統(tǒng)的用廣義坐標q與廣義速度表示的動量;主動力|F>中不包括約束作用力;系統(tǒng)x-空間的維數(shù)可根據(jù)實際情況減少,未必總是為3N.2.2.剛體平面運動動力學方程為了把方程(5)應用于平面運動的剛體,可以定義平面運動剛體的“位形矢”為:<x|=[xc,yc,],式中:xc與yc是質(zhì)心坐標,為剛體繞質(zhì)心軸轉(zhuǎn)動的角坐標;定義平面運動剛體的“速度”為:<v|=[c,c,];定義平面平行運動剛體的“動量”為:<p|=(mc,mc,Ic),其中Ic為剛體對質(zhì)心c軸的轉(zhuǎn)動慣量;定義作用于剛體上的主動“力”為:<F|=[Fx,Fy,c],其中c為有功主動力對質(zhì)心c的力矩。引入廣義坐標q,按公式(3a)或(3b)求廣義坐標基向量;則方程(5)就可作為剛體平面運動的動力學方程了。2.3.剛體一般運動動力學方程在某慣性系中,定義一般運動剛體的“速度”:<v|=[c,c,c,];定義其“動量”:<p|=[mc,mc,mc,IcxIcyy,IcZZ];定義作用于剛體上的主動“力”:<F|=[Fx,Fy,Fz,cx,cy,cz].引入廣義坐標q,按公式(3b)求廣義坐標基向量;則方程(5)也就可作為剛體一般運動的動力學方程了。至此小結一下:方程(5)把多種動力學問題統(tǒng)一起來,它可以適用于一般的質(zhì)點和質(zhì)點系統(tǒng)、剛體和剛體系統(tǒng)、質(zhì)點和剛體混合系統(tǒng),等等;它包含了受約束(理想約束,幾何約束)的情況和不受約束的情況;同時也包含了直角坐標以及一般曲線坐標。方程(5)主要特點是:1)引入廣義坐標,虛位移通過廣義坐標表達,只考慮主動力不考慮理想約束力,使得方程簡潔,解題方便;2)方程尤其適用于多自由度多廣義坐標的比較復雜的完整約束系統(tǒng);3)不管取什么為廣義坐標,方程形式總是不變,解題步驟與格式也總是不變;4)適合采用計算機求解。3.矩陣形式的靜力學平衡方程3.1.靜力學問題的動力學方法靜動法矩陣形式的動力學方程(5)同樣適用于靜力學。剛體或理想約束的質(zhì)點系如果受力平衡,則運動狀態(tài)不發(fā)生變化,方程(5)左邊為為零。因此,受有理想約束的力學系統(tǒng)平衡的充要條件是:[A|F>=0或Qj=(qj|F>=0(j=1,…,s)(6)式中Qi是廣義坐標基(qi|方向上的“廣義力”。利用此方程求解理想約束的力學系統(tǒng)的平衡問題時,約束反力不出現(xiàn)于方程而自動消去,所以可以很簡單地求出主動力在平衡位置時所應滿足的平衡條件。3.2.動力學問題的靜力學方法――動靜法方程(6)是分析靜力學中的基本方程。動力學方程(5)實際上也可以寫成方程(6)的形式:令|F*>=|F>-|P>,則方程(5)即可寫為:[A|F*>=0或Qj=(qj|F*>=0(j=1,…,s)(7)因此,可用用動力學方法求解靜力學問題,也可以用靜力學方法求解動力學問題。靜力學與動力學問題可以用方程(5)統(tǒng)一起來。4.矩陣形式的拉格朗日方程作為理論應用,我們可以由方程(5)推導出分析力學中著名的拉格朗日方程,從而證明方程(5)就是矩陣形式的拉格朗日方程。顯然,方程(5a)的右邊就是廣義力:(qj|F>=Fk=Qj(8)式中對重復下標k取和:k=1,…,3N,略寫求和符號,以下遇到重復指標皆表取和。方程(5a)左邊為:(qj|>=(qj||P>=[(qj|P>)-(j|P>(9)由公式(3b)可得:(qj|P>=mkvkvk=(mkvk2)=(10)由公式(j|=(qj|=<x|=<v|可得:(j|P>=mkvkvk=(mkvk2)=(11)式中T=mkk2=mkvk2為系統(tǒng)動能(其中m3k-2=m3k-1=m3k為第k個質(zhì)點質(zhì)量)綜合(8)、(9)、(10)、(11)就得到基本形式的拉格朗日方程:-=Qj(j=1,2,……,s)(12)因此,筆者認為方程(5)與拉格朗日方程等價,是拉格朗日方程的矩陣形式。當前科學計算中,幾乎無處不用矩陣運算,這使方程(5)的優(yōu)勢得到充分體現(xiàn),該方程最適宜于引用MATLAB計算軟件求解。5.算例例1.質(zhì)量M=3kg半徑為R=20cm的均質(zhì)圓柱體C放在質(zhì)量m=1kg的木板B上,木板放在光滑水平面上,木板受到一個水平拉力F=20N作用,已知圓柱體在木板上純滾動。試求:木板的加速度a.解:選取圓柱體C和木板B為系統(tǒng)研究,其自由度s=2。如圖所示,取木板移動的速度v和圓柱體轉(zhuǎn)動的角速度為廣義坐標(廣義速度),則系統(tǒng)的“速度矢”為:.<V|=[vB,vC,]=[v,v-R,];廣義坐標基向量:(v|=<V|=[1,1,0],(|=<V|=[0,-R,1];合寫為2行左乘投影矩陣:[A|=;作用于系統(tǒng)的主動力:|F>=[F;0;0];系統(tǒng)“動量”:|P>=[mv;M(v-R);Ic]所以|>==,其中Ic==0.06(kg·m2)據(jù)方程(5b)得:=以上完成了“建?!?,往下數(shù)值計算可以采用MATLAB軟件?!綧ATLAB計算程序】clear,formatcompact%按A*B*X=A*F列寫此系統(tǒng)的矩陣方程,其中X=[a;]。A=[1,1,0;0,-0.2,1];B=[1,0;3,-3*0.2;0,0.06];F=[20;0;0].C=A*B;D=A*F;X=C\D;%解出Xa=X(1)%顯示要求的分量【程序運行結果】a=10答案:木板的加速度為10m/s2例2.長為2L的均質(zhì)棒,右端A抵在光滑的墻壁上,而棒身則如圖所示斜靠在與墻壁相距為d(d<Lcos)的光滑棱角上。求棒在平衡時與水平面所成的夾角解:棒在質(zhì)心C處受豎直向下主動力mg(重力),以棒與棱角接觸點為原點,豎直向上為oy軸建立坐標系,如圖所示,則主動力為:|F>=[-mg];取q=角為廣義坐標,則主動力作用點的位矢可表為<X|=[yc]=[(L-)sin]廣義坐標基向量:(q|=<X|=[Lcos-d·sec2];據(jù)方程(6),棒的平衡方程(q|F>=0即:(Lcos-d·sec2)mg=0由此可得:=arccos()1/3.解畢.6.結論方程(5)把多種動力學問題統(tǒng)一起來,還把靜力學問題與動力學統(tǒng)一起來。它是分析力學中拉格朗日方程的矩陣形式。當前科學計算中,幾乎無處不用矩陣運算。方程(5)適宜于引用MATLAB計算軟件求解。總之,矩陣形式的動力學方程(5)具有簡單性、普遍性、方便性與實用性。參考文獻:[1]盧新平.用Dirac符號表述的非自由質(zhì)點系動力學方程[J].力學與實踐,2005(1).[2]朱照宣,周起釗,殷金生.理論力學[M].北京:北京大學出版社,1982.[3]W.Hauser:IntroductiontothePrinciplesofMechanics[M].Addison-WeslesPublishingCompany.1987.第一章線性方程組與矩陣課程教案授課題目:第二節(jié)矩陣概念與矩陣的初等變換教學目的:1.掌握高斯消元法求解線性方程組.2.理解矩陣的概念、運算及其性質(zhì),掌握矩陣的初等行變換.教學重點:本章以課堂教學為主,使學生掌握矩陣的初等行變換,提高學生的邏輯思維能力和計算能力.教學難點:初等行變換的運用.課時安排:2學時.授課方式:多媒體與板書結合.教學基本內(nèi)容:§1.2矩陣概念與矩陣的初等變換1.概念對線性方程組(1其系數(shù)可用表示.定義1個數(shù)排列成行(橫向)、列(縱向)的矩形數(shù)表:

稱為矩陣,簡記為,其中為中第行第列的元素.如是3行4列的矩陣.這里,3×4是個記號,表明矩陣有3行4列的事實而不能取乘積“12”.2.一些特殊的矩陣1行矩陣——只有一行的矩陣.例.2列矩陣——只有一列的矩陣.例.3零矩陣——所有元素都等于0的矩陣.例.4同型矩陣——行數(shù)相同、列數(shù)也相同.例與同型.5當時稱為階方陣;所在的對角線稱為方陣的主對角線.6主對角線下(上)方的元素全為零的方陣稱為上(下)三角陣.例為上三角陣;為下三角陣.7主對角線以外的元素全為零的方陣稱為對角陣,記為,簡記為.8數(shù)量陣——對角陣中.例.9單位陣——數(shù)量陣中,記以或.例.注(1)只有1列或1行的矩陣分別稱為列矩陣或行矩陣,也被稱為列向量或行向量.這樣,它們就有了矩陣和向量的雙重“身份”.作為向量,常用小寫黑體字母a、b、……等標記之,向量的元也稱為分量,一個向量所含分量的個數(shù)稱為維(是個數(shù)),如是個3維列向量,其實就是由3個數(shù)組成的一個有序數(shù)組.維向量是個數(shù)的一個有序數(shù)組,亦即是個的列矩陣或的行矩陣.列向量與行向量雖然只是寫法上的不同,但我們還是與多數(shù)參考書一樣約定:除非特別說明,說到向量一般均指列向量.行向量則被記作aT或a′等.(2)矩陣也稱為階方陣或階矩陣,而1階矩陣被約定當作“數(shù)”(即“元”本身)對待,當然“數(shù)”是不能當作1階矩陣來對待的.對階矩陣,后面要討論其行列式、是否為可逆陣、轉(zhuǎn)置伴隨陣、及特征值與對角化等種種問題等.(3)單位陣、對角陣、三角陣是特別簡單的一些方陣,在今后討論的基本運算中,它們各表現(xiàn)出一些簡單特性,這就使它們在形成或訓練解決問題的矩陣方法中都將有重要作用.對線性方程組(1稱為(1的系數(shù)矩陣,稱為(1的增廣矩陣.3.矩陣的行(列初等變換定義2

矩陣的行(列初等變換:

(1

對換矩陣的兩行(列),用表示對換兩行(列)的行(列)初等變換,即();

(2

用非零數(shù)乘矩陣的某一行(列),用表示以乘矩陣的第行(列)的行(列)初等變換,即;(3將矩陣的某行(列乘以數(shù)再加入另一行(列)中去,用表示乘矩陣的第行(列)后加到第行(列)的行(列)初等變換,即.4.矩陣的等價定義將矩陣的行經(jīng)有限次初等變換化為,稱與等價,記作.5.行階梯形矩陣與最簡形矩陣定義3若矩陣的零行(元素全為零的行)位于的下方,且各非零行(元素不全為零的行)的非零首元(第一個不為零的元素)的列標隨行標的遞增而嚴格增大,則稱為行階梯形矩陣.定義4若行階梯形矩陣的各非零首元均為1,且各非零首元所在列的其余元素均為零,則稱為最簡形.6.用初等變換線性方程組的解1將(1的增廣矩陣用行初等變換化為最簡形;2由最簡形對應的方程組得到解.例1求解下列齊次線性方程組:.解(1對系數(shù)矩陣實施行變換:,即得,故方程組的解為.例2求解下列非齊次線性方程組:(1(2解(1對系數(shù)的增廣矩陣施初等行變換,有故方程組無解.(2對系數(shù)的增廣矩陣施初等行變換:,即得,亦即.參考書目:1.賀鐵山等,線性代數(shù)(第二版),中山大學出版社,2004年8月.2.吳贛昌,大學數(shù)學立體化教材:線性代數(shù)(經(jīng)濟類),中國人民大學出版社,2006年3月.3.同濟大學應用數(shù)學系,工程數(shù)學(第四版),高等教育出版社,2003年7月.作業(yè)和思考題:Page27:1—4.課后小結:1能用矩陣的初等行變換并通過初等行變換將矩陣化為行階梯形矩陣和行最簡形矩陣.2熟練地能掌握用高斯消元法求解線性方程組的思想、方法和步驟.經(jīng)典的矩陣鍵盤掃描程序查找哪個按鍵被按下的方法為:一個一個地查找。

先第一行輸出0,檢查列線是否非全高;

否則第二行輸出0,檢查列線是否非全高;

否則第三行輸出0,檢查列線是否非全高;

如果某行輸出0時,查到列線非全高,則該行有按鍵按下;

根據(jù)第幾行線輸出0與第幾列線讀入為0,即可判斷在具體什么位置的按鍵按下。下面是具體程序:voidCheck_Key(void

{

unsignedcharrow,col,tmp1,tmp2;

tmp1=0x10;

//tmp1用來設置P1口的輸出,取反后使P1.4~P1.7中有一個為0

for(row=0;row<4;row++

//行檢測

{

P1=0x0f;

//先將p1.4~P1.7置高

P1=~tmp1;

//使P1.4~p1.7中有一個為0

tmp1*=2;

//tmp1左移一位

if((P1&0x0f<0x0f

//檢測P1.0~P1.3中是否有一位為0,只要有,則說明此行有鍵按下,進入列檢測

{

tmp2=0x01;

//tmp2用于檢測出哪一列為0

for(col=0;col<4;col++

//列檢測

{

if((P1&tmp2==0x00

//該列如果為低電平則可以判定為該列

{

key_val=key_Map[row*4+col];

//獲取鍵值,識別按鍵;key_Map為按鍵的定義表

return;

//退出循環(huán)

}

tmp2*=2;

//tmp2左移一位

}

}

}

}

//結束

這是一種比較經(jīng)典的矩陣鍵盤識別方法,實現(xiàn)起來較為簡單,程序短小精煉。4*4矩陣鍵盤掃描程序/*

設置行線為輸入線,列線為輸出線

*/

ucharKeyScan(;

//按鍵掃描子程序

voiddelay10ms(;

//延時程序

ucharkey_free(;

//等待按鍵釋放程序

voidkey_deal(;

//鍵處理程序

//主程序

voidmain(

{

while(1

{

KeyScan(;

key_free(;

key_deal(;

}

}

//按鍵掃描子程序

ucharKyeScan()

{

unsignedcharkey,temp;

P1=0xF0;

if(P1&0xF0!=0xF0

{

delay10ms(;

//延時去抖動

if(P1&0xF0!=0xF0

{

P1=0xFE;

//掃描第一列

temp=P1;

temp=temp&0xF0;

if(temp!=0xF0

//如果本列有鍵按下

{

switch(temp

{

case0xE0:

//第一行有鍵按下

key=0;break;

case0xD0:

//第二行有鍵按下

key=4;break;

case0xB0:

//第三行有鍵按下

key=8;break;

case0x70:

//第四行有鍵按下

key=12;break;

}

}

P1=0xFD;

//掃描第二列

temp=P1;

temp&=0xF0;

if(temp!=0xF0

{

switch(temp

{

case0xE0:

//第一行有鍵按下

key=1;break;

case0xD0:

//第二行有鍵按下

key=5;break;

case0xB0:

//第三行有鍵按下

key=9;break;

case0x70:

//第四行有鍵按下

key=13;break;

}

}

P1=0xFb;

//掃描第三列

temp=P1;

temp&=0xF0;

if(temp!=0xF0

{

switch(temp

{

case0xE0:

//第一行有鍵按下

key=2;break;

case0xD0:

//第二行有鍵按下

key=6;break;

case0xB0:

//第三行有鍵按下

key=10;break;

case0x70:

//第四行有鍵按下

key=14;break;

}

}

P1=0xF7;

//掃描第四列

temp=P1;

temp&=0xF0;

if(temp!=0xF0

{

switch(temp

{

case0xE0:

//第一行有鍵按下

key=3;break;

case0xD0:

//第二行有鍵按下

key=7;break;

case0xB0:

//第三行有鍵按下

key=11;break;

case0x70:

//第四行有鍵按下

key=15;break;

}

}

}

return(key;

}

}

//延時程序

voiddelay10ms(

{

unsignedchari,j;

for(i=0;i<10;b++

for(j=0;j<120;j++//延時1ms

{

}

}

//等待按鍵釋放程序

ucharkey_free(

{

key=key_scan(;

//取掃描到的鍵值

P1=0xF0;//置行線全為高電平,列線全為低電平

wheile(P1&0xF0!=0xF0

//如果仍有鍵按下

{

}

return(key;//返回鍵值

}51單片機矩陣鍵盤掃描、數(shù)碼管顯示鍵值實驗/***********************************************

程序名稱:矩陣鍵盤掃描顯示鍵值

簡要說明:P1口接矩陣鍵盤:低四位列,高四位行

使用共陽型數(shù)碼管:

P0口輸出數(shù)碼管段碼,P2口輸出數(shù)碼管位碼

寫:JiangX.net

***********************************************/

#include

#defineucharunsignedchar;

ucharkey_val=0;

//定義鍵值,初始默認為0

ucharcodeTAB[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,0xC6,0xa1,0x86,0x8e};

//0~F共陽數(shù)碼管顯示段碼/*****按鍵掃描*****/

voidCheck_Key(void

{

unsignedcharrow,col,tmp1,tmp2;

tmp1=0x10;

//tmp1用來設置P1口的輸出,取反后使P1.4~P1.7中有一個為0

for(row=0;row<4;row++

//行檢測

{

P1=0x0f;

//先將p1.4~P1.7置高

P1=~tmp1;

//使P1.4~p1.7中有一個為0

tmp1*=2;

//tmp1左移一位

if((P1&0x0f<0x0f

//檢測P1.0~P1.3中是否有一位為0,只要有,則說明此行有鍵按下,進入列檢測

{

tmp2=0x01;

//tmp2用于檢測出哪一列為0

for(col=0;col<4;col++

//列檢測

{

if((P1&tmp2==0x00

//該列如果為低電平則可以判定為該列

{

key_val=row*4+col;//獲取鍵值,識別按鍵

return;

//退出循環(huán)

}

tmp2*=2;

//tmp2左移一位

}

}

}

}

/*****主函數(shù),顯示鍵值*****/

voidmain(

{

P2=0x00;

//位碼,這里全部置低,點亮8位數(shù)碼管(見視頻效果)

while(1

{

Check_Key(;

P0=TAB[key_val];

//顯示

}

}實驗7矩陣按鍵識別技術矩陣按鍵部分由16個輕觸按鍵按照4行4列排列,連接到JP50端口。將行線所接的單片機的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當按鍵沒有按下時,所有的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態(tài)就可得知是否有鍵按下了。確定矩陣式鍵盤上何鍵被按下,介紹一種“行掃描法”。行掃描法行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識別方法.

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

判斷閉合鍵所在的位置:在確認有鍵按下后,即可進入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態(tài)。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。下面給出一個具體的例子:8031單片機的P1口用作鍵盤I/O口,鍵盤的列線接到P1口的低4位,鍵盤的行線接到P1口的高4位。列線設置為輸入線,行線設置為輸出線。4根行線和4根列線形成16個相交點。1,檢測當前是否有鍵被按下。檢測的方法是輸出全“0”,讀取的狀態(tài),若為全“1”,則無鍵閉合,否則有鍵合。2,去除鍵抖動。當檢測到有鍵按下后,延時一段時間再做下一步的檢測判斷。3.若有鍵被按下,應識別出是哪一個鍵閉合。方法是對鍵盤的行線進行掃描。P1.4-P1.7按下述4種組合依次輸出:P1.71110P1.61101P1.51011P1.40111

在每組行輸出時讀取P1.0-P1.3,若全為“1”,則表示為“0”這一行沒有鍵閉合,否則有鍵閉合。由此得到閉合鍵的行值和列值,然后可采用計算法或查表法將閉合鍵的行值和列值轉(zhuǎn)換成所定義的鍵值。4,為了保證鍵每閉合一次CPU僅作一次處理,必須去除鍵釋放時的抖動。實驗目的:通過XL2000的16位矩陣按鍵,在數(shù)碼管上分別顯示09,A,B,C,D,E,F。接線方法:1,用一條8PIN數(shù)據(jù)排線,把矩陣按鍵部份的JP50,接到CPU部份的P1口JP44.

2,接8位數(shù)碼管的數(shù)據(jù)線。將數(shù)碼管部份的數(shù)據(jù)口JP5接到CPU部份的P0口JP51.

3,接8位數(shù)碼管的顯示位線。將數(shù)碼管部份的顯示位口JP8接到CPU部份的P2口JP52.參考程序:;本程序?qū)崿F(xiàn)掃描按鍵顯示功能.;分別按16個鍵盤顯示分別顯示數(shù)字123A456B789C*0#D;鍵盤口P1,數(shù)碼管顯示第二位p21,數(shù)碼管段位p0口org0000hajmpmainorg0030hmain:movdptr,#tab

;將表頭放入DPTRlcallkey;調(diào)用鍵盤掃描程序movca,@a+dptr;查表后將鍵值送入ACCmovp0,a;將Acc值送入P0口CLRP2.1;開顯示ljmpmain;返回反復循環(huán)顯示KEY:LCALLKS;調(diào)用檢測按鍵子程序JNZK1;有鍵按下繼續(xù)LCALLDELAY2;無鍵按調(diào)用延時去抖AJMPKEY;返回繼續(xù)檢測按鍵K1:LCALLDELAY2LCALLDELAY2;有鍵按下延時去抖動LCALLKS;再調(diào)用檢測按鍵程序JNZK2;確認有按下進行下一步AJMPKEY;無鍵按下返回繼續(xù)檢測K2:MOVR2,#0EFH;將掃描值送入R2暫存MOVR4,#00H;將第一列值送入R4暫存K3:MOVP1,R2;將R2的值送入P1口L6:JBP1.0,L1;P1.0等于1跳轉(zhuǎn)到L1MOVA,#00H;將第一行值送入ACCAJMPLK;跳轉(zhuǎn)到鍵值處理程序L1:JBP1.1,L2;P1.1等于1跳轉(zhuǎn)到L2MOVA,#04H;將第二行的行值送入ACCAJMPLK;跳轉(zhuǎn)到鍵值理程序進行鍵值處理L2:JBP1.2,L3;P1.2等于1跳轉(zhuǎn)到L3MOVA,#08H;將第三行的行值送入ACCAJMPLK;跳轉(zhuǎn)到鍵值處理程序L3:JBP1.3,NEXT;P1.3等于1跳轉(zhuǎn)到NEXT處MOVA,#0cH;將第四行的行值送入ACCLK:ADDA,R4;行值與列值相加后的鍵值送入APUSHACC;將A中的值送入堆棧暫存K4:LCALLDELAY2;調(diào)用延時去抖動程序LCALLKS;調(diào)用按鍵檢測程序JNZK4;按鍵沒有松開繼續(xù)返回檢測POPACC;將堆棧的值送入ACCRETNEXT:INCR4;將列值加一MOVA,R2;將R2的值送入AJNBACC.7,KEY;掃描完至KEY處進行下一掃描RLA;掃描未完將A中的值右移一位進行下一列的掃描MOVR2,A;將ACC的值送入R2暫存AJMPK3;跳轉(zhuǎn)到K3繼續(xù)KS:MOVP1,#0FH;將P1口高四位置0低四位值1MOVA,P1;讀P1口XRLA,#0FH;將A中的值與A中的值相異或RET;子程序返回DELAY2:;40ms延時去抖動子程序MOVR5,#08HL7:MOVR6,#0FAHL8:DJNZR6,L8DJNZR5,L7RETtab:db28h,34h,28h,34h,0a9h,60h,20h,7ah,20h,21h,61h,74h,30h,62h,0a2h,7eh;0h0hc9878654a321輪流顯示鍵盤因為無法表達*#就用H表示,B用8表示end矩陣按鍵與數(shù)碼管顯示的運行照片

3x4矩陣鍵盤的掃描程序(C語言3x4矩陣鍵盤的掃描程序(C語言

按相應的按鍵,數(shù)碼管顯示相應的數(shù)字,星號鍵和井號鍵分別顯示為E和F

#include

unsignedcharcodetable[]={0xC0,0xF9,0xA4,0xB0,0x99,//0~4

0x92,0x82,0xF8,0x80,0x90,//5~9

0x88,0x83,0xA7,0xA1,0x86,0x8E};//A~F

voidKeyScan(;

voiddelay10ms(unsignedchartime;

voidDispaly(unsignedchark;

unsignedcharkey,temp;

voidmain(//主程序

{

while(1

{

KeyScan(;

}

}

voidKeyScan(//按鍵掃描子程序

{

P1=0xFF;

P1_3=0;

temp=P1;

temp&=0xF0;

if(temp!=0xF0

{

delay10ms(1;

temp=P1;

temp&=0xF0;

if(temp!=0xF0

{

temp=P1;

temp&=0xF0;

switch(temp

{

case0x70:

key=1;break;

case0xB0:

key=2;break;

case0xD0:

key=3;break;

}

Dispaly(key;

}

}

P1=0xFF;

P1_2=0;

temp=P1;

temp&=0xF0;

if(temp!=0xF0

{

delay10ms(1;

temp=P1;

temp&=0xF0;

if(temp!=0xF0

{

temp=P1;

temp&=0xF0;

switch(temp

{

case0x70:

key=4;break;

case0xB0:

key=5;break;

case0xD0:

key=6;break;

}

Dispaly(key;

}

}

P1=0xFF;

P1_1=0;

temp=P1;

temp&=0xF0;

if(temp!=0xF0

{

delay10ms(1;

temp=P1;

temp&=0xF0;

if(temp!=0xF0

{

temp=P1;

temp&=0xF0;

switch(temp

{

case0x70:

key=7;break;

case0xB0:

key=8;break;

case0xD0:

key=9;break;

}

Dispaly(key;

}

}

P1=0xFF;

P1_0=0;

temp=P1;

temp&=0xF0;

if(temp!=0xF0

{

delay10ms(1;

temp=P1;

temp&=0xF0;

if(temp!=0xF0

{

temp=P1;

temp&=0xF0;

switch(temp

{

case0x70:

key=14;break;

case0xB0:

key=0;break;

case0xD0:

key=15;break;

}

Dispaly(key;

}

}

}

//延時程序

voiddelay10ms(unsignedchartime

{

unsignedchara,b,c;

for(a=0;a

for(b=0;b<10;b++

for(c=0;c<120;c++

;

}

voidDispaly(unsignedchark//顯示程序

{

P0=table[k];

P2_1=0;

}

C51矩陣鍵盤掃描程序代碼實例/**************************************************************************

*p1.3p1.2p1.1p1.0

*||||p1.4

*||||p1.5

*||||p1.6

*||||p1.7

*||||

*

*鍵值排列:

*15141312

*111098

*7654

*3210

****************************************************************************/

#defineucharunsignedchar

#include

ucharKeyScan(

{

ucharrow=0;//將行號置0

ucharcol=0;//將列號置0

ucharmask=0x7f;

ucharpic=0;

ucharkey0=255;

ucharShift_Count=0;

ucharcodeKey_value[]={0,1,2,3,5,6,7,8,9,10,

11,12,13,14,15,16};

/*抖動返回200,無鍵按下返回255*/

P1&=0x0f;

if((P1&0x0f==0x0f{key0=255;return(key0;}

Delay(50;//延時25mS去抖動

if((P1&0x0f==0x0f{key0=200;return(key0;}

/*有鍵按下,則分析鍵所在的列號*/

P1=mask;

while((P1&0x0f==0x0f&&Shift_Count<3

{

++col;++Shift_Count;

mask=_cror_(mask,1;//右移動一位

P1=mask;

}

/*有鍵按下,則分析鍵所在的行號*/

pic=P1&0x0f;

mask=0x01;

while(pic&mask

{

++row;

mask=_crol_(mask,1;//左移一位

}

/*得到鍵值*/

pic=row*4+col;

key0=Key_value[pic];

return(key0;

}

/************************************************************

*函數(shù)功能:延時程序0.5mS

*input:i

*output:NULL

*mcu:p89c51

*frequency:11.0592MHz

*period:f/6

************************************************************/

voidDelay(uinti

{

ucharj;

while(i--

{for(j=0;j<125;j++;}

}

/**************************************************************************

*p1.3p1.2p1.1p1.0

*||||p1.4

*||||p1.5

*||||p1.6

*||||p1.7

*||||

*

*鍵值排列:

*15141312

*111098

*7654

*3210

****************************************************************************/

#defineucharunsignedchar

#include

ucharKeyScan(

{

ucharrow=0;//將行號置0

ucharcol=0;//將列號置0

ucharmask=0x7f;

ucharpic=0;

ucharkey0=255;

ucharShift_Count=0;

ucharcodeKey_value[]={0,1,2,3,5,6,7,8,9,10,

11,12,13,14,15,16};

/*抖動返回200,無鍵按下返回255*/

P1&=0x0f;

if((P1&0x0f==0x0f{key0=255;return(key0;}

Delay(50;//延時25mS去抖動

if((P1&0x0f==0x0f{key0=200;return(key0;}

/*有鍵按下,則分析鍵所在的列號*/

P1=mask;

while((P1&0x0f==0x0f&&Shift_Count<3

{

++col;++Shift_Count;

mask=_cror_(mask,1;//右移動一位

P1=mask;

}

/*有鍵按下,則分析鍵所在的行號*/

pic=P1&0x0f;

mask=0x01;

while(pic&mask

{

++row;

mask=_crol_(mask,1;//左移一位

}

/*得到鍵值*/

pic=row*4+col;

key0=Key_value[pic];

return(key0;

}

/************************************************************

*函數(shù)功能:延時程序0.5mS

*input:i

*output:NULL

*mcu:p89c51

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論