51單片機c語言教程全集_第1頁
51單片機c語言教程全集_第2頁
51單片機c語言教程全集_第3頁
51單片機c語言教程全集_第4頁
51單片機c語言教程全集_第5頁
已閱讀5頁,還剩58頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、單片機c語言教程全集第一課建立你的第一個 KeilC51項目隨著單片機技術的不斷發(fā)展,以單片機C語言為主流的高級語言也不斷被更多的單片機愛好者和工程師所喜愛。使用C51肯定要使用到編譯器,以便把寫好的C程序編譯為機器碼,這樣單片機才能執(zhí)行編寫好的程序。KEIL UVISI0N2是眾多單片機應用開發(fā)軟件中優(yōu)秀的軟件之一,它支持眾多不一樣公司的MCS51架構的芯片,它集編輯,編譯,仿真等于一體,同時還支持,PLM匯編和C語言的程序設計,它的界面和常用的微軟 VC+ 的界面相似,界面友好,易學易用,在調試程序,軟件仿真方面也有很強大的功能。本 站提供的單片機c語言教程都是基于 keilc51的。下面

2、結合8051介紹單片機C語言的優(yōu)越性:無須懂得單片機的具體硬件,也能夠編出符合硬件實際的專業(yè)水平的程序;不懂得單片機的指令集,也能夠編寫完美的單片機程序;不同函數(shù)的數(shù)據(jù)實行覆蓋,有效利用片上有限的RAM空間;提供auto、static 、con st等存儲類型和專門針對8051單片機的data、idata、pdata、xdata、code等存儲類型,自動為變量合理地分配地址; C語言提供復雜的數(shù)據(jù)類型(數(shù)組、結構、聯(lián)合、枚舉、指針等),極大地增強了程序處理能力和靈活性;提供small、compact > large等編譯模式,以適應片上存儲器的大?。恢袛喾粘绦虻默F(xiàn)場保護和恢復,中斷向量

3、表的填寫,是直接與單片機相關的, 都由C編譯器代辦;程序具有堅固性:數(shù)據(jù)被破壞是導致程序運行異常的重要因素。C語言對數(shù)據(jù)進行了許多專業(yè)性的處理,避免了運行中間非異步的破壞提供常用的標準函數(shù)庫,以供用戶直接使用;有嚴格的句法檢查,錯誤很少,可容易地在高級語言的水平上迅速地被排掉;可方便地接受多種實用程序的服務:如片上資源的初始化有專門的實用程序自動 生成;再如,有實時多任務操作系統(tǒng)可調度多道任務,簡化用戶編程,提高運行的安全性頭文件中定義宏、說明復雜數(shù)據(jù)類型和函數(shù)原型,有利于程序的移植和支持單片 機的系列化產(chǎn)品的開發(fā);以上簡單介紹了 KEILC51軟件,要使用 KEILC51軟件,必需先要安裝它

4、,這也是學習單片機編程語言所要求的第一步建立學習環(huán)境。本站提供無限制版的 keil C51 下載(此處)(安裝的方法在壓縮包內(nèi)有詳細說明,這 里就不做介紹了 )安裝好后,您是不是想建立自己的第一個單片機C語言程序項目呢?下面就讓我們一起來建立一個小程序吧,請根據(jù)教程一步步的來,你絕對可以在短時間內(nèi)熟悉C51的。本教程所涉及C51源代碼請點此下載首先當然是運行 KEIL軟件,接著按下面的步驟建立您的第一個項目:(1)點擊Project 菜單,選擇彈出的下拉式菜單中的New Project ,如圖1-2。接著彈 出一個標準 Windows文件對話窗口,如圖1-3。在“文件名”中輸入您的第一個 C

5、程序項 目名稱,這里我們用“ test ”?!氨4妗焙蟮奈募U展名為 uv2,這是KEIL uVision2 項目文件擴展名,以后能直接點擊此文件以打開先前做的項目。耀 |jVision2Fie Edit ViewProject &ebug Peripherals Toois 5VC5 New Project.,Import pjVisionl Project.Open ProjectClose ProjectFile Extensiansj Books and EnvironmentTargets GroupSj Files, h.Sef&ct Devree for Targ

6、et.圖 1-2 New Project 菜單圖1-3文件窗口(2) 選擇所要的單片機,這里選擇常用的 Ateml公司的AT89C51。而且本單片機c語言教程里的大部分程序都是基于此芯片的,此時屏幕如圖1-4所示。AT89C51有什么功能、特點呢?看圖中右邊有簡單的介紹。完成上面步驟后,就可以進行程序的編寫了。(3) 首先在項目中創(chuàng)建新的程序文件或加入舊程序文件。如果您沒有現(xiàn)成的程序,那么就要新建一個程序文件。在KEIL中有一些程序的Demo,在這里我們還是以一個 C程 序 為例介紹如何新建一個C程序和如何加到您的第一個項目中吧。點擊圖 1-5中1的新建文 件的快捷按鈕,在 2中出現(xiàn)一個新的文

