版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、3 單片機(jī)的C語言(yyn)程序設(shè)計(jì)共八十一頁2教學(xué)(jio xu)目的熟悉C51的程序結(jié)構(gòu)掌握(zhngw)C51的數(shù)據(jù)類型、存儲(chǔ)類型及函數(shù)等概念了解C51與標(biāo)準(zhǔn)C的不同之處熟悉C51的開發(fā)工具Keil C51如何學(xué)習(xí)共八十一頁3本章(bn zhn)內(nèi)容C51的程序結(jié)構(gòu)數(shù)據(jù)類型、存儲(chǔ)類型及存儲(chǔ)模式運(yùn)算符、函數(shù)及程序流程控制C51的構(gòu)造(guzo)數(shù)據(jù)類型C51實(shí)例分析及混合編程Keil C51簡介共八十一頁.1 51的程序結(jié)構(gòu) 與匯編語言相比(xin b),C51在功能、結(jié)構(gòu)性、可讀性、可維護(hù)性及可移植性上有明顯的優(yōu)勢(shì) 。C51程序結(jié)構(gòu)與一般C語言沒有差別。共八十一頁5C51的特點(diǎn):1C51
2、在吸取了匯編語言精華的基礎(chǔ)上又有所改進(jìn) 2C51繼承和發(fā)揚(yáng)了高級(jí)語言的長處 3C51的可移植性好 4生成的代碼質(zhì)量高,在代碼效率方面(fngmin)可以和匯編語言相媲美 51的程序結(jié)構(gòu)3.151的程序結(jié)構(gòu) 共八十一頁6C51程序的結(jié)構(gòu)一個(gè)C51程序大體上是一個(gè)函數(shù)(hnsh)定義的集合,在這個(gè)集合中僅有一個(gè)名為main的函數(shù)(主函數(shù))。 函數(shù)定義由類型、函數(shù)名、參數(shù)表和函數(shù)體四部分組成。函數(shù)的一般格式如下: 類型 函數(shù)名(參數(shù)表) 參數(shù)說明; 數(shù)據(jù)說明部分; 執(zhí)行語句部分; 51的程序結(jié)構(gòu)3.151的程序結(jié)構(gòu) 共八十一頁7編寫C51程序時(shí)應(yīng)注意以下幾點(diǎn):1.一個(gè)C51程序總是從main函數(shù)開始
3、執(zhí)行的,而不論main函數(shù)在整個(gè)程序中的位置如何。2C語言程序的書寫格式十分自由。一條語句可以寫成一行,也可以寫成幾行,還可以在一行內(nèi)寫多條語句。但每條語句都必須以分號(hào)“;”作為結(jié)束符。3C語言對(duì)大小字母敏感,C語言編譯器編譯程序時(shí)對(duì)同一個(gè)字母的大小寫作為不同的變量來處理。4可以用/*/對(duì)C程序中的任何部分作注釋。程序加上必要(byo)的注釋,可增加程序的可讀性。51的程序結(jié)構(gòu)3.151的程序結(jié)構(gòu) 共八十一頁.2 數(shù)據(jù)類型、存儲(chǔ)(cn ch)類型及存儲(chǔ)(cn ch)模式 數(shù)據(jù)類型常量和變量C51的存儲(chǔ)類型(lixng)及存儲(chǔ)模式特殊功能寄存器、并行接口及位變量的定義共八十一頁9數(shù)據(jù)類型 可分為
4、基本(jbn)數(shù)據(jù)類型和構(gòu)造數(shù)據(jù)類型。構(gòu)造數(shù)據(jù)類型由基本(jbn)數(shù)據(jù)類型構(gòu)造而成。C51的數(shù)據(jù)類型分類如下所示: 數(shù)據(jù)類型(lixng)、存儲(chǔ)類型(lixng)及存儲(chǔ)模式3.2 數(shù)據(jù)類型、存儲(chǔ)類型及存儲(chǔ)模式 共八十一頁10共八十一頁11常量和變量 C語言中的數(shù)據(jù)有常量、變量之分。 常量在程序運(yùn)行的過程中,其值不能改變的量稱為常量。C語言支持4種常量:整數(shù)常量、浮點(diǎn)數(shù)常量、枚舉量常量、字符常量。 變量在程序執(zhí)行過程中,其值能不斷變化的量。使用一個(gè)變量之前必須進(jìn)行定義,用一個(gè)標(biāo)識(shí)符作為變量名并指出它的數(shù)據(jù)類型和存儲(chǔ)類型,以便(ybin)編譯系統(tǒng)為它分配相應(yīng)的存儲(chǔ)單元。 數(shù)據(jù)類型、存儲(chǔ)(cn ch
5、)類型及存儲(chǔ)(cn ch)模式3.2 數(shù)據(jù)類型、存儲(chǔ)類型及存儲(chǔ)模式 共八十一頁12C51的存儲(chǔ)類型及存儲(chǔ)模式 51系列(xli)單片機(jī)的存儲(chǔ)器采用哈佛結(jié)構(gòu)。即其程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器分開,并有各自的尋址機(jī)構(gòu)和尋址方式。以AT89C52為例,其具體結(jié)構(gòu)如下圖所示。數(shù)據(jù)類型、存儲(chǔ)(cn ch)類型及存儲(chǔ)(cn ch)模式3.2 數(shù)據(jù)類型、存儲(chǔ)類型及存儲(chǔ)模式 共八十一頁13C51的存儲(chǔ)(cn ch)類型及存儲(chǔ)(cn ch)模式AT89C52單片機(jī)在物理上有四個(gè)存儲(chǔ)空間:1片內(nèi)程序存儲(chǔ)器空間2片外程序存儲(chǔ)器空間3片內(nèi)數(shù)據(jù)存儲(chǔ)器空間4片外數(shù)據(jù)存儲(chǔ)器空間 片內(nèi)數(shù)據(jù)存貯區(qū)是存放臨時(shí)性傳遞變量或使用頻率較高的
6、變量的。訪問片內(nèi)數(shù)據(jù)存貯器速度較快,經(jīng)常使用的變量置于片內(nèi)數(shù)據(jù)存貯器,而將不常用的置于片外數(shù)據(jù)存貯器中。尋址方式可使用直接和間接尋址數(shù)據(jù)類型(lixng)、存儲(chǔ)類型(lixng)及存儲(chǔ)模式3.2 數(shù)據(jù)類型、存儲(chǔ)類型及存儲(chǔ)模式 共八十一頁14 C51在定義變量、常量時(shí),將通過不同的存儲(chǔ)類型(data、bdata、idata、pdata、xdata、code)將它們定位在不同的存儲(chǔ)區(qū)中。存儲(chǔ)類型與AT89C52單片機(jī)實(shí)際存儲(chǔ)空間的對(duì)應(yīng)關(guān)系如下所示。data 直接尋址內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū),訪問速度快(128B),007FHbdata 可位尋址內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū),允許位與字節(jié)混合訪問(16B)idata 間接(
7、jin ji)尋址內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū),可訪問片內(nèi)全部RAM地址空間(256B),00FFHpdata 分頁尋址外部數(shù)據(jù)存儲(chǔ)區(qū)(256B),由MOVX Ri訪問(高位P2)xdata 外部數(shù)據(jù)存儲(chǔ)區(qū)(64KB),由MOVX DPTR訪問code 代碼存儲(chǔ)區(qū)(64KB)程序由MOVC A+DPTR訪問C51的存儲(chǔ)(cn ch)類型3.2 數(shù)據(jù)類型、存儲(chǔ)類型及存儲(chǔ)模式 一定要熟悉噢!共八十一頁15當(dāng)使用code存貯類型定義數(shù)據(jù)時(shí),C51編譯器會(huì)將其定義在代碼(di m)空間或FLASH訪問片內(nèi)數(shù)據(jù)存貯器data、bdata、idata比訪問片外數(shù)存相對(duì)要快一些,因此,可將經(jīng)常使用的變量置于片內(nèi)數(shù)存共八十
8、一頁16例:code uchar table =1,2,3,”help”,oxff;idata uint temp;data char var; /char data var;等價(jià)盡量用后一種static unsigned long xdata array100 ; 靜態(tài)(jngti)變量extern float idata x,y,z;模塊化編程uint pdata dimension;uchar xdata vector 1044;char bdata flags;共八十一頁17如果省略掉數(shù)據(jù)類型存儲(chǔ)(cn ch)模式,將自動(dòng)決定變量的默認(rèn)存儲(chǔ)(cn ch)類型作為編譯的選項(xiàng)。由編譯器選用
9、的存儲(chǔ)(cn ch)模式?jīng)Q定。存儲(chǔ)模式?jīng)Q定了變量的默認(rèn)存儲(chǔ)類型,參數(shù)傳遞區(qū)和無明確存儲(chǔ)類型說明變量的存儲(chǔ)類型。共八十一頁18存儲(chǔ)模式(msh)說明SMALL :可直接(zhji)尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)COMPACT: 分頁外部數(shù)據(jù)存儲(chǔ)區(qū)LARGE :外部數(shù)據(jù)存儲(chǔ)區(qū)參數(shù)和局部變量放入Cx51允許在變量類型定義前,指定存儲(chǔ)類型 data char x 與char data x 等價(jià),但應(yīng)盡量使用后一種共八十一頁19特殊功能寄存器的定義 AT89C52單片機(jī)中除了程序計(jì)數(shù)器PC和4組通用寄存器組(R0-R7)之外,其他所有寄存器均稱為特殊功能寄存器(SFR),它們分散在片內(nèi)RAM區(qū)的高128B中,它們
10、只能采用直接尋址方式訪問。 為了能直接訪問這些SFR,C51擴(kuò)充(kuchng)了類型說明符sfr、sfr16、sbit。利用它們可在C語言源程序中直接對(duì)AT89C52單片機(jī)的特殊功能寄存器進(jìn)行定義。數(shù)據(jù)類型(lixng)、存儲(chǔ)類型(lixng)及存儲(chǔ)模式3.2 數(shù)據(jù)類型、存儲(chǔ)類型及存儲(chǔ)模式 共八十一頁20共八十一頁21定義方法如下:sfr 特殊功能寄存器名=地址(dzh)常數(shù)sfr16特殊功能寄存器名=地址常數(shù)注:1、可以與變量名一樣,用SFR名去存取SFR。 2、定義時(shí)標(biāo)示符必須使用SFR名,且必須把原來分配好的絕對(duì)地址賦給預(yù)定義標(biāo)示符例:sfr Acc=0 xE0; sfr P0=0 x
11、80;共八十一頁22 由于51系列(xli)中不同的單片機(jī)的寄存器數(shù)量與類型不同,所以可采用頭文件。 頭文件reg52.h中有所有89C52的SFR及可位尋址的位的定義,只要 # include 共八十一頁23程序的開頭可以(ky)都加上以下三行#include#define uchar unsigned char#define uint unsigned int頭文件reg52.h中有所有89C52的SFR 及可位尋址位的定義共八十一頁24SFR一般按8位存取,在新的8051系列產(chǎn)品中有按16位存取的(如,8052有T2),它們需用sfr16類型(lixng)來說明(*) sfr16 T2=
12、0 xCC共八十一頁25定義(dngy)SFR的位Sbit可以(ky)訪問位尋址對(duì)象1、sbit SFR的位標(biāo)示符=可按位尋址 的SFR 名常量 sfr PSW=0 xD0; sbit OV=PSW2; sbit Cy=PSW7;共八十一頁262、 sbit SFR的位標(biāo)示符=可按位尋址 的SFR 的絕對(duì)地址常量其中,絕對(duì)地址位于(wiy)80HFFH之間,且該地址能被8整除 sbit OV=0 xD02; sbit Cy=0 xD07;共八十一頁273、 sbit SFR的位標(biāo)示符=可按位尋址 的SFR 的絕對(duì)位地址 該絕對(duì)位地址位于80HFFH之間 sbit OV=0 xD2; sbit
13、Cy=0 xD7; 特殊功能位代表了一個(gè)(y )獨(dú)立的定義類,不能與其他位定義和位域互換共八十一頁28并行接口的定義 AT89C52單片機(jī)內(nèi)部(nib)有4個(gè)8位并行口,即SFR中的P0-P3。這些內(nèi)部并行口既可進(jìn)行字節(jié)尋址,也可進(jìn)行位尋址。 除了內(nèi)部4個(gè)并行口之外,AT89C52單片機(jī)還可以在片外擴(kuò)展硬件I/O口,這些I/O口大多只能進(jìn)行字節(jié)尋址。 AT89C52單片機(jī)沒有專用的I/O指令,它的口地址是和數(shù)據(jù)存儲(chǔ)器統(tǒng)一編址的。即把一個(gè)口看作是數(shù)據(jù)存儲(chǔ)器的一個(gè)單元。程序采用訪問數(shù)據(jù)存儲(chǔ)器的指令來訪問I/O口。數(shù)據(jù)類型、存儲(chǔ)(cn ch)類型及存儲(chǔ)(cn ch)模式3.2 數(shù)據(jù)類型、存儲(chǔ)類型及存
14、儲(chǔ)模式 共八十一頁2951系列(xli)并行接口及其Cx51定義 編程時(shí),片內(nèi)I/O口與片外擴(kuò)展I/O口可統(tǒng)一在頭文件中定義,也可在程序(chngx)的開始位置定義,方法如下:1、片內(nèi)I/O口(用sfr定義) sfr P0=0 x80 sfr P1=0 x90共八十一頁302、片外擴(kuò)展I/O口,根據(jù)其硬件譯碼地址,將其視為片外數(shù)據(jù)存儲(chǔ)器的一個(gè)單元(dnyun),用define定義。#include#define PORTA XBYTE0 xffc0 i=PORTA; PORTA=i;共八十一頁31定義口地址的目的,便于Cx51編譯器按51單片機(jī)實(shí)際硬件結(jié)構(gòu)建立I/O口變量名與其實(shí)際地址的聯(lián)系(
15、linx),以便使用軟件模擬51單片機(jī)的硬件操作共八十一頁32位變量(binling)(bit)及其Cx51定義bit類似于unsigned int等,用來說明(shumng)變量類型一、定義位變量1、bit check_bit ; /*將變量check_bit定義為 位變量*/ 共八十一頁33位變量(binling)總位于8051內(nèi)部RAM中(*)bdata bit display_flag ; /*正確*/data bit display_flag ; /*正確*/idata bit display_flag ; /*正確*/ bit display_flag ; /*存儲(chǔ)模式為small
16、,正確*/pdata bit display_flag ; /*錯(cuò)*/static bit display_flag ; /*正確*/extern bit display_flag ; /*正確*/ bit *bptr ; /*錯(cuò)*/ bit b_array3; /*錯(cuò)*/注:位變量不能定義成一個(gè)指針和數(shù)組共八十一頁342、函數(shù)可包含類型(lixng)為bit的參數(shù),也可將其作為返回值 bit func(bit b0, bit b1).return(b1)共八十一頁353、可位尋址對(duì)象 指可以字節(jié)或位尋址的對(duì)象。該對(duì)象應(yīng)位于89C52片內(nèi)可位尋址RAM中。允許數(shù)據(jù)類型為idata的對(duì)象放入89
17、C52片內(nèi)可位尋址RAM區(qū)中。定義(dngy)可分為兩步:1)先定義變量的數(shù)據(jù)類型和存儲(chǔ)類型(*) bdata int ibase ; bdata char bary4;共八十一頁362) 然后可使用sbit定義可獨(dú)立尋址訪問的對(duì)象位sbit mybit0=ibase0;sbit mybit15=ibase15;sbit Ary07=bary07;sbit Ary37=bary37; 對(duì)象ibase和bary也可以(ky)字節(jié)尋址 Ary37=0;/*位尋址*/ bary3=a;/*字節(jié)尋址*/注:1、Sbit定義要求基址對(duì)象的存儲(chǔ)類型為bdata,否則 只有絕對(duì)的特殊位(SFR中的位定義)定
18、義是合 法的。 2、位置(操作符)后的最大值依賴于指定的基類 型共八十一頁37例:判浮點(diǎn)數(shù)的符號(hào)為是否(sh fu)為正union float long 高地址 float bdata f ; long bdata l ;fl ; 低地址sbit float_sign=fl.f31 ; if (! float_sign) /*符號(hào)位為正*/ . else .S EE M M M70共八十一頁3.3 運(yùn)算符、函數(shù)(hnsh)及程序流程控制 C51的運(yùn)算符C51的函數(shù)C51的流程控制(kngzh)語句共八十一頁39C51的運(yùn)算符1.C51的賦值運(yùn)算符和算術(shù)運(yùn)算符(+、-、*、/、%)2.C51的關(guān)
19、系運(yùn)算符(、=、=、=、!=)3.C51邏輯(lu j)運(yùn)算符(|、&、?。?.C51位操作運(yùn)算符(、|、&、 )5.自增減運(yùn)算6.復(fù)合運(yùn)算符(10種)運(yùn)算符、函數(shù)(hnsh)及程序流程控制3.3運(yùn)算符、函數(shù)及程序流程控制 共八十一頁40C51的函數(shù) 函數(shù)是C語言中的一種基本模塊,一個(gè)C語言程序就是由若干個(gè)模塊化的函數(shù)所構(gòu)成的。 1.函數(shù)的分類(fn li)從用戶使用角度劃分,函數(shù)分為標(biāo)準(zhǔn)庫函數(shù)和用戶自定義函數(shù)。用戶自定義函數(shù)是指用戶根據(jù)任務(wù)自己編寫的函數(shù)。從函數(shù)定義的形式上可劃分為三種形式:無參數(shù)函數(shù)、有參數(shù)函數(shù)和空函數(shù)。 運(yùn)算符、函數(shù)(hnsh)及程序流程控制3.3運(yùn)算符、函數(shù)及程序流程控
20、制 共八十一頁41C51的函數(shù)(hnsh) 2.函數(shù)的定義無參數(shù)函數(shù)的定義返回值類型 函數(shù)名() 函數(shù)體語句有參數(shù)函數(shù)的定義返回值類型 函數(shù)名(形式參數(shù)列表) 形式參數(shù)類型說明 函數(shù)體語句空函數(shù)的定義返回值類型 函數(shù)名() 運(yùn)算符、函數(shù)(hnsh)及程序流程控制3.3運(yùn)算符、函數(shù)及程序流程控制 共八十一頁42C51的函數(shù)(hnsh) 3.函數(shù)的參數(shù)和返回值形式參數(shù)和實(shí)際參數(shù)形參:定義函數(shù)時(shí),位于函數(shù)名后面圓括號(hào)中的變量名稱為“形式參數(shù)”。實(shí)參:調(diào)用函數(shù)時(shí),主調(diào)用函數(shù)名后面括號(hào)中的表達(dá)式稱為“實(shí)際參數(shù)”。參數(shù)的返回值通過函數(shù)調(diào)用使主調(diào)用函數(shù)獲得一個(gè)確定的值,這就是函數(shù)的返回值。函數(shù)的返回值是通過
21、return語句獲得的。運(yùn)算符、函數(shù)(hnsh)及程序流程控制3.3運(yùn)算符、函數(shù)及程序流程控制 共八十一頁43C51的函數(shù) 4.函數(shù)的調(diào)用調(diào)用的形式為:函數(shù)名(實(shí)際參數(shù)表列); 函數(shù)的調(diào)用方式有三種:1.函數(shù)調(diào)用語句(yj):即把被調(diào)用函數(shù)名作為調(diào)用函數(shù)的一個(gè)語句(yj),如func( ) 2.被調(diào)用函數(shù)作為表達(dá)式的運(yùn)算對(duì)象:如x=2*func(a,b) 3.被調(diào)用函數(shù)作為另一個(gè)函數(shù)的實(shí)際參數(shù):如x=min(a,func(a,b); 運(yùn)算符、函數(shù)(hnsh)及程序流程控制3.3運(yùn)算符、函數(shù)及程序流程控制 共八十一頁44C51的函數(shù) 5.對(duì)被調(diào)用函數(shù)的說明在調(diào)用一個(gè)函數(shù)之前,應(yīng)對(duì)該函數(shù)的類型進(jìn)行
22、說明,即“先說明,后調(diào)用”。被調(diào)用函數(shù)必須是已經(jīng)存在的函數(shù)(庫函數(shù)或用戶自定義函數(shù))。6.函數(shù)變量的存儲(chǔ)方式函數(shù)變量按其有效作用范圍可劃分為局部變量和全局變量。變量按其存儲(chǔ)方式可分為四種存儲(chǔ)種類,分別是自動(dòng)變量(auto)、外部變量(extern)、靜態(tài)變量(static)和寄存器變量(register),這些存儲(chǔ)種類與變量的關(guān)系(gun x)為:內(nèi)部變量可定義為自動(dòng)變量、靜態(tài)變量或寄存器變量,外部變量可定義為全局變量或靜態(tài)變量。 運(yùn)算符、函數(shù)(hnsh)及程序流程控制3.3運(yùn)算符、函數(shù)及程序流程控制 共八十一頁45C51的流程控制語句 C語言有三種基本結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)與循環(huán)結(jié)構(gòu)。其中
23、(qzhng)選擇結(jié)構(gòu)又派生出串行多分支結(jié)構(gòu)和并行多分支結(jié)構(gòu),循環(huán)結(jié)構(gòu)又分為“while”型循環(huán)結(jié)構(gòu)和“do while”型循環(huán)結(jié)構(gòu)。 運(yùn)算符、函數(shù)(hnsh)及程序流程控制3.3運(yùn)算符、函數(shù)及程序流程控制 順序結(jié)構(gòu)流程圖 選擇結(jié)構(gòu)流程圖 共八十一頁46C51的流程控制語句 C語言有三種基本結(jié)構(gòu):順序結(jié)構(gòu)、選擇(xunz)結(jié)構(gòu)與循環(huán)結(jié)構(gòu)。其中選擇(xunz)結(jié)構(gòu)又派生出串行多分支結(jié)構(gòu)和并行多分支結(jié)構(gòu),循環(huán)結(jié)構(gòu)又分為“while”型循環(huán)結(jié)構(gòu)和“do while”型循環(huán)結(jié)構(gòu)。 運(yùn)算符、函數(shù)(hnsh)及程序流程控制3.3運(yùn)算符、函數(shù)及程序流程控制 循環(huán)結(jié)構(gòu)流程圖 共八十一頁47C51的流程控制語句
24、(yj) 1.選擇語句ifC語言提供了3種形式的if語句:(1)if (條件表達(dá)式) 語句;(2)if (條件表達(dá)式) 語句1; else 語句2;(3)if (條件表達(dá)式1) 語句1; else if (條件表達(dá)式2) 語句2; else if (條件表達(dá)式3) 語句3; else if (條件表達(dá)式m) 語句m; else 語句n; 運(yùn)算符、函數(shù)(hnsh)及程序流程控制3.3運(yùn)算符、函數(shù)及程序流程控制 共八十一頁48C51的流程控制語句(yj) 2. switch/case語句 該語句形式如下:switch (表達(dá)式) case 常量表達(dá)式1: 語句1; break; case 常量表達(dá)
25、式2: 語句2; break; case 常量表達(dá)式n: 語句n; break; default : 語句n+1; 運(yùn)算符、函數(shù)(hnsh)及程序流程控制3.3運(yùn)算符、函數(shù)及程序流程控制 共八十一頁49C51的流程控制語句 3. 循環(huán)語句while語句一般形式為:while (條件(tiojin)表達(dá)式) 語句; /*循環(huán)體*/do while 語句一般形式如下:do 語句; /*循環(huán)體*/ while (條件表達(dá)式);運(yùn)算符、函數(shù)(hnsh)及程序流程控制3.3運(yùn)算符、函數(shù)及程序流程控制 共八十一頁50C51的流程控制語句(yj) 3. 循環(huán)語句for語句一般形式如下:for (初值設(shè)定表達(dá)
26、式;循環(huán)條件表達(dá)式;更新表達(dá)式) 語句; /*循環(huán)體*/運(yùn)算符、函數(shù)(hnsh)及程序流程控制3.3運(yùn)算符、函數(shù)及程序流程控制 共八十一頁3.4 C51的構(gòu)造(guzo)數(shù)據(jù)類型數(shù)組結(jié)構(gòu)聯(lián)合(linh)枚舉指針共八十一頁52數(shù)組一維數(shù)組一維數(shù)組的定義(dngy)方式類型說明符 數(shù)組名整型表達(dá)式初始化 二維數(shù)組二維數(shù)組的定義方式類型說明符 數(shù)組名常量表達(dá)式 常量表達(dá)式二維數(shù)組的初始化C51的構(gòu)造(guzo)數(shù)據(jù)類型3.4 C51的構(gòu)造數(shù)據(jù)類型共八十一頁53結(jié)構(gòu)結(jié)構(gòu)的定義 結(jié)構(gòu)是結(jié)構(gòu)是一種數(shù)據(jù)類型,通常(tngchng)定義結(jié)構(gòu)數(shù)據(jù)類型后再用它去定義相關(guān)變量。定義結(jié)構(gòu)類型的方法如下: struct
27、 結(jié)構(gòu)名 結(jié)構(gòu)成員說明;結(jié)構(gòu)成員說明的格式為:類型標(biāo)識(shí)符 成員名;用結(jié)構(gòu)類型去定義變量的方法有三種:先定義結(jié)構(gòu)類型再定義類型為該結(jié)構(gòu)的變量 定義結(jié)構(gòu)類型的同時(shí),定義該結(jié)構(gòu)的變量 直接定義結(jié)構(gòu)類型變量 結(jié)構(gòu)變量的引用引用的方式為:結(jié)構(gòu)變量名.成員名 C51的構(gòu)造(guzo)數(shù)據(jù)類型3.4 C51的構(gòu)造數(shù)據(jù)類型共八十一頁54聯(lián)合 又稱為共用體。它也是C語言中的一種構(gòu)造數(shù)據(jù)類型。在一個(gè)聯(lián)合中可以包含多個(gè)不同類型的數(shù)據(jù)元素(yun s)。其定義格式為:union 聯(lián)合類型名 類型說明符 變量名; ; 聯(lián)合與結(jié)構(gòu)的區(qū)別在于:聯(lián)合所包含的各個(gè)成員只能分時(shí)共享同一存儲(chǔ)空間。定義聯(lián)合類型變量的方法類似于定義結(jié)
28、構(gòu)變量,同樣有三種。引用聯(lián)合成員的一般格式為:聯(lián)合變量名.聯(lián)合元素 或:聯(lián)合變量名-聯(lián)合元素C51的構(gòu)造(guzo)數(shù)據(jù)類型3.4 C51的構(gòu)造數(shù)據(jù)類型共八十一頁55枚舉(mi j) 枚舉數(shù)據(jù)類型是一個(gè)有名字的某些整數(shù)型常量的集合。這些整數(shù)型常量是該類型變量可取的所有的合法值。枚舉定義應(yīng)當(dāng)列出該類型變量的可取值。定義枚舉類型變量的一般格式為:enum 枚舉名 枚舉值表列 變量表列;C51的構(gòu)造(guzo)數(shù)據(jù)類型3.4 C51的構(gòu)造數(shù)據(jù)類型共八十一頁56指針 指針是C語言的一個(gè)重要概念,也是特色之一。使用指針可以有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu),直接處理內(nèi)存地址,而且可以更有效地使用數(shù)組。 指針的概念
29、 變量的指針就是變量的地址 指針變量的定義指針變量定義的一般形式如下:類型標(biāo)示(bio sh)符 *指針變量名指針變量的引用 應(yīng)注意的是:“*”在指針變量定義時(shí)和在指針運(yùn)算時(shí)所代表的含義是不同的。在進(jìn)行指針變量定義時(shí),“*”是指針變量類型說明符。而在進(jìn)行指針運(yùn)算時(shí),“*”是指針運(yùn)算符,表示引用指針?biāo)赶虻淖兞俊?C51的構(gòu)造(guzo)數(shù)據(jù)類型3.4 C51的構(gòu)造數(shù)據(jù)類型共八十一頁575.2.1 指針的基本概念 變量的指針就是變量的地址。 指向(zh xin)變量的指針變量:若有一個(gè)變量專門來存放另一個(gè)變量的地址,則該變量稱為指向(zh xin)變量的指針變量。1、指針變量的定義 類型標(biāo)示符
30、*指針變量名 例:int *ap ;/*定義ap為指針變量,指 向整型變量*/共八十一頁582、指針變量的引用(*) int a; int *ap; ap=&a;/*ap指向變量a,&為取地址符*/ 指針運(yùn)算符“*”,*ap和a等價(jià)(dngji) *ap表示ap所指向的變量 x=*ap;/*ap所指向的變量賦值給x*/ *ap=0 xff;/*a=0 xff*/ 共八十一頁59關(guān)于KEIL C51的指針(zhzhn)類型 支持“基于存貯器的”指針和“一般”指針兩種類型(lixng)。基于存貯器的指針 在編譯時(shí)一般被“行內(nèi)”編碼,無須庫調(diào)用。即指針?biāo)傅膶?duì)象所在的存儲(chǔ)空間由定義時(shí)c源代碼中的存儲(chǔ)
31、器類型決定。該指針只需12字節(jié)一般指針 一般指針包括3個(gè)字節(jié)。2字節(jié)偏移(即指針的地址)和1字節(jié)存儲(chǔ)器類型。為了表示這種指針必須用長整數(shù)來定義存貯類型。共八十一頁60指針定義(dngy)(*) static data unsigned char data *標(biāo)示符 auto idata char idata register pdata unsigned int pdata extern xdata int xdata code unsinged long code bdata long bdata float struct union共八十一頁61第二列指出指針變量存放在何處(h ch),缺
32、省時(shí)決定于編譯用存儲(chǔ)模式第四列指明指針?biāo)傅膶?duì)象存放在何處,缺省時(shí)為三字節(jié)的通用指針。共八十一頁621、基于存貯器的指針 由C源代碼中的存貯類型決定(judng)。用這種指針可高效訪問對(duì)象且只需1至2字節(jié)1個(gè)字節(jié)idata*, data *,pdata*2個(gè)字節(jié)code *,xdata*例:char xdata *px 其中,xdata為指針指向的對(duì)象變量定位存儲(chǔ)空間,指針長度為2個(gè)字節(jié),所指的對(duì)象是個(gè)字符型,指針自身在默認(rèn)存儲(chǔ)器區(qū)(決定于編譯模式)共八十一頁63char idata *px ;所指的對(duì)象變量(binling)在idata 中,指針為1個(gè)字節(jié) data char xdata *
33、px; 除指明指針?biāo)笇?duì)象 在xdata中,還指明指 針自身存放在data中 char xdata *data px; 與上式等價(jià) 與早期C51版本兼容共八十一頁64例(*) struct time char hour; char min; char sec; struct time xdata *pxtime struct time idata *px; px-pxtime-hour=12;共八十一頁652、一般指針 即定義時(shí)未指明所指對(duì)象的存儲(chǔ)空間共3字節(jié):1個(gè)存放(cnfng)存儲(chǔ)器類型,2個(gè)存放地 址偏移量存儲(chǔ)器類型偏移量高位偏移量低位低高指針的高位(o wi)和低位地址偏移量 共八十
34、一頁66存儲(chǔ)器類型(lixng)編碼(*)存儲(chǔ)器類型idata/data/bdataxdatapdatacode值 0 x000 x010 xFE0 xFF共八十一頁67指針 對(duì)比一般指針和基于存儲(chǔ)器的指針,可得出以下結(jié)論:基于存儲(chǔ)器的指針長度短,運(yùn)行速度快。而一般指針由于其所指對(duì)象變量的存儲(chǔ)器空間位置只有在運(yùn)行期間才能確定,編譯器在編譯期間無法優(yōu)化存儲(chǔ)方式,必須生成一般代碼以保證能對(duì)任意空間的對(duì)象進(jìn)行存取,所以一般指針?biāo)a(chǎn)生的代碼運(yùn)行速度較慢。一般指針可用于存取任何(rnh)變量而不必考慮變量在AT89C52存儲(chǔ)器空間的位置,函數(shù)可利用一般指針來存取位于任何存儲(chǔ)空間的數(shù)據(jù)。因此一般指針的兼容
35、性較好。而基于存儲(chǔ)器的指針?biāo)傅膶?duì)象有確定的存儲(chǔ)器空間,因此缺乏兼容性。C51的構(gòu)造(guzo)數(shù)據(jù)類型3.4 C51的構(gòu)造數(shù)據(jù)類型共八十一頁例:清零程序 (將2000H20FFH的內(nèi)容清零) 匯編語言程序 ORG 0030HSE01: MOV R0,#00H MOV DPTR,#2000H ;(0000H)送DPTRLOO1: CLR A MOVX DPTR,A ;0送(DPTR) INC DPTR ;DPTR+1 INC R0 ;字節(jié)數(shù)加1 CJNE R0,#00H,LOO1 ;不到(b do)FF個(gè)字節(jié)再清LOOP: SJMP LOOP共八十一頁69清零程序(chngx) (將2000H
36、20FFH的內(nèi)容清零) C51程序 #include main( ) int i; unsigned char xdata *p=0 x2000; /* 指針指向2000H單元 */ for(i=0;i256;i+) *p=0; p+; /*清零2000H-20FFH單元*/ 共八十一頁 匯編語言程序 ORG 0030HL00: MOV R0,#10H ;查找16個(gè)字節(jié)(z ji) MOV R1,#00H MOV DPTR,#2000HL11: MOVX A,DPTR CJNE A,#00H,L16 ;取出內(nèi)容與00H相等嗎? INC R1 ;取出個(gè)數(shù)加1L16: INC DPTR DJNZ
37、R0,L11 ;未完繼續(xù) MOV DPTR,#2100H MOV A,R1 MOVX DPTR,A ;相同數(shù)個(gè)數(shù)送2100HL1E: SJMP L1E例:查找(ch zho)零的個(gè)數(shù)(在2000H-200FH中查出有幾個(gè)字 節(jié)是零,把個(gè)數(shù)放在2100H單元中)共八十一頁查找(ch zho)零的個(gè)數(shù)C51程序#include main ( ) unsigned char xdata *p=0 x2000;/*指針p指向2000H單元*/ int n=0,i; for(i=0;i16;i+) if(*p=0) n+; /* 若該單元內(nèi)容為零,則n+1 */ p+; /* 指針指向下一單元 */ p=0 x2100; /* 指針p指向2100H單元 */ *p=n; /* 把個(gè)數(shù)放在2100H單元中 */共八十一頁3.5 C51實(shí)例分析(fnx)及混合編程C51實(shí)例(shl)分析混合編程共八十一頁73C51實(shí)例分析 設(shè)計(jì)一個(gè)程序來實(shí)現(xiàn)以下功能:使用撥動(dòng)開關(guān)模擬從P3.0口輸入(shr)一個(gè)脈沖,控制P1口按16進(jìn)制加一方式變化。在這里,我們選用51系列的AT89C52型號(hào)單片機(jī)。C51實(shí)例分析(fnx)及混合編程3.5 C51實(shí)例分析及混合編程共八十一頁74程序(chngx)如下
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 房屋出租簡約合同樣式
- 出租車承包合同
- 線上辦公信息安全協(xié)議
- 旅館承包合同范例
- 房地產(chǎn)經(jīng)紀(jì)公司代理合同模板
- 技術(shù)成果轉(zhuǎn)讓股權(quán)協(xié)議
- 2024年汽車租賃合同范本
- 抵押物借款合同的社會(huì)責(zé)任
- 教職工違紀(jì)聘用合同案例
- 包裝設(shè)計(jì)認(rèn)可合同書范本
- 糧油流通統(tǒng)計(jì)新任統(tǒng)計(jì)人員業(yè)務(wù)培訓(xùn)課件
- 汽車起重機(jī)日常檢查維修保養(yǎng)記錄表
- 中國醫(yī)科大學(xué)2023年12月《康復(fù)工程學(xué)》作業(yè)考核試題-【答案】
- 浙江省9+1高中聯(lián)盟2022-2023學(xué)年高一上學(xué)期11月期中考物理試題(解析版)
- 七年級(jí)上冊(cè)英語期中專項(xiàng)復(fù)習(xí)-補(bǔ)全對(duì)話(含答案)
- 鐵的單質(zhì)(導(dǎo)學(xué)案)高一化學(xué)
- 絞吸式挖泥船水下疏挖河渠施工工法
- 反腐倡廉廉潔行醫(yī)
- 心血管內(nèi)科醫(yī)療質(zhì)量評(píng)價(jià)體系與考核標(biāo)準(zhǔn)
- 2022-2023學(xué)年廣州市南沙區(qū)小升初全真模擬數(shù)學(xué)檢測(cè)卷含答案
- 2023年食品安全糧食類理論知識(shí)考試題庫(含答案)
評(píng)論
0/150
提交評(píng)論