




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、9:071第第4 4章章 80C51 80C51單片機的單片機的軟軟件基礎件基礎9:072內內 容容80C51單片機的指令系統單片機的指令系統4.1C51程序設計基礎程序設計基礎4.2C51語言的語句語言的語句4.3 C51的函數的函數4.4 C51的程序結構的程序結構4.59:073 單片機應用系統單片機應用系統是由是由硬件和軟件硬件和軟件共同組成的。共同組成的。要使單片機實現所需要的控制功能,必須有控制要使單片機實現所需要的控制功能,必須有控制軟件,軟件,沒有控制軟件的單片機是毫無用處的沒有控制軟件的單片機是毫無用處的。 機器語言機器語言是計算機唯一能識別的語言,是計算機唯一能識別的語言,
2、用匯編用匯編語言和高級語言編寫的程序語言和高級語言編寫的程序( (稱為源程序稱為源程序) )最終都最終都必須翻譯成機器語言的程序必須翻譯成機器語言的程序( (稱為目標程序稱為目標程序) ),計,計算機才能識別。算機才能識別。 匯編語言匯編語言是能夠利用單片機所有特性直接控制是能夠利用單片機所有特性直接控制硬件的語言,硬件的語言,它直接使用它直接使用CPUCPU的指令系統和尋址方的指令系統和尋址方式,從而得到占用空間小、執行速度快的高質量式,從而得到占用空間小、執行速度快的高質量程序。程序。對于一些實時控制要求高的場合,匯編語對于一些實時控制要求高的場合,匯編語言是必不可少的。言是必不可少的。但
3、對于較復雜的單片機應用系但對于較復雜的單片機應用系統,它的編寫效率很低。統,它的編寫效率很低。9:074 為了提高軟件的開發效率,編程人員采用高級語為了提高軟件的開發效率,編程人員采用高級語言言C語言來開發單片機應用程序。語言來開發單片機應用程序。 目前許多軟件公司致力于單片機目前許多軟件公司致力于單片機C編譯器的開發編譯器的開發研究,研究,許多許多C編譯器的效率已接近匯編語言的水平,編譯器的效率已接近匯編語言的水平,對于較復雜的應用程序,對于較復雜的應用程序,C語言產生的代碼效率甚語言產生的代碼效率甚至超出了匯編語言。同時目前單片機片內程序存儲至超出了匯編語言。同時目前單片機片內程序存儲器的
4、發展十分迅速,許多型號的單片機片內器的發展十分迅速,許多型號的單片機片內ROM已已經達到經達到64KB甚至更大,且具備在系統編程甚至更大,且具備在系統編程(ISP)功功能,進一步推動了能,進一步推動了C語言在單片機應用系統開發中語言在單片機應用系統開發中的應用。的應用。9:0754.2 C51程序設計基礎程序設計基礎 1. 頭文件不同。頭文件不同。 C51系列單片機頭文件集中體現了各芯片的不系列單片機頭文件集中體現了各芯片的不同功能,如定時器、中斷、同功能,如定時器、中斷、I/O等數量和功能的不同等數量和功能的不同 。2. 數據類型不同。數據類型不同。由于由于80C51系列單片機包含了位操作空
5、間和系列單片機包含了位操作空間和豐富的位操作指令,可靈活地進行位指令操作。豐富的位操作指令,可靈活地進行位指令操作。 3. 數據存儲類型不同。數據存儲類型不同。C51中的存儲類器型有中的存儲類器型有code、data、idata、xdata,以及,以及bdata、pdata類型。類型。C51與與ANSI C不同,不同,它分為它分為SMALL、COMPACT、LARGE模式,各種不同的模式,各種不同的模式對應不同的實際硬件系統,也將有不同的編譯結果。模式對應不同的實際硬件系統,也將有不同的編譯結果。 4.2.1 C51和標準和標準ANSI C的區別的區別 9:076 4. 在函數的使用上有所不同
6、。在函數的使用上有所不同。單片機資源有限,不允許太多的單片機資源有限,不允許太多的程序嵌套。程序嵌套。 C51有更為豐富的庫函數。有更為豐富的庫函數。 ANSI C中的中的printf和和scanf,通常用于屏幕打印和接收字符,在,通常用于屏幕打印和接收字符,在C51中,主要用于中,主要用于串行通信口數據的發送和接收。串行通信口數據的發送和接收。 5. 在編譯上有所不同。在編譯上有所不同。由于由于80C51系列單片機是系列單片機是8位機,擴展位機,擴展16位字符位字符Unicode不被不被C51支持,并且支持,并且ANSI C所具備的遞歸特所具備的遞歸特性不被性不被C51所支持。所支持。9:0
7、774.2.2 C51程序結構分析程序結構分析 例例2-1 2-1 第第1 1章章1.1.51.1.5節中介紹了點亮一個發光二極管的控制系統,在圖節中介紹了點亮一個發光二極管的控制系統,在圖1-21-2硬硬件不變的基礎上,編寫并調試讓二極管以間隔件不變的基礎上,編寫并調試讓二極管以間隔1s1s的時間亮滅閃爍的程序。的時間亮滅閃爍的程序。# include /52系列單片機頭文件sbit led1=P10; /聲明單片機P1口的第一位unsigned int i,j; /聲明無符號整型變量i,jvoid main() /主函數 while(1) /大循環led1=0; /點亮發光二極管D1for
8、 (i=1000;i0;i-) /延時for (j=110;j0;j-) ;led1=1;/關閉發光二極管D1for (i=1000;i0;i-) /延時for (j=110;j0;j-) ; 9:078 1. 文件包含指令文件包含指令# include “文件名文件名” 或或# include 上述兩種格式略有區別。前者表示先從當前源文件所在的上述兩種格式略有區別。前者表示先從當前源文件所在的目錄中查找被包含的文件,如果找不到,再到軟件安裝文件目錄中查找被包含的文件,如果找不到,再到軟件安裝文件夾處去查找,也就是到夾處去查找,也就是到Keil/C51/INC文件夾下尋找。后者表文件夾下尋找。
9、后者表示直接到軟件安裝文件夾處去查找,這種方法一般用于包含示直接到軟件安裝文件夾處去查找,這種方法一般用于包含頭文件,如頭文件,如# include ,# include 等。等。例例2-19:079 2. 數據類型聲明和函數聲明數據類型聲明和函數聲明例例2-1中程序的第二行聲明中程序的第二行聲明led1是可尋址位的類型數據,它的意是可尋址位的類型數據,它的意思是將思是將P1口鎖存器的第口鎖存器的第0位重新命名為位重新命名為led1,以后我們要操,以后我們要操作作P1口的第口的第0位時,就可直接操作位時,就可直接操作led1。 程序的第三行程序的第三行unsigned int i,j聲明聲明i
10、,j是無符號整數型變量。是無符號整數型變量。例例2-19:0710 3. 主函數主函數main C語言的程序都是由若干個函數組成的,語言的程序都是由若干個函數組成的,每個程序有且只每個程序有且只有一個主函數。有一個主函數。 一個一個C程序總是從程序總是從main()函數開始執行的。函數開始執行的。main后的小括后的小括號通常為空,說明該函數為無參函數,程序寫在其后的大括號通常為空,說明該函數為無參函數,程序寫在其后的大括號中。號中。while(1)為循環控制語句,該控制語句使程序始終執為循環控制語句,該控制語句使程序始終執行行while(1)后大括號中的語句。后大括號中的語句。led1=0;
11、使;使P1口的第口的第0位輸出位輸出0信號,點亮發光二極管,信號,點亮發光二極管,led1=1使使P1口的第口的第0位輸出位輸出1信號,信號,熄滅發光二極管,兩條熄滅發光二極管,兩條for語句用于拖延時間。語句用于拖延時間。# include /52系列單片機頭文件sbit led1=P10; /聲明單片機P1口的第一位unsigned int i,j; /聲明無符號整型變量i,jvoid main() /主函數 while(1) /大循環led1=0; /點亮發光二極管D1for (i=1000;i0;i-) /延時for (j=110;j0;j-) ;led1=1;/關閉發光二極管D1fo
12、r (i=1000;i0;i-) /延時for (j=110;j0;j-) ; 9:07114.2.3 C51的標識符和關鍵字的標識符和關鍵字 標識符標識符常用來聲明源程序中某個對象的名稱,比如變量與常常用來聲明源程序中某個對象的名稱,比如變量與常量的聲明,數組和結構的聲明,自定義函數的聲明以及數據類量的聲明,數組和結構的聲明,自定義函數的聲明以及數據類型的聲明等。如型的聲明等。如 int count; /count為整型變量的標識符為整型變量的標識符 char name 20; /name為包含為包含20個元素的數組的標識符個元素的數組的標識符 說明:說明:C51的標識符可以由字母、數字(的
13、標識符可以由字母、數字(09)和下劃線組)和下劃線組成,最多可支持成,最多可支持32個字符。其中標識符的第一個字符必須為字個字符。其中標識符的第一個字符必須為字母或下劃線,例如母或下劃線,例如count2是正確的,而是正確的,而2count則是錯誤的。通則是錯誤的。通常以下劃線開頭的標識符是編譯系統專用的,因此在編寫常以下劃線開頭的標識符是編譯系統專用的,因此在編寫C語語言源程序時一般不要使用以下劃線開頭的標識符。而且言源程序時一般不要使用以下劃線開頭的標識符。而且C語言語言是區分大小寫的,是區分大小寫的,name與與NAME是兩個不同的標識符是兩個不同的標識符 。 9:07124.2.3 C
14、51的標識符和關鍵字的標識符和關鍵字 關鍵字關鍵字是是C51編譯器已定義保留的編譯器已定義保留的特殊標識符特殊標識符,又稱為,又稱為保留保留字字,它們具有固定的名稱和功能,如,它們具有固定的名稱和功能,如int、if、for等等。等等。 在在Keil C51開發環境的文本編輯器中編寫開發環境的文本編輯器中編寫C程序,系統會把程序,系統會把關鍵字以不同顏色顯示。在關鍵字以不同顏色顯示。在C語言的程序編寫中不允許標識符語言的程序編寫中不允許標識符與關鍵字相同。與其他計算機語言相比,與關鍵字相同。與其他計算機語言相比,C語言的關鍵字較少,語言的關鍵字較少,ANSI C標準共規定了標準共規定了32個關
15、鍵字,個關鍵字, 9:0713表表4-7 ANSI C標準關鍵字標準關鍵字序號序號關鍵字關鍵字用途用途說明說明1auto存儲種類說明存儲種類說明說明局部變量為自動變量,為默認值說明局部變量為自動變量,為默認值2break程序語句程序語句退出最內層循環體退出最內層循環體3case程序語句程序語句switch語句中的選擇項語句中的選擇項4char數據類型聲明數據類型聲明聲明字符型數據聲明字符型數據5const存儲類型聲明存儲類型聲明在程序執行過程中不可更改的常量值在程序執行過程中不可更改的常量值6continue程序語句程序語句轉向下一次循環轉向下一次循環7default程序語句程序語句switc
16、h語句中的語句中的“其他其他”分支分支8do程序語句程序語句構成構成dowhile循環結構循環結構9double數據類型聲明數據類型聲明雙精度浮點數雙精度浮點數10else程序語句程序語句構成構成ifelse選擇結構選擇結構11enum數據類型聲明數據類型聲明枚舉枚舉12extern存儲種類聲明存儲種類聲明在其他程序模塊中聲明了的全局變量在其他程序模塊中聲明了的全局變量13float數據類型聲明數據類型聲明單精度浮點數單精度浮點數14for程序語句程序語句構成構成for循環結構循環結構15goto程序語句程序語句構成構成goto轉移結構轉移結構9:0714續表續表4-7 ANSI C標準關鍵字
17、標準關鍵字16if程序語句程序語句構成構成ifelse選擇結構選擇結構17int數據類型聲明數據類型聲明整型整型數數18long數據類型聲明數據類型聲明長整型數長整型數19register存儲種類聲明存儲種類聲明寄存器變量寄存器變量20return程序語句程序語句函數返回函數返回21short數據類型聲明數據類型聲明短整型數短整型數22signed數據類型聲明數據類型聲明有符號數,二進制數據的最高位為符號位有符號數,二進制數據的最高位為符號位23sizeof運算符運算符計算表達式或數據類型的字節數計算表達式或數據類型的字節數24static存儲種類聲明存儲種類聲明靜態變量靜態變量25struc
18、t數據類型聲明數據類型聲明結構類型數據結構類型數據26switch程序語句程序語句構成構成switch選擇結構選擇結構27typedef數據類型聲明數據類型聲明為系統固有的數據類型起別名為系統固有的數據類型起別名28union數據類型聲明數據類型聲明聯合類型數據聯合類型數據29unsigned數據類型聲明數據類型聲明無符號數據無符號數據30void數據類型聲明數據類型聲明無類型數據無類型數據31volatile數據類型聲明數據類型聲明該變量在程序執行中可被隱含地改變該變量在程序執行中可被隱含地改變32while程序語句程序語句構成構成while和和dowhile循環結構循環結構9:0715表表
19、4-8 Keil C51編譯器擴展的關鍵字編譯器擴展的關鍵字 序號序號關鍵字關鍵字用途用途說明說明1_at_地址定位地址定位為變量定義存儲空間絕對地址為變量定義存儲空間絕對地址2alien 函數特性說明函數特性說明聲明與聲明與PL/M51兼容的函數兼容的函數3bdata 存儲器類型聲明存儲器類型聲明可位尋址的內部可位尋址的內部RAM4bit 數據類型聲明數據類型聲明定義一個位變量或位類型函數定義一個位變量或位類型函數5code 存儲器類型聲明存儲器類型聲明程序存儲器空間(程序存儲器空間(ROM)6compact 存儲模式存儲模式使用外部分頁使用外部分頁RAM的存儲模式的存儲模式7data 存儲
20、器類型聲明存儲器類型聲明直接尋址的內部直接尋址的內部RAM8idata 存儲器類型聲明存儲器類型聲明間接尋址的內部間接尋址的內部RAM9interrupt 中斷函數聲明中斷函數聲明定義一個中斷服務函數定義一個中斷服務函數10large 存儲模式存儲模式使用外部使用外部RAM的存儲模式的存儲模式11pdata 存儲器類型聲明存儲器類型聲明分頁尋址的外部分頁尋址的外部RAM12_priority_ 多任務優先聲明多任務優先聲明規定規定RTX51或或RTX51 Tiny的任務優先級的任務優先級13reentrant 可重入函數聲明可重入函數聲明定義一個可重入函數定義一個可重入函數14sbit 數據類
21、型聲明數據類型聲明定義一個可位尋址的變量定義一個可位尋址的變量15sfr 特殊功能寄存器聲明特殊功能寄存器聲明聲明一個聲明一個8位的特殊功能寄存器位的特殊功能寄存器16sfr16 特殊功能寄存器聲明特殊功能寄存器聲明聲明一個聲明一個16位的特殊功能寄存器位的特殊功能寄存器17small 存儲模式存儲模式使用內部使用內部RAM的存儲模式的存儲模式18_task_任務聲明任務聲明定義實時多任務函數定義實時多任務函數19using寄存器組選擇寄存器組選擇選擇工作寄存器組選擇工作寄存器組20 xdata存儲器類型聲明存儲器類型聲明外部外部RAM9:07164.2.4 C51的數據結構的數據結構 具有一
22、定格式的數字或數值稱為具有一定格式的數字或數值稱為數據數據,數據是計算機操作,數據是計算機操作的對象。的對象。 數據的不同格式稱為數據的不同格式稱為數據類型數據類型,數據按一定的類型進行的,數據按一定的類型進行的排列、組合、架構成為排列、組合、架構成為數據結構數據結構。 數據結構是數據結構是程序設計程序設計的基礎。的基礎。 9:07171. 數據類型概述數據類型概述 C51中常用的數據類型有中常用的數據類型有整型、字符型、實型整型、字符型、實型等。等。 C51中數據有常量與變量之分,它們分別屬于以上這些類中數據有常量與變量之分,它們分別屬于以上這些類型。由以上這些數據類型還可以構成更復雜的數據
23、結構,因型。由以上這些數據類型還可以構成更復雜的數據結構,因此在程序中用到的所有的數據都必須為其指定類型。此在程序中用到的所有的數據都必須為其指定類型。 圖圖4-13 C514-13 C51的數據類型的數據類型 9:07182. 常量與變量常量與變量 在程序運行過程中,其值不能被改變的量稱為在程序運行過程中,其值不能被改變的量稱為“常量常量”,其值可以改變的量稱為其值可以改變的量稱為“變量變量”。 (1) 常量常量 使用常量時可以直接給出常量的值,如使用常量時可以直接給出常量的值,如3,5,0 xfe等;也等;也可以用一些符號來替代常量的值,這稱之為可以用一些符號來替代常量的值,這稱之為“符號
24、常量符號常量”。例例4-5 在第二章圖在第二章圖2-30所示的流水燈電路中,要求點亮所示的流水燈電路中,要求點亮P1.0所接所接LED發光二極管。發光二極管。程序如下:程序如下:#include #define Light0 0 xfevoid main() P1=Light0; 程序中用程序中用#define Light0 0 xfe來定義符號來定義符號Light0,以后在程序中所有出現,以后在程序中所有出現Light0的地方均會用的地方均會用0 xfe來代替,這個程序的執行結構就是來代替,這個程序的執行結構就是P1=0 xfe,即接在,即接在P1.0引腳上的引腳上的LED被點亮。被點亮。9
25、:0719.30H34H35H31H32H33H.(2) 變量變量 變量在內存中占據一定的存儲單元,在這些存儲單元中存放變量的變量在內存中占據一定的存儲單元,在這些存儲單元中存放變量的值,那么應該為這個存儲單元命名。值,那么應該為這個存儲單元命名。 MOV 30H,#01HMOV 31H,#02HMOV 32H,#03HMOV 33H,#04H 例如某儀表有例如某儀表有4位位LED數碼管,分別顯示一個字串數碼管,分別顯示一個字串“1234”,編程時,編程時將將30H33H作為顯示緩沖區,用匯編語言編寫如下:作為顯示緩沖區,用匯編語言編寫如下: 變量X101H02H03H04Hx1=01H;x2
26、=02H;x3=03H;x4=04H ;變量X2變量X3變量X4用用C編寫為:編寫為: 9:0720.30H34H35H31H32H33H. 變量主要由兩部分組成:一個是變量名,一個是變量變量主要由兩部分組成:一個是變量名,一個是變量值。每個變量都有一個變量名,在內存中占據一定的存儲值。每個變量都有一個變量名,在內存中占據一定的存儲地址,在相應的內存單元中存放該變量的值,地址,在相應的內存單元中存放該變量的值, 變量X101H02H03H04Hx1=01H;x2=02H;x3=03H;x4=04H ;變量X2變量X3變量X4變量地址變量值9:0721 在在C語言中,要求對所有用到的變量作強制定
27、義,也就語言中,要求對所有用到的變量作強制定義,也就是是“先定義,后使用先定義,后使用”。 變量的定義格式如下:變量的定義格式如下: 存儲種類存儲種類 數據類型數據類型 存儲器類型存儲器類型 變量名表變量名表 其中,數據類型和變量名表是必須的,存儲種類和存儲其中,數據類型和變量名表是必須的,存儲種類和存儲器類型是可選項。例如:器類型是可選項。例如: int a,b; /*定義兩個整型變量定義兩個整型變量* / unsigned int data i60;/*定義了定義了60個長度的整型數組,個長度的整型數組,編譯器為其分配編譯器為其分配120個存儲單元。個存儲單元。data關鍵字為存儲器類型,
28、關鍵字為存儲器類型,表示用于存取前表示用于存取前128個字節的片內數據存儲器個字節的片內數據存儲器*/。9:07223. 基本數據類型基本數據類型 數據類型數據類型關鍵字關鍵字位數位數取值范圍取值范圍有符號字符型有符號字符型char 8-128127 無符號字符型無符號字符型unsigned char 80255 有符號整型有符號整型int 16-3276832767 無符號整型無符號整型unsigned int 16065535 有符號長整型有符號長整型long 32-21474836482147483647 無符號長整型無符號長整型unsigned long 3204294967295 浮
29、點型浮點型float 321.175494E-383.402823E+38位型位型bit 10,1 可尋址位可尋址位sbit 10,1 特殊功能寄存器特殊功能寄存器sfr 80255 16位特殊功能寄位特殊功能寄存器存器sfr16 16065535 9:0723 sfr16用來定義用來定義51單片機內部的單片機內部的16位特殊功能寄存器,位特殊功能寄存器,如如sfr16 T2=0 xCC。 sbit用來定義用來定義51單片機內部單片機內部RAM中的可尋址位或特殊功能寄中的可尋址位或特殊功能寄存器中的可尋址位,可以用以下三種方法定義存器中的可尋址位,可以用以下三種方法定義(并以程序狀態并以程序狀
30、態字字PSW中的最低位中的最低位奇偶標志位奇偶標志位P為例來說明為例來說明): (1)sbit 位變量名位變量名=位地址,如位地址,如sbit P=0 xD0; (2)sbit 位變量名位變量名=特殊功能寄存器名特殊功能寄存器名位位置,如位位置,如sbit P =PSW0; (3)sbit 位變量名位變量名=字節地址字節地址位位置,如位位置,如sbit P =0 xD00。 以上三種方法所定義的位變量指向的是同一個物理地址。以上三種方法所定義的位變量指向的是同一個物理地址。 9:07244. 構造類型構造類型 以基本數據類型為基礎,以基本數據類型為基礎,由基本類型數據按一定規則組成由基本類型數
31、據按一定規則組成的較復雜的數據結構,即構造類型。的較復雜的數據結構,即構造類型。構造類型包括構造類型包括數組類型、數組類型、結構體類型、共同體類型結構體類型、共同體類型等。等。 9:0725 (1) 數組類型數組類型 數組是一種構造類型的數據,通常用來處理具有相同屬性數組是一種構造類型的數據,通常用來處理具有相同屬性的一批數據。的一批數據。 一維數組的定義方式為:一維數組的定義方式為: 數據類型數據類型 數組名常量表達式;數組名常量表達式; 其中其中類型說明符類型說明符用來說明數組中每個元素的數據類型;數用來說明數組中每個元素的數據類型;數組名的定名規則遵循標識符定名規則;方括號中的常量表達組
32、名的定名規則遵循標識符定名規則;方括號中的常量表達式表示該數組所包含的元素的個數。常量表達式中可以包括式表示該數組所包含的元素的個數。常量表達式中可以包括常量和符號常量,不能包含變量。也就是說,常量和符號常量,不能包含變量。也就是說,C51不允許對不允許對數組的大小作動態定義,即數組的大小不依賴于程序運行過數組的大小作動態定義,即數組的大小不依賴于程序運行過程中變量的值。程中變量的值。 例:例:int a8;9:0726 數組必須先定義,后使用。數組必須先定義,后使用。C51語言規定只能逐個引用數組元素而不能語言規定只能逐個引用數組元素而不能一次引用整個數組。一次引用整個數組。 1) 在定義數
33、組時對數組元素賦以初值。例如:在定義數組時對數組元素賦以初值。例如: int a8=0,1,2,3,4,5,6,7; 2) 可以只給一部分元素賦值。例如:可以只給一部分元素賦值。例如: int a8=0,1,2,3,4;3) 如果想使一個數組中全部元素值為如果想使一個數組中全部元素值為0:int a8=0,0,0,0,0,0,0,0 ; ()int a8=0*8; ( )4) 在對全部數組元素賦初值時,可以不指定數組長度。在對全部數組元素賦初值時,可以不指定數組長度。 int a5=1,2,3,4,5; ()int a=1,2,3,4,5; ()5)可以對數組的某個元素賦值。)可以對數組的某個
34、元素賦值。a1=1; () a3=3; ()9:0727 (2) 結構類型結構類型 結構變量結構變量是將互相關聯的、多個不同類型的變量是將互相關聯的、多個不同類型的變量結合在一起形成的一個結合在一起形成的一個組合型變量,簡稱結構。組合型變量,簡稱結構。構構成結構的各個不同類型的變量稱為成結構的各個不同類型的變量稱為結構元素(或成結構元素(或成員)員),其定義規則與變量的定義相同。,其定義規則與變量的定義相同。 9:07282) 定義結構變量。定義結構變量。結構定義的格式為:結構定義的格式為:struct 結構名結構名 變量表;變量表;struct date/定義名稱為date的結構類型unsi
35、gned char month;unsigned char day;unsigned char year;3) 訪問結構變量中的成員。訪問結構變量中的成員。訪訪問使用問使用“.”運算符,運算符, struct date date1,date2; date1.year=07;date1.month=1;date1.day=25; 1) 首先聲明結構類型。首先聲明結構類型。 結構類型定義的格式為:結構類型定義的格式為: struct 結構名結構名 結構成員說明結構成員說明 其中結構成員說明的格式為:其中結構成員說明的格式為: 類型標識符類型標識符 成員名;成員名;9:0729 5. 指針類型指針類
36、型指針變量的定義指針變量的定義一般形式:一般形式: 存儲類型存儲類型 數據類型數據類型 *指針名;指針名;3變量a2000a_pointer*a_pointera= *a_pointer&a=a_pointera=3;*a_pointer=3合法標識符合法標識符指針變量本身的存儲類型指針變量本身的存儲類型指針的目標變量的數據類型指針的目標變量的數據類型表示定義指針變量表示定義指針變量不是不是*運算符運算符例例 int *p1,*p2; float *q ; static char *name;注意:注意:1、int *p1, *p2; 與與 int *p1, p2;2、指針變量名是、指
37、針變量名是p1,p2 ,不是不是*p1,*p23、指針變量只能指向定義時所規定類型的變量指針變量只能指向定義時所規定類型的變量4、指針變量定義后,、指針變量定義后,變量值不確定變量值不確定,應用前必須先賦值,應用前必須先賦值指針變量與其所指向的變量之間的關系指針變量與其所指向的變量之間的關系9:07304.2.5 變量的存儲種類和存儲器類型變量的存儲種類和存儲器類型 變量是一種在程序執行過程中,其數值不斷變化的量。同變量是一種在程序執行過程中,其數值不斷變化的量。同ANSI C一樣,一樣,C51規定變量必須先定義后使用。規定變量必須先定義后使用。C51對變量對變量進行定義的格式如下:進行定義的
38、格式如下:存儲種類存儲種類 數據類型數據類型 存儲器類型存儲器類型 變量名表變量名表其中,存儲種類和存儲器類型是可選項。其中,存儲種類和存儲器類型是可選項。 9:0731 存儲種類是指變量在程序執行過程中的作用范圍。存儲種類是指變量在程序執行過程中的作用范圍。 變量的存儲種類可以分為變量的存儲種類可以分為兩大類兩大類:靜態存儲方式和動態存靜態存儲方式和動態存儲方式。儲方式。 靜態存儲方式靜態存儲方式是指在程序運行期間分配固定的存儲空間,是指在程序運行期間分配固定的存儲空間,直到程序執行完畢才將存儲空間釋放的方式。直到程序執行完畢才將存儲空間釋放的方式。 而而動態存儲方式動態存儲方式則是在程序運
39、行期間根據需要動態的分配則是在程序運行期間根據需要動態的分配存儲空間的方式。存儲空間的方式。 存儲種類不同,變量的生存期就不同。存儲種類不同,變量的生存期就不同。 變量的存儲種類具變量的存儲種類具體有四種,分別為:體有四種,分別為:自動(自動(auto)外部(外部(extern)靜態(靜態(static)寄存器(寄存器(register)9:0732 (1)自動變量)自動變量 自動(自動(auto),),“auto”也可省略不寫也可省略不寫 作用范圍:作用范圍:在定義它的函數體或復合語句內部。在定義它的函數體或復合語句內部。 在定義它的函數體或復合語句被執行時,在定義它的函數體或復合語句被執行
40、時,C51才為該變量才為該變量分配存儲空間,當函數調用結束返回或復合語句執行結束時,分配存儲空間,當函數調用結束返回或復合語句執行結束時,就自動釋放這些存儲空間,這些存儲空間又可被其他的函數體就自動釋放這些存儲空間,這些存儲空間又可被其他的函數體或復合語句使用,因此這類局部變量稱為自動變量。或復合語句使用,因此這類局部變量稱為自動變量。 使用自動變量能最有效地使用單片機的存儲空間。使用自動變量能最有效地使用單片機的存儲空間。 自動變量的作用范圍只在函數內部,自動變量的作用范圍只在函數內部,所以如果在不同函數所以如果在不同函數中出現相同名稱的變量,那么它們之間沒有任何關系。中出現相同名稱的變量,
41、那么它們之間沒有任何關系。例如:例如: char a,b; /定義定義a,b為字符型、自動變量,等價于為字符型、自動變量,等價于“auto char a,b;”auto int x,y; /定義定義x,y為整型、自動變量為整型、自動變量9:0733例例4-6 觀察自動變量的作用范圍。#include /* 包含頭文件*/#include /*包含原型函數*/void initUart(void); /*定義初始化串口子函數*/void main (void) /*main 函數 */ char ab=a; /*自動變量,字符型變量ab的值為a */ initUart();/* 初始化串口 */
42、 char ab=b; /*自動變量、字符型變量ab的值為b */ printf(%cn,ab); /*輸出字符b*/ printf(%cn,ab); /*輸出字符a*/ while(1);/* 初始化串口 */void initUart(void) /* 晶振頻率為11.0592MHz時,波特率設置為9600 */ SCON = 0 x50; TMOD |= 0 x20; TH1 = 0 xfd; TR1 = 1; TI = 1; 例例4-69:0734 (2)外部變量)外部變量 外部變量是在函數的外部定義的,它的作用域為從變量的外部變量是在函數的外部定義的,它的作用域為從變量的定義處開始,
43、到本程序文件的末尾。在此作用域內,外部變量定義處開始,到本程序文件的末尾。在此作用域內,外部變量可以被程序中各個函數所引用。編譯時將外部變量分配在靜態可以被程序中各個函數所引用。編譯時將外部變量分配在靜態存儲區。存儲區。 有時需要用有時需要用extern來聲明外部變量,以擴展外部變量的作用來聲明外部變量,以擴展外部變量的作用域。這里包括兩種情況,一種是當某個外部變量在定義前被使域。這里包括兩種情況,一種是當某個外部變量在定義前被使用時,需要用用時,需要用extern聲明。聲明。 第二種情況是,當一個程序由多個源程序文件組成時,第二種情況是,當一個程序由多個源程序文件組成時,如果兩個文件要用到同
44、一個變量,不可以在兩個文件中都進行如果兩個文件要用到同一個變量,不可以在兩個文件中都進行定義,否則在進行程序的連接時會出現定義,否則在進行程序的連接時會出現“重復定義重復定義”的錯誤。的錯誤。正確的做法是:在一個文件中定義該變量,在另一個文件中不正確的做法是:在一個文件中定義該變量,在另一個文件中不再定義,只是在使用時用再定義,只是在使用時用extern加以聲明即可。加以聲明即可。 9:0735例例4-7 通過以下例題觀察外部變量的作用范圍。#include /* 包含頭文件*/#include /*包含原型函數*/void initUart(void); /*定義初始化串口子函數*/unsi
45、gned int ab=1234;void main (void) /*主函數*/ extern cd; initUart();/* 初始化串口 */ printf(ab=%u,cd=%un,ab,cd); while(1);cd=5678;/* 初始化串口 */void initUart(void) /* 晶振頻率為11.0592MHz時,波特率設置為9600 */ SCON = 0 x50; TMOD |= 0 x20; TH1 = 0 xfd; TR1 = 1; TI = 1; 例例4-79:0736 (3)靜態變量)靜態變量 靜態變量用靜態變量用關鍵字關鍵字“static”聲明。靜態變
46、量又分為聲明。靜態變量又分為內部靜態變內部靜態變量量(又稱(又稱局部靜態變量局部靜態變量)和)和外部靜態變量外部靜態變量(又稱(又稱全局靜態變量全局靜態變量)。)。內部靜態變量內部靜態變量是在函數內部定義的,外部靜態變量在函數外部定是在函數內部定義的,外部靜態變量在函數外部定義的。從編譯的角度來看二者都是靜態分布存儲空間的。義的。從編譯的角度來看二者都是靜態分布存儲空間的。 內部靜態變量與自動變量有類似之處,其作用域同樣限于定義內部靜態變量與自動變量有類似之處,其作用域同樣限于定義內部靜態變量函數內部,但不同的是內部靜態變量是始終存在并內部靜態變量函數內部,但不同的是內部靜態變量是始終存在并占
47、有存儲單元,其初值只是在進入時賦值一次,而不是在進出函占有存儲單元,其初值只是在進入時賦值一次,而不是在進出函數時被建立或消除。退出函數后變量的值仍然保存但不能訪問。數時被建立或消除。退出函數后變量的值仍然保存但不能訪問。 如果在某種情況下,我們希望函數中的局部變量的值在函數調如果在某種情況下,我們希望函數中的局部變量的值在函數調用結束后不消失而保留原值,即其占用的存儲單元不釋放,在下用結束后不消失而保留原值,即其占用的存儲單元不釋放,在下一次該函數調用時,該變量已有值,就是上一次函數調用結束時一次該函數調用時,該變量已有值,就是上一次函數調用結束時的值。這時就應該指定該局部變量為內部靜態變量
48、。的值。這時就應該指定該局部變量為內部靜態變量。9:0737例例4-8 觀察內部靜態變量的特點及其與自動變量的區別。#include /* 包含頭文件*/#include /*包含原型函數*/void initUart(void); /*定義初始化串口子函數*/void main() char i; initUart(); /* 初始化串口 */ for(i=0;i3;i+) static int x=1; int y=1; printf(x=%d ,x); printf(y=%dn,y); x+; y+; while(1);/* 初始化串口 */void initUart(void) /*
49、晶振頻率為11.0592MHz時,波特率設置為9600 */ SCON = 0 x50; TMOD |= 0 x20; TH1 = 0 xfd; TR1 = 1; TI = 1; 例例4-89:0738(4)寄存器變量()寄存器變量(register) 寄存器變量用關鍵字寄存器變量用關鍵字“register”聲明。因為單片機系統聲明。因為單片機系統中訪問速度最快的是寄存器,所以可以把需要快速存取或中訪問速度最快的是寄存器,所以可以把需要快速存取或使用頻繁的變量放到寄存器中,這樣可以提高整個系統的使用頻繁的變量放到寄存器中,這樣可以提高整個系統的運行速度。但是運行速度。但是C51編譯器能夠自動識
50、別程序中使用頻繁編譯器能夠自動識別程序中使用頻繁的變量,并自動將其作為寄存器變量,而不需要程序設計的變量,并自動將其作為寄存器變量,而不需要程序設計者指定。者指定。9:0739 51子系列的子系列的ROM編址圖編址圖 52子系列的子系列的ROM編址圖編址圖2. 存儲器類型存儲器類型 存儲器類型均為存儲器類型均為codecode9:0740RAM的編址的編址片內數據存儲器片內數據存儲器 51系列的系列的RAM編址圖編址圖片外數據存儲器片外數據存儲器存儲器類型為存儲器類型為datadata存儲器類型為存儲器類型為idataidata存儲器類型為存儲器類型為pdata pdata 、xdataxda
51、ta9:07412. 存儲器類型存儲器類型 表表4-10 C51編譯器可識別的存儲器類型編譯器可識別的存儲器類型 存儲器類型存儲器類型對應的存儲空間說明對應的存儲空間說明data直接尋址的片內數據存儲器的低直接尋址的片內數據存儲器的低128B,訪問速度最快,訪問速度最快bdata可位尋址的片內數據存儲器可位尋址的片內數據存儲器(地址地址20H2FH共共16B),允許位與字),允許位與字節混合訪問節混合訪問idata間接尋址片內數據存儲器間接尋址片內數據存儲器256B,可訪問片內全部,可訪問片內全部RAM空間空間pdata分頁尋址片外數據存儲器的分頁尋址片外數據存儲器的256B,使用指令,使用指
52、令MOVX Ri訪問,頁訪問,頁地址由地址由P2口提供口提供xdata片外數據存儲器片外數據存儲器64KB,使用指令,使用指令MOVX DPTR訪問訪問code尋址程序存儲器尋址程序存儲器64KB,使用,使用MOVC指令訪問指令訪問變量定義格式為:char data a; char idata b;char pdata c;char xdata d;char bdata e;通過以上方式可以把一個字符型變量定通過以上方式可以把一個字符型變量定位在數據存儲器的不同空間內,由于在位在數據存儲器的不同空間內,由于在不同的存儲器空間采用的尋址方式不同,不同的存儲器空間采用的尋址方式不同,所以訪問速度也
53、不同。所以訪問速度也不同。9:0742表表4-11 存儲器、存儲器類型、尋址方式與訪問速度對照表存儲器、存儲器類型、尋址方式與訪問速度對照表 存儲器存儲器地址空間地址空間容量容量C51編譯器中變編譯器中變(常常)量存儲器類量存儲器類型型匯編語言中匯編語言中的尋址方式的尋址方式訪問速訪問速度度內內部部數數據據區區工作寄存器區工作寄存器區00H1FH32data,idata寄存器尋址寄存器尋址最快最快位地址區位地址區20H2FH16bdata,data位尋址、位尋址、直接尋址直接尋址快快數據緩沖區數據緩沖區30H7FH80data,idata直接尋址、直接尋址、寄存器間接寄存器間接尋址尋址data
54、 快快idata 中中80 HFFH128idata寄存器寄存器間接尋址間接尋址中中特殊功能寄存器特殊功能寄存器區區80HFFH128data直接尋址直接尋址快快內內(外外)部程序區部程序區0000HFFFFH65536code變址間接尋變址間接尋址址最慢最慢外部數據區外部數據區0000HFFFFH65536xdata、pdata寄存器寄存器間接尋址間接尋址pdata慢慢xdata最最慢慢9:07433. 存儲模式存儲模式 存儲模式用來決定存儲模式用來決定未標明存儲器類型的變量未標明存儲器類型的變量的默認存儲器類型。的默認存儲器類型。 C51編譯器允許采用三種存儲模式:編譯器允許采用三種存儲模
55、式:小編譯模式(小編譯模式(SMALL)、)、緊湊編譯模式(緊湊編譯模式(COMPACT)、大編譯模式()、大編譯模式(LARGE)。)。SMALL模式:模式:所有未標明存儲器類型的變量都默認位于片內數據存儲器。與所有未標明存儲器類型的變量都默認位于片內數據存儲器。與使用使用data指定存儲器類型的作用一樣。此模式對變量訪問的效率很高,但所有的數指定存儲器類型的作用一樣。此模式對變量訪問的效率很高,但所有的數據對象和堆棧的總大小不能超過內部據對象和堆棧的總大小不能超過內部RAM 的大小。的大小。COMPACT模式:模式:所有未標明存儲器類型的變量都默認位于片外數據存儲器所有未標明存儲器類型的變
56、量都默認位于片外數據存儲器的一頁(的一頁(256字節)內,但堆棧位于片內數據存儲器內,這和使用字節)內,但堆棧位于片內數據存儲器內,這和使用pdata指定存儲器指定存儲器類型的作用一樣,該模式適用于變量不超過類型的作用一樣,該模式適用于變量不超過256字節的情況。地址的高字節往往通過字節的情況。地址的高字節往往通過P2口輸出,其值必須在啟動代碼中設置。這種模式的效率不如口輸出,其值必須在啟動代碼中設置。這種模式的效率不如SMALL模式高,訪模式高,訪問的速度要慢一些。問的速度要慢一些。LARGE模式:模式:所有未標明存儲器類型的變量都默認位于片外數據存儲器內,所有未標明存儲器類型的變量都默認位
57、于片外數據存儲器內,這和使用這和使用xdata指定存儲器類型的作用一樣,使用數據指針指定存儲器類型的作用一樣,使用數據指針DPTR進行尋址,尋址空進行尋址,尋址空間可達到間可達到64KB,但效率較前兩種模式低。,但效率較前兩種模式低。9:07444.2.6 絕對地址的訪問絕對地址的訪問 所定義的變量經過編譯之后具有浮動地址,其絕對地址必須所定義的變量經過編譯之后具有浮動地址,其絕對地址必須經過經過BL51連接定位后才能確定。連接定位后才能確定。 若需要對系統中的某個確定的具體地址空間進行訪問,特別若需要對系統中的某個確定的具體地址空間進行訪問,特別是對外設的操作,必須對絕對地址進行訪問。是對外
58、設的操作,必須對絕對地址進行訪問。 1. 采用預定義宏采用預定義宏 C51編譯器提供了宏定義來對單片機的編譯器提供了宏定義來對單片機的code區、區、data區、區、pdata區和區和xdata區等不同存儲區域進行絕對地址的訪問。區等不同存儲區域進行絕對地址的訪問。 CBYTE以字節方式尋址以字節方式尋址code區;區;CWORD以字方式尋址以字方式尋址code區;區;DBYTE以字節方式尋址以字節方式尋址data區;區;DWORD以字方式尋址以字方式尋址data區;區;PBYTE以字節方式尋址以字節方式尋址pdata區;區;PWORD以字方式尋址以字方式尋址pdata區;區;XBYTE以字節
59、方式尋址以字節方式尋址xdata區;區;XWORD以以字方式字方式尋址尋址xdata區。區。這些宏定義包含在這些宏定義包含在absacc.h文件中。文件中。9:0745DBYTE0 x16=a=3表示把無符表示把無符號字符型變量號字符型變量a(其值為(其值為3)傳)傳送給片內數據存儲器中地址為送給片內數據存儲器中地址為16H的單元;的單元; 。例#include #include void main(void)unsigned char a;unsigned int b;DBYTE0 x16=a=3;b=XWORD0 x2000=8;while(1);XWORD是以字方式尋址是以字方式尋址xd
60、ata區,即每次尋址兩個字節,所區,即每次尋址兩個字節,所以以b=XWORD0 x2000=8表示對表示對片外數據存儲器地址為片外數據存儲器地址為2000H*2的單元(其值為的單元(其值為8)進行操作,)進行操作,也就是把也就是把4000H和和4001H兩個單兩個單元內的數據傳送給無符號整型元內的數據傳送給無符號整型變量變量b。 9:07462. 采用擴展關鍵字采用擴展關鍵字_at_ 采用采用_at_關鍵字可以指定變量在存儲空間中的絕對地址,一般關鍵字可以指定變量在存儲空間中的絕對地址,一般格式如下:格式如下:數據類型數據類型 存儲器類型存儲器類型 標識符標識符 _at_ 地址常數地址常數例如:例如:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 云南省瀘西縣瀘源普通高級中學2025屆高三下學期第二次高考模擬英語試題含解析
- 遼寧省沈陽市沈北新區重點達標名校2025屆初三下學期第二次模擬考試(期中)數學試題含解析
- 浙江省池州市2024-2025學年數學三下期末復習檢測試題含解析
- 陜西省咸陽市秦嶺中學2025年第二學期期末學業質量陽光指標調研卷初三生物試題含解析
- FIDIC電力工程施工合同版
- 江蘇省徐州市睢寧縣2024-2025學年三年級數學第二學期期末質量跟蹤監視模擬試題含解析
- 設備買賣及所有權轉移合同
- 餐廳檔口租賃合同模板
- 手機SIM卡購銷合同
- 停車庫鋼結構施工合同協議
- 期中(試題)-2024-2025學年人教精通版(2024)英語三年級下冊
- 2025-2030中國煤焦油雜酚油行業市場發展趨勢與前景展望戰略研究報告
- 防洪防汛安全教育知識培訓
- 2020-2025年中國遼寧省風力發電行業發展潛力分析及投資方向研究報告
- 規模養殖場十項管理制度
- 2025中考英語熱點話題閱讀《哪吒2魔童鬧海》
- 勞務派遣勞務外包項目方案投標文件(技術方案)
- 瘧疾2025培訓課件
- 流行性感冒診療方案(2025版)解讀課件
- 定額〔2025〕1號文-關于發布2018版電力建設工程概預算定額2024年度價格水平調整的通知
- 《思想政治教育方法論》考研(第3版)鄭永廷配套考試題庫及答案【含名校真題、典型題】
評論
0/150
提交評論