7、字編輯窗口,這個操作也能通過菜單 File-New 或快捷鍵Ctrl+N 來實現(xiàn)。好了,現(xiàn)在能編寫程序了。下面是經(jīng)典的一段程 序,呵,如果您看過別的程序書也許也有類似的程序:#i nclude#i ncludevoid mai n(void)SCON = 0x50; /串行口方式1,允許接收TMOD = 0x20; / 定時器1 定時方式2TCON = 0x40; /設定時器1開始計數(shù)TH1 = 0xE8; /11.0592MHz 1200 波特率TL1 = 0xE8; TI = 1;TR1 = 1; II 啟動定時器while(1)printf ("Hello World!n&qu

8、ot;); II顯示 Hello World圖1-4選取芯片圖1-5新建程序文件這段程序的功能是不斷從串行口輸出“Hello World! ”字符,先不管程序的語法和意思吧,先 看看如何把它加入到項目中和如何編譯試運行。(4) 點擊圖1-5中的3保存新建的程序,也能用菜單File-Save或快捷鍵Ctrl+S進行保存。因是新文件所以保存時會彈出類似圖1-3的文件操作窗口,把第一個程序命名為test1.c ,保存在項目所在的目錄中,這個時候您會發(fā)現(xiàn)程序單詞有了不一樣的 顏色,說明KEIL的C語言語法檢查生效了。如圖1-6 鼠標在屏幕左邊的 Source Group1文件夾圖標上右擊彈出菜單,在這

9、里能做在項目中增加減少文件等操作。選“Add Fileto Group Source Group 1 '”彈出文件窗口,選擇剛剛保存的文件,按ADD按鈕,關閉文件窗,程序文件已加到項目中了。這個時候在Source Group1文件夾圖標左邊出現(xiàn)了一個小+號說明,文件組中有了文件,點擊它能展開查看。File Edit View Project Debug Peripherals Tools SVC5 Window Help宰辜川鬼為didH -T'angetj蘭 D:MyData其它我的iC51cinclude <AT89X51 H>File Edit View Pr

10、oject Debug Peripherals Tools SVC5 Window Help庫feet Device For Target Target 1' Optionm for Group 'Source Group 1'Open HeF7t)曹 Rebuikl target 僅j Build targetTranslate File & 寶叩buildAdd Files to Group 'Source Group 1'Targets Groups, Files,., ,Remove Group 'Source Group f a

11、nd it's Files圖1-6把文件加入到項目文件組中(5) C程序文件已被加到了項目中了,下面就剩下編譯運行了。這個項目只是用做學 習新建程序項目和編譯運行仿真的基本方法,所以使用軟件默認的編譯設置,它不會生 成用 于芯片燒寫的HEX文件。先來看圖1-7吧,圖中1、2、3都是編譯按鈕,不一 樣是1是用于編譯單個文件。2是編譯鏈接當前項目,如果先前編譯過一次之后文件 沒有做動編輯改動,這個時候再點擊是不會再次重新編譯的。3是重新編譯,每點擊一次均會再次編譯鏈接一次,不管程序是否有改動。在3右邊的是停止編譯按鈕,只有點擊了前三個中的任一個,停止按鈕才會生效。5是菜單中的它們。在 4中

12、能看到編譯的錯誤信息和使用的系統(tǒng)資源情況等,以后我們要查錯就靠它了。6是有一個小放大鏡的按鈕,這就是開啟關閉調試模式的按鈕,它也存在于菜單 Debug-StartStop Debug Session,快捷鍵為 Ctrl+F5。File Edit Visvj Project Debug Peripherals Tools 5VCS Window Help煩 test - Wdon2File Edit View Prcject Debug PeripheralNew Project.,.Import pVisionl Project1 Qpen Projectflose ProjectFile E

13、xtensions Boots.-u匕 ”8 Sourt -ffl t冒Fi険囲Target 1Build tart cootpiling Linking.Program S:11 test"-(4Targets? Groups Files. Select Device for Targe Remove ItemOptions For Target 'Tar dear Group 自nd File O(ffi Guild target 黯 Rebuild all target Files 參 Translate DtyDataJ 莒 Sop build圖1-7編譯程序(6)

