片機(jī)的C語言編程

上傳人:nu****n 文檔編號(hào):253310325 上傳時(shí)間:2024-12-11 格式:PPT 頁數(shù):27 大?。?05.64KB
收藏 版權(quán)申訴 舉報(bào) 下載
片機(jī)的C語言編程_第1頁
第1頁 / 共27頁
片機(jī)的C語言編程_第2頁
第2頁 / 共27頁
片機(jī)的C語言編程_第3頁
第3頁 / 共27頁

下載文檔到電腦,查找使用更方便

9.9 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《片機(jī)的C語言編程》由會(huì)員分享,可在線閱讀,更多相關(guān)《片機(jī)的C語言編程(27頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。

1、單擊此處編輯母版標(biāo)題樣式,,單擊此處編輯母版文本樣式,,第二級(jí),,第三級(jí),,第四級(jí),,第五級(jí),,,*,第4章,單片機(jī),C語言程序設(shè)計(jì),第4章 單片機(jī)C語言程序設(shè)計(jì),4.1.1 C語言的特點(diǎn)及程序結(jié)構(gòu),一.C語言的特點(diǎn),1.無須考慮尋址問題和數(shù)據(jù)類型問題,2.模塊化結(jié)構(gòu),3.豐富的子程序,4.可以與匯編交叉使用,5.可以直接對計(jì)算機(jī)硬件進(jìn)行操作。,6.生成的目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高。,7.可移植性好。,,4.1 C語言的程序結(jié)構(gòu),C語言程序采用函數(shù)結(jié)構(gòu),每個(gè)C語言程序由一個(gè)或多個(gè)函數(shù)組成,在這些函數(shù)中至少應(yīng)包含一個(gè)主函數(shù)main(),也可以包含一個(gè)main()函數(shù)和若干個(gè)其它的功能函數(shù)。

2、不管main()函數(shù)放于何處,程序總是從main()函數(shù)開始執(zhí)行,執(zhí)行到main()函數(shù)結(jié)束則結(jié)束。在main()函數(shù)中調(diào)用其它函數(shù),其它函數(shù)也可以相互調(diào)用,但main()函數(shù)只能調(diào)用其它的功能函數(shù),而不能被其它的函數(shù)所調(diào)用。功能函數(shù)可以是C語言編譯器提供的庫函數(shù),也可以是由用戶定義的自定義函數(shù)。在編制C程序時(shí),程序的開始部分一般是預(yù)處理命令、函數(shù)說明和變量定義等。,C語言程序結(jié)構(gòu)一般如下:,,預(yù)處理命令 include,,函數(shù)說明 long fun1();,,float fun2();,,int x,y;,,float z;,,int FindMax(int a,int

3、b);,,int FindMin(int a,int b);,,main(),,{ int nVar1,nVar2,nMax,nMin;,,nVar1=3;,,nVar2=5;,,nMax=FindMax(3,5); //調(diào)用求最大值函數(shù),,nMin=FindMin(3,5); //調(diào)用求最小值函數(shù),,while(1);,,},,int FindMax(int a,int b) //求最大值函數(shù)體,,{ return a>b ? a:b;,,},,int FindMin(int a,int b) //求最小值函數(shù)體,,{ return a

4、范圍,unsigned char,1字節(jié),0~255,signed char,1字節(jié),-128~+127,unsigned int,2字節(jié),0~65535,signed int,2字節(jié),-32768~+32767,unsigned long,4字節(jié),0~4294967295,signed long,4字節(jié),-2147483648~+2147483647,float,4字節(jié),?,1.175494E-38~,?,3.402823E+38,bit,1位,0或1,sbit,1位,0或1,sfr,1字節(jié),0~255,sfr16,2字節(jié),0~65535,4.2 C51的數(shù)據(jù)類型,,在C51語言程序中,有可

5、能會(huì)出現(xiàn)在運(yùn)算中數(shù)據(jù)類型不一致的情況。C51允許任何標(biāo)準(zhǔn)數(shù)據(jù)類型的隱式轉(zhuǎn)換,隱式轉(zhuǎn)換的優(yōu)先級(jí)順序如下:,,bit,?,char,?,int,?,long,?,float,,signed?,unsigned,,也就是說,當(dāng)char型與int型進(jìn)行運(yùn)算時(shí),先自動(dòng)對char型擴(kuò)展為int型,然后與int型進(jìn)行運(yùn)算,運(yùn)算結(jié)果為int型。C51除了支持隱式類型轉(zhuǎn)換外,還可以通過強(qiáng)制類型轉(zhuǎn)換符“()”對數(shù)據(jù)類型進(jìn)行人為的強(qiáng)制轉(zhuǎn)換。,,C5l編譯器除了能支持以上這些基本數(shù)據(jù)類型之外,還能支持一些復(fù)雜的組合型數(shù)據(jù)類型,如數(shù)組類型、指針類型、結(jié)構(gòu)類型、聯(lián)合類型等這些復(fù)雜的數(shù)據(jù)類型,在本書的后面將相繼介紹。,,存

6、儲(chǔ)器類型是用于指明變量所處的單片機(jī)的存儲(chǔ)器區(qū)域情況。存儲(chǔ)器類型與存儲(chǔ)種類完全不同。C51編譯器能識(shí)別的存儲(chǔ)器類型有以下幾種,見表所示。,存儲(chǔ)器類型,描 述,data,直接尋址的片內(nèi)RAM低128B,訪問速度快,bdata,片內(nèi)RAM的可位尋址區(qū)(20H~2FH),允許字節(jié)和位混合訪問,idata,間接尋址訪問的片內(nèi)RAM,允許訪問全部片內(nèi)RAM,pdata,用Ri間接訪問的片外RAM的低256B,xdata,用DPTR間接訪問的片外RAM,允許訪問全部64k片外RAM,code,程序存儲(chǔ)器ROM64k空間,定義變量時(shí)也可以省“存儲(chǔ)器類型”,省時(shí)C51編譯器將按編譯模式默認(rèn)存儲(chǔ)器類型,具體編譯

7、模式的情況在后面介紹。,4.3 數(shù)據(jù)的存儲(chǔ)類型和存儲(chǔ)器模式,,4.3 數(shù)據(jù)的存儲(chǔ)類型和存儲(chǔ)器模式,存儲(chǔ)器模式,描 述,SMALL,參數(shù)及變量放入可直接尋址的內(nèi)部存儲(chǔ)器(最大128byte,默認(rèn)為data),COMPACT,參數(shù)及局部變量放入外部數(shù)據(jù)存儲(chǔ)器(最大256nyte,默認(rèn)類型為pdata),LARGE,參數(shù)及局部變量放入外部數(shù)據(jù)存儲(chǔ)器(最大64k,默認(rèn)類型為 xdata),,Data char var,,Char code MSG[]=“PARAMETER”,,Unsigned long xdata array[100];,,Float idata x,y ,z,,Bit l

8、ock,,Unsigned int pdata sion,,Unsigned char xdata vertor[10][4][4],,Sfr P0=0x80;,,Char bdata flags;,,Sbit flag0=flags^0;,,#pragma small /*變量的存儲(chǔ)模式為SMALL*/,,char k1;,,int xdata m1;,,#pragma compact /*變量的存儲(chǔ)模式為compact*/,,char k2;,,int xdata m2;,,int func1(int x1,int y1) large

9、/*函數(shù)的存儲(chǔ)模式為LARGE*/,,{\return(x1+y1);,,},,int func2(int x2,int y2) /*函數(shù)的存儲(chǔ)模式隱含為SMALL*/,,{,,return(x2-y2);,,},,程序編譯時(shí),k1變量存儲(chǔ)器類型為data,k2變量存儲(chǔ)器類型為pdata,而m1和m2由于定義時(shí)帶了存儲(chǔ)器類型xdata,因而它們?yōu)閤data型;函數(shù)func1的形參x1和y1的存儲(chǔ)器類型為xdata型,而函數(shù)func2由于沒有指明存儲(chǔ)模式,隱含為SMALL模式,形參x2和y2的存儲(chǔ)器類型為data。,,,(補(bǔ)充)存儲(chǔ)種類,,存儲(chǔ)種類是指變量在程序執(zhí)行過程中的作用范

10、圍。C51變量的存儲(chǔ)種類有四種,分別(auto、extern,static和register。,,1.a(chǎn)uto:,使用auto定義的變量稱為自動(dòng)變量,其作用范圍在定義它的函數(shù)體或復(fù)合語句內(nèi)部,定義變量時(shí),如果省略存儲(chǔ)種類,則該變量默認(rèn)為自動(dòng)(auto)變量。,,2.extern:,使用extern定義的變量稱為外部變量。在一個(gè)函數(shù)體內(nèi),要使用一個(gè)已在該函數(shù)體外或別的程序中定義過的外部變量時(shí),該變量在該函數(shù)體內(nèi)要用extern說明。,,3.static:,使用static定義的變量稱為靜態(tài)變量。它又分為內(nèi)部靜態(tài)變量和外部靜態(tài)變量。在函數(shù)體內(nèi)部定義的靜態(tài)變量為內(nèi)部靜態(tài)變量,它在對應(yīng)的函數(shù)體內(nèi)有效,

11、一直存在,但在函數(shù)體外不可見,這樣不僅使變量在定義它的函數(shù)體外被保護(hù),還可以實(shí)現(xiàn)當(dāng)離開函數(shù)時(shí)值不被改變。,,4.register:,使用register定義的變量稱為寄存器變量。它定義的變量存放在CPU內(nèi)部的寄存器中,處理速度快,但數(shù)目少。C51編譯器編譯時(shí)能自動(dòng)識(shí)別程序中使用頻率最高的變量,并自動(dòng)將其作為寄存器變量,用戶可以無需專門聲明。,,【例】,變量定義存儲(chǔ)種類和存儲(chǔ)器類型相關(guān)情況。,,char data varl; /*在片內(nèi)RAM低128B定義用直接尋址方式訪問的字符型變量var1*/,,int idata var2; /*在片內(nèi)RAM256B定義用間接尋址方式訪問的整

12、型變量var2*/,,,auto unsigned long data var3,; /*在片內(nèi)RAM128B定義用直接尋址方式訪問的自動(dòng)無符號(hào)長整型變量var3*/,,,extern float xdata var4;,/*在片外RAM64KB空間定義用間接尋址方式訪問的外部實(shí)型變量var4*/,,int code var5; /*在ROM空間定義整型變量var5*/,,unsign char bdata var6; /*在片內(nèi)RAM位尋址區(qū)20H~2FH單元定義可字節(jié)處理和位處理的無符號(hào)字符型變量var6*/,,4.4 指針,,注:指

13、針的聲明包括3個(gè)部分:,,目標(biāo)變量的數(shù)據(jù)類型,,目標(biāo)變量的存儲(chǔ)類型,,指針變量自身的存儲(chǔ)類型(此指針放在哪里),,指針變量本身的數(shù)據(jù)類型(8位/16位/32位,根據(jù)被指的變量存儲(chǔ)類型來決定),,二.通過指針訪問地址,,采用指針的方法,可以實(shí)現(xiàn)在C51程序中對任意指定的存儲(chǔ)器單元進(jìn)行訪問。,,【例】,通過指針實(shí)現(xiàn)絕對地址的訪問。,,#define uchar unsigned char,,#define uint unsigned int,,void func(void),,{,,uchar data var1;,,Xdata uchar pdata *dp1,; /

14、,*定義一個(gè)指向pdata區(qū)的指針dp1*,指針本身存放于片外64K中/,,uint xdata *dp2;,/,*定義一個(gè)指向xdata區(qū)的指針dp2*/,,uchar data *dp3;,/,*定義一個(gè)指向data區(qū)的指針dp3*/,,dp1=0x30; /*dp1指針賦值,指向pdata區(qū)的30H單元*/,,dp2=0x1000; /*dp2指針賦值,指向xdata區(qū)的1000H單元*/,,*,dp1=0xff;,/,*將數(shù)據(jù)0xff送到片外RAM30H單元*/,,*dp2=0x1234;,/,*將數(shù)據(jù)0x1234送到片外RAM1000H單元*/,,dp3=

15、 /*dp3指針指向data區(qū)的var1變量*/,,*,dp3=0x20;,/,*給變量var1賦值0x20*/,,},,在C51中,允許用戶對特殊功能寄存器進(jìn)行訪問,訪問時(shí)須通過sfr或sfr16類型說明符進(jìn)行定義,定義時(shí)須指明它們所對應(yīng)的片內(nèi)RAM單元的地址。格式如下:,,sfr或sfr16 特殊功能寄存器名=地址;,,sfr用于對MCS-51單片機(jī)中單字節(jié)的特殊功能寄存器進(jìn)行定義,sfr16用于對雙字節(jié)特殊功能寄存器進(jìn)行定義。特殊功能寄存器名一般用大寫字母表示。。,,sfr SCON=0x98;,,sfr TMOD=0x89;,,sfr P1=0x90;,,sfr16

16、 ACC=0xe0;,,sfr16 T1=0X8A;,4.4 C51對SFR/位尋址/存儲(chǔ)器/IO口的定義,,,位變量,,在C51中,允許用戶通過位類型符定義位變量。,位類型符有兩個(gè):bit和sbit??梢远x兩種位變量。,,sbit定義的變量必須與51單片機(jī)的一個(gè)可位尋址字節(jié)的某一位聯(lián)系在一起.C51編譯的時(shí)候其地址是不可變的.,,,它的格式如下三個(gè):,,例:,,1) bit m;,,2) bdata int ibase;,,sbit mybit=ibase^15;,,3) sfr P1=0X90;,,sbit P1_1=P1^1;,,,4.5.3 絕對地址的訪問,一.使用C51

