




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、C51單片機步步學筆記(最新更新)作為一個初學者,如何單片機入門?我需要那些知識和設備?知識上,其實不需要多少東西,會簡單的C語言,知道51單片機的基本結構就可以了。一般的大學畢業生都可以了,自學過這2門課程的高中生也夠條件。設備上,一般是建議購買一個仿真器,這樣才可以進行實際的,全面的學習。日后在工作上,仿真器也大有用處還有,一般光有仿真器是不行,還得有一個實際的電路,即學習板。學習板一般價格都比較貴,而且許多學習板配套程序和講解不夠完善。這里介紹的是最簡單的學習板,4個按鍵加4個LED發光管,一個蜂鳴器,一個24c02即可。通過30個教程,初學者可以學到:單片機控制外部設備,讀取外部設備狀
2、態,外部中斷的應用,中斷的深入理解,變量和標記的靈活應用,定時器的靈活應用,可編程自動控制的方法,按鍵控制設備動作的方法,PWM輸出的設計,存儲器的讀寫,延時報警器的設計,各種報警音的設計,音樂播放的設計,程序模塊化的設計等等知識。雖然,這些知識的覆蓋面有限,但是,當你學習并掌握了這30個試驗之后,您就會豁然開朗,單片機的編程控制如此簡單!學習完后,您就已經完全地入門了,并可以自主地對其它的單片機知識進行學習、試驗,甚至進行項目開發!第一課了解單片機及單片機的控制原理,控制一個LED燈的亮和滅本章學習內容:單片機基本原理,如何仿真器,如何編程點亮和滅掉一個LED燈,如何進入KEILC51uV調
3、試環境,如何使用單步,斷點,全速,停止的調試方法單片機現在是越來越普及了,學習單片機的熱潮也一陣陣趕來,許多人因為工作需要或者個人興趣需要學習單片機。可以說,掌握了單片機開發,就多了一個飯碗。51單片機已經有30多年的歷史了,在中國,高校的單片機課程大多數都是51,而51經過這么多年的發展,也增長了許多的系列,功能上有了許多改進,也擴展出了不少分支。而國內書店的單片機專架上,也大多數都是51系列。可以預見,51單片機在市場上只會越來越多,功能只會越來越豐富,在可以預見的數十年內是不可能會消失的。下面以51為例來了解一下單片機是什么東西,控制原理又是什么?在數字電路中,電壓信號只有兩種情況,高電
4、平和低電平,用數字來記錄就是1和0。單片機內部的CPU,寄存器,總線等等結構都是通過1和0兩種信號來運作的,數據也是以1或者0來保存的。單片機的輸入輸出管腳,也就是IO口,也是只輸出或識別1和0兩種信號,也就是高電平和低電平。當單片機輸出一個或一組電平信號到IO口后,外部的設備就可以讀到這些信號,并進行相應操作,這就是單片機對外部的控制。當外部一個或一組電平信號送到單片機的IO口時,單片機也可以讀到這些信號,并進行分析操作,這就是單片機對外部設備信號的讀取。當然實際的操作中,這些信號可能十分復雜,必須嚴格地按照規定的時間順序(時序)輸入輸出。每種設備也都規定了自己的時序,只要都嚴格遵守,就可以
5、控制任何設備,做出只要你想象得出的任何事情。您可能會再問,我如何讓單片機去控制和分析外部設備呢?答案是程序,您可以編寫相單片機在上電時,就會一步一步按照關的程序,并且把他們燒寫到單片機內部的程序空間,您寫的程序去執行指令,做您想做的事情。在51標準芯片中,有32個輸入輸出IO,分為4組,每組8個,分別為P0口,P1口,P2口,P3口。P1口的8條腳就用P1.0至P1.7表示,其余類似。51就是用這32個口來完成所有外部操作的。對于51的內部結構,如果您已經了解,那是最好;如果不懂,也可以先放下,在完成了本教程開始的幾個章節之后,您就會大有興趣,自己去尋找資料閱讀了。當然,如果您希望成為一個優秀
6、的單片機開發程序員,還是必須熟悉單片機的內部結構及工作原理,切不可偷懶!在這一章,您將用程序去控制一個LED發光管的亮和滅。你應該知道,LED發光管在通過一定電流時亮,不通電就滅。為了不讓LED通過太大的電流把它燒壞,我們還要串上限流電阻。51的IO是弱上拉的方式,在輸出高電平時,只能輸出幾十微安的電流到地,而在輸出低電平時,VCC電源可以輸入幾十毫安的電流到IO。一般LED需要10毫安左右電流點亮,我們就將LED接在電源VCC和IO口之間,中間串上電阻,當IO輸出低電平時,燈就亮了,反之,燈就滅了。我們在這個程序里要控制的是P1.0。請參考一下我們將要使用的試驗板的電路圖。上一 n n* _
7、 7:?.M在實際的單片機學習和開發中,i可以用仿真器模擬一個CPU芯片,讓它按照您編寫的程序工作,并且進行調試,一步步排除程序的bug,使程序正常工作。程序工作正常后,您就可以用燒寫器將您編寫的程序燒入購買來的單片機芯片中,讓它自己去運行了。要使用仿真器,還得有一個編譯調試的環境,這個環境是在計算機上運行的,我們就在計算機上編寫和調試程序,計算機和仿真器有連接,仿真器中的各種數據和程序,都可以從計算機上觀察到,并可以觀察變量,寫入變量的值,單步調試程序,在程序中設置斷點調試,全速運行,停止程序運行,等等操作。我們使用keilC51編譯調試環境,仿真器的選擇太多了,你可以根據自己的實際情況來選
8、擇。隨后我將給大家提供keilc51相關的中文說明資料,這些資料詳細地說明了如何使用C51編程和如何使用keiluV2環境調試。現在可以開始做試驗了,我們打開已經建立好的工程和編寫好的程序試驗。順便還會學習一下程序調試的技巧。至于如何建立一個新工程,請參考C51的幫助文件。請雙擊lessoncode01目錄下的lesson1.uv2,打開后界面如下:點一下上圖第三排第2或者第3個按鈕(您的編譯器按鈕位置不一定在那個位置,自己找找),就可以看到編譯結果了。上面顯示是0errrs,0warnings,這是最佳的編譯結果,如果有error,則無法進行下一步仿真,如果有warning,一定要盡量消除,
9、確實無法消除的,也要確認不會對程序造成影響,才進行下一步的仿真。在編譯結果中,我們還可以看到有data,xdata,code等用了多少字節的報告,要注意您的單片機中是否有這么多的資源,如果不夠,將來燒片運行時就可能出現問題。比如AT89C51的程序空間是4K,xdata如果沒有外擴就是0個,data是128個。超出這些范圍,程序就不能在AT89c51中運行。不同的芯片有不同的容量,如SST89E516RD就有64K程序,內部768字節XDATA,還有256個字節的data。我們的例程中肯定都考慮了這些了,肯定不會超出,將來自己開發時就要注意了。下面我們故意把第9行的P10寫成P11,點編譯,因
10、為沒有預先定義P11,所以就報告錯誤了,如下圖:雙擊一下錯誤報告的那一行,窗口就也會跳到這一行,方便您進行修改。好了,現在請把錯誤改回去,再編譯一次,出現報告正確了以后,下面開始仿真了。點一下第二行第5個一個放大鏡里面一個d字母的按鈕,就可以進入仿真了,仿真器要事先連接好喲。進入仿真后要退出仿真環境也是點這個按鈕。注意,等會如果程序在正在全速運行時,仿真環境是不能直接退出的,得先點停止運行后,再點仿真按鈕才可以退出。點進入仿真按鈕,程序開始裝載,PC自動運行到了main()停下,并指向了main()函數的第一行。進入仿真窗口后,如果出現的不是前面的源代碼窗口,而是夾有反匯編代碼的窗口,直接關掉
11、這個窗口就會恢復到代碼窗口。下次進入也會直接進入到源代碼窗口。現在先試驗單步,點單步(兩個單步都可以,一般點單步跨過)。可以看到燈亮了。PC指針也指向了下一個程序行。再點一下單步,PC又走下一步,燈滅了。再點一次,PC走到掛起的程序行了,繼續點仍然在這一行。這句指令其實就是使程序不斷地跳到自己這一行,別的什么也不做。一般稱作程序掛起。一般的實際應用中的程序是不會掛起的,一般是在main函數里做一個大循環,程序如下:voidmain(void)/主程序while(1)P11=0;/亮燈P10=1;/滅燈請將main函數程序改為上面的代碼,我們下一步將試驗斷點的操作。在第15行雙擊一下,可以看到程
12、序行左邊出現了一個紅方塊,這就是設置斷點,再雙擊一次,斷點就取消了。如果程序在全速運行的過程中遇到斷點,就會自動停下來給你分析。注意在進入仿真后,并且程序是停止狀態時,才可以設置或者取消斷點。g冒:le e« 好 PKijict 占y 引醇力p可2值4 k。= 好口 紗s* Heph.MKI:芭窿圖同£電IA 二,"y % .£哨I三1 M .:#*” 舊1國畫, n x|獨趣幽眄rKrrMR HLII:悝團*;當廖產.。手;:,伸ff±-1'Ui(i misi niftd mt。由寸 Lt a uloRC Hun 我lore«
13、;mclude CrBS5P.)O"隹百一個印師市向弒國土文件fibLl FLO二Pl*。,"受三件中度者走戈用心靛要自己來走發了char co* dxE】53 it QkCU二h ;,:V事F £ 耳其煮口voidT f? 7I*i】M力F般序褶“心Fmtq寺叮 1方 I PIOzl. Jj"J J IJ現在點全速運行,可以看到程序在斷點處停了下來,并且由于前一句指令剛剛執行了點燈,所以這時燈是亮著的。現在在第14行設置斷點,并且取消上一個斷點。現在點全速運行,可以看到程序在斷點處停了下來,并且由于剛剛執行了滅燈,燈是滅著的。好,現在試驗全速運行和停止
14、。把斷點取消,再點全速運行,可以看到燈是亮著的,但是不是很亮,這是由于程序是循環的,亮滅交替進行,亮的時間并不是全部的時間。現在點停止,可以看到程序停止了,重復幾次進行全速和停止,可以發現每次停止的地方不一定是同一位置。第二課用指令方式延時閃爍LED燈本章將學習如何使LED閃爍,和如何查看變量的值。單片機內部的CPU工作都是要靠時鐘驅動的。在標準51芯片中,每個指令周期是12個時鐘。所以只要外部時鐘固定,某一條指令運行的時間也是固定的。比如本試驗中的單片機晶振振蕩輸出的時鐘是HZ,一條單周期指令執行的時間就是12/秒=5.425347X107秒,這樣如果你想在程序里延遲一段時間,就可以用循環執
15、行多少條指令來實現。這是一個最簡單的延時方法,優點是不占用其他的單片機資源,缺點是不容易計算準確延時時間,而且延時過程中CPU無法做其他工作。指令延時方法一般用在一些不用精確計時的場合。在需要精確計時的場合,需要使用定時器,在之后的課程中將會學到。程序由一個循環組成,在點亮 P10 口的LED之后,延時一段時間,再滅掉 LED,又 延時一段時間,之后循環到前面。for ()循環后面直接一個分號,表示這個循環里面什么C寫法。事情也不做,就等循環完成指定的次數就退出來。這也是指令循環延時的最常見的編譯后,按進入仿真。按全速運行,可以看到P1.0的LED燈不斷地閃爍。下面我們用另一個更簡單的方式點燈
16、,就是取反IO口的狀態。取反指令將當前bit變量的狀態反轉,當前是1,取反后就是0,當前是0,取反后就是1。IO口相當于一個bit變量,也可以這樣取反。請修改程序如下:出隹31-小同贏71需01士枇F才尼ik】依廣心:區zigned出自i7W'一下方傳林.電口:*dfinuuintunsignedibnt-三Ttlrfireillfltilone口sinclude<iei62.h>“包楮一T5游準內樵的頭經件u*WgtFl口Pl'。;/佚式件軻曼村定義的m就要自己東走M雕顯晶翳產迷SrQBU;“這是為了仿其收量的jo±liiiriiyci-dj,>&
17、#39;ii.TLkiMtvtii1c1-5/將Jt-后試!F1XT4。:“取反tfc?陽n團用f-:ri#:;r<2QGOO:Ki)可以看到旁邊出現了一個小框框,上面顯示了n=0x47D3,這就是變量此時的值。如果覺得Fr口gram31。日;d同匕&3口國coJeSScrftT111_3h*KFilstrf1IRssnn"",.,hl»«EQEilM-0Error(r),0warning(g)«,ll*卜4.3rnd,FifidinFfef11'-:!?-編譯成功后,再點全速運行。同樣可以看到LED閃爍的現象。可以看到,
18、這種方法,我們只需要一次延時,就可以實現閃爍了。下面我們再來學習如何查看變量n在運行中的值。注意,要查看變量的值,只能在程序停下來的狀態下查看。在程序運行的過程中,程序不斷地運行,變量也在不斷地變化,一般是無法查看的。點停止程序,將鼠標放在程序中的“n”上面。這樣可能會點不準確,可以選中你要看的變量,同樣會顯示變量的值,個人感覺這種操作更為方便。如圖:需耳曲tr)-uOgpk 1 Ilf ItL- B.pJ .L&gistcr卜,4_Liu三氐*交LhtUD"rl%*2QWr3OOJm""" r-4.JrOO- r5fcDO54T3打工一.馬口油
19、i- tEhiDD, ,燈DkOTdj?Lrre $匚:口&,國 IWWMttiOTMm w M aDewoeM M1 lM1aM1017ielefI It I'iiJcTingUFLi ci at ft虐in*udrisig,n-d-iriE-ludE Ce cyh2. h>在h pio - rro:"人文件事沒存疣義田皿旅w日lctiar C3de ciE L t5 3 it CsEdb ;/江是涉 了優其黃之/Wfjftfr:rniil nir Cvo3(D ,: ,I'序Hint rr"wiu_lq c i/7轅件徉科jnsSOtCU
20、= 日第(11I上勺匚門a d "r j WLiQiCUTnpTit Hindt 】qgqrX口日見 itii qtjr外t"十泉面zISI*?i5S:3W Br*akDiciblo BmaikEiimkln BrakKil BraakListP,( rki.l ) ,1 .HG rl >1S _l - - M 17 I r -LL;LoCir在命令行輸入的方法也可以看變量,在命令行輸入n,回車,就看到結果了。請注意看卜圖的命令行窗口的結果。中相nt.但國營號二上陽尸l_:Si sLerp- S-如口i-OLtriOO門鼐0 J-3OhiOJ-g: r4mg tSLh
21、iHf同一0>id3A" SyS五31_二-町 taOTT箱=1 ?i Fr 11Fwiecil wotpKcTm-etY PU fP1飛:人二阡甲涓耳.二史的加就要日已勾ai gds dxblM的 就 0«0031»捱是苦了帕羨也 門/燈社即2VI: j.rl j-tarr. t'c ui J) 匚/ I :同值,工口也富mf nr lr-11 I 71<?U1U Iumt n;Huhn.叮廣平律圻卡叼14中I方I.ElCoK.nfrstad to Hofitor 52 V.&KLo±d "口亦703C: 5orL
22、in-nts. and Xt ting,“梟而立】NLi : t=1、嵬茴一打iririKB j 1Fi H ira pl=5 L L+UJ這里再教一招,如果我想讓n現在就變成我想要的值怎么辦?這也是調試常見的手段,設置一個變量的值,比如,讓n=0x1234,只要在命令框里輸入“n=0x1234”就行了,幾乎所有變量都可以這樣直接設置,包括IO,比如你輸入“P1.1=0”結果第二個燈就亮了。還有一招常用的,就是在watch窗口看變量。點watch圖標,就是那個有個眼鏡的圖標,打開watch窗口。如圖:這個窗口里有locals頁就是當前函數使用的變量的列表,還有有watch1和2兩個窗口,就是自
23、定義要看的變量的值,可以手工輸入,也可以選中某個變量,按右鍵,將出現一個菜單。選擇add到watch窗口即可,在程序停止時隨時看到此變量的值。注意要看某個變量,如果這個變量是某個函數私有的,必須是程序停止時并且PC已經停止在了這個函數中才可以看到,各種看變量的情況都是這樣。還有一種直接看存儲器的方法,可以看到所有存儲器的值,但是和變量名稱就不是那么好對應起來了。點memory窗口圖標,打開memory窗口,如圖:(8S iEi©初行田pgpct Mur 心 pax .口三u |歸I國|cc ;,、-UI 口叱“PU三F1飛:7頭友伴中尊連史的M嗷JF自已勾 char 皿 dxblb口
24、1 或 吮00時;"這另為了衡宜皆于 門了可斤不一nai±i(v«iD "uint n;鄭馨修辭plo=Ti口;"取房糕 tot (f. k" 2j00J.r-H-. .1iS 國 am.3 n. cD-版口: D:OkOF: D: Ok. IE:口! 口支孫 D:Dk.4B1 ::'X :_D D E I- C D n 1- n- D u r- -I -L I -I- I o o o o o o o 口口 口力0 Q 0 Lecce t -L o o o o D o _u 1noe 口 口口 .LOCCDCC o o o o
25、 o o o ,u o o o o o o L o c c o o _L 3 o D c _u o c o o o o o o D 5 c n- c o n- c F o o o _u o o 2 0 0 0 0 o o D o D o D o o 7 D D D u D D 4 o n D D D D n D D Do Do u D D c o Do o D D D D D D D D D c D Do D D D c D D 3 n D o 口口 L o c D o D £ o D D D o D _u o D D D o Do , D D D D .上:q在Address窗口輸
26、入:“d:0x00就可以看到data空間的從0x00開始的所有內存。如上圖。輸入“i:0x00就可以看到idata空間的所有內存的值。輸入“x:0x00,“就可以看到xdata空間的所有內存的值。輸入“c:0x00,”就可以看到code空間的所有程序。在實際的硬件調試方式中,如果不用看memery窗口,就建議不用打開它。因為保持它的打開會增加仿真時通訊的時間,特別是單步運行的時間。這一章就完成了,我們學會了,指令延時,取反的用法,還有更重要的就是如何在keil調試環境中查看變量。第三課跑馬燈試驗在本課中,你可以學習到幾乎所有單片機試驗課程都會介紹到跑馬燈試驗。打開工程文件,如圖:-I 93耐I
27、I二:Source 白口u j*'因 main.匚34537SQQ O 0 0 0 a O 1ffdefira uJong sjnsiened lent#通“1加。鈍52h>外包括一個5 2際送內檸的頭文件ja| =1 va 愀I 嘴2 X- 4 8 8 a 1 2 a 4 5 0 ? 8 111111112 2 0-222-52窗Kt F1Q = F1*O;"/文件1H受有定義的R就表自己未定文sbii Fl I = Pl'1;sti-t H2 = Pl *2;mh ris = pr-a;chai cade dx516 3 it _ 1:s口3b :"
28、;墳呈治了 值巨在甘B./;跳馬燈程序void t.aiii(void) / 王桂掙uint ii'whilo. (1) /程一德環(P13=l T1D=O:icr (n.=0 ,n<400004 r.+4);F1D=1;Pl1=0;工”林二。;彈"QUUU ; r+0 ,Fll-1 T12-0 ;ter <n.=O ;n<1COOO; r.+->);P12=1;P13=Q;-frr(n=n :n<40BOD: n+J :1=1 mni4 sProgram Size:erecting hex* L&sson" - Udata-9
29、.Czdataa0code-1621&frart11lessor".,:rr-ors)rUWarning(s).這里實現跑馬燈的方法是,依次滅掉前一個燈和點亮后一個燈,再延時一會,不斷循環,就可以看到跑馬燈的效果了。請在編譯后,進入仿真,點全速運行看結果。好好研究這段代碼,可以自己試著自己修改代碼:例程中的跑馬燈在同一時刻只顯示1個燈,現在改為同時亮著2個燈的跑馬燈。第4課讀IO,用按鈕控制點燈請看一下電路,今天我們要學習用單片機讀取按鍵的值,并且使用一個按鍵K1去控制點亮P1.0控制的LED,用另一個按鍵K2去控制P1.1控制的LED。看電路圖,K1是接在P32上的,K2是
30、接在P35上的。下面講述一下識別按鍵的原理。在單片機中,我們可以讀取某個IO的值。在51的IO口,如果處于輸出1的狀態(51上電后IO就默認為1),這時IO內部可以簡化為有一個幾十K的電阻上拉到電源VCC(P0除外),這時這個IO就可以作為輸入腳用。P0是沒有上拉的,相當于一個懸空的引腳,就是高阻狀態,如果用P0,必須在外部接上拉電阻。我們這里用的是P3口的IO,內部有上拉。如果直接讀一個沒有按下按鍵的IO,就會讀到1。如果這個按鍵按下了,這個IO就通過按鍵短路到了地。這是就會讀到0。這就是讀按鍵的原理。下面看程序:ProjectspicexE.ejgisterV.1三1通Q。二.j,gist
31、,.j.rrQ0.ri0.rZ0r30.r40.f50.r50.r70.El-Sysa0.b-dptr0.PC$CIt陣w0.g#include<rag52.h>/也括一+曉標帶內載Q5Jtl口序sbitPIO=PTC:/要棒制的LED燈079sbLtKl=P3"2;"按鏤Eh開燈用口口北汽X2=P3"5;"按鍵關燈用1口charcodedx5163_at0H口口劾:/J這是“了:為主4 4用?個按睫分別控制匚ED燈亮火12 voidmain(void)/主程序13 (恒vhile(l)/程序裾壞15 1伯ift!Kl)"如果讀到K
32、1為上點燈17isF10=0.1920ifClK2)”如果讀到K2為匕火燈2'F22P10=l;231勾】26卜20i;:7.;,*LbJ國芝格噂哥(:il編譯,進入仿真,開始全速運行。這時可以實際操作一下,按下K1,燈亮;按下K2,燈滅。第5課標記的用法,用一個按鍵控制1個LED燈的亮滅,按鍵防抖動這一課,我們學習怎么用一個按鍵K1控制1個LED燈的亮和滅兩種斗犬態。按一次K1燈亮,再按一次K1燈滅。再按一次又亮,再按一次又滅。我們學習一下用一個bit變量來做一個標記,然后在按鍵的控制下,這個標記會變化,再根據這個標記的值,LED也輸出不同的狀態。因為按鍵按下時可能會有抖動的情況,每
33、次按下時,可能會發生了人難以覺察到的多次抖動,相當于一下子按下了很多次。這會導致程序無法識別出您真正的按鍵意圖。但是抖動一般都是發生在剛按下鍵和松開鍵的時候,所以,我們只要避開這一段時間,等鍵穩定按下或者松開時,再去讀它的值,一般就可以正確讀取了。所以,當讀到第一次按鍵的值時,要延時等待一會,再處理。在松開后,也延時一會,免得檢測到松開的抖動以為又有按鍵。(注,更復雜的應用,需要在按下延時之后重新驗證按鍵,為了簡化和方便理解,這個例程里沒有這樣做。)另外,因為程序是循環運行的,當一次按鍵處理后,又會再循環回來繼續檢測,如果您的按鍵這時還沒有松開,又會被讀到一次新的按鍵,并做處理。所以我們還要做
34、一個特殊的處理,識別到一個按鍵并處理完成之后,還要等待這個按鍵松開后,再繼續循環運行。ETStiltcharru = pro;"賈護刮的lnk£1= pyz;7技健立 cods 43516 3 _t 出£口斯:。這標溫的用總甫一下按蕊擔用1小工藤void JiaiBL(voidJ ” 主程序5it 1 ight;,/ 位孌量UU上讓 11.ihilrd)門程序福廠if (IKI)“如耳到口知口foi (nF0;n<lC00:nr); /偉詩為律穩京 liEht-"lighrt ;"萼徵臃一次,品已變化一波 vhileEIKJj:"
35、;等侍行鍵松F(由0 ;m2i CM; V等待帙髓特金也升1pikiiat,。直接把色變型賦信消l三工(請根據例程里的注釋理解程序。請編譯,進入仿真,全速運行,看結果。全速后,由于light變量初始化時默認為0,所以燈是亮的。按下K1,松開后,燈滅了;再按一次K1,松開后,燈滅了。這個例子里,我們只用一個按鍵就控制了燈的亮滅,這種方法可以節省了硬件資源,也就是節省了硬件成本。在實際項目設計中,有成本優勢,產品就更具競爭力。所以我們應該多學習類似的可以節省資源的方法。第6課用定時器中斷閃燈,定時器中斷的學習在第二課,我們學習了用指令延時閃燈,但是用指令方式閃燈有cpu不能做其他工作的缺點。這一課
36、,我們將學習如何使用定時器方式使燈閃爍。中斷的理解。這里將涉及到單片機中斷的應用,在cpu的一步步按照指令運行的過程中(主程序),可能會有其它的更緊急的需要做的事情(中斷服務程序),需要cpu暫時停止當前的程序(主程序),做完了(中斷服務程序)之后,又可以繼續去運行先前的程序(主程序)。就像你正在吃飯,一邊又在給水桶里放水,吃著吃著,水滿了,你就得趕快去把水龍頭關掉或者換一個空的水桶,再回來吃飯。單片機的定時器就像是一個水桶,你讓它啟動了,也就是水龍頭打開了;開始裝水了;定時在每個機器周期不斷自動加1,最后溢出了;水桶的水不斷增加,最也就滿出來了;定時器溢出時,你就要去做處理了;水桶的水滿了,
37、你也應該處理一下了;處理完后,單片機又可以回到剛剛開停止的地方繼續運行;水桶處理了,先前你在做什么也可以繼續去做什么了。單片機的主程序是從0x0000開始運行的,單片機服務程序從哪里開始運行呢?在51里,有多個中斷服務程序入口,0號入口是外中斷0,地址在0x0003;1號入口是定時器0,在0X000B;2號入口是外中斷1;地址在0x0013,3號入口是定時器2;地址在0X001B,等等。當中斷發生時,程序就記下當前運行的位置,跳到對應的中斷入口去運行中斷服務程序,運行完之后,又跳回到原來的位置繼續運行。在C51中,你不用理會中斷服務程序放在哪里,會怎么跳轉。你只要把某個函數標識為幾號中斷服務函
38、數就可以了。在發生了對應的中斷時,就會自動的運行這個函數。請看一下相關的51的硬件的書,對定時器工作的寄存器設置做進一步的了解。也可以做完試驗再了解,因為例程中都已經為您設置好了。Proj-scl WotiAdelineucLauursiEneddiacA'/i1'p:在中斷服務函數內設置斷點,再點全速。稍后就會停止在斷點上,就可以繼續單步運行了。如圖:FTQjiCl WkhSfj0優- Xffdefins uirt unsierL&d ir.tLUU杵a分中工門守 ulur寫 un?igrt*d LengAiluldde <±oE62 h;3但括一個&
39、amp;2標推泄川sbi+ Pio = pi n;"至桓前的工面燈方髓海翼崎與甑理春冬景康 wid JLiiiL Lvuid) Z/ 主桂,序T附由:gni /宅H-器n. IK拉丁作F式TS0=l EId=lEAl:南小"啟動完".器“打了定時番。中斷"小步總不斷 “程序循環主程坪在小早就邛斷自錯邱,笑睥/1“走困會口中斷ti n?r3 .) ir+ernpt 1/舞時器:中明星1三對心匚0; 丁二叱收 PlO-TlOi/F人走叫霸而蛤值二磔。阮選擇每秒中斷24次,每次溢出選擇每秒中斷30次,每次溢出1843200/24=768001843200/30
40、=61440選擇每秒中斷32次,每次溢出選擇每秒中斷36次,每次溢出選擇每秒中斷40次,每次溢出1843200/32=576001843200/36=512001843200/40=46080個機器周期,超出65536,無效。個機器周期個機器周期個機器周期個機器周期30次,每次溢出6從上面可以看到我們可以選擇方式有很多,但是最佳的是每秒中斷U0 09 1Q 11 12 43IO W 17 la20 :4 上工 33 4 252S2Q 二日 3Q si 32二二 M.1=1 mkin. c1440個機器周期。也就是賦定時器T2初值6553661440=4096,換成十六進制就是0x1000。從上
41、面的計算也可以看出晶振2118400Hz的好處,它可以整除的倍數多,要準確定時非常方便。更常見的應用是在串口波特率上,使用HZ可以輸出最多準確的標準波特率。請打開程序,如圖:在我們的這個例程中,前一課的1秒鐘輸出信號,被換成了一個全局標記。在主程序中去檢查這個標記,再清0標記和處理相應的工作。這一課的跑馬燈輸出方式也改變了,我們采用查表的方式,將要點亮的燈預先設置好,到了時間,就一起送到P1口。這樣,程序的執行效率會更高。下面請認真學習和分析例程:以下是例程,請打開lesson8目錄的工程,內容是一樣的。#defineucharunsignedchar/定義一下方便使用#defineuintu
42、nsignedint#defineulongunsignedlong#include<reg52.h>/包括一個52標準內核的頭文件sbitP10=P1A0;頭文件中沒有定義的IO就要自己來定義了sbitP11=P1A1;sbitP12=P1A2;sbitP13=P1A3;bitldelay=0;/長定時溢出標記,預置是0charcodedx5163_at_0x003b;/這是為了仿真設置的/定時器中斷方式的跑馬燈voidmain(void)/主程序ucharcodeledp4=0xfe,0xfd,0xfb,0xf7;/預定的寫入P1的值ucharledi;/用來指示顯示順序RCA
43、P2H=0x10;/賦T2的預置值0x1000,溢出30次就是1秒鐘RCAP2L=0x00;TR2=1;/啟動定時器ET2=1;/打開定時器2中斷EA=1;/打開總中斷while(1)/主程序循環if(ldelay)/發現有時間溢出標記,進入處理ldelay=0;/清除標記P1=ledpledi;/讀出一個值送到P1口ledi+;/指向下一個if(ledi=4)ledi=0;/到了最后一個燈就換到第一個/定時器2中斷timer0()interrupt5staticuchart;TF2=0;t+;if(t=30)/T2的預置值0x1000,溢出30次就是1秒鐘,晶振HZt=0;ldelay=1;
44、/每次長時間的溢出,就置一個標記,以便主程序處理編譯,進入仿真,看結果。可以看到4個燈以精確的1秒的速度不斷循環跑動。第9課,自動變速的跑馬燈試驗這一課,我們仍然使用上一個定時器跑馬燈工作方式,但是我們讓跑動的速度自動變化,從慢到快。相對于上一顆的跑馬燈試驗,我們新設置了一個變量speed,用來保存跑馬燈的移動速度,其實也就是定時器的累計時間溢出次數。我們在程序中修改speed的數值,溢出的時間就會改變,跑馬燈的移動速度也就改變了。我們是在每循環跑完一圈,就改變一次速度的。請仔細研究代碼,做到充分理解。源代碼如下:請打開對應目錄里的例程,和下面的代碼是一樣的。#defineucharunsig
45、nedchar/定義一下方便使用#defineuintunsignedint#defineulongunsignedlong#include<reg52.h>/包括一個52標準內核的頭文件sbitP10=P1A0;頭文件中沒有定義的IO就要自己來定義了sbitP11=P1A1;sbitP12=P1A2;sbitP13=P1A3;bitldelay=0;/長定時溢出標記,預置是0ucharspeed=10;/設置一個變量保存跑馬燈的移動速度charcodedx5163_at_0x003b;/這是為了仿真設置的/自動變速的跑馬燈試驗voidmain(void)/主程序ucharcode
46、ledp4=0xfe,0xfd,0xfb,0xf7;/預定的寫入P1的值ucharledi;/用來指示顯示順序RCAP2H=0x10;/賦T2的預置值0x1000,溢出30次就是1秒鐘RCAP2L=0x00;TR2=1;/啟動定時器ET2=1;/打開定時器2中斷EA=1;/打開總中斷while(1)/主程序循環if(ldelay)/發現有時間溢出標記,進入處理ldelay=0;/清除標記P1=ledpledi;/讀出一個值送到P1口ledi+;/指向下一個if(ledi=4)ledi=0;/到了最后一個燈就換到第一個speed-;if(speed=0)speed=10;/每循環顯示一次,就調快
47、一次溢出速度/定時器2中斷timer2()interrupt5staticuchart;TF2=0;t+;if(t=speed)/比較一個變化的數值,以實現變化的時間溢出t=0;ldelay=1;/每次長時間的溢出,就置一個標記,以便主程序處理請編譯,運行,并查看結果。第10課,4個按鍵4級變速的跑馬燈試驗,多任務的工作方式這一課,我們要用4個按鍵,控制跑馬燈的4種不同的跑動速度。按鍵的控制我們也做過了,結合跑馬燈,很容易程序就出來了。只是每按一個鍵,就賦給一個不同的定時器2溢出次數而已。我們設置為1秒,1/2秒,1/5秒,1/10秒四個檔次,分別時K1K4控制。這個程序的主程序執行了2個任務
48、。一個是跑馬燈,一個是檢測按鍵。程序的結構非常清晰。程序如下:#defineucharunsignedchar/定義一下方便使用#defineuintunsignedint#defineulongunsignedlong#include<reg52.h>/包括一個52標準內核的頭文件sbitP10=P1A0;頭文件中沒有定義的IO就要自己來定義了sbitP11=P1A1;sbitP12=P1A2;sbitP13=P1A3;sbitK1=P3A2;sbitK2=P3A5;sbitK3=P2A4;sbitK4=P2A5;bitldelay=0;/長定時溢出標記,預置是0ucharspe
49、ed=10;/設置一個變量保存默認的跑馬燈的移動速度charcodedx5163_at_0x003b;/這是為了仿真設置的/自動變速的跑馬燈試驗voidmain(void)/主程序ucharcodeledp4=0xfe,0xfd,0xfb,0xf7;/預定的寫入P1的值ucharledi;/用來指示顯示順序RCAP2H=0x10;/賦T2的預置值0x1000,溢出30次就是1秒鐘RCAP2L=0x00;TR2=1;/啟動定時器ET2=1;/打開定時器2中斷EA=1;/打開總中斷while(1)/主程序循環if(ldelay)/發現有時間溢出標記,進入處理ldelay=0;/清除標記P1=led
50、pledi;/讀出一個值送到P1口ledi+;/指向下一個if(ledi=4)/到了最后一個燈就換到第一個/檢查到按鍵,設置對應的跑馬速度ledi=0;if(!K1)speed=30;if(!K2)speed=15;if(!K3)speed=6;if(!K4)speed=3;/定時器2中斷timer2()interrupt5staticuchart;TF2=0;t+;if(t=speed)|(t>30)/ 比較一個變化的數值,以實現變化的時間溢出, 同時限制了最慢速度t=0;ldelay=1;/每次長時間的溢出,就置一個標記,以便主程序處理請打開工程,編譯,運行。可以看到,啟動后,以默認
51、的速度跑馬,按K1,速度是1秒一個燈,按K2,是1/2秒一個燈,按K3是1/5秒一個燈,按K4,則最快,是1/10秒。第11課,一個按鍵控制的10級變速跑馬燈試驗在本課中,我們要用一個按鍵來實現跑馬燈的10級調速。這又會涉及到鍵的去抖的問題。本課的試驗結果是,每按一次按鍵,跑馬速度就降低一級,共10級。這里我們又增加了一個變量speedlever,來保存當前的速度檔次。在按鍵里的處理中,多了當前檔次的延時值的設置。請看程序:#defineucharunsignedchar/定義一下方便使用#defineuintunsignedint#defineulongunsignedlong#includ
52、e<reg52.h>/包括一個52標準內核的頭文件sbitP10=P1A0;/頭文件中沒有定義的IO就要自己來定義了sbitP11=P1A1;sbitP12=P1A2;sbitP13=P1A3;sbitK1=P3A2;bitldelay=0;/長定時溢出標記,預置是0ucharspeed=10;/設置一個變量保存默認的跑馬燈的移動速度ucharspeedlever=0;/保存當前的速度檔次charcodedx5163_at_0x003b;/這是為了仿真設置的/一個按鍵控制的10級變速跑馬燈試驗voidmain(void)/主程序ucharcodeledp4=0xfe,0xfd,0x
53、fb,0xf7;/預定的寫入P1的值ucharledi;/用來指示顯示順序uintn;RCAP2H=0x10;/賦T2的預置值0x1000,溢出30次就是1秒鐘RCAP2L=0x00;TR2=1;/啟動定時器ET2=1;/打開定時器2中斷EA=1;/打開總中斷while(1)/主程序循環if(ldelay)/發現有時間溢出標記,進入處理ldelay=0;/清除標記P1=ledpledi;/讀出一個值送到P1口ledi+;/指向下一個if(ledi=4)ledi=0;/到了最后一個燈就換到第一個if(!K1)/如果讀到K1為0for(n=0;n<1000;n+);/等待按鍵穩定while(
54、!K1);/等待按鍵松開for(n=0;n<1000;n+);/等待按鍵穩定松開speedlever+;if(speedlever=10)speedlever=0;speed=speedlever*3;/檔次和延時之間的預算法則,也可以用查表方法,做出不規則的法則/定時器2中斷timer2()interrupt5staticuchart;TF2=0;t+;if(t=speed)|(t>30)/比較一個變化的數值,以實現變化的時間溢出,同時限制了最慢速度為1秒t=0;ldelay=1;/每次長時間的溢出,就置一個標記,以便主程序處理請打開lesson11目錄的工程,編譯,運行,看結果:按K1,速度則降低一次,總共10個檔次第12課,可編程自動控制控制跑馬燈這一顆,我們學習如何讓跑馬燈自動按照我們預定的順序進行。這種控制在工控場合經常用到。這個程序里,我們預先定義了一個變化的順序speedcode,每跑一圈燈就根據預定設置的表格數據來決定下一圈的跑馬速度。這樣我們就實現了按照預定的順序自動變化運行。請看代碼:#defineucharunsignedc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年VB考試高級題目及試題及答案
- 火災應急預案培訓制度(3篇)
- 2025年法學概論考試的知識掌握方式與試題及答案
- 2025年科技進步對戰略影響試題及答案
- 行政法與社會資本的關系探討試題及答案
- 2025年信息技術應用能力試題及答案
- 2025年法學概論的實務考察及試題及答案
- 行政法學重要時事考題及答案
- 開源軟件項目2025年考試試題及答案
- 2025年網絡管理資格考核試題及答案
- 安措費清單完整版本
- 人教版五年級數學下冊全冊分層作業設計含答案
- 民法典企業宣講會
- 學校減免校服政策方案
- 企業管理中的組織行為學
- 培訓課件 -華為鐵三角工作法完全解密
- 貨物儲存、運輸環節的質量保證措施
- 三對三籃球賽記錄表
- 配電柜例行檢驗報告1
- 小學生成長主題班會 只爭朝夕不負韶華-勵志主題 課件 (共27張PPT)
- 市職業技能培訓工作調研報告
評論
0/150
提交評論