14、進入調試模式,軟件窗口樣式大致如圖1-8所示。圖中1為運行,當程序處于停止狀態(tài)時才有效,2為停止,程序處于運行狀態(tài)時才有效。3是復位,模擬芯片的復位,程序 回到最開頭處執(zhí)行。 按4能打開5中的串行調試窗口, 這個窗口能看到從 51 芯片的串 行口輸入輸出的字符,這里的第一個項目也正是在這里看運行結果。這些在菜 單中也有。首 先按4打開串行調試窗口,再按運行鍵,這個時候就能看到串行調試窗 口中不斷的打印“ Hello World! ”。最后要停止程序運行回到文件編輯模式中,就要先 按停止按鈕再按開啟關閉調試模式按鈕。然后就能進行關閉KEIL等相關操作了。倉冷口(3篇跑雀0 U春率怡鬼胞笹購 |a

15、 IfEis |« 皺阿H3簟|竽身M IP柑弋F I 0:二I Ml0 Files:-口岡Serial #1include <ATS 9151. H#include <stdio.h> void main(void)Hello Hello Hello Hello Hello HelloUr-.) 1 -World! World!- Uorld!JWorld!Vorld! World!T.Tr 1 A »審-3呂-1=1 test!. c當 Swial #1吩 SCON = 0k50; r串Twnn = nv70 "電File Edit Visv

16、j Project Debug Peripherals Tools 5VCS Window HelpFile Edit Visvj Project Debug Peripherals Tools 5VCS Window Help2 樓4 sylar我是MM咼級會員用戶等級:院士圖1-8調試運行程序化屈 n 蟲|sylar 源于 herosIize314 于 2010-05-06 給此貼評了 10 分至|區(qū)區(qū)I看推薦視頻,得100元卓越禮品券貝回復L蠢回復本帖 七回到頂端單片機c語言教程第二課 C51HEX文件的生成和單片機最小系統(tǒng)發(fā)表于009-07-30 15:03:51我想評分上一篇建立了第

17、一個單片機C語言項目,但為了讓編譯好的程序能通過編程器寫入51芯片中,要先用編譯器生成HEX文件,下面來看看如何用KEIL UVISION2來編譯生成用于燒寫芯片的HEX文件。HEX文件格式是In tel公司提出的按地址排列的數(shù)據(jù)信息,數(shù)據(jù)寬度為字 節(jié),所有數(shù)據(jù)使用16進制數(shù)字表示,常用來保存單片機或其他處理器的目標程序代碼。它保 存物理程序存儲區(qū)中的目標代碼映象。一般的編程器都支持這種格式。我 們先來打開第一個項目,打開它的所在目錄,找到test.Uv2的文件就能打開先前的項目了。然后右擊圖2-1中的1項目文件夾,彈出項目功能菜加為好友 發(fā)短消息 所有發(fā)言 個人檔案 最后登陸時 間:2010

18、-06-0408:20:15狀態(tài):離線單,選Options for Target' Targetl ',彈出項目選項設置窗口,同樣先選中項目文件夾圖標,這個時候在Project菜單中也有一樣的菜單可選。打開項目選項窗口, 轉到Output選項頁圖2-2所示,圖中1是選擇編譯 輸出的路徑,2是設置編譯輸出生成的文件名,3則是決定是否要創(chuàng)建 HEX文件,選中它就能輸出HEX文件到指定的路徑中。選好了 ?好,我們再將它重新編譯一次,很快在編譯信息窗口中就顯示HEX文件創(chuàng)建到指定的路徑 中了,如圖2-3。這樣我們就可用自己的編程器所附帶的軟件去讀取并 燒到芯片了,再用實驗板看結果,至于

19、編程器或仿真器品種繁多具體方法 就看它的說明書了,這里也不做討論。(技巧:一、在圖2-1中的1里的項目文件樹形目錄中,先選中對象, 再單擊它就可對它進 行重命名操作,雙擊文件圖標便可打開文件。二、在 Project下拉菜單的最下方有最近編輯過的項目路徑保存,這里能快速打開最近在編輯的項目。)圖2-1項目功能菜單圖2-2項目選項窗口|gl Files 少Build target 1 Target 11丄 compiling test1u * .1 inking *I戸三。呂廠白更一旦:三空一:衛(wèi)勺左空二丄卩二丄冬止左更二。-亡s*a空二2丄°°;creata口庇 hex fi

20、le from "test"."test" - 0 Error(s), 0 Warning(s).Btiiltl 人 Commyncl 人 Find"in Fileg j圖2-3編譯信息窗口或許您已把編譯好的文件燒到了芯片上,如果您購買或自制了帶串行 口輸出元件的學習實驗板,那您就能把串行口和 PC機串行口相聯(lián)用串行口調試軟件或 Windows的超級終端,將其波特 率設為1200,就能看到不 停輸出的“ Hello World! ”字樣。如果您還沒有實驗板,那這里先說說AT89C51的最小化系統(tǒng),再以一實例程序驗證最小化系統(tǒng)是否在運行,這 個最

21、小化 系統(tǒng)也易于自制用于實驗。圖2-4便是AT89C51的最小化系統(tǒng),不過為了讓我們能看出它是在運行的,加了一個電阻和一個LED,用以顯示它的狀態(tài),晶體震蕩器能根據(jù)自己的情況使用,一般實驗板上是用11.0592MHz或12MHz,使用前者的好外是能產(chǎn)生標準的串行口波特率,后 者則一個機器周期為1微秒,便于做精確定時。在自己做實驗里,注意的 是VCC是+5V的,不能高于此值,不然將損壞單片機,太低則不能正常 工作。在31腳要接高電平,這樣我們才能執(zhí)行片內(nèi)的程序,如接低電平則使用片外的程序存儲器。下面建一個新的項目名為On eLED來驗證最小化系統(tǒng)是否能工作(所有的例程都可在筆者的主頁下面下載到,

22、網(wǎng)址: 。程序如下:#i nclude /預處理命令void mai n( void) / 主函數(shù)名/這是第一種注釋方式unsigned int a; /定義變量 a 為int 類型/*這是第二種注釋方式*/do /do while 組成循環(huán)for (a=0; a<50000; a+); /這是一個循環(huán) P1_0 = 0; / 設 P1.0 口為低電平,點亮 LED for (a=0; a<50000; a+); /這是一個循環(huán) P1_0 =1; /設P1.0 口為高電平,熄滅 LEDwhile(1);vcco-i 購560JC3 rlOtiF131215311918£4

23、,2J.4J.6.7 p p p p F p p pINTI 叩)INT0(P3-2)TI(P3.5)T0(P3.4)EAATXTAL1XTAL2ItESETRD(P3.7)W(T3.61FOdlAOT)TO.1(AD1)P0.2(AD2)P0.(AD3)PO.4(AI>I)PO.5(AD5)P0.6(AL6)P0r7(AB7)P2.0(A$)P2J(A)P2.2(A1(J)P23(AI1)P2.(A12)P2.5(A13)P16(A14)P2.7(A15)VCC GND RXD(F3.0) TXI>(P3._1) ALEZPROGPSEN9-8-7-ZU-53 -3-3-3-31

24、1»29evccATS9C5L0VCC圖2-4 AT89C51最小化系統(tǒng)這里先講講KEIL C 編譯器所支持的注釋語句。一種是以“/ ”符開始的語句,符號之后的語句都被視為注釋,直到有回車換行。另一種是在“/* ”和“*/ ”符號之內(nèi)的為注釋。注釋不會被C編譯器所編譯。一個C應用程序中應有一個 main主函數(shù),main函數(shù)能調用別的功能函數(shù),但其它功能函數(shù)不允許調用mai n函數(shù)。不論ma in函數(shù)放在程序中的那個位置,總是先被執(zhí)行。用上面學到的知識編譯寫好的On eLED程序,并把它燒到剛做好的最小化系統(tǒng)中。上電,剛開始時LED是不亮的(因為上電復位后所有的IO 口都置1引腳為高電

25、平),然后延時一段時間(for (a=0; a<50000; a+)這句在運行),LED亮,再延時,LED熄 滅,然后交替亮、滅。第一個真正的小實驗就做完,如果沒有這樣的效果 那么您就要認真檢查一下電路或編譯燒寫的步驟了。sylar 源于 heros了解更多電源解決方案©回復I更回復本帖空L回到頂端我想3樓> sylar我是MM高級會員用戶等級:院士單片機c語言教程第三課 C51數(shù)據(jù)類型發(fā)表于2009-07-30 15:04:52每寫一個程序,總離不開數(shù)據(jù)的應用,在學習c51語言的過程中掌握 理解數(shù)據(jù)類型也是很關鍵的。先看表 3 1,表中列出了 KEILuVision2

26、單片機c語言編譯器所支持的數(shù)據(jù)類型。在標準C語言中基本的數(shù)據(jù)類型為 char,int,short,long,float和 double,而在 c51編譯器中int和short 相同,float 和double 相同,這里就不列 出說明了。下面來看看它們的具體定義:加為好友發(fā)短消息所有發(fā)言檔案最后登陸時間:2010-06-0408:20:15狀態(tài):離線數(shù)據(jù)類型長度值域unsigned char單字節(jié)0 255signed char單字節(jié)-128 +127unsigned int雙字節(jié)065535signed int雙字節(jié)-32768 +32767unsigned long四字節(jié)042949672

27、95signed long四字節(jié)-2147483648 +2147483647float四字節(jié)± 1.175494E-38 土 3.402823E+38*13字節(jié)對象的地址個人pit位0或1|sfr單字節(jié)0 255|sfr16雙字節(jié)065535|sbit位0或1表3 1 KEIL uVision2 單片機c語言編譯器所支持的數(shù)據(jù)類型1. char字符類型char類型的長度是一個字節(jié),通常用于定義處理字符數(shù)據(jù)的變量或常 量。分無符號字符類型unsigned char和有符號字符類型 signedchar,默認值為signed char類型。unsigned char類型用字節(jié)中所有的位

28、來表示數(shù)值,所能表達的數(shù)值范圍是 0255。 signed char類型用字節(jié)中最高位字節(jié)表示數(shù)據(jù)的符號,“0 ”表示正數(shù),“ 1”表示負數(shù),負數(shù)用補碼表示。所能表示的數(shù)值范圍是-128+127。unsigned char常用于處理ASCII字符或用于處理小于或等于255的整型數(shù)。*正數(shù)的補碼與原碼相同,負二進制數(shù)的補碼等于它的絕對值按位取 反后加1。2. int 整型int整型長度為兩個字節(jié),用于存放一個雙字節(jié)數(shù)據(jù)。分有符號int整型數(shù)signed int和無符號整型數(shù) unsigned int ,默認值為signed int 類型。signed int 表示的數(shù)值范 圍是-32768+32

29、767,字節(jié)中 最高位表示數(shù)據(jù)的符號,“0”表示正數(shù),“1”表示負數(shù)。unsignedint 表示的數(shù)值范圍是 065535。先停一下來寫個小程序看看unsigned char 和unsigned int 用于延時的不一樣效果,說 明它們的長度是不一樣的,學習它們的使用方法。依舊用上一篇的最小化系統(tǒng)做實驗,不過要加多一個電阻和LED,如圖3 1。實驗中用D1的點亮表明正在用 un sig ned int數(shù)值延時,用D2點亮表明正在用 un sig ned char數(shù)值延時。圖3 1第3課實驗用電路 把這個項目稱為 TwoLED,實驗程序如下:#i nclude /預處理命令void mai n

30、( void) /主函數(shù)名unsigned int a; /定義變量 a 為 unsigned int 類型unsigned char b; /定義變量 b 為 unsigned char 類型do /do while組成循環(huán)for (a=0; a<65535; a+)P1_0 = 0; /65535 次設 P1.0 口為低電平,點亮LED P1_0 = 1; /設P1.0 口為高電平,熄滅 LEDfor (a=0; a<30000; a+); /空循環(huán)for (b=0; b<255; b+)P1_1 = 0; /255 次設 P1.1口為低電平,點亮 LED P1_1 =

31、1; /設P1.1 口為高電平,熄滅 LEDfor (a=0; a<30000; a+); /空循環(huán)while(1);同樣編譯燒寫,上電運行您就能看到結果了。很明顯 D1點亮的時間 長于D2點亮的時間。這里必須要講的是,當定義一個變量為特定的數(shù)據(jù)類型時,在程序使用該變量不應使它的值 超過數(shù)據(jù)類型的值域。如本例中的變量b不能賦超出 0 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)。

32、同理 a的值不應超出065535。long 長整型long長整型長度為四個字節(jié),用于存放一個四字節(jié)數(shù)據(jù)。分有符號long 長整型signed long 和無符號長整型 unsigned long ,默認值 為signed long 類型。signed int 表示 的數(shù)值范圍是-2147483648 +2147483647,字節(jié)中最高位表示數(shù)據(jù)的符號,“ 0”表示正 數(shù),“ 1 ”表示負數(shù)。unsigned long 表示的數(shù)值范圍是 04294967295。3. float 浮點型float 浮點型在十進制中具有7位有效數(shù)字,是符合IEEE 754標準的單精度浮點型數(shù)據(jù),占用四個字節(jié)。因浮點

33、數(shù)的結構較復雜在以 后的章節(jié)中再做詳細的討論。4. *指針型指針型本身就是一個變量,在這個變量中存放的指向另一個數(shù)據(jù)的地址。這個指針變量 要占據(jù)一定的內(nèi)存單元,對不一樣的處理器長度也不盡相同,在c51中它的長度一般為13個字節(jié)。指針變量也具有類型,在以后的課程中有專門一課做探討,這里就不多說了。5. bit 位標量bit位標量是C51編譯器的一種擴充數(shù)據(jù)類型,利用它可定義一個位 標量,但不能定義 位指針,也不能定義位數(shù)組。它的值是一個二進制位,不是0就是1,類似一些高級語 言中的Boolean類型中的True 和 False 。6. sfr 特殊功能寄存器sfr也是一種擴充數(shù)據(jù)類型,點用一個內(nèi)

34、存單元,值域為0255。利用它能訪問51單片機內(nèi)部的所有特殊功能寄存器。如用sfr P1 =0x90這一句定P1為P1端口在片內(nèi) 的寄存器,在后面的語句中用 以用P1 = 255 (對P1端口的所有引腳置高電平)之類的語句來操作特殊功能寄存器。& sfr16 16 位特殊功能寄存器sfr16 占用兩個內(nèi)存單元,值域為065535。sfr16 和sfr 一樣用于操作特殊功能寄存器,所不一樣的是它用于操作占兩個字節(jié)的寄存 器,如定時器T0和T1。9. sbit 可錄址位sbit同樣是 單片機c語言 中的一種擴充數(shù)據(jù)類型,利用它能訪問芯 片內(nèi)部的RAM中的可尋址位或特殊功能寄存器中的可尋址位

35、。如先前定義了sfr P1 = 0x90; / 因P1端口的寄存器是可位尋址的,所以能定義sbit P1_1 = P1 人 1; P1_1為 P1 中的 P1.1 引腳/同樣我們能用 P1.1的地址去寫,如sbit P1_1 = 0x91;這樣在以后的程序語句中就能用P1_1來對P1.1引腳進行讀寫操作了。通常這些能直接使用系統(tǒng)供給的預處理文件,里面已定義好各特殊功能寄 存器的簡單名字,直接引 用能省去一點時間,我自己是一直用的。當 然您也能自己寫自己的定義文件,用您認為好記的名字。夫sylar 源于 heros提高空載性能,降低待機功耗并提升輕載效率普回復境回復本帖 3回到頂端單片機c語言教

36、程第四課C51常量 發(fā)表于2009-07-30 15:05:41我想評分4樓卜 sylar上一篇學習了 KEIL c單片機c語言編譯器所支持的數(shù)據(jù)類型。 而這些c51 數(shù)據(jù)類型又是怎么用在常量和變量的定義中的呢?又有什么要注意的嗎? 常量就是在程序運行過程中不能改變值的量,而變量是能在程序運行過程我是MM高 中不斷變化的量。變量的定義能使用所有c51編譯器支持的數(shù)據(jù)類型,而級會員常量的數(shù)據(jù)類型只有整型、浮點型、字符型、字符串型和位標量。這一篇、學習常量定義和使用方法,而下一篇則學習單片機c語言的變量。用戶等級:院士常量的數(shù)據(jù)類型說明是這樣的加為好友發(fā)短消息所有發(fā)言個人檔案 最后登陸時間:1.

37、整型常量能表示為十進制如 123,0,- 89等。十六進制則以0x開頭 如0x34,-0x3B 等。長整型就在數(shù)字后面加字母 L,如104L,034L,0xF3402. 浮點型常量可分為十進 制和指數(shù)表示形式 。十 進制由數(shù)字和小數(shù)點組成,如0.888,3345.345,0.0 等,整數(shù)或小數(shù)部分為 0,能省略但必須 有小數(shù)點。指數(shù)表 示形式為土 數(shù)字.數(shù)字e ± 數(shù)字,中的內(nèi)容為可 選項,其中內(nèi)容根據(jù)具體情況可有可無,但其余部分必須有,如2010-06-0408:20:15125e3,7e9,-3.0e-3。狀態(tài):離線3. 字符型常量是單引號內(nèi)的字符,如a',d'等

38、,不能顯示的控制字符,能 在該字符前面加一個反斜杠“”組成專用轉義字符。常用轉義字符表請看表4 一 1 o4. 字符串型常量由雙引號內(nèi)的字符組成,如“test ”,“OK等。當引號 內(nèi)的沒有字 符時,為空字符串。在使用特殊字符時同樣要使用轉義字符如 雙引號。在C中字符 串常量是做為字符類型數(shù)組來處理的,在存儲字符串時系統(tǒng)會在字符串尾部加上o轉義字符以作為該字符串的結束符。字符串常量“ A和字符常量A'是不一樣的,前者在存儲時多占用一個字節(jié)的字間。5. 位標量,它的值是一個二進制。轉義字符含義ASCII 碼(16/10 進制)o空字符(NULL)00H/0n換行符(LF)0AH/10r回

39、車符(CR)0DH/13t水平制表符(HT)09H/9b退格符(BS)08H/8f換頁符(FF)0CH/12'單引號27H/39"雙引號22H/34反斜杠5CH/92表4 1常用轉義字符表常量可用在不必改變值的場合,如固定的數(shù)據(jù)表,字庫等。常量的定義方 式有幾種,下 面來加以說明。#difi ne False 0x0; /用預定義語句能定義常量#difine True 0x1; /這里定義 False 為 0,True 為 1/在程序中用到False編譯時自動用0替換,同理True替換為1unsigned int code a=100; /這一句用 code 把a定義在程序存

40、儲器中并賦值con st un sig ned int c=100; / 用con st 定義c 為無符號int常量并賦值 以上兩句它們的值都保存在程序存儲器中,而程序存儲器在運行中是不允許被修改的,所以如果在這兩句后面用了類似a=110, a+這樣的賦值語句,編譯時將會出錯。下面寫個跑馬燈程序來實驗一下典型的常量使用方法。先來看看電路圖吧。它是在上一篇的實驗電路的基礎上增加幾個LED組成的,也就是用P1 口的全部引腳分別驅動一個LED,電路如圖4 1所示。新建一個Run LED的項目,主程序如下:#inelude /預處理文件里面定義了特殊寄存器的名稱如P1 口定義為P1void mai n

41、(void)/定義花樣數(shù)據(jù)const un sig ned chardesig n32=0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x0,0xE7,0xDB,0xBD,0x7E,0xFF;un sig ned int a; /定義循環(huán)用的變量un sig ned char b; /在c51編程中因內(nèi)存有限盡可能注意變量類型的使用/盡可能使用少字節(jié)的類型,在大型的程序中很受用dof

42、or (b=0; b<32; b+)while(1);for(a=0; a<30000; a+); / 延時一段時間P1 = desig n b; /讀已定義的花樣數(shù)據(jù)并寫花樣數(shù)據(jù)到P1 口程序中的花樣數(shù)據(jù)能自以去定義,因這里我們的LED要AT89C51的P1引腳為低電平才 會點亮,所以我們要向 P1 口的各引腳寫數(shù)據(jù) 0對應連 接的LED才會被點亮,P1 口的八個引 腳剛好對應P1 口特殊寄存器的八 個二進位,如向 P1 口定數(shù)據(jù)OxFE,轉成二進制就是11111110,最低位DO為0這里P1.0弓I腳輸出低電平,LED1被點亮。如 此類推,大家不難算出自己想要做的效果了。大家編

43、譯燒寫看看,效果就出來,顯示的速度您能根據(jù)需要調整延時a的值,不要超過變量類型的值域就很行了。哦,您還沒有實驗板?那如何能知道程序運行的結果呢?呵,不用急,這就來說說用KEIL uVision2 的軟件仿真來調試10 口輸出輸入程序。vcc oLED 1-8GHT1519L5.L4P1J0P0D(Al>0)P1.1PO.1(AD1>POLADS)P13PO3(AI>3)P14PO4(AI>4)P1JPOJ(AI>5)PD貞AD時P1JP0.7(AI>7)nm(P33)P2D阿P2.1(A9)P羽抑葉TltPSJ)P33(A11)T0tP34)P3(A1J)E

