C語言編程基礎(chǔ)_第1頁
C語言編程基礎(chǔ)_第2頁
C語言編程基礎(chǔ)_第3頁
C語言編程基礎(chǔ)_第4頁
C語言編程基礎(chǔ)_第5頁
已閱讀5頁,還剩72頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

會計學(xué)1C語言編程基礎(chǔ)1)機(jī)器語言定義:處理器能直接執(zhí)行的二進(jìn)制代碼特點(diǎn):效率高、但不易于使用10110110000000001011010100000000ADDA,#193.1編程語言KeilC51簡介1、編程語言2)匯編語言

定義:以助記符的形式表示機(jī)器語言特點(diǎn):速度快、體積小、但依賴于硬件體系第1頁/共77頁3)高級語言獨(dú)立于機(jī)器、面向過程的、接近于人的自然語言。語言:FORTRAN、C語言特點(diǎn):與硬件無關(guān)、易于交流和使用、運(yùn)行效率低X=X+1;編譯器鏈接器X=X+1;…………程序員1001001010110010……高級語言程序機(jī)器碼單片機(jī)如何執(zhí)行程序指令?第2頁/共77頁KeilC51語言是在標(biāo)準(zhǔn)C的基礎(chǔ)上,針對51單片機(jī)的硬件特點(diǎn)進(jìn)行擴(kuò)展,并向51單片機(jī)上移植的高效、簡潔的實(shí)用高級語言。

與匯編語言相比的特點(diǎn):(1)可讀性好。(2)可模塊化開發(fā)。(3)可移植性好。(4)生成的代碼效率較低。2、KeilC51語言簡介對于51單片機(jī),目前廣泛使用的是KeilC51語言,簡稱C51語言。第3頁/共77頁3、C51與標(biāo)準(zhǔn)C的區(qū)別(1)庫函數(shù)的不同。例如庫函數(shù)printf和scanf,在標(biāo)準(zhǔn)C中,這兩個函數(shù)通常用于屏幕打印和接收字符,而在KeilC51中,主要用于串行口數(shù)據(jù)的收發(fā)。(3)C51的變量存儲模式與標(biāo)準(zhǔn)C中的變量存儲模式不一樣。標(biāo)準(zhǔn)C是在通用計算機(jī)中只有一個程序和數(shù)據(jù)統(tǒng)一尋址的內(nèi)存空間。51單片機(jī)存儲區(qū)可分為內(nèi)部數(shù)據(jù)存儲區(qū)、外部數(shù)據(jù)存儲區(qū)以及程序存儲區(qū)。(4)標(biāo)準(zhǔn)C語言沒有處理單片機(jī)中斷的方法。C51中有專門處理中斷的中斷函數(shù)。(2)數(shù)據(jù)類型有一定的區(qū)別。在標(biāo)準(zhǔn)C的基礎(chǔ)上又?jǐn)U展了4種類型。第4頁/共77頁(5)頭文件的不同。51頭文件把單片機(jī)內(nèi)部的硬件資源如定時器、中斷、I/O等所相應(yīng)的功能寄存器寫入頭文件內(nèi)。(6)程序結(jié)構(gòu)的差異。由于51單片機(jī)硬件資源有限,編譯系統(tǒng)不允許太多的程序嵌套。其次,C51語言不支持標(biāo)準(zhǔn)C的遞歸特性。4、KeilC51的開發(fā)工具———KeilμVision3KeilμVision3是德國Keilsoftware公司開發(fā)的C51語言開發(fā)軟件。這個軟件集成了文件編輯處理、編譯鏈接等功能。第5頁/共77頁3.2C51語言程序設(shè)計基礎(chǔ)1、數(shù)據(jù)類型與存儲類型1)數(shù)據(jù)類型第6頁/共77頁2)C51擴(kuò)展的數(shù)據(jù)類型(4種擴(kuò)展的數(shù)據(jù)類型)(1)位變量bitbit的值可以是1(true),或0(false)。

bit變量名;格式:例如:bitflag;flag=0;第7頁/共77頁(2)特殊功能寄存器sfr

地址單元80H——FFH之間的片內(nèi)數(shù)據(jù)存儲區(qū);

“sfr”

