第6789次課第3章C51語言編程基礎課件_第1頁
第6789次課第3章C51語言編程基礎課件_第2頁
第6789次課第3章C51語言編程基礎課件_第3頁
第6789次課第3章C51語言編程基礎課件_第4頁
第6789次課第3章C51語言編程基礎課件_第5頁
已閱讀5頁,還剩207頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第6次課主要內容:編程語言KeilC51

C51語言的數據類型(背住)數據類型的定義方法(背住)數據類型編程(掌握)第6次課主要內容:第3章C51語言編程基礎第3章C51語言編程基礎1)機器語言定義:處理器能直接執行的二進制代碼特點:效率高、但不易于使用10110110000000001011010100000000ADDA,#193.1編程語言KeilC51簡介1、編程語言2)匯編語言

定義:以助記符的形式表示機器語言特點:速度快、體積小、但依賴于硬件體系1)機器語言1011011000000000ADD3)高級語言獨立于機器、面向過程的、接近于人的自然語言。語言:FORTRAN、C語言、JAVA特點:與硬件無關、易于交流和使用、運行效率低X=X+1;編譯器鏈接器X=X+1;…………程序員1001001010110010……高級語言程序機器碼單片機如何執行程序指令?3)高級語言X=X+1;編譯器X=X+1;程KeilC51語言是在標準C的基礎上,針對51單片機的硬件特點進行擴展,并向51單片機上移植的高效、簡潔的實用高級語言。

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

bit變量名;格式:例如:bitflag;flag=0;畫板書2)C51擴展的數據類型(4種擴展的數據類型)(1)位變量b(2)特殊功能寄存器sfr

地址單元80H—FFH之間的片內數據存儲區;

“sfr”

數據類型占用一個內存單元;利用它可以訪問51單片機內部的所有特殊功能寄存器。sfrP1=0x90;//定義了P1口寄存器,地址為0x90;P1=0xff;//把P1寄存器的值置為0xff,

//P1口的所有輸出引腳設置為高電平。例如sfr寄存器變量名=字節地址常數;格式:※重點、難點、熟練掌握畫板書字節地址?(2)特殊功能寄存器sfrsfrP1=0x90P10x90變量名地址0xff存儲器sfrP1=0x90;//定義了P1口寄存器,地址為0x90;P1=0xff;//把P1寄存器的值置為0xff,

//P1口的所有輸出引腳設置為高電平。畫板書P10x90變量名地址0xff存儲器sfrP1=第6789次課第3章C51語言編程基礎課件sfrP2=0xA0;P2=0xA0;思考:sfrP2=0xA0;思考:sfrSBUF=0x99;習題1:往串行發送數據緩沖寄存器SBUF寫入80SBUF=80;習題2:從P0口寄存器讀取數據,存放到任意一個變量X。sfrP0=0x80;charx;x=P0;※難點、掌握sfrSBUF=0x99;習題1:往串行發送例如:(3)特殊功能寄存器sfr16“sfr16”數據類型占兩個內存單元;用于操作占兩個字節的特殊功能寄存器。sfr16DPTR=0x82;//定義了片內16位數據指針寄存器DPTR,

//低8位字節地址為82H,

//高8位字節地址為83H。DPTR=0x1234;sfr16寄存器變量名=字節地址常數;格式:字節地址為82H、83H存放的數據分別是多少?例如:(3)特殊功能寄存器sfr16sfr16DPTR(4)特殊功能位sbit

片內特殊功能寄存器的可尋址位。“^”前是特殊功能寄存器的名字;“^”的后面數字是特殊功能寄存器可尋址位在寄存器中的位置,取值必須是0-7。①sbit位變量名=特殊功能寄存器^位位置;格式:sfrPSW=0xd0; //定義PSW寄存器地址為0xd0sbitFO=PSW^5; //定義F0位為PSW.5F0=0;例如:(4)特殊功能位sbit“^”前是特殊功能寄存器的名字;①程序狀態字寄存器PSW

