51單片機及C語言入門培訓(xùn)教程_第1頁
51單片機及C語言入門培訓(xùn)教程_第2頁
51單片機及C語言入門培訓(xùn)教程_第3頁
51單片機及C語言入門培訓(xùn)教程_第4頁
已閱讀5頁,還剩187頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

排成51單片機及排成51單片機及C語言入門方便自己打印閱承。請不要用于非那用途。2007,12.2051單片機及C語言入門教程第一課建立您的第一個c項目使用C語言肯定要使用到C編譯器,以便把寫好的C程序編譯為機器碼,這樣單片機才能執(zhí)行編寫好的程序。KEILUVISION2是眾多單片機應(yīng)用開發(fā)軟件中優(yōu)秀的軟件之一,它支持眾多不同公司的MCS51架構(gòu)的芯片,它集編輯,編譯,仿真等于一體,同時還支持,PLM,匯編和C語言的程序設(shè)計,它的界面和常用的微軟VC++的界面相似,界面友好,易學(xué)易用,在調(diào)試程序,軟件仿真方面也有很強大的功能。因此很多開發(fā)51應(yīng)用的工程師或普通的單片機愛好者,都對它十分喜歡。以上簡單介紹了K日L51軟件,要使用KEIL51軟件,必需先要安裝它。K日L51是一個商業(yè)的軟件,對于我們這些普通愛好者可以到K日L中國代理周立功公司的網(wǎng)站上下載ー份能編譯2K的DEMO版軟件,基本可以滿足一般的個人學(xué)習(xí)和小型應(yīng)用的開發(fā)。(安裝的方法和普通軟件相當這里就不做介紹了)安裝好后,你是不是迫不及待的想建立自己的第一個C程序項目呢?ド面就讓我們一起來建立一個小程序項目吧?;蛟S你手中還沒有一塊實驗板,甚至沒有一塊單片機,不過沒有關(guān)系我們可以通過KEIL軟件仿真看到程序運行的結(jié)果。首先當然是運行KEIL51軟件.怎么打開?噢,天!那你要從頭學(xué)電腦了。呵呵,開個玩笑,這個問題我想讀者們也不會提的了:P。運行兒秒后,出現(xiàn)如圖1-1的屏幕。7?ueIntegrationIDEfor7?ueIntegrationIDEforMicrocontrollerThisprogramisprotectedbyU.S.andinternationalcopyrightlaws.IVIKEIUVLXsoftware接著按下面的步驟建立您的第一個項冃:(1)點擊Project菜單,選擇彈出的下拉式菜單中的NewProject,如圖1一2。接著彈出ー個標準Windows文件對話窗口,如闇1-3,這個東東想必大家是見了N次的了,用法技巧也不是這里要說的,以后的章節(jié)中出現(xiàn)類似情況將不再說明。在"文件名"中輸入您的第一個C程序項目名稱,這里我們用"test",這是筆者慣用的名稱,大家不必照搬就是了,只要符合Windows文件規(guī)則的文件名都行。"保存"后的文件擴展名為uv2,這是K日LuVision2項目文件擴展名,以后我們可以直接點擊此文件以打開先前做的項目。圖1—2NewProject菜單TargehjGroups,Files.,,SelectDeviceForTarget.,,文件名國):test.Uv2TargehjGroups,Files.,,SelectDeviceForTarget.,,文件名國):test.Uv2(2)選擇所要的單片機,這里我們選擇常用的Ateml公司的AT89c51。此時屏幕如闇1一4ImportyVision1Project...OpenProjectCloseProjectFileExtensions,BooksandEnvironment保:存類型魚):|ProjectFiles(*.uv2)所示。AT89c51有什么功能、特點呢?不用急,看圖中右邊有簡單的介紹,稍后的章節(jié)會作較詳細的介紹。完成上面步驟后,我們就可以進行程序的編寫了。闇1一4選取芯片(3)首先我們要在項目中創(chuàng)建新的程序文件或加入舊程序文件。如果你沒有現(xiàn)成的程序,那么就要新建一個程序文件。在KEIL中有一些程序的Demo,在這里我們還是以ー個C程序為例介紹如何新建一個C程序和如何加到您的第一個項目中吧。點擊圖1-5中1的新建文件的快捷按鈕,在2中出現(xiàn)ー個新的文字編輯窗口,這個操作也可以通過菜單File—New或快捷鍵Ctrl+N來實現(xiàn)。好了,現(xiàn)在可以編寫程序了,光標已出現(xiàn)在文本編輯窗口中,等待我們的輸入了。第一程序嘛,寫個簡單明了的吧。下面是經(jīng)典的一段程序,呵,如果你看過別的程序書也許也有類似的程序:#include#includevoidmain(void)SCON=0x50;//串口方式1,允許接收TMOD=0x20;〃定時器1定時方式2TCON=0x40;〃設(shè)定時器1開始計數(shù)TH1=0xE8;//11.0592MHz1200波特率TL1=0xE8;Tl=1;TR1=1;〃啟動定時器while(1)printf("HelloWorld!\n");//顯示HelloWorld圖1-5新建程序文件這段程序的功能是不斷從串口輸出"Hell。World!"字符,我們先不管程序的語法和意思吧,先看看如何把它加入到項目中和如何編譯試運行。(4)點擊圖1-5中的3保存新建的程序,也可以用菜單File-Save或快捷犍Ctrl+S進行保存。因是新文件所以保存時會彈出類似圖1-3的文件操作窗口,我們把第一個程序命名為testl.c,保存在項目所在的目錄中,這時你會發(fā)現(xiàn)程序單詞有了不同的顏色,說明KEIL的C語法檢查生效了.如圖1一6鼠標在屏幕左邊的SourceGroupI文件夾圖標上右擊彈出菜單,在這里可以做在項目中增加減少文件等操作。我們?quot;AddFiletoGroup'SourceGroup1"I彈出文件窗口,選擇剛剛保存的文件,按ADD按鈕,關(guān)閉文件窗,程序文件已加到項冃中了。這時在SourceGroupI文件夾圖標左邊出現(xiàn)了一個小+號說明,文件組中有了文件,點擊它可以展開查看。闇1-6把文件加入到項目文件組中感testVlision2FileEditViewProiect卜buqPerpheralsTools5VCSWindowHelp窗?g辭あ至里つ:コ■レーんえ少る犧Iエビs電Groups,Fies...RemoveGroup'SoireeGrotp1'andit'sFilesSrieelDcvLefurTarget^agsl1'OptionsforCrcup'SourceGroup1*includs<AT99X51.H>QnenFile倒Rebuildtarget國buldtargetTranslatenle基SlopbuilJAddFibstoGroupScarceGroup1'(5)C程序文件已被我們加到了項目中了,下面就剩ド編譯運行了。這個項冃我們只是用做學(xué)習(xí)新建程序項目和編譯運行仿真的基本方法,所以使用軟件默認的編譯設(shè)置,它不會生成用于芯片燒寫的HEX文件,如何設(shè)置生成HEX文件就請看下面的第三課。我們先來看圖1-7吧,圖中1、2、3都是編譯按鈕,不同是1是用于編譯單個文件。2是編譯當前項目,如果先前編譯過一次之后文件沒有做動編輯改動,這時再點擊是不會再次重新編譯的。3是重新編譯,每點擊ー次均會再次編譯鏈接ー次,不管程序是否有改動。在3右邊的是停止編譯按鈕,只有點擊了前三個中的任一個,停止按鈕オ會生效。5是菜單中的它們,我個人就不習(xí)慣用它了。嘿嘿,這個項目只有一個文件,你按123中的一個都可以編譯。按了?好快哦,呵呵。在4中可以看到編譯的錯誤信息和使用的系統(tǒng)資源情況等,以后我們要查錯就靠它了。6是有一個小放大鏡的按鈕,這就是開啟、關(guān)閉調(diào)試模式的按鈕,它也存在于菜單Debug—Start'StopDebugSession,快捷鍵為Ctrl+F5?圖1-7編譯程序(6)進入調(diào)試模式,軟件窗口樣式大致如圖1—8所示。圖中1為運行,當程序處于停止狀態(tài)時ォ有效,2為停止,程序處于運行狀態(tài)時オ有效。3是復(fù)位,模擬芯片的復(fù)位,程序回到最開頭處執(zhí)行。按4我們可以打開5中的串行調(diào)試窗口,這個窗口我們可以看到從51芯片的串行口輸入輸出的字符,這里的第一個項目也正是在這里看運行結(jié)果。這些在菜單中也有,這里不再ーー介紹大家不妨找找看,其它的功能也會在后面的課程中慢慢介紹。首先按4打開串行調(diào)試窗口,再按運行鍵,這時就可以看到串行調(diào)試窗口中不斷的打?quot;HelloWorld!%呵呵,是不是不難呀?這樣就完成了您的第一個C項目。最后我們要停止程序運行回到文件編輯模式中,就要先按停止按鈕再按開啟、關(guān)閉調(diào)試模式按鈕。然后我們就可以進行關(guān)閉K日L等相關(guān)操作了。ェarge5Groups,Files.SelectDeviceforTargeRemoveItemOptionsforTarget'TarClearGroupandFileOfNewProject...ImportpVisionlProjectェarge5Groups,Files.SelectDeviceforTargeRemoveItemOptionsforTarget'TarClearGroupandFileOfNewProject...ImportpVisionlProjectOpenProjectCloseProjectFileExtensions,Books.Buildtare Buildtarget5x|到此為止,第一課已經(jīng)完結(jié)了,初步學(xué)習(xí)了一些KEILuVision2的項目文件創(chuàng)建、編譯、運linki:デ幽RebuildalltargetfilesProgramS: TranslateD:\MyData\J’ヂ一(通気opWild行和軟件仿真的基本操作方法。其中?直有提到?些功能的快捷鍵的使用,的確在實際的開發(fā)應(yīng)用中快捷鍵的運用可以大大提高工作的效率,建議大家多多使用,還有就是對這里所講的操作方法舉一反三用于類似的操作中。圖1-8調(diào)試運行程序第二課初步認識51芯片上一課我們的第一個項目完成了,可能有懂C語言的朋友會說,"這和PC機上的C語言沒有多大的區(qū)別呀"。的確沒有太大的區(qū)別,C語言只是ー種程序語言的統(tǒng)稱,針對不同的處理器相關(guān)的C語言都會有一些細い的改變。編寫PC機的C程序時,如要對硬件編程你就必須對硬件要有一定的認識,51單片機編程就更是如此,因它的開發(fā)應(yīng)用是不可與硬件脫節(jié)的,所以我們先要來初步認識一下51あ片的結(jié)構(gòu)和引腳功能。MSC51架構(gòu)的芯片種類很多,具體特點和功能不盡相同(在以后編寫的附錄中會加入常用的ー些51芯片的資料列表),在此后的教程中就以Atmel公司的AT89c51和AT89c2051為中心對象來進行學(xué)習(xí),兩者是AT89系列的典型代表,在愛好者中使用相當?shù)亩?應(yīng)用資料很多,價格便宜,是初學(xué)51的首選芯片。嘿嘿,ロ水多多有點賣廣告之嫌了。:P車車ル先%應(yīng)聃國值僅|同|底岡ゆ勒必GBvoidmain(void)SCON=0x50;//串HelloHelloWorld!World!-World!〇World!World!World!圖2—1AT89C5I和AT89c2051引腳功能圖AT89C514KBAT89C514KB可編程Flash存儲器(可擦寫1000次)

