




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
任務1
C51程序結構及內部單元賦值操作任務2
C51運算符的應用任務3選擇語句的應用任務4
循環語句的應用任務5指針的定義及引用任務1C51程序結構及內部單元賦值操作
1.了解C51程序的基本結構。2.掌握C51語言的數據類型。3.利用絕對地址方式訪問片內RAM存儲單元。在單片機內部,運行時的程序及數據均存放在存儲器中,運行過程中對內存單元的數據操作較為頻繁。本任務主要練習如何手動修改單片機內部RAM單元的內容。如對單片機內部RAM存儲空間地址為0x30的單元進行賦值運算操作。一、C51程序基本結構/******點亮單片機P1.0口發光二極管.C******/#include<AT89X51.h>//包含頭文件sbitLED=P1^0;//位定義單片機//的P1.0口voidmain()//主函數{
LED=0;//點亮P1.0口LED}預處理命令main(){
語句1;//語句注釋
語句2;
┊}1.預處理命令主要包括文件包含(include)、宏定義(define)和條件編譯(ifndef)。程序中的“#include<AT89X51.h>”代碼表示在該程序中調用了AT89系列單片機的頭文件。常用的還有“#include<reg51.h>”、“#include<reg52.h>”。這個文件中定義了AT89系列單片機內部的特殊功能寄存器(SFR)的所有端口。文件的調用一般位于程序的開頭,常見的調用表示方法有兩種:(1)#include<AT89X51.h>(2)#include“AT89X51.h”2.main主函數一個C程序中有且只有一個main主函數,它是函數的入口。main函數可以調用其他的功能函數,但其他功能函數不能調用main函數。函數后面一定要有一對大括號“{}”,程序就寫在大括號里面。main前面的“void”表示“空”,即當main函數執行完后,不返回任何值,編程時可省略不寫。main后面的“()”中沒有寫任何參數,表示了main函數和其他函數間沒有任何的參數傳遞。但后面的“()”必須有,不能省略。3.語句語句是構造函數的主體部分,C程序中的語句大致分為兩類:一類為說明語句,用來描述數據,決定內存的分配;另一類為執行語句,用來描述對數據進行的動作,決定內存的內容。C51程序沒有行號,書寫格式自由,一行內可以書寫多條語句,一條語句也可分寫在多行上,但為了區分程序中不同結構層次的語句,通常要求在同一結構層次上的語句,在行中縮進相同的字數。并且每條語句最后必須以一個分號“;”結尾,因為分號是語句的必要組成部分。4.注釋在C51程序中,為了增加程序的可讀性,通常使用“//┈┈”或一對“/*┈┈*/”對程序中的某些地方作必要注釋。前者只能注釋一行內容,后者則可以注釋多行內容。注釋只是為了方便用戶編寫和閱讀程序,其自身在編譯時不參與編譯。同時還經常利用“//┈┈”或“/*┈┈*/”屏蔽程序中的某些語句來調試程序。二、標識符與關鍵字1.標識符指用來表示源程序中自定義對象名稱的符號,可以是常量、變量、數組、結構、語句標號以及函數等。在C51中,標識符只能由字母(a~z,A~Z)、數字(0~9)和下劃線“_”組成,并且第一個字符必須是字母或者下劃線。
在C51程序中,標識符區分大小寫,如“max”和“MAX”表示兩個完全不同的標識符。用戶自定義的標識符不能與系統保留的關鍵字重復。關鍵字是C51編譯器保留的一些特殊標識符,具有特定的含義和用法。單片機C51程序語言繼承了ANSIC標準定義的關鍵字共32個,如auto、double、int、break、else、switch、case等。2.關鍵字sfrP0=0x80;/*定義地址為“0x80”的特殊功能寄存器命名為“P0”。對P0口的操作也就是對地址為“0x80”的特殊功能寄存器操作*/sbitLED=P2^0;/*位定義LED為單片機的P2.0端口,對LED操作也即對P2.0端口操作*/同時結合單片機硬件的特點擴充了一些關鍵字,如sfr、sbit。三、常量與變量在程序運行過程中,數值不能被改變的量稱為常量,可以為字符、十進制數或十六進制數;數值能被改變的量稱為變量。[例]已知符號常量“PI”,它的值為3.1415926,求任意圓的周長和面積。#definePI3.1415926/*宏定義符號常量PI=3.141596*/main()
{floatr,c,s;//定義三個實型變量分別為r、c、s
c=2*PI*r;//圓的周長公式
s=PI*r*r;//圓的面積公式
┊
}四、KeilC51支持的數據類型類型符號基本數據長度/bit取值范圍字符型無unsignedchar80~255有signedchar8-128~+127整型無unsignedint160~65535unsignedlong320~4294967295有signedint16-32768~+32767signedlong32-2147483648~+2147483647(續表)類型符號基本數據長度/bit取值范圍實型有float32
1.176E-38~
3.40E+38指針型無*8~24存儲空間0~65535位類型無bit10或1sbit10或1特殊功能寄存器型無sfr80~255sfr16160~65535一、程序設計C51數據的存儲類型與51單片機實際存儲空間的對應關系:存儲類型長度/bit描述data8直接尋址的片內RAM低128B,訪問速度快bdata1片內RAM的可位尋址區(20H~2FH),允許字節和位混合訪問idata8間接尋址訪問的片內RAM,允許訪問全部片內RAMpdata8用Ri間接訪問的片外RAM的低256Bxdata16用DPTR間接訪問的片外RAM,允許訪問全部64k片外RAMcode16程序存儲器ROM64k空間在C51編譯器中提供了一組宏定義對51單片機的code、data、pdata和xdata空間進行絕對尋址。并且規定只能以無符號數方式訪問,定義了8個宏,其函數原型如下:#defineCBYTE((unsignedcharvolatile*)0x50000L)#defineDBYTE((unsignedcharvolatile*)0x40000L)#definePBYTE((unsignedcharvolatile*)0x30000L)#defineXBYTE((unsignedcharvolatile*)0x20000L)#defineCWORD((unsignedintvolatile*)0x50000L)#defineDWORD((unsignedintvolatile*)0x40000L)#definePWORD((unsignedintvolatile*)0x30000L)#defineXWORD((unsignedintvolatile*)0x20000L)上述函數原型放在absacc.h文件中,使用時只需用預處理命令將其包含到源程序的文件中,即#include<absacc.h>。如對單片機片內RAM的0x30單元進行操作,可使用DBYTE以字節形式對data區尋址,即0x30的絕對地址為DBYTE[0x30]。接下來向單片機內存單元的賦值操作,可借助KeilC51編譯器所支持的無符號字符變量進行操作。
unsignedchardata30=0x15;//將十六進制數15賦值給無//符號字符變量data30
DBYTE[0x30]=data30;//將data30中的值(0x15)傳送到//片內RAM的30H單元根據上述任務分析編寫完整的程序:二、編寫程序并錄入三、調試運行編譯無誤后單擊調試按鈕,將自動彈出“debug”工具欄和存儲器觀察窗口。通過在存儲器觀察窗口地址欄內輸入“字母:數字”即可顯示相應單元值。其中字母代表的意義如下表所示。數字代表所要查看相應單元中的地址,可以為十進制數也可以為十六進制數。字母對應的存儲器空間字母對應的存儲器空間C代碼存儲空間I間接尋址的片內存儲空間D直接尋址的片內存儲空間X擴展的外部RAM空間在地址欄后的文本框內輸入“D:0x30”,然后單擊運行“”按鈕,則程序進入運行狀態,再單擊停止“”按鈕,程序執行結束,即可觀察到地址為0x30開始的片內RAM新的單元值,如下圖所示。單擊此處返回目錄任務2C51運算符的應用
1.了解C51的運算符、表達式及其規則。2.掌握每一種算術運算符對數據操作的具體功能。3.能夠完成計算梯形面積程序的設計與調試。51系列單片機為單芯片微控制器(簡稱MCU),內部有具有數據運算處理能力的CPU。本任務主要利用C51中的算術運算符,計算下圖所示梯形的面積(已知梯形的上底長為a,下底長為b,高是h),并通過串行窗口輸出顯示出來。一、算術運算符運算符意義示例(設x=5,y=3)+加法運算z=x+y;//z=8-減法運算z=x-y;//z=2*乘法運算z=x*y;//z=15/除法運算z=x/y;//z=1﹪模運算(取余運算)z=x%y;//z=2在運算過程中,當只用作加1和減1運算時,可以采用自增和自減運算符:運算符意義示例(設x的初值為2)x++先使用x的值,再讓x加1y=x++;//y=2,x=3++x先讓x加1,再使用x的值y=++x;//y=3,x=3x--先使用x的值,再讓x減1y=x--;//y=2,x=1--x先讓x減1,再使用x的值y=--x;//y=1,x=1二、關系運算符運算符意義示例(設a=5,b=6)<小于a<b;//返回值1>大于a>b;//返回值0<=小于等于(不大于)a<=b;//返回值1>=大于等于(不小于)a>=b;//返回值0!=不等于a!=b;//返回值1==等于a==b;//返回值0三、邏輯運算符運算符意義示例(設a=5,b=6)&&邏輯與a&&b;//返回值1||邏輯或a||b;//返回值1!邏輯非!a或!b;//返回值0關系運算符和邏輯運算符通常用來判別某個條件是否滿足,其運算結果只有“0”和“1”兩種值。即當所指定的條件滿足時結果為“1”,否則為“0”。四、位運算符運算符意義示例(設a=0x25,b=0x46)&按位與c=a&b;//c=0x04|按位或c=a|b;//c=0x67~按位取反c=~a;//c=0xda運算符意義示例(設a=0x25,b=0x46)^按位異或c=a^b;//c=0x63<<左移(各位同時左移若干位,高位舍棄,低位補零)c=a<<2;//c=0x94
>>右移(各位同時右移若干位,低位舍棄,高位補零)c=a<<2;//c=0x94(續表)邏輯與是判斷“&&”兩側的表達式是否都為真,都為真則此邏輯與表達式值為真;按位與是將“&”兩側的數用二進制展開,每一位都求與運算(有0出0,全1出1),最后得到的二進制數即為結果。邏輯與結果只講真和假,而按位與得出的仍然是一個二進制數。五、復合賦值運算符運算符意義示例+=左邊的變量或數組元素加上右邊表達式的值b+=a相當于b=b+a-=左邊的變量或數組元素減去右邊表達式的值b-=a相當于b=b-a*=左邊的變量或數組元素乘以右邊表達式的值b*=a相當于b=b*a/=左邊的變量或數組元素除以右邊表達式的值b/=a相當于b=b/a%=左邊的變量或數組元素模右邊表達式的值b%=a相當于b=b%a(續表)運算符意義示例<<=左移操作,再賦值b<<=a相當于b=b<<a>>=右移操作,再賦值b>>=a相當于b=b>>a&=按位與操作,再賦值b&=a相當于b=b&a|=按位或操作,再賦值b|=a相當于b=b|a^=按位異或操作,再賦值b^=a相當于b=b^a六、條件運算符一般形式如下:邏輯表達式?表達式1:表達式2[例]當a=10,b=12時,求a、b中最大值。其條件表達式:max=(a>b)?a:b一、程序設計梯形面積的計算主要分為三步:①a+b;②(a+b)×h;③(a+b)×h÷2。根據C51中提供的算術運算符,則梯形的面積表達式為:S=(a+b)*h/2為了保證梯形面積計算結果的準確,程序中應定義梯形上底長a、下底長b、高h和梯形面積值S均為浮點型變量。二、編寫程序并錄入根據上述任務分析編寫完整的程序:三、調試運行
1.載入源文件,編譯無誤后單擊調試按鈕,自動彈出“debug”工具欄和存儲器觀察窗口。為了查看程序的運行結果,單擊“”按鈕,彈出“serial#1”的串行窗口。
2.單擊運行按鈕“”,按提示輸入相應的值再分別按下回車鍵,則在串行窗口中即可顯示出單片機計算后的梯形面積值。運行中可進行多次數據輸入并計算,如圖所示。
單擊此處返回目錄任務3選擇語句的應用1.了解C51程序中選擇結構的構建。2.了解if、switch/case語句的功能。3.能夠完成學生成績等級劃分程序的設計與調試。將某校學生成績劃分為A、B、C、D、E五個等級,見下表。同時,要求根據不同的分數打印出其相應等級。數據范圍(成績)等級>100error90~100A80~89B70~79C60~69D<60E一、條件語句if1.if(條件表達式)語句
當條件表達式的結果為真時,就執行語句,否則就跳過。[例]:
if(a==b)a++;//當a等于b時,a就加12.if(條件表達式)語句1else語句2
當條件表達式成立時,就執行語句1,否則就執行語句2。[例]:
if(a==b)a++;//當a等于b時,a加1elsea--;//當a不等于b時,a減13.if(條件表達式1)語句1elseif(條件表達式2)語句2elseif(條件表達式3)語句3elseif(條件表達式m)語句melse語句n條件語句常用來實現多方向條件分支。使用時if和else要配對使用,且else總是與最臨近的if相配對,要是少了一個就會出現語法錯誤。二、開關語句switch/caseswitch(表達式)
{
case常量表達式1:語句1;
//如果常量表達式1滿足,則執行語句1
break;//執行完語句1后,使用break跳出switch//結構
case常量表達式2:語句2;
break;
┋
case常量表達式n:語句n;break;
//如果常量表達式n滿足,則執行語句n后并跳出
default:語句n+1;
//默認情況下(以上條件都不滿足時),//執行語句(n+1)
}
case后常量表達式的值必須是整型或字符型,且互不相同。每個case語句后面可以有“break”,也可以沒有。有break語句,執行到break則退出switch結構;沒有break語句,則會導致其后多條case語句連續執行,直到遇到break結束。
開關語句也是一種用來實現多方向條件分支的語句。雖然采用條件語句也可以實現多方向條件分支,但當分支較多時會使條件語句的嵌套層次過多,程序冗長,可讀性降低。開關語句能直接處理多分支選擇,使程序結構清晰、使用方便。一、程序設計本任務使用條件語句if來完成相關成績數據的判定。if(score>100)grade=’e’;//錯誤(error)
elseif(score>=90)grade=’A’;//等級為Aelseif(score>=80)grade=’B’;//等級為B
elseif(score>=70)grade=’C’;//等級為C
elseif(score>=60)grade=’D’;//等級為Delsegrade=’E’;//等級為E對于不同成績的等級劃分,借助于switch/case語句打印輸出:switch(grade){case'A':printf("學生的成績等級為A\n\n");break;case'B':printf("學生的成績等級為B\n\n");break;case'C':printf("學生的成績等級為C\n\n");break;case'D':printf("學生的成績等級為D\n\n");break;case'E':printf("學生的成績等級為E\n\n");break;default:printf("Error\n");break; }二、編寫程序并錄入根據上述任務分析編寫完整的程序:三、調試運行
1.載入源文件,編譯無誤后單擊調試按鈕,自動彈出“debug”工具欄和存儲器觀察窗口。為了查看程序的運行結果,單擊“”按鈕,彈出“serial#1”的串行窗口。
2.單擊運行按鈕“”,按提示輸入一名學生的成績再按下回車鍵,則在串行窗口中即可顯示出該學生的成績等級。運行中可進行多次成績輸入,如圖所示。
單擊此處返回目錄任務4循環語句的應用
1.了解C51程序中循環結構的構建。2.掌握for、while等循環語句的功能。3.掌握0~100累加和的程序設計與調試方法。在單片機的程序設計中,當一段程序需要反復執行時,通常采用循環體來構建,這樣不僅可以優化程序,而且還可以提高程序的執行效率。本任務以完成Sum=0+1+2+3+………+99+100累加和的程序設計為例,學習使用“for”和“while”語句來構建循環體的方法。一、for循環語句for(初始化表達式;條件表達式;增量表達式){
語句;//循環體
︰}for循環語句的表達式間要用“;”隔開,循環體即為for后面用“{}”括起來的語句,當循環語句只有一條時,“{}”可以省略,緊跟在for語句的結構表達式之后。for循環語句的執行過程如下:(1)初始化表達式。(2)求解條件表達式。如其值為“真”,則執行for循環體內的語句;如果為“假”則退出for循環,轉到for循環體外語句去執行。(3)如條件表達式為“真”,在執行for循環體內的語句后,執行增量表達式,再轉到上一步繼續執行。(4)結束for循環,執行后面的語句。for語句不僅可以用于循環已經確定的情況,而且可以用于循環次數不確定但已經給出循環條件的情況。下面為for語句應用的幾個特例:1)for(;i<=100;i++)sum+=i;//i不設初值,由外部i決定
2)for(i=1;;i++)sum+=I;//不設循環判斷條件,默認將
//無條件循環執行下去
3)for(i=1;i<=100;i++);
//沒有循環體,用于實現延時
4)for(;;)sum+=i;//沒有任何限制,無限循環二、while循環語句while(表達式){語句;//循環體
︰}括號中的表達式為while循環能否繼續的條件,而語句部分則是循環體。只要表達式為真,則重復執行循環體內的語句;否則,終止while循環,執行循環之外的下一行語句。
while語句應用的幾個特例:
1)while(1)sum+=i;//表達式始終為真,無限循//環語句“sum+=i;”2)while(1);//表達式始終為真,死循環當循環語句只有一條時,“{}”可以省略,緊跟在while語句的結構表達式后。一般在循環體中應該有讓循環最終結束的語句,否則將造成死循環。三、do…while循環語句do{
語句;//循環體
︰}while(表達式);
do是C語言的關鍵字,必須和while聯合使用。while(表達式)后的分號“;”不能少,它表示整個循環體的結束。在使用時由于是先執行循環體再判斷,所以應注意循環次數的設置。do…while循環語句和while循環語句的最大區別是:先執行循環體一次,再判斷表達式的值。若為真,則繼續執行循環體,否則退出循環。do…while語句執行過程如下:(1)先執行循環體語句一次,然后判斷表達式。(2)當表達式的值為非“0”時,返回到上一步重新執行循環體語句。(3)如此反復,直到表達式的值為“0”時循環結束。一、程序設計二、編寫程序并錄入根據上述任務分析編寫的完整程序:三、調試運行單擊此處返回目錄載入源文件,編譯無誤后單擊調試按鈕彈出“debug”工具欄,單擊“”按鈕,彈出“serial#1”的串行窗口。再單擊運行按鈕,即可查看串行窗口中輸出的和的值:任務5指針的定義及引用
1.了解數組、指針的定義。2.掌握指向數組的指針的引用。3.掌握利用數組的指針控制單片機I/O口的方法。在C51中,指針是被廣泛使用的一種特殊數據類型。通過指針可以間接地訪問另一變量,方便地使用字符串,有效地使用數組,可使程序更加精煉、高效。本任務以用數組的指針控制單片機的I/O口為例,學習掌握指向數組的指針的引用方法,從而體會指針在C51中的重要意義。一、數組的定義與引用1.一維數組
類型說明符數組名[常量]
┇如inta[10];一維數組的賦值方法有以下幾種:(1)在數組定義時賦值[例]
inta[10]={0,1,2,3,4,5,6,7,8,9};在a[10]中,10表示a數組中有10個元素,下標從0開始,依次是a[0]=0,a[1]=1,……,a[9]=9,數組中的有效數據只有10個。(2)數組元素部分賦值[例]intb[10]={0,1,2,3,4};定義整型數組b,共包含10個元素,只對前5個元素作了定義,后5個元素值均為0。(3)全部數組元素都已賦值,可省去方括號中的下標[例]intc[]={0,1,2,3,4,5,6,7};若被定義的數組長度(常量)與實際數組中的元素個數不相等,則數組長度不能省略。2.字符數組用來存放字符型數據的數組稱為字符數組。字符數組的賦值方法有以下幾種:
[例]chara[5]={'H','E','L','L','O'};
定義字符型數組a,它包含了a[0]~a[4]共5個字符元素。(1)在定義時進行初始化賦值(2)用字符串的形式對全體字符數組元素進行賦值
[例]charstr[]={"Hello,word!"};或者charstr[]="H
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025【合同范本】設備租賃合同協議書
- 《2025企業管理指南合同終止與解除操作手冊》
- 車庫使用權及廣告位使用權轉讓合同
- 財務數據保密與信息安全責任合同
- 互聯網產業復合型人才勞動合同范本
- 文化創意園區場地租賃及文化創意產業合作協議
- 2025合同權益的質押有效條件分析
- 2025【標準范本】設備租賃合同書
- 2025兼職教師聘用合同模板
- 小學三年級英語上冊全冊教(學)案
- 2025年“兩新”領域超長期特別國債項目申報策略
- 2024年四川省涼山州初中學業水平考試生物試題含答案
- 腎病心理護理課件
- 直播電商用戶情感互動設計
- 紀法知識競賽復習試題及答案
- 醫院安保人員培訓提升方案
- 中國老年人臨床水化實踐指南(2024版)解讀
- 跟骨骨折賠償協議書
- 2024年國家知識產權局商標審查協作中心招聘60人高頻難、易錯點500題模擬試題附帶答案詳解
- 燃氣入戶安裝工人合同范本
- 中國道路的經濟解釋學習通超星期末考試答案章節答案2024年
評論
0/150
提交評論