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

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

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

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

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

矩陣的行(列初等變換:

(1

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

(2

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

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

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

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

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

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

{

unsignedcharrow,col,tmp1,tmp2;

tmp1=0x10;

//tmp1用來(lái)設(shè)置P1口的輸出,取反后使P1.4~P1.7中有一個(gè)為0

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

//行檢測(cè)

{

P1=0x0f;

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

P1=~tmp1;

//使P1.4~p1.7中有一個(gè)為0

tmp1*=2;

//tmp1左移一位

if((P1&0x0f<0x0f

//檢測(cè)P1.0~P1.3中是否有一位為0,只要有,則說(shuō)明此行有鍵按下,進(jìn)入列檢測(cè)

{

tmp2=0x01;

//tmp2用于檢測(cè)出哪一列為0

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

//列檢測(cè)

{

if((P1&tmp2==0x00

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

{

key_val=key_Map[row*4+col];

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

return;

//退出循環(huán)

}

tmp2*=2;

//tmp2左移一位

}

}

}

}

//結(jié)束

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

設(shè)置行線為輸入線,列線為輸出線

*/

ucharKeyScan(;

//按鍵掃描子程序

voiddelay10ms(;

//延時(shí)程序

ucharkey_free(;

//等待按鍵釋放程序

voidkey_deal(;

//鍵處理程序

//主程序

voidmain(

{

while(1

{

KeyScan(;

key_free(;

key_deal(;

}

}

//按鍵掃描子程序

ucharKyeScan()

{

unsignedcharkey,temp;

P1=0xF0;

if(P1&0xF0!=0xF0

{

delay10ms(;

//延時(shí)去抖動(dòng)

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;

}

}

//延時(shí)程序

voiddelay10ms(

{

unsignedchari,j;

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

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

{

}

}

//等待按鍵釋放程序

ucharkey_free(

{

key=key_scan(;

//取掃描到的鍵值

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

wheile(P1&0xF0!=0xF0

//如果仍有鍵按下

{

}

return(key;//返回鍵值

}51單片機(jī)矩陣鍵盤(pán)掃描、數(shù)碼管顯示鍵值實(shí)驗(yàn)/***********************************************

程序名稱:矩陣鍵盤(pán)掃描顯示鍵值

簡(jiǎn)要說(shuō)明:P1口接矩陣鍵盤(pán):低四位列,高四位行

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

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

寫(xiě):JiangX.net

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

#include

#defineucharunsignedchar;

ucharkey_val=0;

//定義鍵值,初始默認(rèn)為0

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

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

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

voidCheck_Key(void

{

unsignedcharrow,col,tmp1,tmp2;

tmp1=0x10;

//tmp1用來(lái)設(shè)置P1口的輸出,取反后使P1.4~P1.7中有一個(gè)為0

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

//行檢測(cè)

{

P1=0x0f;

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

P1=~tmp1;

//使P1.4~p1.7中有一個(gè)為0

tmp1*=2;

//tmp1左移一位

if((P1&0x0f<0x0f

//檢測(cè)P1.0~P1.3中是否有一位為0,只要有,則說(shuō)明此行有鍵按下,進(jìn)入列檢測(cè)

{

tmp2=0x01;

//tmp2用于檢測(cè)出哪一列為0

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

//列檢測(cè)

{

if((P1&tmp2==0x00

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

{

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

return;

//退出循環(huán)

}

tmp2*=2;

//tmp2左移一位

}

}

}

}

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

voidmain(

{

P2=0x00;

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

while(1

{

Check_Key(;

P0=TAB[key_val];

//顯示

}

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

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

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

在每組行輸出時(shí)讀取P1.0-P1.3,若全為“1”,則表示為“0”這一行沒(méi)有鍵閉合,否則有鍵閉合。由此得到閉合鍵的行值和列值,然后可采用計(jì)算法或查表法將閉合鍵的行值和列值轉(zhuǎn)換成所定義的鍵值。4,為了保證鍵每閉合一次CPU僅作一次處理,必須去除鍵釋放時(shí)的抖動(dòng)。實(shí)驗(yàn)?zāi)康模和ㄟ^(guò)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個(gè)鍵盤(pán)顯示分別顯示數(shù)字123A456B789C*0#D;鍵盤(pán)口P1,數(shù)碼管顯示第二位p21,數(shù)碼管段位p0口org0000hajmpmainorg0030hmain:movdptr,#tab

;將表頭放入DPTRlcallkey;調(diào)用鍵盤(pán)掃描程序movca,@a+dptr;查表后將鍵值送入ACCmovp0,a;將Acc值送入P0口CLRP2.1;開(kāi)顯示ljmpmain;返回反復(fù)循環(huán)顯示KEY:LCALLKS;調(diào)用檢測(cè)按鍵子程序JNZK1;有鍵按下繼續(xù)LCALLDELAY2;無(wú)鍵按調(diào)用延時(shí)去抖AJMPKEY;返回繼續(xù)檢測(cè)按鍵K1:LCALLDELAY2LCALLDELAY2;有鍵按下延時(shí)去抖動(dòng)LCALLKS;再調(diào)用檢測(cè)按鍵程序JNZK2;確認(rèn)有按下進(jìn)行下一步AJMPKEY;無(wú)鍵按下返回繼續(xù)檢測(cè)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)到鍵值理程序進(jì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)用延時(shí)去抖動(dòng)程序LCALLKS;調(diào)用按鍵檢測(cè)程序JNZK4;按鍵沒(méi)有松開(kāi)繼續(xù)返回檢測(cè)POPACC;將堆棧的值送入ACCRETNEXT:INCR4;將列值加一MOVA,R2;將R2的值送入AJNBACC.7,KEY;掃描完至KEY處進(jìn)行下一掃描RLA;掃描未完將A中的值右移一位進(jìn)行下一列的掃描MOVR2,A;將ACC的值送入R2暫存AJMPK3;跳轉(zhuǎn)到K3繼續(xù)KS:MOVP1,#0FH;將P1口高四位置0低四位值1MOVA,P1;讀P1口XRLA,#0FH;將A中的值與A中的值相異或RET;子程序返回DELAY2:;40ms延時(shí)去抖動(dòng)子程序MOVR5,#08HL7:MOVR6,#0FAHL8:DJNZR6,L8DJNZR5,L7RETtab:db28h,34h,28h,34h,0a9h,60h,20h,7ah,20h,21h,61h,74h,30h,62h,0a2h,7eh;0h0hc9878654a321輪流顯示鍵盤(pán)因?yàn)闊o(wú)法表達(dá)*#就用H表示,B用8表示end矩陣按鍵與數(shù)碼管顯示的運(yùn)行照片

3x4矩陣鍵盤(pán)的掃描程序(C語(yǔ)言3x4矩陣鍵盤(pán)的掃描程序(C語(yǔ)言

按相應(yīng)的按鍵,數(shù)碼管顯示相應(yīng)的數(shù)字,星號(hào)鍵和井號(hào)鍵分別顯示為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;

}

}

}

//延時(shí)程序

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矩陣鍵盤(pán)掃描程序代碼實(shí)例/**************************************************************************

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

*||||p1.4

*||||p1.5

*||||p1.6

*||||p1.7

*||||

*

*鍵值排列:

*15141312

*111098

*7654

*3210

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

#defineucharunsignedchar

#include

ucharKeyScan(

{

ucharrow=0;//將行號(hào)置0

ucharcol=0;//將列號(hào)置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};

/*抖動(dòng)返回200,無(wú)鍵按下返回255*/

P1&=0x0f;

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

Delay(50;//延時(shí)25mS去抖動(dòng)

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

/*有鍵按下,則分析鍵所在的列號(hào)*/

P1=mask;

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

{

++col;++Shift_Count;

mask=_cror_(mask,1;//右移動(dòng)一位

P1=mask;

}

/*有鍵按下,則分析鍵所在的行號(hào)*/

pic=P1&0x0f;

mask=0x01;

while(pic&mask

{

++row;

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

}

/*得到鍵值*/

pic=row*4+col;

key0=Key_value[pic];

return(key0;

}

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

*函數(shù)功能:延時(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;//將行號(hào)置0

ucharcol=0;//將列號(hào)置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};

/*抖動(dòng)返回200,無(wú)鍵按下返回255*/

P1&=0x0f;

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

Delay(50;//延時(shí)25mS去抖動(dòng)

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

/*有鍵按下,則分析鍵所在的列號(hào)*/

P1=mask;

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

{

++col;++Shift_Count;

mask=_cror_(mask,1;//右移動(dòng)一位

P1=mask;

}

/*有鍵按下,則分析鍵所在的行號(hào)*/

pic=P1&0x0f;

mask=0x01;

while(pic&mask

{

++row;

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

}

/*得到鍵值*/

pic=row*4+col;

key0=Key_value[pic];

return(key0;

}

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

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

*input:i

*output:NULL

*mcu:p89c51

溫馨提示

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

評(píng)論

0/150

提交評(píng)論