17、運(yùn)行庫中預(yù)定義宏,,C51編譯器提供了一組宏定義來對51系列單片機(jī)的code、data、pdata和xdata空間進(jìn)行絕對尋址。規(guī)定只能以無符號(hào)數(shù)方式訪問,定義了8個(gè)宏定義:,,CBYTE以字節(jié)形式對code區(qū)尋址,,,DBYTE以字節(jié)形式對data區(qū)尋址,,,PBYTE以字節(jié)形式對pdata區(qū)尋址,,,XBYTE以字節(jié)形式對xdata區(qū)尋址,,,CWORD以字形式對code區(qū)尋址,,,DWORD以字形式對data區(qū)尋址,,,PWORD以字形式對pdata區(qū)尋址,,,XWORD以字形式對xdata區(qū)尋址。,,訪問形式如下:,,宏名[地址],,使用時(shí)須用預(yù)處理命令把該頭文件包含到文件中,形式為:

18、#include 。,,,,【例】,絕對地址對存儲(chǔ)單元的訪問,,#include ,,#include ,,#define uchar unsigned char,,#define uint unsigned int,,,void main(void),,{,,uchar var1;,,uint var2;,,var1=XBYTE[0x0005];,,var2=XWORD[0x0002];,,while(1);,,},,在上面程序中,其中XBYTE[0x0005]就是以絕對地址方式訪問的片外RAM 0005,字節(jié),單元;XWORD[0x0002]就是以絕對地址方式訪問的

