單片機C51教學課件_第1頁
單片機C51教學課件_第2頁
單片機C51教學課件_第3頁
單片機C51教學課件_第4頁
單片機C51教學課件_第5頁
已閱讀5頁,還剩95頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第1章C51數(shù)據(jù)類型與運算一、C51數(shù)據(jù)類型C51數(shù)據(jù)類型與標準C數(shù)據(jù)類型的最大不同之處:位型。位型(bit)字符型(char)整型(int)長整型(long)浮點型(float)雙精度浮點型(double)數(shù)組類型(array)結(jié)構(gòu)體類型(struct)共用體(union)枚舉(enum)基本類型構(gòu)造類型指針類型空類型數(shù)據(jù)類型第1章C51數(shù)據(jù)類型與運算一、C51數(shù)據(jù)類型位型(bit)1第1章C51數(shù)據(jù)類型與運算C51數(shù)據(jù)類型的取值范圍:數(shù)據(jù)類型長度(bit)長度(byte)值域范圍bit1——0,1unsignedchar810~255signedchar81–128~127unsignedint1620~65535signedint162–32768~32767unsignedfloat3240~4294967295signedfloat324–2147483648~2147483647float324±1.176E-38~±3.40E+38(6位數(shù)字)double648±1.176E-38~±3.40E+38(10位數(shù)字)一般指針243存儲空間0~65535第1章C51數(shù)據(jù)類型與運算C51數(shù)據(jù)類型的取值范圍:數(shù)據(jù)類2第1章C51數(shù)據(jù)類型與運算二、C51數(shù)據(jù)存儲類型1.C51存儲類型與MCS-51單片機存儲空間的對應關系

存儲類型與存儲空間的對應關系data直接尋址片內(nèi)數(shù)據(jù)存儲區(qū),訪問速度快(128字節(jié))bdata可位尋址片內(nèi)數(shù)據(jù)存儲區(qū),允許位與字節(jié)混合訪問(16字節(jié))idata間接尋址片內(nèi)數(shù)據(jù)存儲區(qū),可訪問片內(nèi)全部RAM地址空間(256字節(jié))pdata分頁尋址片外數(shù)據(jù)存儲區(qū)(256字節(jié)),由MOVXRi訪問xdata尋址片外數(shù)據(jù)存儲區(qū)(64K字節(jié)),有MOVXDPTR訪問code尋址代碼存儲區(qū)(64K字節(jié)),有MOVCDPTR訪問第1章C51數(shù)據(jù)類型與運算二、C51數(shù)據(jù)存儲類型存儲類3第1章C51數(shù)據(jù)類型與運算2.C51存儲類型及其大小和值域存儲類型長度(bit)長度(byte)值域范圍data810~255idata810~255pdata810~255xdata1620~65535code1620~65535第1章C51數(shù)據(jù)類型與運算2.C51存儲類型及其大小和值4第1章C51數(shù)據(jù)類型與運算3.51單片機的存儲模式

存儲模式說明SMALL

參數(shù)及局部變量放入可直接尋址的片內(nèi)存儲器(最大128字節(jié),默認存儲類型是data),因此訪問十分方便。另外所有對象,包括棧,都必須嵌入片內(nèi)RAM。棧長很關鍵,因為實際棧長依賴于不同函數(shù)的嵌套層數(shù)COMPACT

參數(shù)及局部變量放入分頁片外存儲區(qū)(最大256字節(jié),默認的存儲類型是pdata),通過寄存器R0和R1間接尋址,??臻g位于內(nèi)部數(shù)據(jù)存儲區(qū)中LARGE

參數(shù)及局部變量直接放入片外數(shù)據(jù)存儲區(qū)(最大64KB,默認存儲類型為xdata),使用數(shù)據(jù)指針DPTR來進行尋址。用此數(shù)據(jù)指針訪問的效率較低,尤其是對二個或多個字節(jié)的變量,這種數(shù)據(jù)類型的訪問機制直接影響代碼的長度,另一不方便之處在于這種數(shù)據(jù)指針不能對稱操作第1章C51數(shù)據(jù)類型與運算3.51單片機的存儲模式存儲模5第1章C51數(shù)據(jù)類型與運算三、C51定義SFR定義方法:兩個關鍵字:sfr和sbit1.定義特殊功能寄存器用sfr例如:sfrPSW=0xD0;/*定義程序狀態(tài)字PSW的地址為D0H*/sfrTMOD=0x89;/*定義定時器/計數(shù)器方式控制寄存器TMOD的地址為89H*/sfrP1=0x90;/*定義P1口的地址為90H*/2.定義可位尋址的特殊功能寄存器的位用sbit例如:sbitCY=0xD7;/*定義進位標志CY的地址為D7H*/sbitAC=0xD0^6;/*定義輔助進位標志AC的地址為D6H*/sbitRS0=0xD0^3;/*定義RS0的地址為D3H*/第1章C51數(shù)據(jù)類型與運算三、C51定義SFR6第1章C51數(shù)據(jù)類型與運算標準SFR在reg51.h、reg52.h等頭文件中已經(jīng)被定義,只要用文件包含做出申明即可使用。例如:#include”reg51.h”sbitP10=P1^0;sbitP12=P1^2;main(){P10=1;P12=0;PSW=0x08;……}第1章C51數(shù)據(jù)類型與運算標準SFR在reg51.h、re7第1章

C51數(shù)據(jù)類型與運算四、C51定義并行口

單片機內(nèi)部并行口用sfr定義,外部并行口的定義如何定義?用指針定義,指針的定義在absacc.h頭文件中例如:#include“absacc.h”#definePAXBYTE[0xffec]main(){PA=0x3A;/*將數(shù)據(jù)3AH寫入地址為0xffec的存儲單元或I/O端口*/}XBYTE是一個指針,它將PA定義為一個外部并行口,其地址是FFECH。第1章C51數(shù)據(jù)類型與運算四、C51定義并行口XBYTE8第1章