三級程序存儲器保密靜態(tài)工作頻率:0Hz-24MHz128字節(jié)內(nèi)部RAM2個16位定時/計數(shù)器

ー個串行通訊口6個中斷源32條I/O引線片內(nèi)時種振蕩器AT89C20512KB可編程Flash存儲器(可擦寫1000次)兩級程序存儲器保密

靜態(tài)工作頻率:0Hz-24MHz128字節(jié)內(nèi)部RAM2個16位定時/計數(shù)器一個串行通訊口6個中斷源15條!/O引線1個片內(nèi)模擬比較器表2-1AT89c51和AT89c2051主要性能表圖2—1中是AT89c51和AT89c2051的引腳功能圖。而表2—1中則是它們的主要性能表。以上可以看出它們是大體相同的,由于AT89c2051的IO線很少,導(dǎo)致它無法外加RAM和程序ROM,片內(nèi)Flash存儲器也少,但它的體積比AT89c51小很多,以后大家可根據(jù)實際需要來選用。它們各有其特點但其核心是ー樣的,下面就來看看AT89c51的引腳R體功能。.電源引腳Vcc40電源端GND20接地端?工作電壓為5V,另有AT89LV51工作電壓則是2.7-6V,引腳功能一樣。P10<71VGCPi1r2!。〇。(ADO)piス匚3)eJPO1MODFl3437J,024AO2)P1.4CSコPO.3イA。J)PISL6J4JPe4M04)F1?CIr34□PO?^A05)P17C033!ハeイa。。)RST9)2TPO7イ▲<>?)(RMD)PJ0CZ?011□eK/VPPcr貝。)pj1c1130JALErPROG<ETT)PJN匚12Z9コ”!:忖<fNTT)PS3C13?8JP>!イA1"(T4)Pl.4C14271P2?4A14)(11)P3S10ハ]アス34AU)(wn>?二?a2s□P24?人,,j<RVT)P371724JPl3MH)KTAL218237P22(A10)XTAL1匚1?22コ>21(A?)CMDL9021JP?0イAりRST/VPP.:コvcc120(RXD>P3.0L;213PI.7(TXD?P3.1q318PI.5XTAL2C417コPl.5XTAL1q51¢PI.4(INTO>P3.2U615コP1.3(INTI〉P3.3C714PI.2(砌P3.4C813コP1.1(AIMI)(Tl>P3,5912Pl0(AINO)GND1011P3.7AT89C51 AT89C2051《51單片機及C語言入門》作者:明浩排成16開版式:EverNew2007.12.20.外接晶體引腳圖2—2外接晶體引腳XTAL119XTAL218XTAL1是片內(nèi)振蕩器的反相放大器輸入端,XTAL2則是輸出端,使用外部振蕩器時,外部振蕩信號應(yīng)直接加到XTAL1,而XTAL2懸空。內(nèi)部方式時,時鐘發(fā)生器對振蕩脈沖二分頻,如晶振為12MHz,時鐘頻率就為6MHz。晶振的頻率可以在1MHz-24MHz內(nèi)選擇。電容取30PF左右。?型號同樣為AT89c51的芯片,在其后面還有頻率編號,有12,16,20,24MHz可選。大家在購買和選用時要注意了。如AT89c5124PC就是最高振蕩頻率為24MHz,40P6封裝的普通商用芯片。.復(fù)位RST9在振蕩器運行時,有兩個機器周期(24個振蕩周期)以上的高電平出現(xiàn)在此引腿時,將使單片機復(fù)位,只要這個腳保持高電平,51芯片便循環(huán)復(fù)位。復(fù)位后P0—P3口均置1引腳表現(xiàn)為高電平,程序計數(shù)器和特殊功能寄存器SFR全部清零。當復(fù)位腳由高電平變?yōu)榈碗娖綍r,芯片為ROM的00H處開始運行程序。常用的復(fù)位電路如圖2—3所示。?復(fù)位操作不會對內(nèi)部RAM有所影響。圖2—3常用復(fù)位電路GNDGND4.輸入輸出引腳P0端口仔0.0干0.7]P0是?個8位漏極開路型雙向I/O端口,端口置1(對端口寫1)時作高阻抗輸入端。作為輸出口時能驅(qū)動8個TTL。對內(nèi)部Flash程序存儲器編程時,接收指令字節(jié);校驗程序時輸出指令字節(jié),要求外接上拉電在訪問外部程序和外部數(shù)據(jù)存儲器時,P0口是分時轉(zhuǎn)換的地址(低8位)/數(shù)據(jù)總線,訪問期間內(nèi)部的上拉電阻起作用。P1端口[P1.0—P1.7]P1是ー個帶有內(nèi)部上拉電阻的8位雙向I/O端口。輸出時可驅(qū)動4個TTL?端口置1時,內(nèi)部上拉電阻將端口拉到高電平,作輸入用。對內(nèi)部Flash程序存儲器編程時,接收低8位地址信息。P2端口[P2.0—P2.7]P2是ー個帶有內(nèi)部上拉電阻的8位雙向I/O端口。輸出時可驅(qū)動4個TTL?端口置1時,內(nèi)部上拉電阻將端口拉到高電平,作輸入用。對內(nèi)部Flash程序存儲器編程時,接收高8位地址和控制信息。在訪問外部程序和16位外部數(shù)據(jù)存儲器時,P2口送出高8位地址。而在訪問8位地址的外部數(shù)據(jù)存儲器時其引腳上的內(nèi)容在此期間不會改變。P3端口[P3.0—P3.7]P2是ー個帶有內(nèi)部上拉電阻的8位雙向I/O端口。輸出時可驅(qū)動4個TTL。端口置1時,內(nèi)部上拉電阻將端口拉到高電平,作輸入用。對內(nèi)部Flash程序存儲器編程時,接控制信息。除此之外P3端口還用于ー些專門功能,具體請看表2—2.。*P1-3端口在做輸入使用時,因內(nèi)部有上接電阻,被外部拉低的引腳會輸出一定的電流。P3引P3引腳P3.0P3.1P3.2P3.3P3.4P3.5P3.6P3.7串行通訊輸入(RXD)串行通訊輸出(TXD)タト部中斷〇(INTO)