44、A/VPV2JXA14)KTAL2vrcGHDEisirrOD(P3JQEI>iP3.7)ALE/PROC網(wǎng)P3心PSEHAT89C3I:迎:J8:J7:?5:54+0:ioL0:joGNP圖4 - 1八路跑馬燈電路編譯運行上面的程序,然后按外部設備菜單Peripherals I/O Ports Portl 就打開Portl的調試窗口了,如圖 4 3中的2。這個時候程序運行了,但我們 并不能在Portl調試窗口 上看到有會什么效果,這個時候能用鼠標左擊 圖4 3中1旁邊綠色的方條,點一下就有一個小紅方格再點一下又沒有了,哪一句語句前有小方格程序運行到那一句時就停止了,就是設 置調試斷點,

45、同樣圖42中的1也是同樣功能,分別是增加/移除斷點、移除所有斷點、允 許/禁止斷點、禁止所有斷點,菜單也有一樣的功能,另外菜單中還有Breakpoints可打開斷點設置窗口它的功能更強大,不過這里先不用它。在"P1 = desig nb;”這一句設置一 個斷點這個時候程序運行到這里就停住了,再留意一下Port1調試窗口,再按圖5-2中的2的運 行鍵,程序又運行到設置斷點的地方停住了,這個時候Port1 調試窗口的狀態(tài)又不一樣了。 也就是說Port1 調試窗口模擬了 P1 口的電平狀 態(tài),打勾為高電平,不打勾則為低電平,窗口中P1為P1寄存器的狀態(tài),Pins為引腳的狀態(tài),注意的是如果是