C51數(shù)據(jù)類型與運算五、C51定義位變量 使用關鍵字bit

例如:

bitlock;/*將lock定義為位變量*/ bitdirention;/*將direction定義為位變量*/

注意:不能定義位變量指針;也不能定義位變量數(shù)組。第1章C51數(shù)據(jù)類型與運算五、C51定義位變量9第1章

C51數(shù)據(jù)類型與運算六、C51運算符、表達式及其規(guī)則

1.算術運算符 +——加法運算符 -——減法運算符 *——乘法運算符 /——除法運算符 %——模運算或取余運算符 ++——為自增運算符 --——為自減運算符。⒉關系運算符 <——小于 <=——小于等于 >——大于 >=——大于等于 ==——等于 ?。健坏扔赿ouble←floatint←charlongunsigned高低這四個運算符的優(yōu)先級相同,處于高優(yōu)先級這兩個運算符的優(yōu)先級相同,處于低優(yōu)先級第1章C51數(shù)據(jù)類型與運算六、C51運算符、表達式及其規(guī)則10⒊邏輯運算符

&&——邏輯與

||——邏輯或 !——邏輯非⒋位運算符

&——按位與 相當于ANL指令

|——按位或 相當于ORL指令 ^——按位異或 相當于XRL指令 ~——按位取反 相當于CPL指令

<<——左移 相當于RL指令

>>——右移 相當于RR指令⒊邏輯運算符11⒌賦值運算符

賦值運算符就是賦值符號“=”⒍復合賦值運算符

十種:+=,-=,*=,/=,%=,

﹠=,︱=,^=,<<=,>>=。按優(yōu)先級順序結(jié)合運算。例如:a+=b等價于a=(a+b)x*=a+b等價于x=(x*(a+b))a&=b等價于a=(a&b)a<<=4等價于a=(a<<4)⒌賦值運算符12第2章

C51流程控制語句

一、選擇語句1.if語句以下三種形式:if(表達式){語句;}if(表達式){語句1;}else{語句2;}if(表達式1){語句1;} elseif(表達式2){語句2;} elseif(表達式3){語句3;} …… elseif(表達式n){語句n;} else{語句n+1;}第2章C51流程控制語句一、選擇語句13第2章

C51流程控制語句例1: if(p1!=0) {c=20;}例2: if(p1!=0) {c=20;} else {c=0;}例3: if(a>=1){c=10;} elseif(a>=2){c=20;} elseif(a>=3){c=30;} elseif(a>=4){c=40;} else{c=0;}第2章C51流程控制語句例1: if(p1!=0)14第2章

C51流程控制語句⒉switch/case語句

switch/case語句的一般形式如下:

switch(表達式)

{ case常量表達式1:語句1;break;

case常量表達式2:語句2;break;

…… case常量表達式n:語句n;break;

default:語句n+1;

}第2章C51流程控制語句⒉switch/case語句15第2章

C51流程控制語句

例7.1:單片機P1口的P1.0和P1.1各接一個開關K1、K2,P1.4、P1.5、P1.6和P1.7各接一只發(fā)光二極管。有K1和K2的不同狀態(tài)來確定哪個發(fā)光二極管被點亮。K2K1亮的二極管00L101L210L311L4第2章C51流程控制語句 例7.1:單片機P1口的P1.016第2章

C51流程控制語句方法一:用if語句實現(xiàn)

#include“reg51.h” voidmain() { chara; a=P1; a=a&0x03; /*屏蔽高6位*/ if(a==0)P1=0x83;

elseif(a==1)P1=0x43;

elseif(a==2)P1=0x23;

elseP1=0x13;

}第2章C51流程控制語句方法一:用if語句實現(xiàn)17第2章

C51流程控制語句方法二:用switch/case語句實現(xiàn)

#include“reg51.h” voidmain() { chara; a=P1; a=a&0x03; /*屏蔽高6位*/ switch(a) { case0:P1=0x83;break;

case1:P1=0x43;break;

case2:P1=0x23;break;

case3:P1=0x13;

} }第2章C51流程控制語句方法二:用switch/case語18第2章

C51流程控制語句二、循環(huán)語句⒈if語句和goto語句

goto語句只能構(gòu)成簡單循環(huán),與if語句一起可以實現(xiàn)當型和直到型循環(huán)。 ⑴構(gòu)成當型循環(huán)

loop:if(表達式)

{語句

gotoloop;

} ⑵構(gòu)成直到型循環(huán)

loop:{語句

if(表達式)gotoloop;

}第2章C51流程控制語句二、循環(huán)語句19第2章

C51流程控制語句⒉while語句

while語句的一般格式:

while(表達式)語句⒊do-while語句

do-while語句一般格式:

do語句while(表達式);⒋for語句

for語句的一般形式:

for(表達式1;表達式2;表達式3)語句先計算表達式的值,若其值為非0,則執(zhí)行內(nèi)嵌語句(循環(huán)),若其值為0,則退出while循環(huán)。先執(zhí)行內(nèi)嵌的語句,若表達式的值為非0時,則循環(huán);當表達式的值為0時,則結(jié)束循環(huán),執(zhí)行do-while語句下面的語句。第2章C51流程控制語句⒉while語句先計算表達式的值20第2章

C51流程控制語句

舉例:例7.1的程序只能執(zhí)行一遍,先用循環(huán)程序使其無窮循環(huán)下去。用goto語句實現(xiàn)

#include“reg51.h” voidmain() { chara;

loop:

a=P1; a=a&0x03; /*屏蔽高6位*/ switch(a) { case0:P1=0x83;break;

case1:P1=0x43;break;

case2:P1=0x23;break;

case3:P1=0x13;

}

