當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]根據(jù)有網(wǎng)友提出美中不足的是所用單片機(jī)編程語言為匯編,基于此,電子發(fā)燒友網(wǎng)再接再厲再次為讀者誠摯奉上非常詳盡的《單片機(jī)C語言知識點(diǎn)全攻略》系列單片機(jī)C語言學(xué)習(xí)教程,本教程共分為四部分,主要知識點(diǎn)如下所示。

根據(jù)有網(wǎng)友提出美中不足的是所用單片機(jī)編程語言為匯編,基于此,電子發(fā)燒友網(wǎng)再接再厲再次為讀者誠摯奉上非常詳盡的《單片機(jī)C語言知識點(diǎn)全攻略》系列單片機(jī)C語言學(xué)習(xí)教程,本教程共分為四部分,主要知識點(diǎn)如下所示。

第一部分知識點(diǎn):

  第一課 建立你的第一個KeilC51項目

  第二課 C51HEX文件的生成和單片機(jī)

  第三課 C51數(shù)據(jù)類型

  第四課 C51常量

第二部分知識點(diǎn):

  第五課 C51變量

  第六課 C51運(yùn)算符和表達(dá)式

  第七課 運(yùn)算符和表達(dá)式(關(guān)系運(yùn)算符)

  第八課 運(yùn)算符和表達(dá)式(位運(yùn)算符)

  第九課 C51運(yùn)算符和表達(dá)式(指針和地址運(yùn)算符)

第三部分知識點(diǎn):

  第十課 C51表達(dá)式語句及仿真器

  第十一課 C51復(fù)合語句和條件語句

  第十二課 C51開關(guān)分支語句

  第十三課 C51循環(huán)語句

  第十四課 C51函數(shù)

第四部分知識點(diǎn):

  第十五課 C51數(shù)組的使用

  第十六課 C51指針的使用

  第十七課 C51結(jié)構(gòu)、聯(lián)合和枚舉的使用

  附錄(運(yùn)算符優(yōu)先級和結(jié)合性等)

  c語言是很好用的結(jié)構(gòu)化語言,80年代后,c也能用在單片機(jī)上了。本站為了方便大家學(xué)習(xí)制作了一個單片機(jī)c語言教程,如果你是新手先看下下面的c51介紹吧,過去長期困擾人們的所謂“高級語言產(chǎn)生代碼太長,運(yùn)行速度太慢,運(yùn)行效率不高,所以不適合單片機(jī)使用”keil公司出品的單片機(jī)c語言集成開發(fā)環(huán)境成功的解決了這個難題,使得單片機(jī)c語言的效率大大的提高,而且在關(guān)鍵部位還能嵌入?yún)R編語言代碼,從而挖掘程序的最高潛力。

  目前,8051上的C語言的代碼長度,已經(jīng)做到了匯編水平的1.2~1.5倍。4K字節(jié)以上的程度,C語言的優(yōu)勢更能得到發(fā)揮。至于運(yùn)行速度的問題,只要有好的仿真器,找出關(guān)鍵的代碼,再進(jìn)一步做一下人工優(yōu)化,就可很容易達(dá)到美滿。單片機(jī)c語言是高效的單片機(jī)開發(fā)語言,本站提供的單片機(jī)c語言教程共17課時,由淺入深,看完了這些教程你就基本了解了c51,能進(jìn)行一般的單片機(jī)c語言程序設(shè)計了,現(xiàn)在讓我們開始學(xué)習(xí)吧。