46、讀引腳值之前 必須把引腳對應的寄存器置1才能正確讀取。圖 4 2中2旁邊的樣的按鈕分別為單步入,步越,步出和執(zhí)行到當前行。圖中 3為顯示下一句將要執(zhí)行的語句。圖4 3中的3是Watches窗口可查 看各變量的當前值,數(shù)組和字串是顯示其頭一個地址,如本例中的desig n 數(shù)組是保 存在code存儲區(qū)的首地址為 D:0x08,能在圖中4 Memory存儲器查看窗口中的 Address 地址中打入 D:0x08 就能查看到 design 各數(shù)據(jù)和存放 地址了。如果你的 uVision2沒有顯示這些窗口,能在View菜單中打開在圖4 2中3后面一欄的查看窗口快捷欄中打開。圖4 -2調試用快捷菜單欄皆

47、 F: MyDjIJI V:挖的?fit :=!Z/盡町能便用少事節(jié)的糞SI.在大整的狽序中詛受用dofor (b=0; b<35: b+)a<50000; a+4);"延時一JK時簡Fl - dssi?nb: "iftE定叉的花撐敎據(jù)并耳花I*無據(jù)翎P1 口欝 RunLEB c0 4 4 48 0 220 8 82& o 1 4IX d* al- o 2 2 OS0 0 2214 0 4vaut0:0x06OxC35O OxlOdesign圖4 3各調試窗口sylar 源于 heros我是A I; A提高空載性能,降低待機功耗并提升輕載效率回復一/回復