外部中斷1(INT1)定時器。輸入(TO)定時器1輸入(T1)外部數(shù)據(jù)存儲器寫選通WR外部數(shù)據(jù)存儲器寫選通RD表2—2P3端口引腳兼用功能表呼!一口氣說了那么多,停ー下吧。嗯,什么?什么叫上拉電阻?上拉電阻簡單來說就是把電平拉高,通常用4.7—10K的電阻接至Wcc電源,下拉電阻則是把電平拉低,電阻接到GND地線上。具體說明也不是這里要討論的,接下來還是接著看其它的引腳功能吧。5.其它的控制或復(fù)用引腳ALE/PROG30訪問外部存儲器時,ALE(地址鎖存允許)的輸出用于鎖存地址的低位字節(jié)。即使不訪問外部存儲器,ALE端仍以不變的頻率輸出脈沖信號(此頻率是振蕩器頻率的101/6)?在訪問外部數(shù)據(jù)存儲器時,出現(xiàn)ー個ALE脈沖。對Flash存儲器編程時,這個引腳用于輸入編程脈沖PROGPSEN29該引是外部程序存儲器的選通信號輸出端。當AT89c51由外部程序存儲器取指令或常數(shù)時,每個機器周期輸出2個脈沖即兩次有效。但訪問外部數(shù)據(jù)存儲器時,將不會有脈沖輸出。EA/Vpp31外部訪問允許端。當該引腳訪問外部程序存儲器時,應(yīng)輸入低電平。要使AT89c51只訪問外部程序存儲器(地址為0000H-FFFFH),這時該引腳必須保持低電平,而要使用片內(nèi)的程序存儲器時該引腳必須保持高電平。對Flash存儲器編程時,該引腳用于施加Vpp編程電壓。Vpp電壓有兩種,類似芯片最大頻率值要根據(jù)附加的編號或芯片內(nèi)的特征字決定。具體如表2—3所列。Vpp=12VVpp=5V印刷在芯片面上的AT89C51AT89LV51AT89C51AT89LV51型號XxxxXxxxxxxx-5xxxx-5YYWWYYWWYYWWYYWW片內(nèi)特征字030H=lEH030H=lEH030H=lEH030H=1EH031H=51H031H=61H031H=51H031H=61H032H=FFH032H=FFH032H=05H032H=05H表2-3Vpp與芯片型號和片內(nèi)特征字的關(guān)系看到這您對AT89c51引腳的功能應(yīng)該有了?定的了解了,引腳在編程和校驗時的時序我們在這里就不做詳細的探討,通常情況ド我們也沒有必要去撐握它,除非你想自己開發(fā)編程器。下來的課程我們要開始以一些簡單的實例來講述C程序的語法和編寫方法技巧,中間穿插相關(guān)的硬件知識如串ロ,中斷的用法等等。第三課生成HEX文件和最小化系統(tǒng)在開始C語言的主要內(nèi)容時,我們先來看看如何用KE1LUVISION2來編譯生成用于燒寫芯片的HEX文件。HEX文件格式是Intel公司提出的按地址排列的數(shù)據(jù)信息,數(shù)據(jù)寬度為字節(jié),所有數(shù)據(jù)使用16進制數(shù)字表示,常用來保存單片機或其他處理器的目標程序代碼。它保存物理程序存儲區(qū)中的目標代碼映象。一般的編程器都支持這種格式。我們先來打開第一課做的第一項目,打開它的所在目錄,找到test.Uv2的文件就可以打開先前的項目了。然后右擊圖3—1中的1項目文件夾,彈出項目功能菜單,選OptionsfbrTarget'Targctl',彈出項目選項設(shè)置窗口,同樣先選中項目文件夾圖標,這時在Project菜單中也有一樣的菜單可選。打開項目選項窗口,轉(zhuǎn)到Output選項頁圖3—2所示,圖中1是選擇編譯輸出的路徑,2是設(shè)置編譯輸出生成的文件名,3則是決定是否要創(chuàng)建HEX文件,選中它就可以輸出HEX文件到指定的路徑中。選好了?好,我們再將它重新編譯ー次,很快在編譯信息窗口中就顯示HEX文件創(chuàng)建到指定的路徑中了,如闇3—3。這樣我們就可用自己的編程器所附帶的軟件去讀取并燒到芯片了,再用實驗板看結(jié)果,至于編程器或仿真器品種繁多具體方法就看它的說明書了,這里也不做討論。(技巧:ー、在圖3—1中的1里的項目文件樹形目象中,先選中對象,再單擊它就可對它進行重11命名操作,雙擊文件圖標便可打開文件。二、在Project下拉菜單的最下方有最近編輯過的項目路徑保存,這里可以快速打開最近在編輯的項目。)圖3—1項目功能菜單圖3—2項目選項窗口OutputIfelect'Felder皆D:\MyData\;C* Libr&xy...Vtest.LIB-AfterMakeDefaultsFileEditViewProjectDebugPeripheralsTools(?CreateE:<ecutable: ..\testvBeepWhenCompleteStartDebuggingRmUserProgran學(xué)]Erovse...J偉名船也OutputIfelect'Felder皆D:\MyData\;C* Libr&xy...Vtest.LIB-AfterMakeDefaultsFileEditViewProjectDebugPeripheralsTools(?CreateE:<ecutable: ..\testvBeepWhenCompleteStartDebuggingRmUserProgran學(xué)]Erovse...J偉名船也qたフDebugInformttioPBrowselufcrmat!廠ガerwe32IhexfileHE:()(EX80SelectDeviceForTarget'Target1'I田口rOpenFile圍Rebuildtargeti:l:|BuildtargetTranslateFile昌StopbuildIBIS]LocateIBIS1Mise|Deby|NaneofExecutable:|t?stforOtjects.j|期test-HisionZOptionsforTarget'Target1'OptionsforTarget"Target1"圖3—3-15編譯信息窗口或許您已把編譯好的文件燒到了芯片上,如果您購買或自制了帶串口輸出元件的學(xué)習(xí)實驗板,那您就可以把串口和PC機串口相聯(lián)用串U調(diào)試軟件或Windows的超級終端,將其波特率設(shè)為1200,就可以看到不停輸出的"HelloWorld!"字樣。也許您還沒有實驗板,那這里先說說AT89c51的最小化系統(tǒng),再以ー實例程序驗證最小化系統(tǒng)是否在運行,這個最小化系統(tǒng)也易于自制用于實驗。圖3—4便是AT89c51的最小化系統(tǒng),不過為了讓我們可以看出它是在運行的,我加了一個電阻和一個LED,用以顯示它的狀態(tài),晶振可以根據(jù)自己的情況使用,一般實驗板上是用11.0592MHz或12MHz,使用前者的好外是可以產(chǎn)生標準的串口波特率,后者則ー個機器周期為1微秒,便于做精確定時。在自己做實驗里,注意的是VCC是+5V的,不能高于此值,否則將損壞單片機,太低則不能正常工作。在31(EA)腳要接高電平,這樣我們才能執(zhí)行片內(nèi)的程序,如接低電平則使用片外的程序存儲器。下面,我們建一個新的項目名為OneLED來驗證最小化系統(tǒng)是否可以工作(所有的例程都可在我的主頁下面下載到,網(wǎng)址:或)〇程序如下:#include<AT89X5l.h>〃預(yù)處理命令voidmain(void)〃主函數(shù)名〃這是第一種注釋方式unsignedinta;〃定義變量a為int類型/?這是第二種注釋方式*/do{//dowhile組成循環(huán)for(a=0;a<50000;a++);〃這是ー個循環(huán)Pl_0=0;〃設(shè)P1.0口為低電平,點亮LEDfor(a=0;a<50000; //這是ー個循環(huán)Pl_0=1;〃設(shè)P1.0口為高電平,熄滅LEDwhile(l);