gotoloop;

}第2章C51流程控制語句 舉例:例7.1的程序只能執(zhí)行一遍21第2章

C51流程控制語句用while語句實現(xiàn)

#include“reg51.h” voidmain() { chara;

while(1) { a=P1; a=a&0x03; /*屏蔽高6位*/ switch(a) { case0:P1=0x83;break;

case1:P1=0x43;break;

case2:P1=0x23;break;

case3:P1=0x13;

}} }While中的條件恒為1,表示死循環(huán)。第2章C51流程控制語句用while語句實現(xiàn)While中的22第2章

C51流程控制語句用do-while語句實現(xiàn)

#include“reg51.h” voidmain() { chara;

do{ a=P1; a=a&0x03; /*屏蔽高6位*/ switch(a) { case0:P1=0x83;break;

case1:P1=0x43;break;

case2:P1=0x23;break;

case3:P1=0x13;

}}while(1); }While中的條件恒為1,表示死循環(huán)。第2章C51流程控制語句用do-while語句實現(xiàn)Whil23第2章

C51流程控制語句用for語句實現(xiàn)

#include“reg51.h” voidmain() {

chara;

for(;;)

{

a=P1;

a=a&0x03; /*屏蔽高6位*/

switch(a)

{

case0:P1=0x83;break;

case1:P1=0x43;break;

case2:P1=0x23;break;

case3:P1=0x13;

}

} }for中的條件恒為真,表示死循環(huán)。第2章C51流程控制語句用for語句實現(xiàn)for中的條件恒為24第3章

C51構(gòu)造數(shù)據(jù)類型一、數(shù)組⒈一維數(shù)組 ⑴一維數(shù)組的定義 類型說明符數(shù)組名[元素個數(shù)]; 如:inta[50]; ⑵一維數(shù)組的初始化

inta[5]={1,2,3,4,5};/*給全部元素賦值*/ intb[6]={1,2,6};/*給部分元素賦值*/ intd[10];d[0]=4;d[1]=-6;……/*定義完后再賦值*/第3章C51構(gòu)造數(shù)據(jù)類型一、數(shù)組25第3章

C51構(gòu)造數(shù)據(jù)類型⒉二維數(shù)組 ⑴二維數(shù)組的定義 類型說明符數(shù)組名[行數(shù)][列數(shù)]; 如:floata[3][4]; ⑵二維數(shù)組的初始化

inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

/*全部初始化*/ inta[3][4]={{1,2,3,4},{5,6,7,8},{}};

/*部分初始化,a[2][0]=a[2][1]=a[2][2]=a[2][3]=0*/ C51還可以定義多維數(shù)組,也可以定義字符型數(shù)組。 數(shù)組是十分有用的數(shù)據(jù)類型,用它可以形成容易查找的數(shù)據(jù)表格。第3章C51構(gòu)造數(shù)據(jù)類型⒉二維數(shù)組26第3章

C51構(gòu)造數(shù)據(jù)類型二、指針1.基于存儲器的指針 基于存儲器的指針是在說明一個指針時,指定它所指向的對象的存儲類型。一般占2字節(jié)。 例如:charxdata*px;

px為指向一個定義在xdata存儲器中的字符變量的指針變量。px本身在默認的存儲器區(qū)域(由編譯模式?jīng)Q定),其長度為2字節(jié)。 例如:charxdata*datapy;

py為指向一個定義在xdata存儲器中的字符變量的指針變量。py本身在RAM中,與編譯模式無關,其長度也為2字節(jié)。第3章C51構(gòu)造數(shù)據(jù)類型二、指針27第3章

C51構(gòu)造數(shù)據(jù)類型2.一般指針

不作特別申明的指針,即為一般指針。 如:char*pz; 這里沒有指定指針變量pz所指向的變量的存儲類型,pz處于編譯模式默認的存儲區(qū),長度為3字節(jié)。3個字節(jié)的含義如下:地址+0+1+2內(nèi)容存儲類型的編碼高位地址偏移量低位地址偏移量存儲類型idataxdatapdatadatacode編碼值12345例如:#defineXBYTE((unsignedchar*)0x20000L)XBYTE被定義為(unsignedchar*)0x20000L,它是一個一般指針,其存儲類型為2,即為xdata型,偏移量是0000,這樣,XBYTE成為指向外部數(shù)據(jù)存儲器的零地址單元的指針。而XBYTE[8000]則表示外部數(shù)據(jù)存儲器的0x8000單元。

第3章C51構(gòu)造數(shù)據(jù)類型2.一般指針地址+0+1+2內(nèi)容28第4章

C51函數(shù)一、函數(shù)的定義與分類⒈函數(shù)的分類 ⑴標準庫函數(shù) ⑵用戶自定義函數(shù)用戶自定義函數(shù)是用戶根據(jù)自己的需要而編寫的函數(shù)。從函數(shù)定義的形式上劃分:無參數(shù)函數(shù)、有參數(shù)函數(shù)和空函數(shù)。⒉函數(shù)的定義 返回值類型函數(shù)名(形式參數(shù)列表)

{

函數(shù)體

}

例如:intmax(intx,inty,intz) 返回值的數(shù)據(jù)類型為整型,函數(shù)名為max,x、y、z為3個整型入口參數(shù)。第4章C51函數(shù)一、函數(shù)的定義與分類29第4章

C51函數(shù)二、C51的庫函數(shù)