48、本帖回到頂端5樓單片機c語言教程第五課 C51變量 發(fā)表于2009-07-30 15:07:49我想評分上課所提到變量就是一種在程序執(zhí)行過程中其值能不斷變化的量。要在 程序中使用變量必須先用標識符作為變量名,并指出所用的數(shù)據(jù)類型和存儲 模式,這樣編譯系統(tǒng)才能為變量分配相應的存儲空間。定義一個變量的格式 如下:MM高級 會員 用戶等 級:院士 加為好友 發(fā)短消息 所有發(fā)言 個人檔案 最后登陸 時間: 2010-060408:20:15 狀態(tài):離 線存儲種類數(shù)據(jù)類型存儲器類型變量名表在定義格式中除了數(shù)據(jù)類型和變量名表是必要的,其它都是可選項。存儲種類有四種:自動(auto),外部(extern )

49、,靜態(tài)(static )和寄存器(register ),缺省類型為自動(auto)。這些存儲種類的具體含義和使用方 法,將在第七課變量的存儲中進一步進行學習。而這里的數(shù)據(jù)類型則是和我們在第四課中學習到的名種數(shù)據(jù)類型的定義 是一樣的。說明了一個變量的數(shù)據(jù)類型后,還可選擇說明該變量的存儲器類 型。存儲器類型的說明就是指定該變量在單片機c語言硬件系統(tǒng)中所使用的存儲區(qū)域,并在編譯時準確的定位。表6- 1中是KEIL uVision2 所能認別的存儲器類型。注意的是在 AT89C51芯片中RAMR有低128位,位于80H到FFH 的高128位則在52芯片中才有用,并和特殊寄存器地址重疊。特殊寄存器(SF

50、R的地址表請看附錄二AT89c51特殊功能寄存器列表表6-1存儲器類型存儲器類型說明data直接訪問內(nèi)部數(shù)據(jù)存儲器(128字節(jié)),訪問速度最快bdata可位尋址內(nèi)部數(shù)據(jù)存儲器(16字節(jié)),允許位與字節(jié)混合訪idata間接訪問內(nèi)部數(shù)據(jù)存儲器(256字節(jié)),允許訪問全部內(nèi)部地pdata分頁訪問外部數(shù)據(jù)存儲器(256字節(jié)),用MOVX R指令-xdata外部數(shù)據(jù)存儲器(64KB),用MOVX DPTR令訪問code程序存儲器(64KB),用MOVC A+DP指令訪問如果省略存儲器類型,系統(tǒng)則會按編譯模式SMALL,COMPAC或 LARGE所規(guī)定的默認存儲器類型去指定變量的存儲區(qū)域。無論什么存儲模式

51、都能聲明 變量在任何的8051存儲區(qū)范圍,然而把最常用的命令如循環(huán)計數(shù)器和隊列索 引放在內(nèi)部數(shù)據(jù)區(qū)能顯著的提高系統(tǒng)性能。還有要指出的就是變量的存儲種 類與存儲器類型是完全無關的。.數(shù)據(jù)存儲模式存儲模式?jīng)Q定了沒有明確指定存儲類型的變量,函數(shù)參數(shù)等的缺省存儲區(qū)域, 共三種:1. 1. Small 模式所有缺省變量參數(shù)均裝入內(nèi)部RAM優(yōu)點是訪問速度快,缺點是空間有限,只適用于小程序。2. 2. Compact 模式所有缺省變量均位于外部RAM區(qū)的一頁(256Bytes),具體哪一頁可由 P2 口指定,在STARTUP.A5仗件中說明,也可用 pdata指定,優(yōu)點是空間較 Small 為寬裕速度較Sm