第一課、建立你的第一個KeilC51項目

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

  下面結(jié)合8051介紹單片機(jī)C語言的優(yōu)越性:

  ·無須懂得單片機(jī)的具體硬件,也能夠編出符合硬件實際的專業(yè)水平的程序;

  ·不懂得單片機(jī)的指令集,也能夠編寫完美的單片機(jī)程序;

  ·不同函數(shù)的數(shù)據(jù)實行覆蓋,有效利用片上有限的RAM空間;

  ·提供auto、static、const等存儲類型和專門針對8051單片機(jī)的data、idata、pdata、xdata、code等存儲類型,自動為變量合理地分配地址;

  ·C語言提供復(fù)雜的數(shù)據(jù)類型(數(shù)組、結(jié)構(gòu)、聯(lián)合、枚舉、指針等),極大地增強(qiáng)了程序處理能力和靈活性;

  ·提供small、compact、large等編譯模式,以適應(yīng)片上存儲器的大小;

  ·中斷服務(wù)程序的現(xiàn)場保護(hù)和恢復(fù),中斷向量表的填寫,是直接與單片機(jī)相關(guān)的,都由C編譯器代辦;

  ·程序具有堅固性:數(shù)據(jù)被破壞是導(dǎo)致程序運(yùn)行異常的重要因素。C語言對數(shù)據(jù)進(jìn)行了許多專業(yè)性的處理,避免了運(yùn)行中間非異步的破壞

  ·提供常用的標(biāo)準(zhǔn)函數(shù)庫,以供用戶直接使用;

  ·有嚴(yán)格的句法檢查,錯誤很少,可容易地在高級語言的水平上迅速地被排掉;

  ·可方便地接受多種實用程序的服務(wù):如片上資源的初始化有專門的實用程序自動生成;再如,有實時多任務(wù)操作系統(tǒng)可調(diào)度多道任務(wù),簡化用戶編程,提高運(yùn)行的安全性等等。

  ·頭文件中定義宏、說明復(fù)雜數(shù)據(jù)類型和函數(shù)原型,有利于程序的移植和支持單片機(jī)的系列化產(chǎn)品的開發(fā);

  以上簡單介紹了 KEILC51 軟件,要使用KEILC51軟件,必需先要安裝它,這也是學(xué)習(xí)單片機(jī)編程語言所要求的第一步――建立學(xué)習(xí)環(huán)境。

  安裝好后,您是不是想建立自己的第一個單片機(jī)C語言程序項目呢?下面就讓我們一起來建立一個小程序吧,請根據(jù)教程一步步的來,你絕對可以在短時間內(nèi)熟悉c51的。

  首先當(dāng)然是運(yùn)行KEIL軟件,接著按下面的步驟建立您的第一個項目:

  (1)點(diǎn)擊 Project 菜單,選擇彈出的下拉式菜單中的 New Project,如圖 1-2。接著彈 出一個標(biāo)準(zhǔn) Windows 文件對話窗口,如圖 1-3。在“文件名”中輸入您的第一個 C 程序項 目名稱,這里我們用“test”。“保存”后的文件擴(kuò)展名為 uv2,這是 KEIL uVision2 項目文件擴(kuò)展名,以后能直接點(diǎn)擊此文件以打開先前做的項目。

  

  圖 1-2 New Project 菜單

  

  圖 1-3 文件窗口

  (2)選擇所要的單片機(jī),這里選擇常用的 Ateml 公司的 AT89c51。而且本單片機(jī)c語言教程里的大部分程序都是基于此芯片的,此時屏幕如圖 1-4 所示。AT89c51 有什么功能、特點(diǎn)呢?看圖中右邊有簡單的介紹。完成上面步驟后,就可 以進(jìn)行程序的編寫了。

 ?。?)首先在項目中創(chuàng)建新的程序文件或加入舊程序文件。如果您沒有現(xiàn)成的程序,那 么就要新建一個程序文件。在 KEIL 中有一些程序的 Demo,在這里我們還是以一個 C 程序 為例介紹如何新建一個 C 程序和如何加到您的第一個項目中吧。點(diǎn)擊圖 1-5 中 1 的新建文 件的快捷按鈕,在 2 中出現(xiàn)一個新的文字編輯窗口,這個操作也能通過菜單 File-New 或 快捷鍵 Ctrl+N 來實現(xiàn)。好了,現(xiàn)在能編寫程序了。