C51編譯器提供了豐富的庫函數(shù),使用這些庫函數(shù)大大提高了編程效率,用戶可以根據(jù)需要隨時調(diào)用。每個庫函數(shù)都在相應的頭文件中給出了函數(shù)的原型,使用時只需在源程序的開頭用編譯預處理命令#include將相關的頭文件包含進來即可。 例如,要進行絕對地址訪問,只需要在程序開頭使用#include“absacc.h”文件包含就可以了。要訪問SFR和SFR的位,則只需要在程序開頭使用#include“reg51.h”或#include“reg52.h”文件包含。第4章C51函數(shù)二、C51的庫函數(shù)30第5章

C51應用編程實例

例1:

外部中斷0引腳(P3.2)接一個開關,P1.0接一個發(fā)光二極管。開關閉合一次,發(fā)光二極管改變一次狀態(tài)。 本例解決外部中斷如何應用。

#include“reg51.h” #include“intrins.h” voiddelay(void)

{ inta=5000;

while(a--)_nop_();

} voidint_srv(void)interrupt0using1{ delay();

if(INT0==0)

{P10=!P10;while(INT0==0);} }延時程序0表示外部中斷01表示使用第1組寄存器第5章C51應用編程實例 例1:外部中斷0引腳(P331第5章C51應用編程實例 voidmain()

{P10=0;

EA=1;

EX0=1;while(1);

}

例2:從P1.0輸出方波信號,周期為50ms。設單片機的focs=6MHz。 本例解決定時器及其中斷的應用。

#include“reg51.h” voidmain(){ TMOD=0x01;

TH0=-12500/256;

TL0=-12500%256;

ET0=1;

EA=1;

TR0=1;

while(1);

}定時25ms第5章C51應用編程實例 voidmain()定時25m32第5章C51應用編程實例 voidT0_srv(void)interrupt1using1 { TH0=-12500/256;

TL0=-12500%256;

P10=!P10;

}

例3:如圖所示,單片機擴展可編程接口芯片8155,8155PA口控制8只發(fā)光二極管,形成走馬燈,每位點亮的時間為0.1秒。第5章C51應用編程實例 voidT0_srv(voi33第5章

C51應用編程實例8155的端口地址如下:命令口地址(COM8155): FEF8HPA口地址(PA8155): FEF9HPB口地址(PB8155): FEFAHPC口地址(PC8155): FEFBH #include“reg51.h” #include“absacc.h” #defineCOM8155XBYTE[0xfef8] #definePA8155XBYTE[0xfef9] voiddelay(void) /*延時1ms*/ { TH0=-500/256;

TL0=-500%256;

TR0=1;

while(!TF0);

TF0=0;

TR0=0;

}第5章C51應用編程實例8155的端口地址如下:34第5章

C51應用編程實例 main()

{ chari;

disp_word=0x01; /*從第1位開始點亮*/ COM8155=0x01; /*初始化8155*/ do{ PA8155=disp_word; /*輸出去點亮一位*/ for(i=0;i<100;i++) /*點亮0.1秒*/ {delay();}disp_word=disp_word<<1; /*左移控制字,準備點亮下一位*/if(disp_word==0)disp_word=0x01;

}whlie(1);

}第5章C51應用編程實例 main()35第5章

C51應用編程實例

例4:獨立鍵盤,用C語言實現(xiàn)。

第5章C51應用編程實例 例4:獨立鍵盤,用C語言實現(xiàn)。36第5章C51應用編程實例 #include“reg51.h” #include“absacc.h” voiddelay(void) /*延時1ms*/ { TH0=-500/256;

TL0=-500%256;

TR0=1;

while(!TF0);

TF0=0;

TR0=0;

}第5章C51應用編程實例 #include“reg5137第5章

C51應用編程實例main(){charx,i;

loop:x=P1;

x=x&0x0f;

if(x==0)gotoloop;

for(i=0;i<10;i++) /*延時10ms去抖動*/{delay();}x=P1;

x=x&0x0f;

if(x==0)gotoloop;

switch(x)

{case0x01:PBYTE[0x20]=PBYTE[0x20]+1;break; /*20單元加1*/case0x02:PBYTE[0x20]=PBYTE[0x20]-1;break; /*20單元減1*/case0x04:PBYTE[0x20]=0x00;break; /*20單元清0*/case0x08:PBYTE[0x20]=0xff; /*20單元置全1*/}gotoloop;}第5章C51應用編程實例main()38第5章

C51應用編程實例例5:動態(tài)顯示,用C語言實現(xiàn)。

首先掃描最后掃描第5章C51應用編程實例例5:動態(tài)顯示,用C語言實現(xiàn)。首39第5章

C51應用編程實例#include“reg51.h”#include“intrins.h”charcodedispdata[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};chardis_dat[4];voiddelay(void)/*延時1ms*/{TH0=-500/256;TL0=-500%256;TR0=1;while(!TF0);TF0=0;TR0=0;}第5章C51應用編程實例#include“reg51.40第5章

C51應用編程實例voiddisp(charch1) /*顯示函數(shù)*/{staticcharch=0x01;

P2=ch;

P1=dis_data[ch1];

ch=ch<<1;

if(ch==0x10)ch=0x01;

}main(){charch1;

TMOD=0x01;while(1)

{for(ch1=0;ch1<4;ch1++)/*對四位LED掃描一遍*/{disp(ch1);

delay();

}delay();

delay();

}}第5章C51應用編程實例voiddisp(charch41第5章C51應用編程實例

例6:如圖所示,對8個通道輪流采集一次,采集的結(jié)果放在數(shù)組ad中。通道地址:78H~7FH第5章C51應用編程實例 例6:如圖所示,對8個通道輪流采42第5章

C51應用編程實例#include“reg51.h”#include“absacc.h”sbitad_busy=P3^2;main(){ staticcharidataad[8];

chari;

charpdata*ad_ch;

ad_chl=0x78; /*設置初始通道地址*/ for(i=0;i<8;i++)

{ *ad_chl=0;

/*啟動A/D轉(zhuǎn)換*/ i=i; /*等待EOC信號變低*/ i=i;

while(ad_busy==1); /*查詢*/ ad[i]=*ad_chl; /*存放結(jié)果*/ ad_chl++;

}}第5章C51應用編程實例#include“reg51.h43第5章