-13--13-Buildtarget'Target1'compilingtest1.c.,?linking...ProgramSize:data=30.1xdata=0code=1100^creatinghexfilefrom"test11..."test"-0Error(s),0Warning(s).ハBuild卜Command入FindinFiles7圖3-4AT89c51最小化系統(tǒng)這里先講講KEILC編譯器所支持的注釋語句。ー?種是以"http://"符號開始的語句,符號之后的語句都被視為注釋,直到有回車換行。另一種是在"/*"和"*/"符號之內(nèi)的為注釋。注釋不會被C編譯器所編譯。ー個C應(yīng)用程序中應(yīng)有一個main主函數(shù),main函數(shù)可以調(diào)用別的功能函數(shù),但其它功能函數(shù)不允許調(diào)用main函數(shù)。不論main函數(shù)放在程序中的那個位置,總是先被執(zhí)行。用上面學(xué)到的知識編譯寫好的OneLED程序,并把它燒到剛做好的最小化系統(tǒng)中。上電,剛開始時LED是不亮的(因為上電復(fù)位后所有的I。ロ都置1引腳為高電平),然后延時一段時間(for(a=0;a<50000;a++)這句在運行),LED亮,再延時,LED熄滅,然后交替亮、滅。第一個真正的小應(yīng)用就做完,呵呵,先不要管它是否實用哦。如果沒有這樣的效果那么您就要認真檢查一下電路或編譯燒寫的步驟了。第四課數(shù)據(jù)類型先來簡單說說C語言的標識符和關(guān)健字。標識符是用來標識源程序中某個對象的名字的,這些對象可以是語句、數(shù)據(jù)類型、函數(shù)、變量、數(shù)組等等。C語言是大小字敏感的?種高級語言,如果我們要定義ー個定時器1,可以寫做"Timerl",如果程序中有"TIMER1",那么這兩個是完全不同定義的標識符。標識符由字符串,數(shù)字和下劃線等組成,注意的是第一個字符必須是字母或下劃線,如"ITimer"是錯誤的,編譯時便會有錯誤提示。有些編譯系統(tǒng)專用的標識符是以下劃線開頭,所以一般不要以下劃線開頭命名標識符。標識符在命名時應(yīng)當簡單,含義清晰,這樣有助QO—