下面是經(jīng)典的一段程序,呵,如果您看過別的程序書也許也有類似的程序:

 

  #include 《AT89X51.H》

  #include 《stdio.h》

  void main(void)

  {

  SCON = 0x50; //串口方式1,允許接收

  TMOD = 0x20; //定時器1定時方式2

  TCON = 0x40; //設(shè)定時器1開始計數(shù)

  TH1 = 0xE8; //11.0592MHz 1200波特率

  TL1 = 0xE8;

  TI = 1;

  TR1 = 1; //啟動定時器

  while(1)

  printf (Hello World!n);; //顯示Hello World

  }

  

  圖 1-4 選取芯片

  

  圖 1-5 新建程序文件

  這段程序的功能是不斷從串行口輸出“Hello World!”字符,先不管程序的語法和意思吧,先 看看如何把它加入到項目中和如何編譯試運(yùn)行。

 ?。?)點(diǎn)擊圖 1-5 中的 3 保存新建的程序,也能用菜單 File-Save 或快捷鍵 Ctrl+S

  進(jìn)行保存。因是新文件所以保存時會彈出類似圖 1-3 的文件操作窗口,把第一個程序命名

  為 test1.c,保存在項目所在的目錄中,這個時候您會發(fā)現(xiàn)程序單詞有了不一樣的顏色,說明 KEIL的C語言語法檢查生效了。如圖 1-6 鼠標(biāo)在屏幕左邊的 Source Group1 文件夾圖標(biāo)上右擊彈出 菜單,在這里能做在項目中增加減少文件等操作。選“Add File to Group ‘Source Group 1’” 彈出文件窗口,選擇剛剛保存的文件,按 ADD 按鈕,關(guān)閉文件窗,程序文件已加到項目中了。這個時候在 Source Group1 文件夾圖標(biāo)左邊出現(xiàn)了一個小+號說明,文件組中有了文件,點(diǎn)擊它能展開查看。

  

  圖 1-6 把文件加入到項目文件組中

 ?。?)C程序文件已被加到了項目中了,下面就剩下編譯運(yùn)行了。這個項目只是用做學(xué) 習(xí)新建程序項目和編譯運(yùn)行仿真的基本方法,所以使用軟件默認(rèn)的編譯設(shè)置,它不會生成用 于芯片燒寫的 HEX 文件。先來看圖 1-7 吧,圖中 1、2、3 都是編譯按鈕,不一樣是 1 是用 于編譯單個文件。2 是編譯鏈接當(dāng)前項目,如果先前編譯過一次之后文件沒有做動編輯改動, 這個時候再點(diǎn)擊是不會再次重新編譯的。3 是重新編譯,每點(diǎn)擊一次均會再次編譯鏈接一次,不 管程序是否有改動。在 3 右邊的是停止編譯按鈕,只有點(diǎn)擊了前三個中的任一個,停止按鈕 才會生效。5 是菜單中的它們。在 4 中能看到編譯的錯誤信息和使用的系統(tǒng)資源情況等, 以后我們要查錯就靠它了。6 是有一個小放大鏡的按鈕,這就是開啟關(guān)閉調(diào)試模式的按鈕, 它也存在于菜單 Debug-StartStop Debug Session,快捷鍵為 Ctrl+F5。

  

  圖 1-7 編譯程序

  (6)進(jìn)入調(diào)試模式,軟件窗口樣式大致如圖 1-8 所示。圖中 1 為運(yùn)行,當(dāng)程序處于停止 狀態(tài)時才有效,2 為停止,程序處于運(yùn)行狀態(tài)時才有效。3 是復(fù)位,模擬芯片的復(fù)位,程序 回到最開頭處執(zhí)行。按 4 能打開 5 中的串行調(diào)試窗口,這個窗口能看到從 51 芯片的串 行口輸入輸出的字符,這里的第一個項目也正是在這里看運(yùn)行結(jié)果。這些在菜單中也有。首 先按 4 打開串行調(diào)試窗口,再按運(yùn)行鍵,這個時候就能看到串行調(diào)試窗口中不斷的打印“Hello World!”。最后要停止程序運(yùn)行回到文件編輯模式中,就要先按停止按鈕再按開啟關(guān)閉調(diào)試 模式按鈕。然后就能進(jìn)行關(guān)閉 KEIL 等相關(guān)操作了。

  

  圖 1-8 調(diào)試運(yùn)行程序