C51應用編程實例例7:如圖所示,將AD574的轉(zhuǎn)換結(jié)果放入單片機片內(nèi)單元中。啟動A/D地址:00H讀高8位地址:01H讀低4位地址:03H第5章C51應用編程實例例7:如圖所示,將AD574的轉(zhuǎn)換44第5章

C51應用編程實例#include“reg51.h”#include“absacc.h”#defineADCOMPBYTE[0x00]#defineADLOPBYTE[0x03]#defineADHIPBYTE[0x01]sbitad_busy=P3^2;main(){ intidataresult;

ADCOM=0; /*啟動A/D轉(zhuǎn)換*/ while(ad_buy==1); /*查詢*/ result=(int)(ADHI)*256+((ADLO>>4)&0x0f));

/*存結(jié)果*/}第5章C51應用編程實例#include“reg51.h45第5章

C51應用編程實例

例8:如圖所示,要求DAC0832輸出鋸齒波電壓信號,信號周期自由,用C語言寫出相應程序。用Q7作選擇信號,口地址:7FH第5章C51應用編程實例 例8:如圖所示,要求DAC08346第5章

C51應用編程實例#include“reg51.h”#include“absacc.h”#defineDA0832PBYTE[0x7f]main(){ chari;

do{ for(i=0;i<255;i++)

{DAC0832=i;} }while(1);}第5章C51應用編程實例#include“reg51.h47小結(jié)掌握C51的數(shù)據(jù)類型、C51的數(shù)據(jù)存儲類型、C51的存儲模式、C51對SFR的定義、C51對位變量的定義,在這些方面與標準C語言有很大不同,至于其他規(guī)則與標準C語言是基本一致的;了解C51的庫函數(shù);學習時應與匯編語言與標準C語言的程序?qū)φ掌饋?,特別強調(diào)C51如何操作基本I/O口、擴展I/O口,如何進行位操作和對特殊功能寄存器的操作,掌握C51下定時器/計數(shù)器的應用及中斷的使用方法。小結(jié)48謝謝!謝謝!49單片機C51教學課件50第1章C51數(shù)據(jù)類型與運算一、C51數(shù)據(jù)類型C51數(shù)據(jù)類型與標準C數(shù)據(jù)類型的最大不同之處:位型。位型(bit)字符型(char)整型(int)長整型(long)浮點型(float)雙精度浮點型(double)數(shù)組類型(array)結(jié)構(gòu)體類型(struct)共用體(union)枚舉(enum)基本類型構(gòu)造類型指針類型空類型數(shù)據(jù)類型第1章C51數(shù)據(jù)類型與運算一、C51數(shù)據(jù)類型位型(bit)51第1章C51數(shù)據(jù)類型與運算C51數(shù)據(jù)類型的取值范圍:數(shù)據(jù)類型長度(bit)長度(byte)值域范圍bit1——0,1unsignedchar810~255signedchar81–128~127unsignedint1620~65535signedint162–32768~32767unsignedfloat3240~4294967295signedfloat324–2147483648~2147483647float324±1.176E-38~±3.40E+38(6位數(shù)字)double648±1.176E-38~±3.40E+38(10位數(shù)字)一般指針243存儲空間0~65535第1章C51數(shù)據(jù)類型與運算C51數(shù)據(jù)類型的取值范圍:數(shù)據(jù)類52第1章C51數(shù)據(jù)類型與運算二、C51數(shù)據(jù)存儲類型1.C51存儲類型與MCS-51單片機存儲空間的對應關系

存儲類型與存儲空間的對應關系data直接尋址片內(nèi)數(shù)據(jù)存儲區(qū),訪問速度快(128字節(jié))bdata可位尋址片內(nèi)數(shù)據(jù)存儲區(qū),允許位與字節(jié)混合訪問(16字節(jié))idata間接尋址片內(nèi)數(shù)據(jù)存儲區(qū),可訪問片內(nèi)全部RAM地址空間(256字節(jié))pdata分頁尋址片外數(shù)據(jù)存儲區(qū)(256字節(jié)),由MOVXRi訪問xdata尋址片外數(shù)據(jù)存儲區(qū)(64K字節(jié)),有MOVXDPTR訪問code尋址代碼存儲區(qū)(64K字節(jié)),有MOVCDPTR訪問第1章C51數(shù)據(jù)類型與運算二、C51數(shù)據(jù)存儲類型存儲類53第1章C51數(shù)據(jù)類型與運算2.C51存儲類型及其大小和值域存儲類型長度(bit)長度(byte)值域范圍data810~255idata810~255pdata810~255xdata1620~65535code1620~65535第1章C51數(shù)據(jù)類型與運算2.C51存儲類型及其大小和值54第1章C51數(shù)據(jù)類型與運算3.51單片機的存儲模式

存儲模式說明SMALL

參數(shù)及局部變量放入可直接尋址的片內(nèi)存儲器(最大128字節(jié),默認存儲類型是data),因此訪問十分方便。另外所有對象,包括棧,都必須嵌入片內(nèi)RAM。棧長很關鍵,因為實際棧長依賴于不同函數(shù)的嵌套層數(shù)COMPACT

參數(shù)及局部變量放入分頁片外存儲區(qū)(最大256字節(jié),默認的存儲類型是pdata),通過寄存器R0和R1間接尋址,??臻g位于內(nèi)部數(shù)據(jù)存儲區(qū)中LARGE