23112149。1〇〇。a〕レWレレトルトト闈?レ23112149。1〇〇。a〕《51單片機及C語言入門》作者:明浩排成16開版式:EverNew2007.12.20于閱讀理解程序。在C51編譯器中,只支持標識符的前32位為有效標識,一般情況下也足夠用了,除非你要寫天書:P。關(guān)鍵字則是編程語言保留的特殊標識符,它們具有固定名稱和含義,在程序編寫中不允許標識符與關(guān)鍵字亦同。在KEILuVision2中的關(guān)鍵字除了有ANSIC標準的32個關(guān)鍵字外還根據(jù)51單片機的特點擴展了相關(guān)的關(guān)鍵字。其實在KEILuVision2的文本編輯器中編寫C程序,系統(tǒng)可以把保留字以不同顏色顯示,缺省顏色為天藍色。標準和擴展關(guān)鍵字請看附錄一中的附表1-1和附表1-2)先看表4—1,表中列出了KEILuVision2c51編譯器所支持的數(shù)據(jù)類型。在標準C語言中基本的數(shù)據(jù)類型為char,int,shortJong,float和double,而在C51編譯器中int和short相同,float和double相同,這里就不列出說明了。下面來看看它們的具體定義:數(shù)據(jù)類型長度值域unsignedchar單字節(jié)〇?255signedchar單字節(jié)?128?+127unsignedint雙字節(jié)〇?65535signedint雙字節(jié)?32768?+32767unsignedlong四字節(jié)〇?4294967295signedlong四字節(jié)-2147483648?+2147483647float四字節(jié)±1.175494E-38?±3.402823E+38*1?3字節(jié)對象的地址bit位0或1sfr單字節(jié)〇?255sfrl6雙字節(jié)〇?65535sbit位0或1表4-1KEILuVision2C51編譯器所支持的數(shù)據(jù)類型char字符類型char類型的長度是一個字節(jié)(8位),通常用于定義處理字符數(shù)據(jù)的變量或常量。分無符號字符類型unsignedchar和有符號字符類型signedchar,默認值為signedchar類型。unsignedchar類型用字節(jié)中所有的位來表示數(shù)值,所可以表達的數(shù)值范圍是。?255。signedchar類型用字節(jié)中最高位字節(jié)表示數(shù)據(jù)的符號,“0"表示正數(shù),"1"表示負數(shù),負數(shù)用補碼表示。所能表示的數(shù)值范圍是ー128?+127。unsignedchar常用于處理ASCII字符或用于處理小于或等于255的整型數(shù)。?正數(shù)的補碼與原碼相同,負二進制數(shù)的補碼等于它的絕對值按位取反后加1。int整型int整型長度為兩個字節(jié)(16位),用于存放ー個雙字節(jié)數(shù)據(jù)。分有符號int整型數(shù)signedint和無符號整型數(shù)unsignedint,默認值為signedint類型。signedint表示的數(shù)值范圍是-32768?+32767,字節(jié)中最高位表示數(shù)據(jù)的符號,"〇"表示正數(shù),"1"表示負數(shù)。unsignedint表示的數(shù)值范圍是0?65535。好了,先停?下吧,我們來寫個小程序看看unsignedchar和unsignedint用于延時的不同效果,說明它們的長度是不同的,呵,盡管它并沒有實際的應(yīng)用意義,這里我們學(xué)習(xí)它們的用-15-法就行。依舊用我們上ー課的最小化系統(tǒng)做實驗,不過要加多一個電阻和LED,如圖4-1。實驗中用D1的點亮表明正在用unsignedint數(shù)值延時,用D2點亮表明正在用unsignedchar數(shù)值延時。圖4-1第4課實驗用電路我們把這個項目稱為TwoLED,實驗程序如下:#include〃預(yù)處理命令voidmain(void)〃主函數(shù)名{unsignedinta;〃定義變量a為unsignedint類型unsignedcharb;〃定義變量b為unsignedchar類型do{//dowhile組成循環(huán)for(a=0;a<65535;a++)P1_0=〇;//65535次設(shè)P1.0口為低電平,點亮LEDP1_0=1;〃設(shè)P1.0口為高電平,熄滅LEDfor(a=0;a<30000;a++);//空循環(huán)for(b=0;b<255;b++)P1_1=0;〃255次設(shè)P1.1口為低電平,點亮LEDP1_1=1;//設(shè)P1.1口為高電平,熄滅LED二6,R2し60「R3560D2"メルケvcco-771