19、片外RAM 0002,字,單元。,,位運(yùn)算符,C51語言能對運(yùn)算對象按位進(jìn)行操作,它與匯編語言使用一樣方便。位運(yùn)算是按位對變量進(jìn)行運(yùn)算,但并不改變參與運(yùn)算的變量的值。如果要求按位改變變量的值,則要利用相應(yīng)的賦值運(yùn)算。C51中位運(yùn)算符只能對整數(shù)進(jìn)行操作,不能對浮點(diǎn)數(shù)進(jìn)行操作。C51中的位運(yùn)算符有:,,& 按位與,,| 按位或,,^ 按位異或,,~ 按位取反,,<< 左移,,>> 右移,,【例4-10】,設(shè)a=0x45=01010100B,b=0x3b=00111011B,則a&b、a|b、a^b、~a、a>2分別為多少?,,a&b=00010000b=0x10

20、。,,a|b=01111111B=0x7f。,,a^b=01101111B=0x6f。,,~a=10101011B=0xab。,,a<<2=01010000B=0x50。,,b>>2=00001110B=0x0e。,,復(fù)合賦值運(yùn)算符,,C51語言中支持在賦值運(yùn)算符“=”的前面加上其它運(yùn)算符,組成復(fù)合賦值運(yùn)算符。下面是C51中支持的復(fù)合賦值運(yùn)算符:,,+= 加法賦值,?,+,減法賦值,,*= 乘法賦值 /= 除法賦值,,%= 取模賦值 &= 邏輯與賦值,,|= 邏輯或賦值 ^= 邏輯異或賦值,,~=