第二課、C51HEX文件的生成和單片機(jī)最小系統(tǒng)

  上一篇建立了第一個單片機(jī)C語言項目,但為了讓編譯好的程序能通過編程器寫入51芯 片中,要先用編譯器生成HEX文件,下面來看看如何用KEIL uVISION2來編譯生成用于燒寫 芯片的HEX文件。HEX文件格式是Intel公司提出的按地址排列的數(shù)據(jù)信息,數(shù)據(jù)寬度為字 節(jié),所有數(shù)據(jù)使用16進(jìn)制數(shù)字表示, 常用來保存單片機(jī)或其他處理器的目標(biāo)程序代碼。它保 存物理程序存儲區(qū)中的目標(biāo)代碼映象。一般的編程器都支持這種格式。我們先來打開第一個 項目,打開它的所在目錄,找到test.Uv2的文件就能打開先前的項目了。然后右擊圖2-1 中的1項目文件夾,彈出項目功能菜單,選Options for Target’Target1’,彈出項目選項設(shè)置窗口, 同樣先選中項目文件夾圖標(biāo),這個時候在Project菜單中也有一樣的菜單可選。打開項目選項窗口, 轉(zhuǎn)到Output選項頁圖2-2所示,圖中1是選擇編譯輸出的路徑,2是設(shè)置編譯輸出生成的文件 名,3則是決定是否要創(chuàng)建HEX文件,選中它就能輸出HEX文件到指定的路徑中。選好了? 好,我們再將它重新編譯一次,很快在編譯信息窗口中就顯示HEX文件創(chuàng)建到指定的路徑 中了,如圖2-3。這樣我們就可用自己的編程器所附帶的軟件去讀取并燒到芯片了,再用實 驗板看結(jié)果,至于編程器或仿真器品種繁多具體方法就看它的說明書了,這里也不做討論。

  (技巧:一、在圖2-1中的1里的項目文件樹形目錄中,先選中對象,再單擊它就可對它進(jìn) 行重命名操作,雙擊文件圖標(biāo)便可打開文件。二、在Project下拉菜單的最下方有最近編輯過

  的項目路徑保存,這里能快速打開最近在編輯的項目。)

  圖2-1項目功能菜單

  

  圖2-2 項目選項窗口

  

  圖 2-3 編譯信息窗口

  或許您已把編譯好的文件燒到了芯片上,如果您購買或自制了帶串行口輸出元件的學(xué)習(xí)實 驗板,那您就能把串行口和 PC 機(jī)串行口相聯(lián)用串行口調(diào)試軟件或 Windows 的超級終端,將其波特 率設(shè)為 1200,就能看到不停輸出的“Hello World!”字樣。如果您還沒有實驗板,那這 里先說說 AT89c51 的最小化系統(tǒng),再以一實例程序驗證最小化系統(tǒng)是否在運(yùn)行,這個最小化 系統(tǒng)也易于自制用于實驗。圖 2-4 便是 AT89c51 的最小化系統(tǒng),不過為了讓我們能看出它 是在運(yùn)行的,加了一個電阻和一個 LED,用以顯示它的狀態(tài),晶體震蕩器能根據(jù)自己的情況使用, 一般實驗板上是用 11.0592MHz 或 12MHz,使用前者的好外是能產(chǎn)生標(biāo)準(zhǔn)的串行口波特率,后 者則一個機(jī)器周期為 1 微秒,便于做精確定時。在自己做實驗里,注意的是 VCC 是+5V 的, 不能高于此值,不然將損壞單片機(jī),太低則不能正常工作。在 31 腳要接高電平,這樣我們 才能執(zhí)行片內(nèi)的程序,如接低電平則使用片外的程序存儲器。下面建一個新的項目名為 OneLED 來驗證最小化系統(tǒng)是否能工作(所有的例程都可在筆者的主頁下面下載到,網(wǎng)址: http://www.51hei.com 。程序如下:

  #include 《 AT89X51.h》 //預(yù)處理命令

  void main(void) //主函數(shù)名

  {

  //這是第一種注釋方式

  unsigned int a; //定義變量 a 為 int 類型

  /* 這是第二種注釋方式

  */

  do{ //do while 組成循環(huán)

  for (a=0; a《50000; a++); //這是一個循環(huán) P1_0 = 0; //設(shè) P1.0 口為低電平,點(diǎn)亮 LED for (a=0; a《50000; a++); //這是一個循環(huán) P1_0 = 1; //設(shè) P1.0 口為高電平,熄滅 LED

  }

  while(1);

  }

  

  圖 2-4 AT89c51 最小化系統(tǒng)

  這里先講講 KEIL C 編譯器所支持的注釋語句。一種是以“//”符號開始的語句,符號之后 的語句都被視為注釋,直到有回車換行。另一種是在“/*”和“*/”符號之內(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ù)位后所有的 IO 口都置 1 引腳為高電平), 然后延時一段時間(for (a=0; a《50000; a++)這句在運(yùn)行),LED 亮,再延時,LED 熄滅, 然后交替亮、滅。第一個真正的小實驗就做完,如果沒有這樣的效果那么您就要認(rèn)真檢查一下電路或編譯燒寫的步驟了。

第三課、C51數(shù)據(jù)類型

  每寫一個程序,總離不開數(shù)據(jù)的應(yīng)用,在學(xué)習(xí) c51 語言的過程中掌握理解數(shù)據(jù)類型也是 很關(guān)鍵的。先看表 3-1,表中列出了 KEIL uVision2 單片機(jī)c語言編譯器所支持的數(shù)據(jù)類型。在標(biāo)準(zhǔn)C語言中基本的數(shù)據(jù)類型為 char,int,short,long,float 和 double,而在c51編譯器中int 和 short 相同,float 和 double 相同,這里就不列出說明了。下面來看看它們的具體定 義:

  表 3-1 KEIL uVision2 單片機(jī)c語言編譯器所支持的數(shù)據(jù)類型

  1. char 字符類型

  char 類型的長度是一個字節(jié),通常用于定義處理字符數(shù)據(jù)的變量或常量。分無符號字 符類型 unsigned char 和有符號字符類型 signed char,默認(rèn)值為 signed char 類型。 unsigned char 類型用字節(jié)中所有的位來表示數(shù)值,所能表達(dá)的數(shù)值范圍是 0~255。 signed char 類型用字節(jié)中最高位字節(jié)表示數(shù)據(jù)的符號,“0”表示正數(shù),“1”表示負(fù)數(shù), 負(fù)數(shù)用補(bǔ)碼表示。所能表示的數(shù)值范圍是-128~+127。unsigned char 常用于處理 ASCII 字符或用于處理小于或等于 255 的整型數(shù)。

  *正數(shù)的補(bǔ)碼與原碼相同,負(fù)二進(jìn)制數(shù)的補(bǔ)碼等于它的絕對值按位取反后加 1。

  2. int 整型

  int 整型長度為兩個字節(jié),用于存放一個雙字節(jié)數(shù)據(jù)。分有符號 int 整型數(shù) signed int 和無符號整型數(shù) unsigned int,默認(rèn)值為 signed int 類型。signed int 表示的數(shù)值范 圍是-32768~+32767,字節(jié)中最高位表示數(shù)據(jù)的符號,“0”表示正數(shù),“1”表示負(fù)數(shù)。 unsigned int 表示的數(shù)值范圍是 0~65535。

  先停一下來寫個小程序看看 unsigned char 和 unsigned int 用于延時的不一樣效果,說 明它們的長度是不一樣的,學(xué)習(xí)它們的使用方法。依舊用上一篇的最小化系統(tǒng)做實驗,不過要加多 一個電阻和 LED,如圖 3-1。實驗中用 D1 的點(diǎn)亮表明正在用 unsigned int 數(shù)值延時,用D2 點(diǎn)亮表明正在用 unsigned char 數(shù)值延時。

  圖 3-1 第 3 課實驗用電路 把這個項目稱為 TwoLED,實驗程序如下:

  #include 《AT89X51.h》 //預(yù)處理命令

  void main(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 次設(shè) P1.0 口為低電平,點(diǎn)亮 LED P1_0 = 1; //設(shè) P1.0 口為高電平,熄滅 LED

  for (a=0; a《30000; a++); //空循環(huán)

  for (b=0; b《255; b++)

  P1_1 = 0; //255 次設(shè) P1.1 口為低電平,點(diǎn)亮 LED P1_1 = 1; //設(shè) P1.1 口為高電平,熄滅 LED

  for (a=0; a《30000; a++); //空循環(huán)

  }

  while(1);

  }

  同樣編譯燒寫,上電運(yùn)行您就能看到結(jié)果了。很明顯 D1 點(diǎn)亮的時間長于 D2 點(diǎn)亮的時間。

  這里必須要講的是,當(dāng)定義一個變量為特定的數(shù)據(jù)類型時,在程序使用該變量不應(yīng)使它的值 超過數(shù)據(jù)類型的值域。如本例中的變量 b 不能賦超出 0~255 的值,如 for (b=0; b《255; b++) 改為 for (b=0; b《256; b++),編譯是能通過的,但運(yùn)行時就會有問題出現(xiàn),就是說 b 的 值永遠(yuǎn)都是小于 256 的,所以無法跳出循環(huán)執(zhí)行下一句 P1_1 = 1,從而造成死循環(huán)。同理 a 的值不應(yīng)超出 0~65535。

  3. long 長整型

  long 長整型長度為四個字節(jié),用于存放一個四字節(jié)數(shù)據(jù)。分有符號 long 長整型 signed long 和無符號長整型 unsigned long,默認(rèn)值為 signed long 類型。signed int 表示 的數(shù)值范圍是-2147483648~+2147483647,字節(jié)中最高位表示數(shù)據(jù)的符號,“0”表示正 數(shù),“1”表示負(fù)數(shù)。unsigned long 表示的數(shù)值范圍是 0~4294967295。

  4. float 浮點(diǎn)型

  float 浮點(diǎn)型在十進(jìn)制中具有 7 位有效數(shù)字,是符合 IEEE-754 標(biāo)準(zhǔn)的單精度浮點(diǎn)型數(shù) 據(jù),占用四個字節(jié)。因浮點(diǎn)數(shù)的結(jié)構(gòu)較復(fù)雜在以后的章節(jié)中再做詳細(xì)的討論。

  5.* 指針型 指針型本身就是一個變量,在這個變量中存放的指向另一個數(shù)據(jù)的地址。這個指針變量 要占據(jù)一定的內(nèi)存單元,對不一樣的處理器長度也不盡相同,在 c51 中它的長度一般為 1~

  3 個字節(jié)。指針變量也具有類型,在以后的課程中有專門一課做探討,這里就不多說了。

  6. bit 位標(biāo)量

  bit 位標(biāo)量是 c51 編譯器的一種擴(kuò)充數(shù)據(jù)類型,利用它可定義一個位標(biāo)量,但不能定義 位指針,也不能定義位數(shù)組。它的值是一個二進(jìn)制位,不是 0 就是 1,類似一些高級語 言中的 Boolean 類型中的 True 和 False。

  7. sfr 特殊功能寄存器

  sfr 也是一種擴(kuò)充數(shù)據(jù)類型,點(diǎn)用一個內(nèi)存單元,值域為 0~255。利用它能訪問 51 單片機(jī)內(nèi)部的所有特殊功能寄存器。如用 sfr P1 = 0x90 這一句定 P1 為 P1 端口在片內(nèi) 的寄存器,在后面的語句中用以用 P1 = 255(對 P1 端口的所有引腳置高電平)之類的 語句來操作特殊功能寄存器。

  8.sfr16 16 位特殊功能寄存器

  sfr16 占用兩個內(nèi)存單元,值域為 0~65535。sfr16 和 sfr 一樣用于操作特殊功能寄存 器,所不一樣的是它用于操作占兩個字節(jié)的寄存器,如定時器 T0 和 T1。

  9. sbit 可錄址位

  sbit 同樣是 單片機(jī)c語言 中的一種擴(kuò)充數(shù)據(jù)類型,利用它能訪問芯片內(nèi)部的 RAM 中的可尋址

  位或特殊功能寄存器中的可尋址位。如先前定義了

  sfr P1 = 0x90; //因 P1 端口的寄存器是可位尋址的,所以能定義

  sbit P1_1 = P1^1; //P1_1 為 P1 中的 P1.1 引腳

  //同樣我們能用 P1.1 的地址去寫,如 sbit P1_1 = 0x91; 這樣在以后的程序語句中就能用 P1_1 來對 P1.1 引腳進(jìn)行讀寫操作了。通常這些能 直接使用系統(tǒng)供給的預(yù)處理文件,里面已定義好各特殊功能寄存器的簡單名字,直接引 用能省去一點(diǎn)時間,我自己是一直用的。當(dāng)然您也能自己寫自己的定義文件,用您 認(rèn)為好記的名字。