數(shù)據(jù)類型占用一個內(nèi)存單元;利用它可以訪問51單片機(jī)內(nèi)部的所有特殊功能寄存器。sfrP1=0x90;//定義了P1為片內(nèi)的P1口寄存器;P1=0xff;//把P1口的所有輸出引腳設(shè)置為高電平。例如:sfr寄存器變量名=字節(jié)地址常數(shù);格式:第8頁/共77頁sfrSBUF=0x99;習(xí)題:往串行發(fā)送數(shù)據(jù)緩沖寄存器SBUF寫入80SBUF=80;習(xí)題:從P0口寄存器讀取數(shù)據(jù),存放到任意一個變量X。sfrP0=0x80;intx;x=P0;第9頁/共77頁例如:(3)特殊功能寄存器sfr16“sfr16”數(shù)據(jù)類型占兩個內(nèi)存單元;用于操作占兩個字節(jié)的特殊功能寄存器。sfr16DPTR=0x82;//定義了片內(nèi)16位數(shù)據(jù)指針寄存器DPTR,

//低8位字節(jié)地址為82H,

//高8位字節(jié)地址為83H。DPTR=0x1234;sfr16寄存器變量名=字節(jié)地址常數(shù);格式:字節(jié)地址為82H、83H存放的數(shù)據(jù)分別是多少?第10頁/共77頁(4)特殊功能位sbit

片內(nèi)特殊功能寄存器的可尋址位?!癪”前是特殊功能寄存器的名字;“^”的后面數(shù)字是特殊功能寄存器可尋址位在寄存器中的位置,取值必須是0-7。①sbit位變量名=特殊功能寄存器^位位置;格式:sfrPSW=0xd0; //定義PSW寄存器地址為0xd0sbitFO=PSW^5; //定義F0位為PSW.5F0=0;例如:第11頁/共77頁習(xí)題:片內(nèi)I/O口P1口的P1.0尋址位置成高電平sfr P1=0x90;

sbitP1_0=P1^0;

P1_0=1;習(xí)題:從P2口的P2.7讀取數(shù)據(jù),存放到任意一個位變量X。sfr P2=0xA0;

sbitP2_7=P2^7;

bitx;

x=P2_7;第12頁/共77頁sbit位變量名

=位地址常數(shù);

sbitCY=0xD7; /*CY位地址為0xD7*/sbitOV=0xD2;/*OV位地址為0xD2*/if(CY==1){

…}例如:格式:第13頁/共77頁習(xí)題:片內(nèi)I/O口P1口的P1.0尋址位置成低電平sbitP1_0=0x90;P1_0=0;在頭文件AT89X51.h中定義了常用的特殊功能寄存器和可尋址位。#include<AT89X51.h>sfr P1=0x90;

sbitP1_0=0x90;

兩者區(qū)別?6第14頁/共77頁3)數(shù)據(jù)存儲類型數(shù)據(jù)存儲類型是指數(shù)據(jù)存放在51單片機(jī)的哪一個存儲器空間。第15頁/共77頁bdatadataidatapdataxdatacode第16頁/共77頁(1)DATA區(qū)。

DATA區(qū)指片內(nèi)RAM的低128字節(jié)的空間,可直接尋址;尋址是最快的,應(yīng)該把經(jīng)常使用的變量放在DATA區(qū)。unsignedchardatasystem_status=0;unsignedintdataunit_id[8];例如:格式:

數(shù)據(jù)類型

【存儲類型】

變量名;第17頁/共77頁(2)BDATA區(qū)。

BDATA區(qū)是內(nèi)部RAM可位尋址的16字節(jié)存儲區(qū)(字節(jié)地址為20H

~2FH)中的128個位。在這個區(qū)中聲明變量就可進(jìn)行位尋址。例如: unsignedcharbdatastatus_byte;

unsignedintbdatastatus_word;

sbitstat_flag=status_byte^4;

if(status_word^15) {stat_flag=1;

}第18頁/共77頁(3)IDATA區(qū)。

IDATA區(qū)是片內(nèi)RAM的0-256字節(jié)的存儲區(qū),只能間接尋址,速度比直接尋址慢。 unsignedcharidatasystem_status=0; floatidatavalue;

例如:第19頁/共77頁(4)PDATA區(qū)和XDATA區(qū)。

PDATA區(qū)和XDATA區(qū)位于片外存儲區(qū);

PDATA區(qū)指的是外部數(shù)據(jù)存儲區(qū)0—256字節(jié)。