參數(shù)及局部變量直接放入片外數(shù)據(jù)存儲區(qū)(最大64KB,默認存儲類型為xdata),使用數(shù)據(jù)指針DPTR來進行尋址。用此數(shù)據(jù)指針訪問的效率較低,尤其是對二個或多個字節(jié)的變量,這種數(shù)據(jù)類型的訪問機制直接影響代碼的長度,另一不方便之處在于這種數(shù)據(jù)指針不能對稱操作第1章C51數(shù)據(jù)類型與運算3.51單片機的存儲模式存儲模55第1章C51數(shù)據(jù)類型與運算三、C51定義SFR定義方法:兩個關鍵字:sfr和sbit1.定義特殊功能寄存器用sfr例如:sfrPSW=0xD0;/*定義程序狀態(tài)字PSW的地址為D0H*/sfrTMOD=0x89;/*定義定時器/計數(shù)器方式控制寄存器TMOD的地址為89H*/sfrP1=0x90;/*定義P1口的地址為90H*/2.定義可位尋址的特殊功能寄存器的位用sbit例如:sbitCY=0xD7;/*定義進位標志CY的地址為D7H*/sbitAC=0xD0^6;/*定義輔助進位標志AC的地址為D6H*/sbitRS0=0xD0^3;/*定義RS0的地址為D3H*/第1章C51數(shù)據(jù)類型與運算三、C51定義SFR56第1章C51數(shù)據(jù)類型與運算標準SFR在reg51.h、reg52.h等頭文件中已經(jīng)被定義,只要用文件包含做出申明即可使用。例如:#include”reg51.h”sbitP10=P1^0;sbitP12=P1^2;main(){P10=1;P12=0;PSW=0x08;……}第1章C51數(shù)據(jù)類型與運算標準SFR在reg51.h、re57第1章

C51數(shù)據(jù)類型與運算四、C51定義并行口

單片機內(nèi)部并行口用sfr定義,外部并行口的定義如何定義?用指針定義,指針的定義在absacc.h頭文件中例如:#include“absacc.h”#definePAXBYTE[0xffec]main(){PA=0x3A;/*將數(shù)據(jù)3AH寫入地址為0xffec的存儲單元或I/O端口*/}XBYTE是一個指針,它將PA定義為一個外部并行口,其地址是FFECH。第1章C51數(shù)據(jù)類型與運算四、C51定義并行口XBYTE58第1章

C51數(shù)據(jù)類型與運算五、C51定義位變量 使用關鍵字bit

例如:

bitlock;/*將lock定義為位變量*/ bitdirention;/*將direction定義為位變量*/

注意:不能定義位變量指針;也不能定義位變量數(shù)組。第1章C51數(shù)據(jù)類型與運算五、C51定義位變量59第1章

C51數(shù)據(jù)類型與運算六、C51運算符、表達式及其規(guī)則

1.算術運算符 +——加法運算符 -——減法運算符 *——乘法運算符 /——除法運算符 %——模運算或取余運算符 ++——為自增運算符 --——為自減運算符。⒉關系運算符 <——小于 <=——小于等于 >——大于 >=——大于等于 ==——等于 ?。健坏扔赿ouble←floatint←charlongunsigned高低這四個運算符的優(yōu)先級相同,處于高優(yōu)先級這兩個運算符的優(yōu)先級相同,處于低優(yōu)先級第1章C51數(shù)據(jù)類型與運算六、C51運算符、表達式及其規(guī)則60⒊邏輯運算符

&&——邏輯與

||——邏輯或 !——邏輯非⒋位運算符

&——按位與 相當于ANL指令

|——按位或 相當于ORL指令 ^——按位異或 相當于XRL指令 ~——按位取反 相當于CPL指令

<<——左移 相當于RL指令

>>——右移 相當于RR指令⒊邏輯運算符61⒌賦值運算符

賦值運算符就是賦值符號“=”⒍復合賦值運算符

十種:+=,-=,*=,/=,%=,

﹠=,︱=,^=,<<=,>>=。按優(yōu)先級順序結(jié)合運算。例如:a+=b等價于a=(a+b)x*=a+b等價于x=(x*(a+b))a&=b等價于a=(a&b)a<<=4等價于a=(a<<4)⒌賦值運算符62第2章

C51流程控制語句

一、選擇語句1.if語句以下三種形式:if(表達式){語句;}if(表達式){語句1;}else{語句2;}if(表達式1){語句1;} elseif(表達式2){語句2;} elseif(表達式3){語句3;} …… elseif(表達式n){語句n;} else{語句n+1;}第2章C51流程控制語句一、選擇語句63第2章

C51流程控制語句例1: if(p1!=0) {c=20;}例2: if(p1!=0) {c=20;} else {c=0;}例3: if(a>=1){c=10;} elseif(a>=2){c=20;} elseif(a>=3){c=30;} elseif(a>=4){c=40;} else{c=0;}第2章C51流程控制語句例1: if(p1!=0)64第2章

C51流程控制語句⒉switch/case語句

switch/case語句的一般形式如下:

switch(表達式)

{ case常量表達式1:語句1;break;

case常量表達式2:語句2;break;

…… case常量表達式n:語句n;break;

default:語句n+1;

}第2章C51流程控制語句⒉switch/case語句65第2章

C51流程控制語句

例7.1:單片機P1口的P1.0和P1.1各接一個開關K1、K2,P1.4、P1.5、P1.6和P1.7各接一只發(fā)光二極管。有K1和K2的不同狀態(tài)來確定哪個發(fā)光二極管被點亮。K2K1亮的二極管00L101L210L311L4第2章C51流程控制語句 例7.1:單片機P1口的P1.066第2章

C51流程控制語句方法一:用if語句實現(xiàn)

#include“reg51.h” voidmain() { chara; a=P1; a=a&0x03; /*屏蔽高6位*/ if(a==0)P1=0x83;