21、 邏輯非賦值 >>= 右移位賦值,,<<= 左移位賦值,,復(fù)合賦值運(yùn)算的一般格式如下:,,變量 復(fù)合運(yùn)算賦值符 表達(dá)式,,它的處理過程:先把變量與后面的表達(dá)式進(jìn)行某種運(yùn)算,然后將運(yùn)算的結(jié)果賦給前面的變量。其實(shí)這是C51語言中簡化程序的一種方法,大多數(shù)二目運(yùn)算都可以用復(fù)合賦值運(yùn)算符簡化表示。例如:a+=6相當(dāng)于a=a+6;a*=5相當(dāng)于a=a*5;b&=0x55相當(dāng)于b=b&0x55;x>>=2相當(dāng)于x=x>>2。,,函數(shù)調(diào)用方式:3種,,1 把被調(diào)函數(shù)名作為一個(gè)語句,,2 被調(diào)函數(shù)作為表達(dá)式的運(yùn)算對象,,resule=2*get(a,b),,3 被調(diào)函數(shù)作

22、為另一個(gè)數(shù)的實(shí)際參數(shù),,m=max(a,get(a,b)),4.7 函 數(shù),,,4.8 C語言編程實(shí)例,,#include,,main(),,{,,char c;,,for(;;),,{,,c=XBYTE[14];,,XBYTE[14]=XBYTE[15];,,XBYTE[15]=c;,,},,},,循環(huán)語句:,,1 while(判斷句式){},,2 do{語句}while(判斷句式),,3 for(表達(dá)式1;表達(dá)式2;表達(dá)式3){語句},,分支程序,,1if(表達(dá)式){語句},,2 if (表達(dá)式){語句}else{語句},,3 switch(表達(dá)式){case 常量表達(dá)式1:{語句}bre