XDATA區(qū)指的是外部數(shù)據(jù)區(qū)64KB內(nèi)的任何地址。 unsignedcharxdatasystem_status=0; unsignedintpdataunit_id[8];例如:第20頁/共77頁(5)程序存儲區(qū)CODE。

CODE區(qū)是程序存儲區(qū),儲存的數(shù)據(jù)是不可改變的。unsignedcharcodea[9]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};例如:第21頁/共77頁4)數(shù)據(jù)存儲器模式C51編譯器設(shè)定的存儲器模式:

SMALL、COMPACT和LARGE三種模式。若聲明charvar1;在SMALL模式下,var1被定位在data存儲區(qū);在COMPACT模式下,var1被定位在idata存儲區(qū);在LARGE模式下,var1被定位在xdata存儲區(qū)中。第22頁/共77頁2、C51語言的絕對地址訪問C51語言提供了兩種比較常用的訪問絕對地址的方法,對片內(nèi)RAM、片外RAM及I/O進(jìn)行訪問。絕對地址第23頁/共77頁1)絕對宏C51編譯器提供了一組宏定義對code、data、pdata和xdata空間進(jìn)行絕對尋址。這組宏定義放在absacc.h頭文件中:CBYTE以字節(jié)形式對code區(qū)尋址;CWORD以字形式對code區(qū)尋址;DBYTE以字節(jié)形式對data區(qū)尋址;DWORD以字形式對data區(qū)尋址;XBYTE以字節(jié)形式對xdata區(qū)尋址;XWORD以字形式對xdata區(qū)尋址;PBYTE以字節(jié)形式對pdata區(qū)尋址;PWORD以字形式對pdata區(qū)尋址。#define變量名絕對宏[字節(jié)地址]格式絕對宏第24頁/共77頁【例】片內(nèi)RAM、片外RAM定義的程序如下:#include<absacc.h>#definePORTEXBYTE[0xFFC0] /*將PORTE定義為外部I/O,地址為0xFFC0*/#defineNRAMDBYTE[0x40] /*將NRAM定義為片內(nèi)RAM,地址為0x40*/main(){ PORTE=0x3D;

NRAM=0x01;}/*數(shù)據(jù)3DH寫入地址0xFFC0的外部I/OPORTE*//*將數(shù)據(jù)01H寫入片內(nèi)RAM的40H單元*/第25頁/共77頁習(xí)題使用絕對宏將片內(nèi)RAM20H的字節(jié)地址單元全部置1。#include<absacc.h>#defineMDBYTE[0x0020] /*將M定義為外部RAM,地址為0x0020*/main(){ M=0xff;}第26頁/共77頁習(xí)題:使用絕對宏讀取片外RAMF000H字節(jié)地址單元的內(nèi)容。#include<absacc.h>#defineWRAMXBYTE[0xF000] main(){charx;

x=WRAM;}7第27頁/共77頁2)_at_關(guān)鍵字使用關(guān)鍵字_at_可對指定的存儲器空間的絕對地址進(jìn)行訪問。格式:

[存儲類型]數(shù)據(jù)類型變量名_at_地址常數(shù);地址常數(shù):指定變量的絕對地址,位于存儲器空間之內(nèi);使用_at_定義的變量必須為全局變量。第28頁/共77頁【例】使用關(guān)鍵字_at_實(shí)現(xiàn)絕對地址的訪問。dataunsignedchary1_at_0x50;/*在data區(qū)定義字節(jié)變量

y1,地址為50H*/xdataunsignedinty2_at_0x4000;/*在xdata區(qū)定義字變量

y2,地址為4000H*/voidmain(void){ y1=0xff;y2=0x1234;

……while(1);}第29頁/共77頁習(xí)題:使用關(guān)鍵字_at_讀取片內(nèi)RAM60H單元的內(nèi)容。dataunsignedcharM_at_0x60;voidmain(void){unsignedchary;y=M;}第30頁/共77頁【例】使用關(guān)鍵字_at_將片外RAM2000H開始的連續(xù)20個字節(jié)單元清0。voidmain(void){unsignedchari;

for(i=0;i<20;i++){ buffer[i]=0;

}}xdataunsignedcharbuffer[20]_at_0x2000;第31頁/共77頁dataunsignedcharbuffer[8]_at_0x40;voidmain(void){unsignedcharj;for(j=0;j<8;j++){ buffer[j]=0;

}}習(xí)題:使用關(guān)鍵字_at_把片內(nèi)RAM40H單元開始的8個單元內(nèi)容清0。8第32頁/共77頁C51語言的基本運(yùn)算與標(biāo)準(zhǔn)C類似,主要包括算術(shù)運(yùn)算、關(guān)系運(yùn)算、邏輯運(yùn)算、位運(yùn)算和賦值運(yùn)算及其表達(dá)式等。1)算術(shù)運(yùn)算符3、C51的基本運(yùn)算第33頁/共77頁2)關(guān)系運(yùn)算符關(guān)系表達(dá)式intx=3;inty=6;intR;R=x>y;第34頁/共77頁3)邏輯運(yùn)算符邏輯表達(dá)式intx=0;inty=1;intR;R=x&&y;第35頁/共77頁4)位運(yùn)算符01001000&1111111100001000>>201001001|11111111第36頁/共77頁01001000&0011011101000000|1111111100001000<<3習(xí)題:第37頁/共77頁【例】以字節(jié)操作方式對I/O口P1的P1.5清0,P1.1置為1,其他位保持不變。XX0XXX1XP1.5P1.1sfrP1=0x90;P1=(P1&0xDF)│0x02;P1.0第38頁/共77頁sfrP2=0xA0;P2=P2

|0x10;習(xí)題:以字節(jié)操作方式,把P2口的P2.4位置成1,其它位保持不變。第39頁/共77頁sfrP0=0x80;charflag;flag=P0&0x40;習(xí)題:以字節(jié)操作方式,讀取P0口的P0.6位是否為1?第40頁/共77頁4、C51的分支與循環(huán)程序結(jié)構(gòu)程序結(jié)構(gòu)分為三類:順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)。1)分支結(jié)構(gòu)控制語句格式二分支if語句if(表達(dá)式){語句;}第41頁/共77頁if(x>y){max=x;}比較變量x和變量y,如果x>y,則把x賦給變量max。習(xí)題:比較變量x和變量y,如果x和y相等,則把0賦給變量max。if(x==y){max=0;}第42頁/共77頁格式:if(表達(dá)式){語句1;}

else{語句2;}

第43頁/共77頁if(x>y){max=x;}else{max=y;}比較變量x和變量y,如果x>y,則把x賦給變量max;否則把y賦給變量max。第44頁/共77頁習(xí)題:比較變量x和變量y,把二者最小值賦給變量min;if(x>y){min=y;}else{min=x;}第45頁/共77頁習(xí)題:如果變量x滿足關(guān)系10<x<20,則把變量y置成1;否則把y置成0。if((x>10)&&(x<20)){ y=1;}else{y=0;}9第46頁/共77頁voidmain(){sfrP2=0xA0;

sfrP1=0x90;

sbitP24=P2^4;

sbitP10=P1^0;

習(xí)題:如果讀取P2口的P2.4位為1,則把P1口的P1.0置成0。if(P24==1){P10=0;

}}第47頁/共77頁if(表達(dá)式1)

語句1;elseif(表達(dá)式2)

語句2;…

…elseif(表達(dá)式n)語句n;else語句n+1;多分支if語句0表達(dá)式1

表達(dá)式2

表達(dá)式n語句n+100語句n

語句2

語句1

非0

非0

非0…

第48頁/共77頁當(dāng)成績≥90時,輸出verygood,當(dāng)80≤成績<90時,輸出good,當(dāng)60≤成績<80時,輸出pass,當(dāng)成績<60時,輸出fail。intscore;if(score>=90)printf(“verygood");elseif(score>=80)printf(“good");elseif(score>=60)printf(“pass");elseprintf(“fail");第49頁/共77頁多分支switch語句switch(表達(dá)式1){ case常量表達(dá)式1:{語句1;}break;

case常量表達(dá)式2:{語句2;}break;

……

case常量表達(dá)式n:{語句n;}break;

default:{語句n+1;}}格式:第50頁/共77頁switch表達(dá)式1語句1語句2語句n語句n+1…式1式2式ndefaultcase