elseif(a==1)P1=0x43;

elseif(a==2)P1=0x23;

elseP1=0x13;

}第2章C51流程控制語句方法一:用if語句實現(xiàn)67第2章

C51流程控制語句方法二:用switch/case語句實現(xiàn)

#include“reg51.h” voidmain() { chara; a=P1; a=a&0x03; /*屏蔽高6位*/ switch(a) { case0:P1=0x83;break;

case1:P1=0x43;break;

case2:P1=0x23;break;

case3:P1=0x13;

} }第2章C51流程控制語句方法二:用switch/case語68第2章

C51流程控制語句二、循環(huán)語句⒈if語句和goto語句

goto語句只能構(gòu)成簡單循環(huán),與if語句一起可以實現(xiàn)當型和直到型循環(huán)。 ⑴構(gòu)成當型循環(huán)

loop:if(表達式)

{語句

gotoloop;

} ⑵構(gòu)成直到型循環(huán)

loop:{語句

if(表達式)gotoloop;

}第2章C51流程控制語句二、循環(huán)語句69第2章

C51流程控制語句⒉while語句

while語句的一般格式:

while(表達式)語句⒊do-while語句

do-while語句一般格式:

do語句while(表達式);⒋for語句

for語句的一般形式:

for(表達式1;表達式2;表達式3)語句先計算表達式的值,若其值為非0,則執(zhí)行內(nèi)嵌語句(循環(huán)),若其值為0,則退出while循環(huán)。先執(zhí)行內(nèi)嵌的語句,若表達式的值為非0時,則循環(huán);當表達式的值為0時,則結(jié)束循環(huán),執(zhí)行do-while語句下面的語句。第2章C51流程控制語句⒉while語句先計算表達式的值70第2章

C51流程控制語句

舉例:例7.1的程序只能執(zhí)行一遍,先用循環(huán)程序使其無窮循環(huán)下去。用goto語句實現(xiàn)

#include“reg51.h” voidmain() { chara;

loop:

a=P1; a=a&0x03; /*屏蔽高6位*/ switch(a) { case0:P1=0x83;break;

case1:P1=0x43;break;

case2:P1=0x23;break;

case3:P1=0x13;

}

gotoloop;

}第2章C51流程控制語句 舉例:例7.1的程序只能執(zhí)行一遍71第2章

C51流程控制語句用while語句實現(xiàn)

#include“reg51.h” voidmain() { chara;

while(1) { a=P1; a=a&0x03; /*屏蔽高6位*/ switch(a) { case0:P1=0x83;break;

case1:P1=0x43;break;

case2:P1=0x23;break;

case3:P1=0x13;

}} }While中的條件恒為1,表示死循環(huán)。第2章C51流程控制語句用while語句實現(xiàn)While中的72第2章

C51流程控制語句用do-while語句實現(xiàn)

#include“reg51.h” voidmain() { chara;

do{ a=P1; a=a&0x03; /*屏蔽高6位*/ switch(a) { case0:P1=0x83;break;

case1:P1=0x43;break;

case2:P1=0x23;break;

case3:P1=0x13;

}}while(1); }While中的條件恒為1,表示死循環(huán)。第2章C51流程控制語句用do-while語句實現(xiàn)Whil73第2章

C51流程控制語句用for語句實現(xiàn)

#include“reg51.h” voidmain() {

chara;

for(;;)

{

a=P1;

a=a&0x03; /*屏蔽高6位*/

switch(a)

{

case0:P1=0x83;break;

case1:P1=0x43;break;

case2:P1=0x23;break;

case3:P1=0x13;

}

} }for中的條件恒為真,表示死循環(huán)。第2章C51流程控制語句用for語句實現(xiàn)for中的條件恒為74第3章

C51構(gòu)造數(shù)據(jù)類型一、數(shù)組⒈一維數(shù)組 ⑴一維數(shù)組的定義 類型說明符數(shù)組名[元素個數(shù)]; 如:inta[50]; ⑵一維數(shù)組的初始化

inta[5]={1,2,3,4,5};/*給全部元素賦值*/ intb[6]={1,2,6};/*給部分元素賦值*/ intd[10];d[0]=4;d[1]=-6;……/*定義完后再賦值*/第3章C51構(gòu)造數(shù)據(jù)類型一、數(shù)組75第3章

C51構(gòu)造數(shù)據(jù)類型⒉二維數(shù)組 ⑴二維數(shù)組的定義 類型說明符數(shù)組名[行數(shù)][列數(shù)]; 如:floata[3][4]; ⑵二維數(shù)組的初始化

inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

/*全部初始化*/ inta[3][4]={{1,2,3,4},{5,6,7,8},{}};

/*部分初始化,a[2][0]=a[2][1]=a[2][2]=a[2][3]=0*/ C51還可以定義多維數(shù)組,也可以定義字符型數(shù)組。 數(shù)組是十分有用的數(shù)據(jù)類型,用它可以形成容易查找的數(shù)據(jù)表格。第3章C51構(gòu)造數(shù)據(jù)類型⒉二維數(shù)組76第3章

C51構(gòu)造數(shù)據(jù)類型二、指針1.基于存儲器的指針 基于存儲器的指針是在說明一個指針時,指定它所指向的對象的存儲類型。一般占2字節(jié)。 例如:charxdata*px;

px為指向一個定義在xdata存儲器中的字符變量的指針變量。px本身在默認的存儲器區(qū)域(由編譯模式?jīng)Q定),其長度為2字節(jié)。 例如:charxdata*datapy;

py為指向一個定義在xdata存儲器中的字符變量的指針變量。py本身在RAM中,與編譯模式無關,其長度也為2字節(jié)。第3章C51構(gòu)造數(shù)據(jù)類型二、指針77第3章

