




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C51單片機(jī)步步學(xué)筆記(最新更新)作為一個(gè)初學(xué)者,如何單片機(jī)入門(mén)?我需要那些知識(shí)和設(shè)備?知識(shí)上,其實(shí)不需要多少東西,會(huì)簡(jiǎn)單的C語(yǔ)言,知道51單片機(jī)的基本結(jié)構(gòu)就可以了。一般的大學(xué)畢業(yè)生都可以了,自學(xué)過(guò)這2門(mén)課程的高中生也夠條件。設(shè)備上,一般是建議購(gòu)買(mǎi)一個(gè)仿真器,這樣才可以進(jìn)行實(shí)際的,全面的學(xué)習(xí)。日后在工作上,仿真器也大有用處還有,一般光有仿真器是不行,還得有一個(gè)實(shí)際的電路,即學(xué)習(xí)板。學(xué)習(xí)板一般價(jià)格都比較貴,而且許多學(xué)習(xí)板配套程序和講解不夠完善。這里介紹的是最簡(jiǎn)單的學(xué)習(xí)板,4個(gè)按鍵加4個(gè)LED發(fā)光管,一個(gè)蜂鳴器,一個(gè)24c02即可。通過(guò)30個(gè)教程,初學(xué)者可以學(xué)到:?jiǎn)纹瑱C(jī)控制外部設(shè)備,讀取外部設(shè)備狀
2、態(tài),外部中斷的應(yīng)用,中斷的深入理解,變量和標(biāo)記的靈活應(yīng)用,定時(shí)器的靈活應(yīng)用,可編程自動(dòng)控制的方法,按鍵控制設(shè)備動(dòng)作的方法,PWM輸出的設(shè)計(jì),存儲(chǔ)器的讀寫(xiě),延時(shí)報(bào)警器的設(shè)計(jì),各種報(bào)警音的設(shè)計(jì),音樂(lè)播放的設(shè)計(jì),程序模塊化的設(shè)計(jì)等等知識(shí)。雖然,這些知識(shí)的覆蓋面有限,但是,當(dāng)你學(xué)習(xí)并掌握了這30個(gè)試驗(yàn)之后,您就會(huì)豁然開(kāi)朗,單片機(jī)的編程控制如此簡(jiǎn)單!學(xué)習(xí)完后,您就已經(jīng)完全地入門(mén)了,并可以自主地對(duì)其它的單片機(jī)知識(shí)進(jìn)行學(xué)習(xí)、試驗(yàn),甚至進(jìn)行項(xiàng)目開(kāi)發(fā)!第一課了解單片機(jī)及單片機(jī)的控制原理,控制一個(gè)LED燈的亮和滅本章學(xué)習(xí)內(nèi)容:?jiǎn)纹瑱C(jī)基本原理,如何仿真器,如何編程點(diǎn)亮和滅掉一個(gè)LED燈,如何進(jìn)入KEILC51uV調(diào)
3、試環(huán)境,如何使用單步,斷點(diǎn),全速,停止的調(diào)試方法單片機(jī)現(xiàn)在是越來(lái)越普及了,學(xué)習(xí)單片機(jī)的熱潮也一陣陣趕來(lái),許多人因?yàn)楣ぷ餍枰蛘邆€(gè)人興趣需要學(xué)習(xí)單片機(jī)??梢哉f(shuō),掌握了單片機(jī)開(kāi)發(fā),就多了一個(gè)飯碗。51單片機(jī)已經(jīng)有30多年的歷史了,在中國(guó),高校的單片機(jī)課程大多數(shù)都是51,而51經(jīng)過(guò)這么多年的發(fā)展,也增長(zhǎng)了許多的系列,功能上有了許多改進(jìn),也擴(kuò)展出了不少分支。而國(guó)內(nèi)書(shū)店的單片機(jī)專架上,也大多數(shù)都是51系列??梢灶A(yù)見(jiàn),51單片機(jī)在市場(chǎng)上只會(huì)越來(lái)越多,功能只會(huì)越來(lái)越豐富,在可以預(yù)見(jiàn)的數(shù)十年內(nèi)是不可能會(huì)消失的。下面以51為例來(lái)了解一下單片機(jī)是什么東西,控制原理又是什么?在數(shù)字電路中,電壓信號(hào)只有兩種情況,高電
4、平和低電平,用數(shù)字來(lái)記錄就是1和0。單片機(jī)內(nèi)部的CPU,寄存器,總線等等結(jié)構(gòu)都是通過(guò)1和0兩種信號(hào)來(lái)運(yùn)作的,數(shù)據(jù)也是以1或者0來(lái)保存的。單片機(jī)的輸入輸出管腳,也就是IO口,也是只輸出或識(shí)別1和0兩種信號(hào),也就是高電平和低電平。當(dāng)單片機(jī)輸出一個(gè)或一組電平信號(hào)到IO口后,外部的設(shè)備就可以讀到這些信號(hào),并進(jìn)行相應(yīng)操作,這就是單片機(jī)對(duì)外部的控制。當(dāng)外部一個(gè)或一組電平信號(hào)送到單片機(jī)的IO口時(shí),單片機(jī)也可以讀到這些信號(hào),并進(jìn)行分析操作,這就是單片機(jī)對(duì)外部設(shè)備信號(hào)的讀取。當(dāng)然實(shí)際的操作中,這些信號(hào)可能十分復(fù)雜,必須嚴(yán)格地按照規(guī)定的時(shí)間順序(時(shí)序)輸入輸出。每種設(shè)備也都規(guī)定了自己的時(shí)序,只要都嚴(yán)格遵守,就可以
5、控制任何設(shè)備,做出只要你想象得出的任何事情。您可能會(huì)再問(wèn),我如何讓單片機(jī)去控制和分析外部設(shè)備呢?答案是程序,您可以編寫(xiě)相單片機(jī)在上電時(shí),就會(huì)一步一步按照關(guān)的程序,并且把他們燒寫(xiě)到單片機(jī)內(nèi)部的程序空間,您寫(xiě)的程序去執(zhí)行指令,做您想做的事情。在51標(biāo)準(zhǔn)芯片中,有32個(gè)輸入輸出IO,分為4組,每組8個(gè),分別為P0口,P1口,P2口,P3口。P1口的8條腳就用P1.0至P1.7表示,其余類(lèi)似。51就是用這32個(gè)口來(lái)完成所有外部操作的。對(duì)于51的內(nèi)部結(jié)構(gòu),如果您已經(jīng)了解,那是最好;如果不懂,也可以先放下,在完成了本教程開(kāi)始的幾個(gè)章節(jié)之后,您就會(huì)大有興趣,自己去尋找資料閱讀了。當(dāng)然,如果您希望成為一個(gè)優(yōu)秀
6、的單片機(jī)開(kāi)發(fā)程序員,還是必須熟悉單片機(jī)的內(nèi)部結(jié)構(gòu)及工作原理,切不可偷懶!在這一章,您將用程序去控制一個(gè)LED發(fā)光管的亮和滅。你應(yīng)該知道,LED發(fā)光管在通過(guò)一定電流時(shí)亮,不通電就滅。為了不讓LED通過(guò)太大的電流把它燒壞,我們還要串上限流電阻。51的IO是弱上拉的方式,在輸出高電平時(shí),只能輸出幾十微安的電流到地,而在輸出低電平時(shí),VCC電源可以輸入幾十毫安的電流到IO。一般LED需要10毫安左右電流點(diǎn)亮,我們就將LED接在電源VCC和IO口之間,中間串上電阻,當(dāng)IO輸出低電平時(shí),燈就亮了,反之,燈就滅了。我們?cè)谶@個(gè)程序里要控制的是P1.0。請(qǐng)參考一下我們將要使用的試驗(yàn)板的電路圖。上一 n n* _
7、 7:?.M在實(shí)際的單片機(jī)學(xué)習(xí)和開(kāi)發(fā)中,i可以用仿真器模擬一個(gè)CPU芯片,讓它按照您編寫(xiě)的程序工作,并且進(jìn)行調(diào)試,一步步排除程序的bug,使程序正常工作。程序工作正常后,您就可以用燒寫(xiě)器將您編寫(xiě)的程序燒入購(gòu)買(mǎi)來(lái)的單片機(jī)芯片中,讓它自己去運(yùn)行了。要使用仿真器,還得有一個(gè)編譯調(diào)試的環(huán)境,這個(gè)環(huán)境是在計(jì)算機(jī)上運(yùn)行的,我們就在計(jì)算機(jī)上編寫(xiě)和調(diào)試程序,計(jì)算機(jī)和仿真器有連接,仿真器中的各種數(shù)據(jù)和程序,都可以從計(jì)算機(jī)上觀察到,并可以觀察變量,寫(xiě)入變量的值,單步調(diào)試程序,在程序中設(shè)置斷點(diǎn)調(diào)試,全速運(yùn)行,停止程序運(yùn)行,等等操作。我們使用keilC51編譯調(diào)試環(huán)境,仿真器的選擇太多了,你可以根據(jù)自己的實(shí)際情況來(lái)選
8、擇。隨后我將給大家提供keilc51相關(guān)的中文說(shuō)明資料,這些資料詳細(xì)地說(shuō)明了如何使用C51編程和如何使用keiluV2環(huán)境調(diào)試?,F(xiàn)在可以開(kāi)始做試驗(yàn)了,我們打開(kāi)已經(jīng)建立好的工程和編寫(xiě)好的程序試驗(yàn)。順便還會(huì)學(xué)習(xí)一下程序調(diào)試的技巧。至于如何建立一個(gè)新工程,請(qǐng)參考C51的幫助文件。請(qǐng)雙擊lessoncode01目錄下的lesson1.uv2,打開(kāi)后界面如下:點(diǎn)一下上圖第三排第2或者第3個(gè)按鈕(您的編譯器按鈕位置不一定在那個(gè)位置,自己找找),就可以看到編譯結(jié)果了。上面顯示是0errrs,0warnings,這是最佳的編譯結(jié)果,如果有error,則無(wú)法進(jìn)行下一步仿真,如果有warning,一定要盡量消除,
9、確實(shí)無(wú)法消除的,也要確認(rèn)不會(huì)對(duì)程序造成影響,才進(jìn)行下一步的仿真。在編譯結(jié)果中,我們還可以看到有data,xdata,code等用了多少字節(jié)的報(bào)告,要注意您的單片機(jī)中是否有這么多的資源,如果不夠,將來(lái)燒片運(yùn)行時(shí)就可能出現(xiàn)問(wèn)題。比如AT89C51的程序空間是4K,xdata如果沒(méi)有外擴(kuò)就是0個(gè),data是128個(gè)。超出這些范圍,程序就不能在AT89c51中運(yùn)行。不同的芯片有不同的容量,如SST89E516RD就有64K程序,內(nèi)部768字節(jié)XDATA,還有256個(gè)字節(jié)的data。我們的例程中肯定都考慮了這些了,肯定不會(huì)超出,將來(lái)自己開(kāi)發(fā)時(shí)就要注意了。下面我們故意把第9行的P10寫(xiě)成P11,點(diǎn)編譯,因
10、為沒(méi)有預(yù)先定義P11,所以就報(bào)告錯(cuò)誤了,如下圖:雙擊一下錯(cuò)誤報(bào)告的那一行,窗口就也會(huì)跳到這一行,方便您進(jìn)行修改。好了,現(xiàn)在請(qǐng)把錯(cuò)誤改回去,再編譯一次,出現(xiàn)報(bào)告正確了以后,下面開(kāi)始仿真了。點(diǎn)一下第二行第5個(gè)一個(gè)放大鏡里面一個(gè)d字母的按鈕,就可以進(jìn)入仿真了,仿真器要事先連接好喲。進(jìn)入仿真后要退出仿真環(huán)境也是點(diǎn)這個(gè)按鈕。注意,等會(huì)如果程序在正在全速運(yùn)行時(shí),仿真環(huán)境是不能直接退出的,得先點(diǎn)停止運(yùn)行后,再點(diǎn)仿真按鈕才可以退出。點(diǎn)進(jìn)入仿真按鈕,程序開(kāi)始裝載,PC自動(dòng)運(yùn)行到了main()停下,并指向了main()函數(shù)的第一行。進(jìn)入仿真窗口后,如果出現(xiàn)的不是前面的源代碼窗口,而是夾有反匯編代碼的窗口,直接關(guān)掉
11、這個(gè)窗口就會(huì)恢復(fù)到代碼窗口。下次進(jìn)入也會(huì)直接進(jìn)入到源代碼窗口?,F(xiàn)在先試驗(yàn)單步,點(diǎn)單步(兩個(gè)單步都可以,一般點(diǎn)單步跨過(guò))??梢钥吹綗袅亮恕C指針也指向了下一個(gè)程序行。再點(diǎn)一下單步,PC又走下一步,燈滅了。再點(diǎn)一次,PC走到掛起的程序行了,繼續(xù)點(diǎn)仍然在這一行。這句指令其實(shí)就是使程序不斷地跳到自己這一行,別的什么也不做。一般稱作程序掛起。一般的實(shí)際應(yīng)用中的程序是不會(huì)掛起的,一般是在main函數(shù)里做一個(gè)大循環(huán),程序如下:voidmain(void)/主程序while(1)P11=0;/亮燈P10=1;/滅燈請(qǐng)將main函數(shù)程序改為上面的代碼,我們下一步將試驗(yàn)斷點(diǎn)的操作。在第15行雙擊一下,可以看到程
12、序行左邊出現(xiàn)了一個(gè)紅方塊,這就是設(shè)置斷點(diǎn),再雙擊一次,斷點(diǎn)就取消了。如果程序在全速運(yùn)行的過(guò)程中遇到斷點(diǎn),就會(huì)自動(dòng)停下來(lái)給你分析。注意在進(jìn)入仿真后,并且程序是停止?fàn)顟B(tài)時(shí),才可以設(shè)置或者取消斷點(diǎn)。g冒:le e« 好 PKijict 占y 引醇力p可2值4 k。= 好口 紗s* Heph.MKI:芭窿圖同£電IA 二,"y % .£哨I三1 M .:#*” 舊1國(guó)畫(huà), n x|獨(dú)趣幽眄rKrrMR HLII:悝團(tuán)*;當(dāng)廖產(chǎn).。手;:,伸ff±-1'Ui(i misi niftd mt。由寸 Lt a uloRC Hun 我lore«
13、;mclude CrBS5P.)O"隹百一個(gè)印師市向弒國(guó)土文件fibLl FLO二Pl*。,"受三件中度者走戈用心靛要自己來(lái)走發(fā)了char co* dxE】53 it QkCU二h ;,:V事F £ 耳其煮口voidT f? 7I*i】M力F般序褶“心Fmtq寺叮 1方 I PIOzl. Jj"J J IJ現(xiàn)在點(diǎn)全速運(yùn)行,可以看到程序在斷點(diǎn)處停了下來(lái),并且由于前一句指令剛剛執(zhí)行了點(diǎn)燈,所以這時(shí)燈是亮著的?,F(xiàn)在在第14行設(shè)置斷點(diǎn),并且取消上一個(gè)斷點(diǎn)?,F(xiàn)在點(diǎn)全速運(yùn)行,可以看到程序在斷點(diǎn)處停了下來(lái),并且由于剛剛執(zhí)行了滅燈,燈是滅著的。好,現(xiàn)在試驗(yàn)全速運(yùn)行和停止
14、。把斷點(diǎn)取消,再點(diǎn)全速運(yùn)行,可以看到燈是亮著的,但是不是很亮,這是由于程序是循環(huán)的,亮滅交替進(jìn)行,亮的時(shí)間并不是全部的時(shí)間?,F(xiàn)在點(diǎn)停止,可以看到程序停止了,重復(fù)幾次進(jìn)行全速和停止,可以發(fā)現(xiàn)每次停止的地方不一定是同一位置。第二課用指令方式延時(shí)閃爍LED燈本章將學(xué)習(xí)如何使LED閃爍,和如何查看變量的值。單片機(jī)內(nèi)部的CPU工作都是要靠時(shí)鐘驅(qū)動(dòng)的。在標(biāo)準(zhǔn)51芯片中,每個(gè)指令周期是12個(gè)時(shí)鐘。所以只要外部時(shí)鐘固定,某一條指令運(yùn)行的時(shí)間也是固定的。比如本試驗(yàn)中的單片機(jī)晶振振蕩輸出的時(shí)鐘是HZ,一條單周期指令執(zhí)行的時(shí)間就是12/秒=5.425347X107秒,這樣如果你想在程序里延遲一段時(shí)間,就可以用循環(huán)執(zhí)
15、行多少條指令來(lái)實(shí)現(xiàn)。這是一個(gè)最簡(jiǎn)單的延時(shí)方法,優(yōu)點(diǎn)是不占用其他的單片機(jī)資源,缺點(diǎn)是不容易計(jì)算準(zhǔn)確延時(shí)時(shí)間,而且延時(shí)過(guò)程中CPU無(wú)法做其他工作。指令延時(shí)方法一般用在一些不用精確計(jì)時(shí)的場(chǎng)合。在需要精確計(jì)時(shí)的場(chǎng)合,需要使用定時(shí)器,在之后的課程中將會(huì)學(xué)到。程序由一個(gè)循環(huán)組成,在點(diǎn)亮 P10 口的LED之后,延時(shí)一段時(shí)間,再滅掉 LED,又 延時(shí)一段時(shí)間,之后循環(huán)到前面。for ()循環(huán)后面直接一個(gè)分號(hào),表示這個(gè)循環(huán)里面什么C寫(xiě)法。事情也不做,就等循環(huán)完成指定的次數(shù)就退出來(lái)。這也是指令循環(huán)延時(shí)的最常見(jiàn)的編譯后,按進(jìn)入仿真。按全速運(yùn)行,可以看到P1.0的LED燈不斷地閃爍。下面我們用另一個(gè)更簡(jiǎn)單的方式點(diǎn)燈
16、,就是取反IO口的狀態(tài)。取反指令將當(dāng)前bit變量的狀態(tài)反轉(zhuǎn),當(dāng)前是1,取反后就是0,當(dāng)前是0,取反后就是1。IO口相當(dāng)于一個(gè)bit變量,也可以這樣取反。請(qǐng)修改程序如下:出隹31-小同贏71需01士枇F才尼ik】依廣心:區(qū)zigned出自i7W'一下方傳林.電口:*dfinuuintunsignedibnt-三Ttlrfireillfltilone口sinclude<iei62.h>“包楮一T5游準(zhǔn)內(nèi)樵的頭經(jīng)件u*WgtFl口Pl'。;/佚式件軻曼村定義的m就要自己東走M(jìn)雕顯晶翳產(chǎn)迷SrQBU;“這是為了仿其收量的jo±liiiriiyci-dj,>&
17、#39;ii.TLkiMtvtii1c1-5/將Jt-后試!F1XT4。:“取反tfc?陽(yáng)n團(tuán)用f-:ri#:;r<2QGOO:Ki)可以看到旁邊出現(xiàn)了一個(gè)小框框,上面顯示了n=0x47D3,這就是變量此時(shí)的值。如果覺(jué)得Fr口gram31。日;d同匕&3口國(guó)coJeSScrftT111_3h*KFilstrf1IRssnn"",.,hl»«EQEilM-0Error(r),0warning(g)«,ll*卜4.3rnd,F(xiàn)ifidinFfef11'-:!?-編譯成功后,再點(diǎn)全速運(yùn)行。同樣可以看到LED閃爍的現(xiàn)象。可以看到,
18、這種方法,我們只需要一次延時(shí),就可以實(shí)現(xiàn)閃爍了。下面我們?cè)賮?lái)學(xué)習(xí)如何查看變量n在運(yùn)行中的值。注意,要查看變量的值,只能在程序停下來(lái)的狀態(tài)下查看。在程序運(yùn)行的過(guò)程中,程序不斷地運(yùn)行,變量也在不斷地變化,一般是無(wú)法查看的。點(diǎn)停止程序,將鼠標(biāo)放在程序中的“n”上面。這樣可能會(huì)點(diǎn)不準(zhǔn)確,可以選中你要看的變量,同樣會(huì)顯示變量的值,個(gè)人感覺(jué)這種操作更為方便。如圖:需耳曲tr)-uOgpk 1 Ilf ItL- B.pJ .L&gistcr卜,4_Liu三氐*交LhtUD"rl%*2QWr3OOJm""" r-4.JrOO- r5fcDO54T3打工一.馬口油
19、i- tEhiDD, ,燈DkOTdj?Lrre $匚:口&,國(guó) IWWMttiOTMm w M aDewoeM M1 lM1aM1017ielefI It I'iiJcTingUFLi ci at ft虐in*udrisig,n-d-iriE-ludE Ce cyh2. h>在h pio - rro:"人文件事沒(méi)存疣義田皿旅w日l(shuí)ctiar C3de ciE L t5 3 it CsEdb ;/江是涉 了優(yōu)其黃之/Wfjftfr:rniil nir Cvo3(D ,: ,I'序Hint rr"wiu_lq c i/7轅件徉科jnsSOtCU
20、= 日第(11I上勺匚門(mén)a d "r j WLiQiCUTnpTit Hindt 】qgqrX口日見(jiàn) 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,回車(chē),就看到結(jié)果了。請(qǐng)注意看卜圖的命令行窗口的結(jié)果。中相nt.但國(guó)營(yíng)號(hào)二上陽(yáng)尸l_:Si sLerp- S-如口i-OLtriOO門(mén)鼐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»捱是苦了帕羨也 門(mén)/燈社即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現(xiàn)在就變成我想要的值怎么辦?這也是調(diào)試常見(jiàn)的手段,設(shè)置一個(gè)變量的值,比如,讓n=0x1234,只要在命令框里輸入“n=0x1234”就行了,幾乎所有變量都可以這樣直接設(shè)置,包括IO,比如你輸入“P1.1=0”結(jié)果第二個(gè)燈就亮了。還有一招常用的,就是在watch窗口看變量。點(diǎn)watch圖標(biāo),就是那個(gè)有個(gè)眼鏡的圖標(biāo),打開(kāi)watch窗口。如圖:這個(gè)窗口里有l(wèi)ocals頁(yè)就是當(dāng)前函數(shù)使用的變量的列表,還有有watch1和2兩個(gè)窗口,就是自
23、定義要看的變量的值,可以手工輸入,也可以選中某個(gè)變量,按右鍵,將出現(xiàn)一個(gè)菜單。選擇add到watch窗口即可,在程序停止時(shí)隨時(shí)看到此變量的值。注意要看某個(gè)變量,如果這個(gè)變量是某個(gè)函數(shù)私有的,必須是程序停止時(shí)并且PC已經(jīng)停止在了這個(gè)函數(shù)中才可以看到,各種看變量的情況都是這樣。還有一種直接看存儲(chǔ)器的方法,可以看到所有存儲(chǔ)器的值,但是和變量名稱就不是那么好對(duì)應(yīng)起來(lái)了。點(diǎn)memory窗口圖標(biāo),打開(kāi)memory窗口,如圖:(8S iEi©初行田pgpct Mur 心 pax .口三u |歸I國(guó)|cc ;,、-UI 口叱“PU三F1飛:7頭友伴中尊連史的M嗷JF自已勾 char 皿 dxblb口
24、1 或 吮00時(shí);"這另為了衡宜皆于 門(mén)了可斤不一nai±i(v«iD "uint n;鄭馨修辭plo=Ti口;"取房糕 tot (f. k" 2j00J.r-H-. .1iS 國(guó) 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開(kāi)始的所有內(nèi)存。如上圖。輸入“i:0x00就可以看到idata空間的所有內(nèi)存的值。輸入“x:0x00,“就可以看到xdata空間的所有內(nèi)存的值。輸入“c:0x00,”就可以看到code空間的所有程序。在實(shí)際的硬件調(diào)試方式中,如果不用看memery窗口,就建議不用打開(kāi)它。因?yàn)楸3炙拇蜷_(kāi)會(huì)增加仿真時(shí)通訊的時(shí)間,特別是單步運(yùn)行的時(shí)間。這一章就完成了,我們學(xué)會(huì)了,指令延時(shí),取反的用法,還有更重要的就是如何在keil調(diào)試環(huán)境中查看變量。第三課跑馬燈試驗(yàn)在本課中,你可以學(xué)習(xí)到幾乎所有單片機(jī)試驗(yàn)課程都會(huì)介紹到跑馬燈試驗(yàn)。打開(kāi)工程文件,如圖:-I 93耐I
27、I二:Source 白口u j*'因 main.匚34537SQQ O 0 0 0 a O 1ffdefira uJong sjnsiened lent#通“1加。鈍52h>外包括一個(gè)5 2際送內(nèi)檸的頭文件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) /程一德環(huán)(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).這里實(shí)現(xiàn)跑馬燈的方法是,依次滅掉前一個(gè)燈和點(diǎn)亮后一個(gè)燈,再延時(shí)一會(huì),不斷循環(huán),就可以看到跑馬燈的效果了。請(qǐng)?jiān)诰幾g后,進(jìn)入仿真,點(diǎn)全速運(yùn)行看結(jié)果。好好研究這段代碼,可以自己試著自己修改代碼:例程中的跑馬燈在同一時(shí)刻只顯示1個(gè)燈,現(xiàn)在改為同時(shí)亮著2個(gè)燈的跑馬燈。第4課讀IO,用按鈕控制點(diǎn)燈請(qǐng)看一下電路,今天我們要學(xué)習(xí)用單片機(jī)讀取按鍵的值,并且使用一個(gè)按鍵K1去控制點(diǎn)亮P1.0控制的LED,用另一個(gè)按鍵K2去控制P1.1控制的LED。看電路圖,K1是接在P32上的,K2是
30、接在P35上的。下面講述一下識(shí)別按鍵的原理。在單片機(jī)中,我們可以讀取某個(gè)IO的值。在51的IO口,如果處于輸出1的狀態(tài)(51上電后IO就默認(rèn)為1),這時(shí)IO內(nèi)部可以簡(jiǎn)化為有一個(gè)幾十K的電阻上拉到電源VCC(P0除外),這時(shí)這個(gè)IO就可以作為輸入腳用。P0是沒(méi)有上拉的,相當(dāng)于一個(gè)懸空的引腳,就是高阻狀態(tài),如果用P0,必須在外部接上拉電阻。我們這里用的是P3口的IO,內(nèi)部有上拉。如果直接讀一個(gè)沒(méi)有按下按鍵的IO,就會(huì)讀到1。如果這個(gè)按鍵按下了,這個(gè)IO就通過(guò)按鍵短路到了地。這是就會(huì)讀到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>/也括一+曉標(biāo)帶內(nèi)載Q5Jtl口序sbitPIO=PTC:/要棒制的LED燈079sbLtKl=P3"2;"按鏤Eh開(kāi)燈用口口北汽X2=P3"5;"按鍵關(guān)燈用1口charcodedx5163_at0H口口劾:/J這是“了:為主4 4用?個(gè)按睫分別控制匚ED燈亮火12 voidmain(void)/主程序13 (恒vhile(l)/程序裾壞15 1伯ift!Kl)"如果讀到K
32、1為上點(diǎn)燈17isF10=0.1920ifClK2)”如果讀到K2為匕火燈2'F22P10=l;231勾】26卜20i;:7.;,*LbJ國(guó)芝格噂哥(:il編譯,進(jìn)入仿真,開(kāi)始全速運(yùn)行。這時(shí)可以實(shí)際操作一下,按下K1,燈亮;按下K2,燈滅。第5課標(biāo)記的用法,用一個(gè)按鍵控制1個(gè)LED燈的亮滅,按鍵防抖動(dòng)這一課,我們學(xué)習(xí)怎么用一個(gè)按鍵K1控制1個(gè)LED燈的亮和滅兩種斗犬態(tài)。按一次K1燈亮,再按一次K1燈滅。再按一次又亮,再按一次又滅。我們學(xué)習(xí)一下用一個(gè)bit變量來(lái)做一個(gè)標(biāo)記,然后在按鍵的控制下,這個(gè)標(biāo)記會(huì)變化,再根據(jù)這個(gè)標(biāo)記的值,LED也輸出不同的狀態(tài)。因?yàn)榘存I按下時(shí)可能會(huì)有抖動(dòng)的情況,每
33、次按下時(shí),可能會(huì)發(fā)生了人難以覺(jué)察到的多次抖動(dòng),相當(dāng)于一下子按下了很多次。這會(huì)導(dǎo)致程序無(wú)法識(shí)別出您真正的按鍵意圖。但是抖動(dòng)一般都是發(fā)生在剛按下鍵和松開(kāi)鍵的時(shí)候,所以,我們只要避開(kāi)這一段時(shí)間,等鍵穩(wěn)定按下或者松開(kāi)時(shí),再去讀它的值,一般就可以正確讀取了。所以,當(dāng)讀到第一次按鍵的值時(shí),要延時(shí)等待一會(huì),再處理。在松開(kāi)后,也延時(shí)一會(huì),免得檢測(cè)到松開(kāi)的抖動(dòng)以為又有按鍵。(注,更復(fù)雜的應(yīng)用,需要在按下延時(shí)之后重新驗(yàn)證按鍵,為了簡(jiǎn)化和方便理解,這個(gè)例程里沒(méi)有這樣做。)另外,因?yàn)槌绦蚴茄h(huán)運(yùn)行的,當(dāng)一次按鍵處理后,又會(huì)再循環(huán)回來(lái)繼續(xù)檢測(cè),如果您的按鍵這時(shí)還沒(méi)有松開(kāi),又會(huì)被讀到一次新的按鍵,并做處理。所以我們還要做
34、一個(gè)特殊的處理,識(shí)別到一個(gè)按鍵并處理完成之后,還要等待這個(gè)按鍵松開(kāi)后,再繼續(xù)循環(huán)運(yùn)行。ETStiltcharru = pro;"賈護(hù)刮的lnk£1= pyz;7技健立 cods 43516 3 _t 出£口斯:。這標(biāo)溫的用總甫一下按蕊擔(dān)用1小工藤void JiaiBL(voidJ ” 主程序5it 1 ight;,/ 位孌量UU上讓 11.ihilrd)門(mén)程序福廠if (IKI)“如耳到口知口foi (nF0;n<lC00:nr); /偉詩(shī)為律穩(wěn)京 liEht-"lighrt ;"萼徵臃一次,品已變化一波 vhileEIKJj:"
35、;等侍行鍵松F(由0 ;m2i CM; V等待帙髓特金也升1pikiiat,。直接把色變型賦信消l三工(請(qǐng)根據(jù)例程里的注釋理解程序。請(qǐng)編譯,進(jìn)入仿真,全速運(yùn)行,看結(jié)果。全速后,由于light變量初始化時(shí)默認(rèn)為0,所以燈是亮的。按下K1,松開(kāi)后,燈滅了;再按一次K1,松開(kāi)后,燈滅了。這個(gè)例子里,我們只用一個(gè)按鍵就控制了燈的亮滅,這種方法可以節(jié)省了硬件資源,也就是節(jié)省了硬件成本。在實(shí)際項(xiàng)目設(shè)計(jì)中,有成本優(yōu)勢(shì),產(chǎn)品就更具競(jìng)爭(zhēng)力。所以我們應(yīng)該多學(xué)習(xí)類(lèi)似的可以節(jié)省資源的方法。第6課用定時(shí)器中斷閃燈,定時(shí)器中斷的學(xué)習(xí)在第二課,我們學(xué)習(xí)了用指令延時(shí)閃燈,但是用指令方式閃燈有cpu不能做其他工作的缺點(diǎn)。這一課
36、,我們將學(xué)習(xí)如何使用定時(shí)器方式使燈閃爍。中斷的理解。這里將涉及到單片機(jī)中斷的應(yīng)用,在cpu的一步步按照指令運(yùn)行的過(guò)程中(主程序),可能會(huì)有其它的更緊急的需要做的事情(中斷服務(wù)程序),需要cpu暫時(shí)停止當(dāng)前的程序(主程序),做完了(中斷服務(wù)程序)之后,又可以繼續(xù)去運(yùn)行先前的程序(主程序)。就像你正在吃飯,一邊又在給水桶里放水,吃著吃著,水滿了,你就得趕快去把水龍頭關(guān)掉或者換一個(gè)空的水桶,再回來(lái)吃飯。單片機(jī)的定時(shí)器就像是一個(gè)水桶,你讓它啟動(dòng)了,也就是水龍頭打開(kāi)了;開(kāi)始裝水了;定時(shí)在每個(gè)機(jī)器周期不斷自動(dòng)加1,最后溢出了;水桶的水不斷增加,最也就滿出來(lái)了;定時(shí)器溢出時(shí),你就要去做處理了;水桶的水滿了,
37、你也應(yīng)該處理一下了;處理完后,單片機(jī)又可以回到剛剛開(kāi)停止的地方繼續(xù)運(yùn)行;水桶處理了,先前你在做什么也可以繼續(xù)去做什么了。單片機(jī)的主程序是從0x0000開(kāi)始運(yùn)行的,單片機(jī)服務(wù)程序從哪里開(kāi)始運(yùn)行呢?在51里,有多個(gè)中斷服務(wù)程序入口,0號(hào)入口是外中斷0,地址在0x0003;1號(hào)入口是定時(shí)器0,在0X000B;2號(hào)入口是外中斷1;地址在0x0013,3號(hào)入口是定時(shí)器2;地址在0X001B,等等。當(dāng)中斷發(fā)生時(shí),程序就記下當(dāng)前運(yùn)行的位置,跳到對(duì)應(yīng)的中斷入口去運(yùn)行中斷服務(wù)程序,運(yùn)行完之后,又跳回到原來(lái)的位置繼續(xù)運(yùn)行。在C51中,你不用理會(huì)中斷服務(wù)程序放在哪里,會(huì)怎么跳轉(zhuǎn)。你只要把某個(gè)函數(shù)標(biāo)識(shí)為幾號(hào)中斷服務(wù)函
38、數(shù)就可以了。在發(fā)生了對(duì)應(yīng)的中斷時(shí),就會(huì)自動(dòng)的運(yùn)行這個(gè)函數(shù)。請(qǐng)看一下相關(guān)的51的硬件的書(shū),對(duì)定時(shí)器工作的寄存器設(shè)置做進(jìn)一步的了解。也可以做完試驗(yàn)再了解,因?yàn)槔讨卸家呀?jīng)為您設(shè)置好了。Proj-scl WotiAdelineucLauursiEneddiacA'/i1'p:在中斷服務(wù)函數(shù)內(nèi)設(shè)置斷點(diǎn),再點(diǎn)全速。稍后就會(huì)停止在斷點(diǎn)上,就可以繼續(xù)單步運(yùn)行了。如圖:FTQjiCl WkhSfj0優(yōu)- Xffdefins uirt unsierL&d ir.tLUU杵a分中工門(mén)守 ulur寫(xiě) un?igrt*d LengAiluldde <±oE62 h;3但括一個(gè)&
39、amp;2標(biāo)推泄川sbi+ Pio = pi n;"至桓前的工面燈方髓海翼崎與甑理春冬景康 wid JLiiiL Lvuid) Z/ 主桂,序T附由:gni /宅H-器n. IK拉丁作F式TS0=l EId=lEAl:南小"啟動(dòng)完".器“打了定時(shí)番。中斷"小步總不斷 “程序循環(huán)主程坪在小早就邛斷自錯(cuò)邱,笑睥/1“走困會(huì)口中斷ti n?r3 .) ir+ernpt 1/舞時(shí)器:中明星1三對(duì)心匚0; 丁二叱收 PlO-TlOi/F人走叫霸而蛤值二磔。阮選擇每秒中斷24次,每次溢出選擇每秒中斷30次,每次溢出1843200/24=768001843200/30
40、=61440選擇每秒中斷32次,每次溢出選擇每秒中斷36次,每次溢出選擇每秒中斷40次,每次溢出1843200/32=576001843200/36=512001843200/40=46080個(gè)機(jī)器周期,超出65536,無(wú)效。個(gè)機(jī)器周期個(gè)機(jī)器周期個(gè)機(jī)器周期個(gè)機(jī)器周期30次,每次溢出6從上面可以看到我們可以選擇方式有很多,但是最佳的是每秒中斷U0 09 1Q 11 12 43IO W 17 la20 :4 上工 33 4 252S2Q 二日 3Q si 32二二 M.1=1 mkin. c1440個(gè)機(jī)器周期。也就是賦定時(shí)器T2初值6553661440=4096,換成十六進(jìn)制就是0x1000。從上
41、面的計(jì)算也可以看出晶振2118400Hz的好處,它可以整除的倍數(shù)多,要準(zhǔn)確定時(shí)非常方便。更常見(jiàn)的應(yīng)用是在串口波特率上,使用HZ可以輸出最多準(zhǔn)確的標(biāo)準(zhǔn)波特率。請(qǐng)打開(kāi)程序,如圖:在我們的這個(gè)例程中,前一課的1秒鐘輸出信號(hào),被換成了一個(gè)全局標(biāo)記。在主程序中去檢查這個(gè)標(biāo)記,再清0標(biāo)記和處理相應(yīng)的工作。這一課的跑馬燈輸出方式也改變了,我們采用查表的方式,將要點(diǎn)亮的燈預(yù)先設(shè)置好,到了時(shí)間,就一起送到P1口。這樣,程序的執(zhí)行效率會(huì)更高。下面請(qǐng)認(rèn)真學(xué)習(xí)和分析例程:以下是例程,請(qǐng)打開(kāi)lesson8目錄的工程,內(nèi)容是一樣的。#defineucharunsignedchar/定義一下方便使用#defineuintu
42、nsignedint#defineulongunsignedlong#include<reg52.h>/包括一個(gè)52標(biāo)準(zhǔn)內(nèi)核的頭文件sbitP10=P1A0;頭文件中沒(méi)有定義的IO就要自己來(lái)定義了sbitP11=P1A1;sbitP12=P1A2;sbitP13=P1A3;bitldelay=0;/長(zhǎng)定時(shí)溢出標(biāo)記,預(yù)置是0charcodedx5163_at_0x003b;/這是為了仿真設(shè)置的/定時(shí)器中斷方式的跑馬燈voidmain(void)/主程序ucharcodeledp4=0xfe,0xfd,0xfb,0xf7;/預(yù)定的寫(xiě)入P1的值ucharledi;/用來(lái)指示顯示順序RCA
43、P2H=0x10;/賦T2的預(yù)置值0x1000,溢出30次就是1秒鐘RCAP2L=0x00;TR2=1;/啟動(dòng)定時(shí)器ET2=1;/打開(kāi)定時(shí)器2中斷EA=1;/打開(kāi)總中斷while(1)/主程序循環(huán)if(ldelay)/發(fā)現(xiàn)有時(shí)間溢出標(biāo)記,進(jìn)入處理ldelay=0;/清除標(biāo)記P1=ledpledi;/讀出一個(gè)值送到P1口ledi+;/指向下一個(gè)if(ledi=4)ledi=0;/到了最后一個(gè)燈就換到第一個(gè)/定時(shí)器2中斷timer0()interrupt5staticuchart;TF2=0;t+;if(t=30)/T2的預(yù)置值0x1000,溢出30次就是1秒鐘,晶振HZt=0;ldelay=1;
44、/每次長(zhǎng)時(shí)間的溢出,就置一個(gè)標(biāo)記,以便主程序處理編譯,進(jìn)入仿真,看結(jié)果??梢钥吹?個(gè)燈以精確的1秒的速度不斷循環(huán)跑動(dòng)。第9課,自動(dòng)變速的跑馬燈試驗(yàn)這一課,我們?nèi)匀皇褂蒙弦粋€(gè)定時(shí)器跑馬燈工作方式,但是我們讓跑動(dòng)的速度自動(dòng)變化,從慢到快。相對(duì)于上一顆的跑馬燈試驗(yàn),我們新設(shè)置了一個(gè)變量speed,用來(lái)保存跑馬燈的移動(dòng)速度,其實(shí)也就是定時(shí)器的累計(jì)時(shí)間溢出次數(shù)。我們?cè)诔绦蛑行薷膕peed的數(shù)值,溢出的時(shí)間就會(huì)改變,跑馬燈的移動(dòng)速度也就改變了。我們是在每循環(huán)跑完一圈,就改變一次速度的。請(qǐng)仔細(xì)研究代碼,做到充分理解。源代碼如下:請(qǐng)打開(kāi)對(duì)應(yīng)目錄里的例程,和下面的代碼是一樣的。#defineucharunsig
45、nedchar/定義一下方便使用#defineuintunsignedint#defineulongunsignedlong#include<reg52.h>/包括一個(gè)52標(biāo)準(zhǔn)內(nèi)核的頭文件sbitP10=P1A0;頭文件中沒(méi)有定義的IO就要自己來(lái)定義了sbitP11=P1A1;sbitP12=P1A2;sbitP13=P1A3;bitldelay=0;/長(zhǎng)定時(shí)溢出標(biāo)記,預(yù)置是0ucharspeed=10;/設(shè)置一個(gè)變量保存跑馬燈的移動(dòng)速度charcodedx5163_at_0x003b;/這是為了仿真設(shè)置的/自動(dòng)變速的跑馬燈試驗(yàn)voidmain(void)/主程序ucharcode
46、ledp4=0xfe,0xfd,0xfb,0xf7;/預(yù)定的寫(xiě)入P1的值ucharledi;/用來(lái)指示顯示順序RCAP2H=0x10;/賦T2的預(yù)置值0x1000,溢出30次就是1秒鐘RCAP2L=0x00;TR2=1;/啟動(dòng)定時(shí)器ET2=1;/打開(kāi)定時(shí)器2中斷EA=1;/打開(kāi)總中斷while(1)/主程序循環(huán)if(ldelay)/發(fā)現(xiàn)有時(shí)間溢出標(biāo)記,進(jìn)入處理ldelay=0;/清除標(biāo)記P1=ledpledi;/讀出一個(gè)值送到P1口ledi+;/指向下一個(gè)if(ledi=4)ledi=0;/到了最后一個(gè)燈就換到第一個(gè)speed-;if(speed=0)speed=10;/每循環(huán)顯示一次,就調(diào)快
47、一次溢出速度/定時(shí)器2中斷timer2()interrupt5staticuchart;TF2=0;t+;if(t=speed)/比較一個(gè)變化的數(shù)值,以實(shí)現(xiàn)變化的時(shí)間溢出t=0;ldelay=1;/每次長(zhǎng)時(shí)間的溢出,就置一個(gè)標(biāo)記,以便主程序處理請(qǐng)編譯,運(yùn)行,并查看結(jié)果。第10課,4個(gè)按鍵4級(jí)變速的跑馬燈試驗(yàn),多任務(wù)的工作方式這一課,我們要用4個(gè)按鍵,控制跑馬燈的4種不同的跑動(dòng)速度。按鍵的控制我們也做過(guò)了,結(jié)合跑馬燈,很容易程序就出來(lái)了。只是每按一個(gè)鍵,就賦給一個(gè)不同的定時(shí)器2溢出次數(shù)而已。我們?cè)O(shè)置為1秒,1/2秒,1/5秒,1/10秒四個(gè)檔次,分別時(shí)K1K4控制。這個(gè)程序的主程序執(zhí)行了2個(gè)任務(wù)
48、。一個(gè)是跑馬燈,一個(gè)是檢測(cè)按鍵。程序的結(jié)構(gòu)非常清晰。程序如下:#defineucharunsignedchar/定義一下方便使用#defineuintunsignedint#defineulongunsignedlong#include<reg52.h>/包括一個(gè)52標(biāo)準(zhǔn)內(nèi)核的頭文件sbitP10=P1A0;頭文件中沒(méi)有定義的IO就要自己來(lái)定義了sbitP11=P1A1;sbitP12=P1A2;sbitP13=P1A3;sbitK1=P3A2;sbitK2=P3A5;sbitK3=P2A4;sbitK4=P2A5;bitldelay=0;/長(zhǎng)定時(shí)溢出標(biāo)記,預(yù)置是0ucharspe
49、ed=10;/設(shè)置一個(gè)變量保存默認(rèn)的跑馬燈的移動(dòng)速度charcodedx5163_at_0x003b;/這是為了仿真設(shè)置的/自動(dòng)變速的跑馬燈試驗(yàn)voidmain(void)/主程序ucharcodeledp4=0xfe,0xfd,0xfb,0xf7;/預(yù)定的寫(xiě)入P1的值ucharledi;/用來(lái)指示顯示順序RCAP2H=0x10;/賦T2的預(yù)置值0x1000,溢出30次就是1秒鐘RCAP2L=0x00;TR2=1;/啟動(dòng)定時(shí)器ET2=1;/打開(kāi)定時(shí)器2中斷EA=1;/打開(kāi)總中斷while(1)/主程序循環(huán)if(ldelay)/發(fā)現(xiàn)有時(shí)間溢出標(biāo)記,進(jìn)入處理ldelay=0;/清除標(biāo)記P1=led
50、pledi;/讀出一個(gè)值送到P1口ledi+;/指向下一個(gè)if(ledi=4)/到了最后一個(gè)燈就換到第一個(gè)/檢查到按鍵,設(shè)置對(duì)應(yīng)的跑馬速度ledi=0;if(!K1)speed=30;if(!K2)speed=15;if(!K3)speed=6;if(!K4)speed=3;/定時(shí)器2中斷timer2()interrupt5staticuchart;TF2=0;t+;if(t=speed)|(t>30)/ 比較一個(gè)變化的數(shù)值,以實(shí)現(xiàn)變化的時(shí)間溢出, 同時(shí)限制了最慢速度t=0;ldelay=1;/每次長(zhǎng)時(shí)間的溢出,就置一個(gè)標(biāo)記,以便主程序處理請(qǐng)打開(kāi)工程,編譯,運(yùn)行??梢钥吹剑瑔?dòng)后,以默認(rèn)
51、的速度跑馬,按K1,速度是1秒一個(gè)燈,按K2,是1/2秒一個(gè)燈,按K3是1/5秒一個(gè)燈,按K4,則最快,是1/10秒。第11課,一個(gè)按鍵控制的10級(jí)變速跑馬燈試驗(yàn)在本課中,我們要用一個(gè)按鍵來(lái)實(shí)現(xiàn)跑馬燈的10級(jí)調(diào)速。這又會(huì)涉及到鍵的去抖的問(wèn)題。本課的試驗(yàn)結(jié)果是,每按一次按鍵,跑馬速度就降低一級(jí),共10級(jí)。這里我們又增加了一個(gè)變量speedlever,來(lái)保存當(dāng)前的速度檔次。在按鍵里的處理中,多了當(dāng)前檔次的延時(shí)值的設(shè)置。請(qǐng)看程序:#defineucharunsignedchar/定義一下方便使用#defineuintunsignedint#defineulongunsignedlong#includ
52、e<reg52.h>/包括一個(gè)52標(biāo)準(zhǔn)內(nèi)核的頭文件sbitP10=P1A0;/頭文件中沒(méi)有定義的IO就要自己來(lái)定義了sbitP11=P1A1;sbitP12=P1A2;sbitP13=P1A3;sbitK1=P3A2;bitldelay=0;/長(zhǎng)定時(shí)溢出標(biāo)記,預(yù)置是0ucharspeed=10;/設(shè)置一個(gè)變量保存默認(rèn)的跑馬燈的移動(dòng)速度ucharspeedlever=0;/保存當(dāng)前的速度檔次charcodedx5163_at_0x003b;/這是為了仿真設(shè)置的/一個(gè)按鍵控制的10級(jí)變速跑馬燈試驗(yàn)voidmain(void)/主程序ucharcodeledp4=0xfe,0xfd,0x
53、fb,0xf7;/預(yù)定的寫(xiě)入P1的值ucharledi;/用來(lái)指示顯示順序uintn;RCAP2H=0x10;/賦T2的預(yù)置值0x1000,溢出30次就是1秒鐘RCAP2L=0x00;TR2=1;/啟動(dòng)定時(shí)器ET2=1;/打開(kāi)定時(shí)器2中斷EA=1;/打開(kāi)總中斷while(1)/主程序循環(huán)if(ldelay)/發(fā)現(xiàn)有時(shí)間溢出標(biāo)記,進(jìn)入處理ldelay=0;/清除標(biāo)記P1=ledpledi;/讀出一個(gè)值送到P1口ledi+;/指向下一個(gè)if(ledi=4)ledi=0;/到了最后一個(gè)燈就換到第一個(gè)if(!K1)/如果讀到K1為0for(n=0;n<1000;n+);/等待按鍵穩(wěn)定while(
54、!K1);/等待按鍵松開(kāi)for(n=0;n<1000;n+);/等待按鍵穩(wěn)定松開(kāi)speedlever+;if(speedlever=10)speedlever=0;speed=speedlever*3;/檔次和延時(shí)之間的預(yù)算法則,也可以用查表方法,做出不規(guī)則的法則/定時(shí)器2中斷timer2()interrupt5staticuchart;TF2=0;t+;if(t=speed)|(t>30)/比較一個(gè)變化的數(shù)值,以實(shí)現(xiàn)變化的時(shí)間溢出,同時(shí)限制了最慢速度為1秒t=0;ldelay=1;/每次長(zhǎng)時(shí)間的溢出,就置一個(gè)標(biāo)記,以便主程序處理請(qǐng)打開(kāi)lesson11目錄的工程,編譯,運(yùn)行,看結(jié)果:按K1,速度則降低一次,總共10個(gè)檔次第12課,可編程自動(dòng)控制控制跑馬燈這一顆,我們學(xué)習(xí)如何讓跑馬燈自動(dòng)按照我們預(yù)定的順序進(jìn)行。這種控制在工控場(chǎng)合經(jīng)常用到。這個(gè)程序里,我們預(yù)先定義了一個(gè)變化的順序speedcode,每跑一圈燈就根據(jù)預(yù)定設(shè)置的表格數(shù)據(jù)來(lái)決定下一圈的跑馬速度。這樣我們就實(shí)現(xiàn)了按照預(yù)定的順序自動(dòng)變化運(yùn)行。請(qǐng)看代碼:#defineucharunsignedc
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 河北石油職業(yè)技術(shù)學(xué)院《體育與健康-形體禮儀訓(xùn)練(中)》2023-2024學(xué)年第二學(xué)期期末試卷
- 河南交通職業(yè)技術(shù)學(xué)院《空間藝術(shù)數(shù)字化表現(xiàn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 遼寧何氏醫(yī)學(xué)院《社區(qū)管理》2023-2024學(xué)年第二學(xué)期期末試卷
- 漢中職業(yè)技術(shù)學(xué)院《二外(日)》2023-2024學(xué)年第二學(xué)期期末試卷
- 揚(yáng)州中瑞酒店職業(yè)學(xué)院《音樂(lè)鑒賞》2023-2024學(xué)年第二學(xué)期期末試卷
- 徐州工業(yè)職業(yè)技術(shù)學(xué)院《社會(huì)項(xiàng)目管理與評(píng)估》2023-2024學(xué)年第二學(xué)期期末試卷
- 保護(hù)環(huán)境從我做起議論文呼吁(9篇)
- 徐州醫(yī)科大學(xué)《學(xué)科教育學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 體育設(shè)施智能化升級(jí)行業(yè)跨境出海項(xiàng)目商業(yè)計(jì)劃書(shū)
- 公共交通樞紐建筑設(shè)計(jì)企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力項(xiàng)目商業(yè)計(jì)劃書(shū)
- 9 天上有顆南仁東星 課件-課堂無(wú)憂新課標(biāo)同步核心素養(yǎng)課堂
- 車(chē)輛日常安全檢查課件
- 登革熱疫情應(yīng)急處置桌面推演方案(2025年)
- 2025年4月版安全環(huán)境職業(yè)健康法律法規(guī)標(biāo)準(zhǔn)文件清單
- 新型傳感技術(shù)及應(yīng)用 課件 第五部分:典型傳感器-諧振式傳感器
- 煙草遴選考試試題及答案
- 廣西《淡水水產(chǎn)養(yǎng)殖尾水排放標(biāo)準(zhǔn)》編制說(shuō)明
- 認(rèn)知能力評(píng)估體系-全面剖析
- 圍棋行業(yè)跨境出海戰(zhàn)略研究報(bào)告
- 附件-珠海市職業(yè)衛(wèi)生分類(lèi)及分級(jí)管理辦法
- 第三單元名著導(dǎo)讀《駱駝祥子》教學(xué)設(shè)計(jì) 2023-2024學(xué)年統(tǒng)編版語(yǔ)文七年級(jí)上冊(cè)
評(píng)論
0/150
提交評(píng)論