PSW的不同位表明程序運行的狀態。程序狀態字寄存器PSWPSW的不同位表明程序運行的狀態。習題3:片內I/O口P1口的P1.0尋址位置成高電平sfr P1=0x90;

sbitP1_0=P1^0;

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

sbitP2_7=P2^7;

bitx;

x=P2_7;※難點習題3:片內I/O口P1口的P1.0尋址位置成高電平sbit位變量名

=位地址常數;

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

…}例如:格式:格式:③sbit位變量名=字節地址^位位置;sbitP1_0=0x90^0;

P1_0=1;sbit位變量名=位地址常數;sbitC習題5:片內I/O口P1口的P1.0尋址位置成低電平sbitP1_0=0x90;P1_0=0;在頭文件AT89X51.h或者reg1.h中定義了常用的特殊功能寄存器和可尋址位。#include<AT89X51.h>sfr P1=0x90;

sbitP1_0=0x90;

兩者區別?習題5:片內I/O口P1口的P1.0尋址位置成低電平sbit數據類型區別、及其作用。bitsfrsfr16sbit討論數據類型區別、及其作用。討論第7次課主要內容:數據存儲類型絕對宏及程序習題_at_關鍵字及程序習題第7次課主要內容:3)數據存儲類型

數據存儲類型是指數據存放在51單片機的哪一個存儲器空間,不同的存儲器空間,尋址方式不同,訪問速度不同。P463)數據存儲類型數據存儲類型是指數據存放在51單片機bdatadataidatapdataxdatacode畫板書※重點、記住bdatadataidatapdataxdatacode畫板(1)DATA區。

DATA區指片內RAM的低128字節的空間,可直接尋址;尋址是最快的,應該把經常使用的變量放在DATA區。unsignedchardatasystem_status=0;unsignedintdataunit_id[8];例如:格式:

數據類型

【存儲類型】

變量名;(1)DATA區。unsignedchardata(2)BDATA區。

BDATA區是內部RAM可位尋址的16字節存儲區(字節地址為20H

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

unsignedintbdatastatus_word;

sbitstat_flag=status_byte^4;

if(status_word^15) {stat_flag=1;

}(2)BDATA區。例如: unsignedchar(3)IDATA區。

IDATA區是片內RAM的0-256字節的存儲區,只能間接尋址,速度比直接尋址慢。 unsignedcharidatasystem_status=0; floatidatavalue;

例如:(3)IDATA區。 unsignedchar(4)PDATA區和XDATA區。

PDATA區和XDATA區位于片外存儲區;

PDATA區指的是外部數據存儲區0—256字節。

XDATA區指的是外部數據區64KB內的任何地址。 unsignedcharxdatasystem_status=0; unsignedintpdatauint_id[8];例如:(4)PDATA區和XDATA區。 unsignedcha(5)程序存儲區CODE。

CODE區是程序存儲區,儲存的數據是不可改變的。unsignedcharcodea[9]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};例如:(5)程序存儲區CODE。unsignedcharcod4)數據存儲模式C51編譯器設定的存儲模式:

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

NRAM=0x01;}/*數據3DH寫入地址0xFFC0的外部I/OPORTE*//*將數據01H寫入片內RAM的40H單元*/※難點例題,片內RAM、片外RAM定義的程序如下:main(習題6使用絕對宏將片內RAM20H的字節地址單元全部置1。#include<absacc.h>#defineMDBYTE[0x0020] /*將M定義為內部RAM,地址為0x0020*/main(){ M=0xff;}習題6使用絕對宏將片內RAM20H的字節地址單元全部置習題7使用絕對宏讀取片外RAMF000H字節地址單元的內容。#include<absacc.h>#defineWRAMXBYTE[0xF000] main(){charx;

x=WRAM;}習題7使用絕對宏讀取片外RAMF000H字節地址單元的使用關鍵字_at_可對指定的存儲器空間的絕對地址進行訪問。格式:

[存儲類型]數據類型變量名_at_地址常數;地址常數:指定變量的絕對地址,位于存儲器空間之內;使用_at_定義的變量必須為全局變量。板書※重點2)_at_關鍵字地址常數:指定變量的絕對地址,位于存儲器空間之內;板書※重例題使用關鍵字_at_實現絕對地址的訪問。dataunsignedchary1_at_0x50;/*在data區定義字節變量

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

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

……while(1);}例題使用關鍵字_at_實現絕對地址的訪問。習題8使用關鍵字_at_讀取片內RAM60H單元的內容。dataunsignedcharM_at_0x60;voidmain(void){unsignedchary;y=M;}習題8使用關鍵字_at_讀取片內RAM60H單元例題使用關鍵字_at_將片外RAM2000H開始的連續20個字節單元清0。voidmain(void){unsignedchari;

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

}}xdataunsignedcharbuffer[20]_at_0x2000;程序記憶1※重點例題voidmain(void)xdataunsignedataunsignedcharbuffer[8]_at_0x40;voidmain(void){unsignedcharj;for(j=0;j<8;j++){ buffer[j]=0;

}}習題9:使用關鍵字_at_把片內RAM40H單元開始的8個單元內容清0。dataunsignedcharbuffer[8]_第8次課主要內容:C51的基本運算

C51的二分支結構

C51語言單詞、語法熟記,程序設計第8次課主要內容:C51語言的基本運算與標準C類似,主要包括算術運算、關系運算、邏輯運算、位運算和賦值運算及其表達式等。1)算術運算符3、C51的基本運算※重點C51語言的基本運算與標準C類似,主要包括算術運算、關系運算讀程序,z值是多少?charx,y,z;

x=60;y=40;z=x/y;x=10;y=4;z=x%y;z=x/y;x=100;y=10;z=x*y;讀程序,z值是多少?x=60;x=10;x有一個任意2位數,求出個位數、十位數。編程實現。例題intc;chargw,sw;c=52;gw=c%10;sw=c/10;有一個任意2位數,求出個位數、十位數。編程實現。例題int習題10有一個任意3位數,求出個位數、十位數、百位數。編程實現。gw=c%10;sw=(c/10)%10;bw=c/100;intc;chargw,sw,bw;c=851;※難點習題10gw=c%10;intc;※難2)關系運算符關系表達式intx=3;inty=6;intR;R=x>y;2)關系運算符關系表達式intx=3;R=x>3)邏輯運算符邏輯表達式intx=1;inty=1;intR=0;R=x&&y;3)邏輯運算符邏輯表達式intx=1;R=x&&10<X<100,編程語句。X<100或者X>1000,編程語句。判斷X是否能被3整除的整數,編程語句。(X>10)&&(X<100)(X<100)||(x>1000)0==(X%3)判斷X是否能被3整除卻不能被6整除的整數,編程語句。(0==(X%3))&&(0!=(X%6))10<X<100,編程語句。X<100或者X>100本次課暫不做,習題11求100到1000之間,能被100整除不能被3整除的整數,編程語句。本次課暫不做,習題114)位運算符01001000&1111111100001000>>26<<301001001|11111111charx=65;x=~x;※重點4)位運算符01001000&11111111000000000001&0011011101000000|0000000100001000<<332>>4習題12(9<<3)|(1<<1)(1<<4)|(1<<2)|(1<<1)0xF0|0x010xFF&0x1000000001&0011011101000000|綜合例題

以字節操作方式對P1口的P1.5清0,P1.1置為1,其他位保持不變。XX0XXX1XP1.5P1.1P1.0綜合例題XX0XXX1XP1.5P1.1P1.0第6789次課第3章C51語言編程基礎課件綜合例題

以字節操作方式對P1口的P1.5清0,P1.1置為1,其他位保持不變。XX0XXX1XP1.5P1.1sfrP1=0x90;P1=(P1&0xDF)│0x02;P1.0綜合例題XX0XXX1XP1.5P1.1sfrsfrP2=0xA0;P2=P2

|0x10;綜合習題11以字節操作方式,把P2口的P2.4位置成1,其它位保持不變。sfrP2=0xA0;綜合習題11sfrP0=0x80;Bitflag;flag=P0&0x40;綜合習題12

以字節操作方式,讀取P0口的P0.6位是否為1?sfrP0=0x80;綜合習題124、C51的分支與循環程序結構程序結構分為三類:順序結構、分支結構、循環結構。1)分支結構控制語句格式二分支if語句if(表達式){語句;}4、C51的分支與循環程序結構程序結構分為三類:順序結構、if(x>y){max=x;}比較變量x和變量y,如果x>y,則把x賦給變量max。習題13比較變量x和變量y,如果x和y相等,則把0賦給變量max。if(x==y){max=0;}if(x>y){max=x;}比較變量x和變量y格式:if(表達式){語句1;}

else{語句2;}

格式:if(表達式)if(x>y){max=x;}else{max=y;}比較變量x和變量y,如果x>y,則把x賦給變量max;否則把y賦給變量max。if(x>y)比較變量x和變量y,如果x>y,例題14,說明下列語句的作用if(x>y){m=y;}else{m=x;}比較變量x和變量y,把二者最小值賦給變量m例題14,說明下列語句的作用if(x>y)比較變量習題15如果變量x滿足關系10<x<20,則把變量y置成1;否則把y置成0。if((x>10)&&(x<20)){ y=1;}else{y=0;}習題15if((x>10)&&(x<20))sfrP2=0xA0;

sfrP1=0x90;

sbitP24=P2^4;

sbitP10=P1^0;綜合習題16如果讀取P2口的P2.4位為1,則把P1口的P1.0置成0。voidmain(){

if(1==P24){P10=0;

}}sfrP2=0xA0;綜合習題16voidif(表達式1)

語句1;elseif(表達式2)

語句2;…

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

表達式2

表達式n語句n+100語句n

語句2

語句1

非0

非0

非0…

if(表達式1)語句1;多分支if語句0當成績≥90時,輸出verygood,當80≤成績<90時,輸出good,當60≤成績<80時,輸出pass,當成績<60時,輸出fail。intscore;if(score>=90)printf(“verygood");elseif(score>=80)printf(“good");elseif(score>=60)printf(“pass");elseprintf(“fail");注意ifelse配對問題當成績≥90時,輸出verygood,ints第9次課主要內容:C51的多分支結構,while、switch-casebreak語句和continue

數組、函數IO口編程學習方法:背住C語言語法、執行流程、程序分析方法第9次課主要內容:多分支switch語句switch(表達式1){ case常量表達式1:{語句1;}break;

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

……

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

default:{語句n+1;}}格式:多分支switch語句switch(表達式1)格式:switch表達式1語句1語句2語句n語句n+1…式1式2式ndefaultcase

switch表達式1語句1語句2語句n語句n+1…式1式2式switch(key){ case1:

y=1;break;

case2:

y=2;break;

case3:

y=4;break;

default:;}在單片機程序設計中,常用switch語句作為鍵盤中按鍵的判別。當按下鍵的鍵號變量key=1,則變量y=1;鍵號變量key=2,則變量y=2;鍵號變量key=4,則變量y=3;沒有按下鍵,則變量y不變。板書switch(key)在單片機程序設計中,常用swikey=2;switch(key){ case1:

y=1;

case2:

y=2; case3:

y=4;

default:;}習題:讀程序執行的結果y=?key=2;習題:讀程序執行的結果y=?習題17y=x(x<1)2x-1(1≤x<10)3x-11(x≥10)思考:多分支語句區別:if…

elseif…else…和switchcase語句習題17y=x(x<1)2x-1(1≤x<10)3x2)循環結構控制語句while(表達式){

循環體;}格式:表達式循環體假(0)真(非0)先判斷表達式,后執行循環體。while語句畫板書2)循環結構控制語句while(表達式)格式:表達式循環體假main(){inti=0;inty;while(i<3)

{ i++;

}

y=i;}i++執行幾次?y=?習題:讀程序執行的結果y=?注意方法main()i++執行幾次?y=?習題:讀程序執行的結果main(){inti=0;inty;while(i<7)

{ i=i+3;

}

y=i;}y=?習題:讀程序執行的結果y=?main()y=?習題:讀程序執行的結果y=?do{

循環體;}while(表達式);格式:表達式循環體假(0)真(非0);不可省略!切記!!先執行循環體,后判斷表達式。do-while語句畫板書do格式:表達式循環體假(0)真(非0);不可省略!先執行循main(){inti=0;inty;do{ i=i+2;

}while(i<3);y=i;}i++執行幾次?y=?習題:讀程序執行的結果y=?main()i++執行幾次?y=?習題:讀程序執行的結果main(){inti=0;inty=0;do{ i++;

y=y+i;}while(y<7);}習題:讀程序執行的結果y=?main()習題:讀程序執行的結果y=?for(表達式1;表達式2;表達式3){

語句;}格式:for語句畫板書※重點for(表達式1;表達式2;表達式3)格式:for語句畫板書main(){inti,y;y=0;for(i=1;i<4;i++) {y=y+i;

}}y=?習題:讀程序執行的結果y=?main()y=?習題:讀程序執行的結果y=?main(){inti,y;y=5;for(i=2;i<6;i++) {y=y+i;

}}y=?習題:讀程序執行的結果y=?main()y=?習題:讀程序執行的結果y=?main(){inti,y;y=0;for(i=0;i<20;i++) {if(0==(i%3))

y=y+i;

}}y=?習題:讀程序執行的結果y=?main()y=?習題:讀程序執行的結果y=?while語句和for語句區別?思考循環語句while語句和for語句區別?思考循環語句3)break語句和continue語句break功能:

跳出switch結構;

在循環語句中,終止并跳出本層循環。continue功能:結束本次循環,跳過本層循環體中尚未執行的語句,執行循環體的判斷。3)break語句和continue語句break功能:co#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時停止。運行結果:r=1,area=3.14r=2,area=12.57r=3,area=28.27r=4,area=50.26r=5,area=78.54結束整個for循環#definePI3.1415計算r=1到r=10的把100~200之間不能被3整除的數輸出。main(){intn;for(n=100;n<=200;n++){if(n%3==0)continue;printf(“%d",n);}}結束本次循環,循環體的剩余語句被忽略,執行表達式3,進入下一循環。把100~200之間不能被3整除的數輸出。main()結main(){intn;for(n=100;n<=200;n++){if(n%3==0)break;printf(“%d",n);}}習題:讀程序執行的結果?main()習題:讀程序執行的結果?習題:循環檢測P1.0引腳,只有檢測P1.0為低電平時,循環結束。sfrP1=0x90;sbitP10=P1^0;main(){while(1){if(P10==0)break;}}習題:循環檢測P1.0引腳,只有檢測P1.0為低電平時,循環5、數組數組是用來存儲一組相同數據類型的數據結構。一維數組格式:數據類型變量名[N];inta[10];inta[5]={1,2,3,4,5};初始化:charb[10];inty;y=a[2]+a[4];5、數組數組是用來存儲一組相同數據類型的數據結構。一維數組格求下列數組的和。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];

}}求下列數組的和。inta[5]={1,2,3,習題:求數組a[5]中能被2整除的數的和。inta[5]={10,2,33,54,15};main(){inta[5]={10,2,33,54,15};inti,sum;sum=0;for(i=0;i<5;i++) {if(sum[i]%2==0){sum=sum+a[i];

}}}習題:求數組a[5]中能被2整除的數的和。inta[5習題18:輸入輸出對應關系。如果P0口只有P00輸入低電平,則P1口只有P10輸出高電平;如果P0口只有P01輸入低電平,則P1口只有P11輸出高電平;

…如果P0口只有P07輸入低電平,則P1口只有P17輸出高電平。

輸入二進制數00000001輸出0x10;輸入二進制數00000010輸出0x20;輸入二進制數00000100輸出0x40;輸入二進制數00001000輸出0x80;輸入二進制數00010000輸出0x11;輸入二進制數00100000輸出0x21;輸入二進制數01000000輸出0x41;輸入二進制數10000000輸出0x81。習題18:輸入輸出對應關系。如果P0口只有P00輸入低習題19:將一組數中100個數的值按逆序重新存放。10,2,13,54,55,54,13,2,100,991,982,97i,99-i習題19:將一組數中100個數的值按逆序重新存放。10,2二維數組格式:數據類型變量名[N][M];inta[3][2];inta[3][2]={{1,2},

{3,4},

{5,6}};行數列數求下列數組的和。二維數組格式:數據類型變量名[N][M];intmain(){inta[3][2]={{1,2},{3,4},{5,6}};inti,j,sum;sum=0;for(i=0;i<3;i++) {for(j=0;j<2;j++)sum=sum+a[i][j];

}}inta[3][2]={{1,2},{3,4},{5,6}};求下列數組的和。main()inta[3][2]={{6、自定義函數intadd(inta,intb)//被調用函數{intc;c=a+b;returnc;}main(){intx,y,z;x=5;y=6;z=add(x,y);//調用函數}形式參數函數名類型※難點6、自定義函數intadd(inta,int7、C51語言的中斷函數函數是一個完成某個相關功能的代碼段;C51程序只有一個主函數main(),并且從主函數開始運行。中斷服務函數格式:函數類型函數名()interruptnusingninterruptn:表示中斷號,n的值為0—4;usingn:表示寄存器組號,n的值為0—3;7、C51語言的中斷函數函數是一個完成某個相關功能的代碼段;sfrP2=0xA0;P2=P2

|0x10;綜合習題11以字節操作方式,把P2口的P2.4位置成1,其它位保持不變。XXX1XXXXP2.4sfrP2=0xA0;綜合習題11XXX1XXXXP習題19:將一組數中數值按逆序重新存放。10,2,13,54,55,54,13,2,10習題19:將一組數中數值按逆序重新存放。10,2,13,綜合習題

以字節操作方式對P1口的P1.5清0,P1.1置為1,其他位保持不變。XX0XXX1XP1.5P1.1sfrP1=0x90;P1=(P1&0xDF)│0x02;P1.0綜合習題XX0XXX1XP1.5P1.1sfrsfrP0=0x80;Bitflag;flag=P0&0x40;綜合習題12

以字節操作方式,讀取P0口的P0.6位是否為1?sfrP0=0x80;綜合習題12sfrP2=0xA0;

sfrP1=0x90;

sbitP24=P2^4;

sbitP10=P1^0;綜合習題16如果讀取P2口的P2.4位為1,則把P1口的P1.0置成0。voidmain(){

if(1==P24){P10=0;

}}sfrP2=0xA0;綜合習題16void綜合習題:檢測P1.0引腳,只有等到檢測P1.0為低電平時,才讓P1.1輸出高電平。sfrP1=0x90;sbitP10=P1^0;main(){while(1){if(P10==0)break;}}綜合習題:檢測P1.0引腳,只有等到檢測P1.0為低電平時,綜合習題18:輸入輸出對應關系。如果P0口只有P00輸入低電平,則P1口只有P10輸出高電平;如果P0口只有P01輸入低電平,則P1口只有P11輸出高電平;

…如果P0口只有P07輸入低電平,則P1口只有P17輸出高電平。

輸入二進制數00000001輸出0x10;輸入二進制數00000010輸出0x20;輸入二進制數00000100輸出0x40;輸入二進制數00001000輸出0x80;輸入二進制數00010000輸出0x11;輸入二進制數00100000輸出0x21;輸入二進制數01000000輸出0x41;輸入二進制數10000000輸出0x81。綜合習題18:輸入輸出對應關系。如果P0口只有P00輸作業:P68一、3-5三、1、2四、1補充,例3-4作業:P68main(){inti,y;y=0;for(i=2;i<5;i++) {y=y+i;

}}9、讀程序執行的結果y=?main()9、讀程序執行的結果y=?第6次課主要內容:編程語言KeilC51

C51語言的數據類型(背住)數據類型的定義方法(背住)數據類型編程(掌握)第6次課主要內容:第3章C51語言編程基礎第3章C51語言編程基礎1)機器語言定義:處理器能直接執行的二進制代碼特點:效率高、但不易于使用10110110000000001011010100000000ADDA,#193.1編程語言KeilC51簡介1、編程語言2)匯編語言

定義:以助記符的形式表示機器語言特點:速度快、體積小、但依賴于硬件體系1)機器語言1011011000000000ADD3)高級語言獨立于機器、面向過程的、接近于人的自然語言。語言:FORTRAN、C語言、JAVA特點:與硬件無關、易于交流和使用、運行效率低X=X+1;編譯器鏈接器X=X+1;…………程序員1001001010110010……高級語言程序機器碼單片機如何執行程序指令?3)高級語言X=X+1;編譯器X=X+1;程KeilC51語言是在標準C的基礎上,針對51單片機的硬件特點進行擴展,并向51單片機上移植的高效、簡潔的實用高級語言。

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

bit變量名;格式:例如:bitflag;flag=0;畫板書2)C51擴展的數據類型(4種擴展的數據類型)(1)位變量b(2)特殊功能寄存器sfr

地址單元80H—FFH之間的片內數據存儲區;

“sfr”

數據類型占用一個內存單元;利用它可以訪問51單片機內部的所有特殊功能寄存器。sfrP1=0x90;//定義了P1口寄存器,地址為0x90;P1=0xff;//把P1寄存器的值置為0xff,

//P1口的所有輸出引腳設置為高電平。例如sfr寄存器變量名=字節地址常數;格式:※重點、難點、熟練掌握畫板書字節地址?(2)特殊功能寄存器sfrsfrP1=0x90P10x90變量名地址0xff存儲器sfrP1=0x90;//定義了P1口寄存器,地址為0x90;P1=0xff;//把P1寄存器的值置為0xff,

//P1口的所有輸出引腳設置為高電平。畫板書P10x90變量名地址0xff存儲器sfrP1=第6789次課第3章C51語言編程基礎課件sfrP2=0xA0;P2=0xA0;思考:sfrP2=0xA0;思考:sfrSBUF=0x99;習題1:往串行發送數據緩沖寄存器SBUF寫入80SBUF=80;習題2:從P0口寄存器讀取數據,存放到任意一個變量X。sfrP0=0x80;charx;x=P0;※難點、掌握sfrSBUF=0x99;習題1:往串行發送例如:(3)特殊功能寄存器sfr16“sfr16”數據類型占兩個內存單元;用于操作占兩個字節的特殊功能寄存器。sfr16DPTR=0x82;//定義了片內16位數據指針寄存器DPTR,

//低8位字節地址為82H,

//高8位字節地址為83H。DPTR=0x1234;sfr16寄存器變量名=字節地址常數;格式:字節地址為82H、83H存放的數據分別是多少?例如:(3)特殊功能寄存器sfr16sfr16DPTR(4)特殊功能位sbit

片內特殊功能寄存器的可尋址位。“^”前是特殊功能寄存器的名字;“^”的后面數字是特殊功能寄存器可尋址位在寄存器中的位置,取值必須是0-7。①sbit位變量名=特殊功能寄存器^位位置;格式:sfrPSW=0xd0; //定義PSW寄存器地址為0xd0sbitFO=PSW^5; //定義F0位為PSW.5F0=0;例如:(4)特殊功能位sbit“^”前是特殊功能寄存器的名字;①程序狀態字寄存器PSW

PSW的不同位表明程序運行的狀態。程序狀態字寄存器PSWPSW的不同位表明程序運行的狀態。習題3:片內I/O口P1口的P1.0尋址位置成高電平sfr P1=0x90;

sbitP1_0=P1^0;

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

sbitP2_7=P2^7;

bitx;

x=P2_7;※難點習題3:片內I/O口P1口的P1.0尋址位置成高電平sbit位變量名

=位地址常數;

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

…}例如:格式:格式:③sbit位變量名=字節地址^位位置;sbitP1_0=0x90^0;

P1_0=1;sbit位變量名=位地址常數;sbitC習題5:片內I/O口P1口的P1.0尋址位置成低電平sbitP1_0=0x90;P1_0=0;在頭文件AT89X51.h或者reg1.h中定義了常用的特殊功能寄存器和可尋址位。#include<AT89X51.h>sfr P1=0x90;

sbitP1_0=0x90;

兩者區別?習題5:片內I/O口P1口的P1.0尋址位置成低電平sbit數據類型區別、及其作用。bitsfrsfr16sbit討論數據類型區別、及其作用。討論第7次課主要內容:數據存儲類型絕對宏及程序習題_at_關鍵字及程序習題第7次課主要內容:3)數據存儲類型

數據存儲類型是指數據存放在51單片機的哪一個存儲器空間,不同的存儲器空間,尋址方式不同,訪問速度不同。P463)數據存儲類型數據存儲類型是指數據存放在51單片機bdatadataidatapdataxdatacode畫板書※重點、記住bdatadataidatapdataxdatacode畫板(1)DATA區。

DATA區指片內RAM的低128字節的空間,可直接尋址;尋址是最快的,應該把經常使用的變量放在DATA區。unsignedchardatasystem_status=0;unsignedintdataunit_id[8];例如:格式:

數據類型

【存儲類型】

變量名;(1)DATA區。unsignedchardata(2)BDATA區。

BDATA區是內部RAM可位尋址的16字節存儲區(字節地址為20H

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

unsignedintbdatastatus_word;

sbitstat_flag=status_byte^4;

if(status_word^15) {stat_flag=1;

}(2)BDATA區。例如: unsignedchar(3)IDATA區。

IDATA區是片內RAM的0-256字節的存儲區,只能間接尋址,速度比直接尋址慢。 unsignedcharidatasystem_status=0; floatidatavalue;

例如:(3)IDATA區。 unsignedchar(4)PDATA區和XDATA區。

PDATA區和XDATA區位于片外存儲區;

PDATA區指的是外部數據存儲區0—256字節。

XDATA區指的是外部數據區64KB內的任何地址。 unsignedcharxdatasystem_status=0; unsignedintpdatauint_id[8];例如:(4)PDATA區和XDATA區。 unsignedcha(5)程序存儲區CODE。

CODE區是程序存儲區,儲存的數據是不可改變的。unsignedcharcodea[9]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};例如:(5)程序存儲區CODE。unsignedcharcod4)數據存儲模式C51編譯器設定的存儲模式:

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

NRAM=0x01;}/*數據3DH寫入地址0xFFC0的外部I/OPORTE*//*將數據01H寫入片內RAM的40H單元*/※難點例題,片內RAM、片外RAM定義的程序如下:main(習題6使用絕對宏將片內RAM20H的字節地址單元全部置1。#include<absacc.h>#defineMDBYTE[0x0020] /*將M定義為內部RAM,地址為0x0020*/main(){ M=0xff;}習題6使用絕對宏將片內RAM20H的字節地址單元全部置習題7使用絕對宏讀取片外RAMF000H字節地址單元的內容。#include<absacc.h>#defineWRAMXBYTE[0xF000] main(){charx;

x=WRAM;}習題7使用絕對宏讀取片外RAMF000H字節地址單元的使用關鍵字_at_可對指定的存儲器空間的絕對地址進行訪問。格式:

[存儲類型]數據類型變量名_at_地址常數;地址常數:指定變量的絕對地址,位于存儲器空間之內;使用_at_定義的變量必須為全局變量。板書※重點2)_at_關鍵字地址常數:指定變量的絕對地址,位于存儲器空間之內;板書※重例題使用關鍵字_at_實現絕對地址的訪問。dataunsignedchary1_at_0x50;/*在data區定義字節變量

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

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

……while(1);}例題使用關鍵字_at_實現絕對地址的訪問。習題8

溫馨提示

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

評論

0/150

提交評論