C51構(gòu)造數(shù)據(jù)類型2.一般指針

不作特別申明的指針,即為一般指針。 如:char*pz; 這里沒有指定指針變量pz所指向的變量的存儲類型,pz處于編譯模式默認的存儲區(qū),長度為3字節(jié)。3個字節(jié)的含義如下:地址+0+1+2內(nèi)容存儲類型的編碼高位地址偏移量低位地址偏移量存儲類型idataxdatapdatadatacode編碼值12345例如:#defineXBYTE((unsignedchar*)0x20000L)XBYTE被定義為(unsignedchar*)0x20000L,它是一個一般指針,其存儲類型為2,即為xdata型,偏移量是0000,這樣,XBYTE成為指向外部數(shù)據(jù)存儲器的零地址單元的指針。而XBYTE[8000]則表示外部數(shù)據(jù)存儲器的0x8000單元。

第3章C51構(gòu)造數(shù)據(jù)類型2.一般指針地址+0+1+2內(nèi)容78第4章

C51函數(shù)一、函數(shù)的定義與分類⒈函數(shù)的分類 ⑴標準庫函數(shù) ⑵用戶自定義函數(shù)用戶自定義函數(shù)是用戶根據(jù)自己的需要而編寫的函數(shù)。從函數(shù)定義的形式上劃分:無參數(shù)函數(shù)、有參數(shù)函數(shù)和空函數(shù)。⒉函數(shù)的定義 返回值類型函數(shù)名(形式參數(shù)列表)

{

函數(shù)體

}

例如:intmax(intx,inty,intz) 返回值的數(shù)據(jù)類型為整型,函數(shù)名為max,x、y、z為3個整型入口參數(shù)。第4章C51函數(shù)一、函數(shù)的定義與分類79第4章

C51函數(shù)二、C51的庫函數(shù)

C51編譯器提供了豐富的庫函數(shù),使用這些庫函數(shù)大大提高了編程效率,用戶可以根據(jù)需要隨時調(diào)用。每個庫函數(shù)都在相應的頭文件中給出了函數(shù)的原型,使用時只需在源程序的開頭用編譯預處理命令#include將相關的頭文件包含進來即可。 例如,要進行絕對地址訪問,只需要在程序開頭使用#include“absacc.h”文件包含就可以了。要訪問SFR和SFR的位,則只需要在程序開頭使用#include“reg51.h”或#include“reg52.h”文件包含。第4章C51函數(shù)二、C51的庫函數(shù)80第5章

C51應用編程實例

例1:

外部中斷0引腳(P3.2)接一個開關,P1.0接一個發(fā)光二極管。開關閉合一次,發(fā)光二極管改變一次狀態(tài)。 本例解決外部中斷如何應用。

#include“reg51.h” #include“intrins.h” voiddelay(void)

{ inta=5000;

while(a--)_nop_();

} voidint_srv(void)interrupt0using1{ delay();

if(INT0==0)

{P10=!P10;while(INT0==0);} }延時程序0表示外部中斷01表示使用第1組寄存器第5章C51應用編程實例 例1:外部中斷0引腳(P381第5章C51應用編程實例 voidmain()

{P10=0;

EA=1;

EX0=1;while(1);

}

例2:從P1.0輸出方波信號,周期為50ms。設單片機的focs=6MHz。 本例解決定時器及其中斷的應用。

#include“reg51.h” voidmain(){ TMOD=0x01;

TH0=-12500/256;

TL0=-12500%256;

ET0=1;

EA=1;

TR0=1;

while(1);

}定時25ms第5章C51應用編程實例 voidmain()定時25m82第5章C51應用編程實例 voidT0_srv(void)interrupt1using1 { TH0=-12500/256;

TL0=-12500%256;

P10=!P10;

}

例3:如圖所示,單片機擴展可編程接口芯片8155,8155PA口控制8只發(fā)光二極管,形成走馬燈,每位點亮的時間為0.1秒。第5章C51應用編程實例 voidT0_srv(voi83第5章

C51應用編程實例8155的端口地址如下:命令口地址(COM8155): FEF8HPA口地址(PA8155): FEF9HPB口地址(PB8155): FEFAHPC口地址(PC8155): FEFBH #include“reg51.h” #include“absacc.h” #defineCOM8155XBYTE[0xfef8] #definePA8155XBYTE[0xfef9] voiddelay(void) /*延時1ms*/ { TH0=-500/256;

TL0=-500%256;

TR0=1;

while(!TF0);

TF0=0;

TR0=0;

}第5章C51應用編程實例8155的端口地址如下:84第5章

C51應用編程實例 main()

{ chari;

disp_word=0x01; /*從第1位開始點亮*/ COM8155=0x01; /*初始化8155*/ do{ PA8155=disp_word; /*輸出去點亮一位*/ for(i=0;i<100;i++) /*點亮0.1秒*/ {delay();}disp_word=disp_word<<1; /*左移控制字,準備點亮下一位*/if(disp_word==0)disp_word=0x01;

}whlie(1);

}第5章C51應用編程實例 main()85第5章

C51應用編程實例

例4:獨立鍵盤,用C語言實現(xiàn)。

第5章C51應用編程實例 例4:獨立鍵盤,用C語言實現(xiàn)。86第5章C51應用編程實例 #include“reg51.h” #include“absacc.h” voiddelay(void) /*延時1ms*/ { TH0=-500/256;

TL0=-500%256;

TR0=1;

while(!TF0);

TF0=0;

TR0=0;

}第5章C51應用編程實例 #include“reg5187第5章

C51應用編程實例main(){charx,i;

loop:x=P1;

x=x&0x0f;

if(x==0)gotoloop;

for(i=0;i<10;i++) /

溫馨提示

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

評論

0/150

提交評論