第四課、C51常量

  上一篇學(xué)習(xí)了 KEIL c 單片機(jī)c語言 編譯器所支持的數(shù)據(jù)類型。而這些c51數(shù)據(jù)類型又是怎么用在常量和變量的定義中的呢?又有什么要注意的嗎?常量就是在程序運(yùn)行過程中不能改變值的量,而變量是能在程序運(yùn)行過程中不斷變化的量。變量的定義能使用所有c51編譯器支持的數(shù)據(jù)類型,而常量的數(shù)據(jù)類型只有整型、浮點(diǎn)型、字符型、字符串型和位標(biāo)量。這一篇學(xué)習(xí)常量定義和使用方法,而下一篇則學(xué)習(xí)單片機(jī)c語言的變量。

  常量的數(shù)據(jù)類型說明是這樣的

  1. 整型常量能表示為十進(jìn)制如 123,0,-89 等。十六進(jìn)制則以 0x 開頭如 0x34,-0x3B 等。長整型就在數(shù)字后面加字母 L,如 104L,034L,0xF340 等。

  2. 浮點(diǎn)型常量可分為 十進(jìn) 制和指數(shù)表示形式 。十 進(jìn)制由數(shù)字和小數(shù)點(diǎn)組成,如0.888,3345.345,0.0 等,整數(shù)或小數(shù)部分為 0,能省略但必須有小數(shù)點(diǎn)。指數(shù)表 示形式為[±]數(shù)字[。數(shù)字]e[±]數(shù)字,[]中的內(nèi)容為可選項,其中內(nèi)容根據(jù)具體情 況可有可無,但其余部分必須有,如125e3,7e9,-3.0e-3。

  3. 字符型常量是單引號內(nèi)的字符,如‘a’,‘d’等,不能顯示的控制字符,能 在該字符前面加一個反斜杠“”組成專用轉(zhuǎn)義字符。常用轉(zhuǎn)義字符表請看表 4-1。

  4. 字符串型常量由雙引號內(nèi)的字符組成,如“test”,“OK”等。當(dāng)引號內(nèi)的沒有字 符時,為空字符串。在使用特殊字符時同樣要使用轉(zhuǎn)義字符如雙引號。在 C 中字符 串常量是做為字符類型數(shù)組來處理的,在存儲字符串時系統(tǒng)會在字符串尾部加上o 轉(zhuǎn)義字符以作為該字符串的結(jié)束符。字符串常量“A”和字符常量‘A’是不一樣的, 前者在存儲時多占用一個字節(jié)的字間。

  5. 位標(biāo)量,它的值是一個二進(jìn)制。

  表 4-1 常用轉(zhuǎn)義字符表

  常量可用在不必改變值的場合,如固定的數(shù)據(jù)表,字庫等。常量的定義方式有幾種,下 面來加以說明。

  #difine False 0x0; //用預(yù)定義語句能定義常量

  #difine True 0x1; //這里定義 False 為 0,True 為 1

  //在程序中用到 False 編譯時自動用 0 替換,同理 True 替換為 1

  unsigned int code a=100; //這一句用 code 把 a 定義在程序存儲器中并賦值

  const unsigned int c=100; //用 const 定義 c 為無符號 int 常量并賦值 以上兩句它們的值都保存在程序存儲器中,而程序存儲器在運(yùn)行中是不允許被修改的,

  所以如果在這兩句后面用了類似 a=110,a++這樣的賦值語句,編譯時將會出錯。

  下面寫個跑馬燈程序來實驗一下典型的常量使用方法。先來看看電路圖吧。它是在上一篇的

  實驗電路的基礎(chǔ)上增加幾個 LED 組成的,也就是用 P1 口的全部引腳分別驅(qū)動一個 LED,電 路如圖 4-1 所示。

  新建一個 RunLED 的項目,主程序如下:

  #include 《AT89X51.H》 //預(yù)處理文件里面定義了特殊寄存器的名稱如 P1 口定義為 P1

  void main(void)

  {

  //定義花樣數(shù)據(jù)

  const unsigned char design[32]={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};

  unsigned int a; //定義循環(huán)用的變量

  unsigned char b; //在 c51 編程中因內(nèi)存有限盡可能注意變量類型的使用

  //盡可能使用少字節(jié)的類型,在大型的程序中很受用

  do{

  for (b=0; b《32; b++)

  {

  }

  }while(1);

  }

  for(a=0; a《30000; a++); //延時一段時間

  P1 = design[b]; //讀已定義的花樣數(shù)據(jù)并寫花樣數(shù)據(jù)到 P1 口

  程序中的花樣數(shù)據(jù)能自以去定義,因這里我們的 LED 要 AT89c51 的 P1 引腳為低電平才 會點(diǎn)亮,所以我們要向 P1 口的各引腳寫數(shù)據(jù) O 對應(yīng)連接的 LED 才會被點(diǎn)亮,P1 口的八個引 腳剛好對應(yīng) P1 口特殊寄存器的八個二進(jìn)位,如向 P1 口定數(shù)據(jù) 0xFE,轉(zhuǎn)成二進(jìn)制就是

  11111110,最低位 D0 為 0 這里 P1.0 引腳輸出低電平,LED1 被點(diǎn)亮。如此類推,大家不難算 出自己想要做的效果了。大家編譯燒寫看看,效果就出來,顯示的速度您能根據(jù)需要調(diào)整 延時 a 的值,不要超過變量類型的值域就很行了。哦,您還沒有實驗板?那如何能知道程 序運(yùn)行的結(jié)果呢?呵,不用急,這就來說說用 KEIL uVision2 的軟件仿真來調(diào)試 IO 口輸出輸入程序。

  

  圖 4-1 八路跑馬燈電路 編譯運(yùn)行上面的程序,然后按外部設(shè)備菜單 Peripherals-I/O Ports-Port1 就打開