23、ak;,,case 常量表達(dá)式2:{語句}break;,,……..,,},,,,1.在C51中嵌入?yún)R編程序,,嵌入?yún)R編程序是通過C51中的預(yù)處理指令#pragma asm/end asm 語句來實(shí)現(xiàn)的。其格式如下:,,#pragma ASM,,;匯編程序代碼,,#pragma ENDASM,2.,在C51中調(diào)用匯編程序,,這種方法應(yīng)用較多,C模塊與匯編模塊的接口較簡單,分別用C51與A51對源程序進(jìn)行編譯,然后用L51將obj文件連接即可,關(guān)鍵問題在于C函數(shù)與匯編函數(shù)之間的參數(shù)傳遞和得到正確的返回值,以保證模塊間的數(shù)據(jù)交換。,4.9 匯編語言和C語言的混合編程,,,#include ,,M

24、ain(){,,P2=1;,,#pragma asm,,MOV R7,#10;,,DEL:MOV R6,#20;,,DJNZ R6,$ //,R6-1操作,不為零,跳轉(zhuǎn)到自己本身,,DJNZ R7,DEL;//,R7-1操作,不為零,跳轉(zhuǎn)到DEL,,#pragma endasm,,P2=0;,,,#include,,,,#define uchar unsigned char,,sbit P1_1=P1^1;,,extern void delay4ms();,,main(),,{ //unsigned char i;,,for(;;),,{,,P1_1=0;,,delay4ms();,,P1

25、_1=1;,,delay4ms() ;,,},,},,,#include,,#define uchar unsigned char,,sbit P1_0=P1^0;,,extern delay1ms(uchar x);,,void delay4ms(void),,{,,P1_0=0;,,delay1ms(2);,,P1_0=1;,,delay1ms(2);,,},,,PUBLIC _DELAY1MS ;,,DE SEGMENT CODE ;,,RSEG DE;,,_DELAY1MS: NOP,,DELA: MOV R1,#0F8H;,,LOP1: NOP,,NOP,,DJNZ R1,LOP1,,DJNZ R7,DELA,,EXIT: RET,,END,,

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

相關(guān)資源

更多
正為您匹配相似的精品文檔

相關(guān)搜索

copyright@ 2023-2025  sobing.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!