第51頁/共77頁switch(key){ case1:

y=1;break;

case2:

y=2;break;

case3:

y=4;break;

default:;}在單片機(jī)程序設(shè)計中,常用switch語句作為鍵盤中按鍵的判別。當(dāng)按下鍵的鍵號變量key=1,則變量y=1;鍵號變量key=2,則變量y=2;鍵號變量key=4,則變量y=3;沒有按下鍵,則變量y不變。第52頁/共77頁key=2;switch(key){ case1:

y=1;

case2:

y=2; case3:

y=4;

default:;}習(xí)題:讀程序執(zhí)行的結(jié)果y=?第53頁/共77頁2)循環(huán)結(jié)構(gòu)控制語句while(表達(dá)式){

循環(huán)體;}格式:表達(dá)式循環(huán)體假(0)真(非0)先判斷表達(dá)式,后執(zhí)行循環(huán)體。while語句第54頁/共77頁main(){inti=0;intr;while(i<3)

{ i++;

}

y=i;}i++執(zhí)行幾次?y=?r=3習(xí)題:讀程序執(zhí)行的結(jié)果y=?第55頁/共77頁main(){inti=3;intr;while(i<6)

{ i++;

}

y=i;}y=?習(xí)題:讀程序執(zhí)行的結(jié)果y=?第56頁/共77頁do{

循環(huán)體;}while(表達(dá)式);格式:表達(dá)式循環(huán)體假(0)真(非0);不可省略!切記??!先執(zhí)行循環(huán)體,后判斷表達(dá)式。do-while語句第57頁/共77頁main(){inti=0;inty;do{ i++;

}while(i<3);y=i;}i++執(zhí)行幾次?y=?習(xí)題:讀程序執(zhí)行的結(jié)果y=?第58頁/共77頁main(){inti=0;inty=0;do{ i++;

y=y+i;}while(y<20);}習(xí)題:讀程序執(zhí)行的結(jié)果y=?第59頁/共77頁for(表達(dá)式1;表達(dá)式2;表達(dá)式3){

語句;}格式:for語句第60頁/共77頁main(){inti,y;y=0;for(i=1;i<4;i++) {y=y+i;

}}y=?習(xí)題:讀程序執(zhí)行的結(jié)果y=?第61頁/共77頁main(){inti,y;y=1;for(i=2;i<6;i++) {y=y+i;

}}y=?習(xí)題:讀程序執(zhí)行的結(jié)果y=?第62頁/共77頁3)break語句和continue語句break功能:

跳出switch結(jié)構(gòu);

在循環(huán)語句中,終止并跳出本層循環(huán)。continue功能:結(jié)束本次循環(huán),跳過本層循環(huán)體中尚未執(zhí)行的語句,執(zhí)行循環(huán)體的判斷。第63頁/共77頁#definePI3.1415main(){intr;floatarea;for(r=1;r<=10;r++){area=PI*r*r;if(area>100)

break;printf("r=%d,area=%.2f\n",r,area);}}計算r=1到r=10的圓面積,直到面積大于100時停止。運(yùn)行結(jié)果:r=1,area=3.14r=2,area=12.57r=3,area=28.27r=4,area=50.26r=5,area=78.54結(jié)束整個for循環(huán)第64頁/共77頁把100~200之間不能被3整除的數(shù)輸出。main(){intn;for(n=100;n<=200;n++){if(n%3==0)continue;printf(“%d",n);}}結(jié)束本次循環(huán),循環(huán)體的剩余語句被忽略,執(zhí)行表達(dá)式3,進(jìn)入下一循環(huán)。第65頁/共77頁main(){intn;for(n=100;n<=200;n++){if(n%3==0)break;printf(“%d",n);}}習(xí)題:讀程序執(zhí)行的結(jié)果?第66頁/共77頁習(xí)題:循環(huán)檢測P1.0引腳,只有檢測P1.0為低電平時,循環(huán)結(jié)束。sfrP1=0x90;sbitP10=P1^0;main(){while(1){if(P10==0)break;}}第67頁/共77頁5、數(shù)組數(shù)組是用來存儲一組相同數(shù)據(jù)類型的數(shù)據(jù)結(jié)構(gòu)。一維數(shù)組格式:數(shù)據(jù)類型變量名[N];inta[10];inta[5]={1,2,3,4,5};初始化:charb[10];第68頁/共77頁求下列數(shù)組的和。inta[5]={1,2,3,4,5};main(){inta[5]={1,2,3,4,5};inti,sum;sum=0;for(i=0;i<5;i++) {sum=sum+a[i];

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論