Port1 的調(diào)試窗口了,如圖 4-3 中的 2。這個時候程序運(yùn)行了,但我們并不能在 Port1 調(diào)試窗口 上看到有會什么效果,這個時候能用鼠標(biāo)左擊圖 4-3 中 1 旁邊綠色的方條,點(diǎn)一下就有一個 小紅方格再點(diǎn)一下又沒有了,哪一句語句前有小方格程序運(yùn)行到那一句時就停止了,就是設(shè) 置調(diào)試斷點(diǎn),同樣圖 4-2 中的 1 也是同樣功能,分別是增加/移除斷點(diǎn)、移除所有斷點(diǎn)、允 許/禁止斷點(diǎn)、禁止所有斷點(diǎn),菜單也有一樣的功能,另外菜單中還有 Breakpoints 可打開 斷點(diǎn)設(shè)置窗口它的功能更強(qiáng)大,不過這里先不用它。在“P1 = design[b];”這一句設(shè)置一 個斷點(diǎn)這個時候程序運(yùn)行到這里就停住了,再留意一下 Port1 調(diào)試窗口,再按圖 5-2 中的 2 的運(yùn) 行鍵,程序又運(yùn)行到設(shè)置斷點(diǎn)的地方停住了,這個時候 Port1 調(diào)試窗口的狀態(tài)又不一樣了。也就是說 Port1 調(diào)試窗口模擬了 P1 口的電平狀態(tài),打勾為高電平,不打勾則為低電平,窗口中 P1為 P1 寄存器的狀態(tài),Pins 為引腳的狀態(tài),注意的是如果是讀引腳值之前必須把引腳對應(yīng)的 寄存器置 1 才能正確讀取。圖 4-2 中 2 旁邊的{}樣的按鈕分別為單步入,步越,步出和 執(zhí)行到當(dāng)前行。圖中 3 為顯示下一句將要執(zhí)行的語句。圖 4-3 中的 3 是 Watches 窗口可查 看各變量的當(dāng)前值,數(shù)組和字串是顯示其頭一個地址,如本例中的 design 數(shù)組是保存在 code 存儲區(qū)的首地址為 D:0x08,能在圖中 4 Memory 存儲器查看窗口中的 Address 地址中打入 D:0x08 就能查看到 design 各數(shù)據(jù)和存放地址了。如果你的 uVision2 沒有顯示這些窗口, 能在 View 菜單中打開在圖 4-2 中 3 后面一欄的查看窗口快捷欄中打開。

  

  圖 4-2 調(diào)試用快捷菜單欄

  

  圖 4-3 各調(diào)試窗口

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