52、all慢,較large要快,是一種中間狀態(tài)。3. 3. large 模式所有缺省變量可放在多達64KB的外部RAM區(qū),優(yōu)點是空間大,可存變量多,缺點是速度較慢。提示:存儲模式在單片機c語言編譯器選項中選擇。之前提到簡單提到sfr,sfr16,sbit定義變量的方法,下面我們再來仔細看看。sfr和sfr16能直接對51單片機的特殊寄存器進行定義,定義方法如下:sfr特殊功能寄存器名=特殊功能寄存器地址常數(shù); sfr16特殊功能寄存器名=特殊功能寄存器地址常數(shù);我們能這樣定義 AT89C51的P1 口sfr P1 = 0x90; / 定義 P1 I/O 口,其地址 90Hsfr關鍵定后面是一個要定

53、義的名字,可任意選取,但要符合標識符的命名規(guī)則,名字最好有一定的含義如P1 口能用P1為名,這樣程序會變的好讀好多。等號后面必須是常數(shù),不允許有帶運算符的表達式,而且該常數(shù)必須 在特殊功能寄存器的地址范圍之內(nèi)(80H FFH),具體可查看附錄中的相關表。sfr是定義8位的特殊功能寄存器而 sfr16則是用來定義16位特殊功能 寄存器,如8052的T2定時器,能定義為:sfr16 T2 = OxCC; /這里定義8052定時器2,地址為T2L=CCH,T2H=CDH用sfr16定義16位特殊功能寄存器時,等號后面是它的低位地址,高位地址 一定要位于物理低位地址之上。注意的是不能用于定時器0和1的定義。sbit可定義可位尋址對象。如訪問特殊功能寄存器中的某位。其實這樣應用是經(jīng)常要用的如要訪問P1 口中的第2個引腳P1.1。我們能照以下的方法去定義:(1) sbit位變量名=位地址sbit P1_1 = Ox91;這樣是把位的絕對地址賦給位變量。同sfr 一樣sbit的位地址必須位于80H-FFH 之間。(2) Sbit位

溫馨提示

  • 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

提交評論