」30PFPPPPPPPP11111111し14しjK>Jと!PPPPPPPPPPPPPPPPしヌレAUしJ3&駝ち口白Uもフ。どど9IL—Jl.mnjzC2r〔30PF. FQ16^f=10UFAT喀CtQOINT1Q3.3)JNT0CP3.ST1<P3.5)T0&4)SX/VPXTAUXTAL2RESET闿CP3JYVRe3.6)?XJhj^ュヌ"EUM尸!。宮宮宮宮6官ヨヨとeをg\QCGNDRXD(P3.0)TXD居匕ALE/P別0G需N22223222 |3333|333387655[321 123工36789QVCC2厶〇〇《51單片機及C語言入門》作者:明浩 排成16開版式:EverNew2007.12.20for(a=0;a<30000;a++);//空循環(huán)while(1);}同樣編譯燒寫,上電運行您就可以看到結(jié)果了。很明顯D1點亮的時間長于D2點亮的時間。程序中的循環(huán)延時時間并不是很好確定,并不太適合要求精確延時的場合,關(guān)于這方面我們以后也會做討論。這里必須要講的是,當定義?個變量為特定的數(shù)據(jù)類型時,在程序使用該變量不應(yīng)使它的值超過數(shù)據(jù)類型的值域。如本例中的變量b不能賦超出〇?255的值,如for(b=0;b<255;b++)改為for(b=0;b<256;b++),編譯是可以通過的,但運行時就會有問題出現(xiàn),就是說b的值永遠都是小于256的,所以無法跳出循環(huán)執(zhí)行下一句P1_1=1,從而造成死循環(huán)。同理a的值不應(yīng)超出〇?65535?大家可以燒片看看實驗的運行結(jié)果,同樣軟件仿真也是可以看到結(jié)果的。long長整型long長整型長度為四個字節(jié)(32位),用于存放一個四字行數(shù)據(jù)。分有符號long長整型signedlong和無符號長整型unsignedlong,默認值為signedlong類型。signedint表示的數(shù)值范圍是-2147483648?+2147483647,字節(jié)中最高位表示數(shù)據(jù)的符號,"0"表示正數(shù),"1"表示負數(shù)。unsignedlong表示:的數(shù)值范圍是。?4294967295。float浮點型float浮點型在十進制中具有7位有效數(shù)字,是符合IEEE-754標準的單精度浮點型數(shù)據(jù),占用四個字節(jié)。因浮點數(shù)的結(jié)構(gòu)較復(fù)雜在以后的章節(jié)中再做詳細的討論。?指針型指針型本身就是ー個變量,在這個變量中存放的指向另ー個數(shù)據(jù)的地址。這個指針變量要占據(jù)ー定的內(nèi)存單元,對不同的處理器長度也不盡相同,在C51中它的長度一般為1?3個字節(jié)。指針變量也具有類型,在以后的課程中有專門ー課做探討,這里就不多說了。bit位標量bit位標量是C51編譯器的ー種擴充數(shù)據(jù)類型,利用它可定義ー個位標量,但不能定義位指針,也不能定義位數(shù)組。它的值是ー個二進制位,不是。就是1,類似ー些高級語言中的Boolean類型中的True和False。sfr特殊功能寄存器sfr也是ー種擴充數(shù)據(jù)類型,點用ー個內(nèi)存單元(8位),值域為。?255。利用它可以訪問51單片機內(nèi)部的所有特殊功能寄存器。如用sfrP1=0x9。這一句定P1(工作寄存器)為P1端口在片內(nèi)的寄存器,在后面的語句中我們可以用P1=255(對P1端口的所有引腳置高電平)之類的語句來操作特殊功能寄存器。*AT89c51的特殊功能寄存器表請看附錄ニsfr1616位特殊功能寄存器sfr16占用兩個內(nèi)存單元(16位),值域為。?65535。sfr16和sfr?樣用于操作特殊功能寄存器,所不同的是它用于操作占兩個字節(jié)的寄存器,好定時器T。和T1。sbit可尋址位sbit同位是C51中的ー種擴充數(shù)據(jù)類型,利用它可以訪問芯片內(nèi)部的RAM中的可尋址位或特殊功能寄存器中的可尋址位。如先前我們定義了sfrP1=0x9。;〃因P1端ロ的寄存器是可位尋址的,所以我們可以定義17sbitP1_1=P1*1:〃P1_1為P1中的P1.1弓I腳//同樣我們可以用P1.1的地址去寫,如sbitP1_1=0x91;這樣我們在以后的程序語句中就可以用P1_1來對P1.1引腳進行讀寫操作了。通常這些可以直接使用系統(tǒng)提供的預(yù)處理文件,里面已定義好各特殊功能寄存器的簡單名字,直接引用可以省去一點時間,我自己是一直用的。當然您也可以自己寫自己的定義文件,用您認為好記的名字。關(guān)于數(shù)據(jù)類型轉(zhuǎn)換等相關(guān)操作在后面的課程或程序?qū)嵗袑⒂兴峒?。大家可以用所講到的數(shù)據(jù)類型改寫一下這課的實例程序,加深對各類型的認識。以上就是Keil51中常用的數(shù)據(jù)類型,下面我們來看ー個跑馬燈的程序,加深了解一下C51的程序結(jié)構(gòu)。#include<AT89X51.H>〃預(yù)處理文件里面定義了特殊寄存器的名稱,如P1口定義為P1voidmain(void)〃定義花樣數(shù)據(jù)constunsignedchardesign[32]={0xFF,OxFE,OxFD,OxFB,0xF7,OxEF,OxDF,OxBF,0x7F,0x7F,OxBF,OxDF,OxEF,0xF7,OxFB,OxFD,OxFE,OxFF,OxFF,OxFE,OxFC,0xF8,OxFO,OxEO,OxCO,0x80,0x0,0xE7,OxDB,OxBD,0x7E,OxFF};unsignedinta;〃定義循環(huán)用的變量unsignedcharb;〃在C51編程中因內(nèi)存有限盡可能注意變量類型的使用盡可能使用少字節(jié)的類型,在大型的程序中很受用do{for(b=0;b<32;b++)for(a=O;a<30000;a++);〃延時一段時間Pl=design[b];〃讀已定義的花樣數(shù)據(jù)并寫花樣數(shù)據(jù)到Plロ}while(l);對應(yīng)硬件電路圖如下:18程序中的花樣數(shù)據(jù)可以自己去定義,因這里我們的LED要AT89c51的P1引腳為低電平オ會點亮,所以我們要向P1口的各引腳寫數(shù)據(jù)0,對應(yīng)連接的LEDオ會被點亮,P1口的八個引腳剛好對應(yīng)P1口特殊寄存器的八個二進位,如向P1口定數(shù)據(jù)OxFE,轉(zhuǎn)成二進制就是11111110,最低位D0為〇,這里P1.0引腳輸出低電平,LED1被點亮

溫馨提示

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

評論

0/150

提交評論