版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
C51知識C語言是一種編譯型程序設(shè)計語言,它兼顧了多種高級語言的特點,并具備匯編語言的功能。目前,使用C語言進行程序設(shè)計已經(jīng)成為軟件開發(fā)的一個主流。用C語言開發(fā)系統(tǒng)可以大大縮短開發(fā)周期,明顯增強程序的可讀性,便于改進、擴充和移植。而針對8051的C語言日趨成熟,成為了專業(yè)化的實用高級語言。C51的特點
C語言作為一種非常方便的語言而得到廣泛的支持,很多硬件開發(fā)都用C語言編程,如:各種單片機、DSP、ARM等.C語言程序本身不依賴于機器硬件系統(tǒng),基本上不作修改就可將程序從不同的單片機中移植過來。
C提供了很多數(shù)學(xué)函數(shù)并支持浮點運算,開發(fā)效率高,故可縮短開發(fā)時間,增加程序可讀性和可維護性。C-51與ASM-51相比,有如下優(yōu)點:對單片機的指令系統(tǒng)不要求了解,僅要求對8051的存貯器結(jié)構(gòu)有初步了解;寄存器分配、不同存貯器的尋址及數(shù)據(jù)類型等細節(jié)可由編譯器管理;程序有規(guī)范的結(jié)構(gòu),可分成不同的函數(shù),這種方式可使程序結(jié)構(gòu)化;提供的庫包含許多標準子程序,具有較強的數(shù)據(jù)處理能力;由于具有方便的模塊化編程技術(shù),使已編好程序可移植;KeilC語言的基本結(jié)構(gòu)一般C語言的程序可看做由一些函數(shù)(function,或視為子程序)所構(gòu)成,其中的主程序是以“main()”開始的函數(shù),而每個函數(shù)可視為獨立個體,就像是模塊(module)一樣,所以C語言是一種非常模塊化的程序語言。C語言的基本結(jié)構(gòu)如下:#include<reg51.h>指定頭文件delay(int);unsignedcharx,y;聲明區(qū)……main()主程序{主程序起始符號inti,j;unsignedcharLED;聲明區(qū)……LED=0xff;程序區(qū)…..}主程序結(jié)束符號
delay(intx)函數(shù)定義{函數(shù)起始符號inti,j;聲明區(qū)……for(i=0;j<x;i++)程序區(qū)……}函數(shù)結(jié)束符號指定頭文件“頭文件”或稱為包含文件(*.h),這是一種將預(yù)先定義好的基本數(shù)據(jù)存放在一個文件中。在8X51中,必要的頭文件是定義8X51內(nèi)部寄存器地址的數(shù)據(jù),如下所示:/*REG51.HHeaderfileforgeneric80C51and80C31microcontroller.Copyright(c)1988-2002KeilElektronikGmbHandKeilSoftware,Inc.Allrightsreserved.*/#ifndef__REG51_H__#define__REG51_H__/*BYTERegister*/sfrP0=0x80;sfrP1=0x90;sfrP2=0xA0;sfrP3=0xB0;sfrPSW=0xD0;sfrACC=0xE0;sfrB=0xF0;sfrSP=0x81;sfrDPL=0x82;sfrDPH=0x83;sfrPCON=0x87;sfrTCON=0x88;sfrTMOD=0x89;sfrTL0=0x8A;sfrTL1=0x8B;sfrTH0=0x8C;sfrTH1=0x8D;sfrIE=0xA8;sfrIP=0xB8;sfrSCON=0x98;sfrSBUF=0x99;/*BITRegister*//*PSW*/sbitCY=0xD7;sbitAC=0xD6;sbitF0=0xD5;sbitRS1=0xD4;sbitRS0=0xD3;sbitOV=0xD2;sbitP=0xD0;/*TCON*/sbitTF1=0x8F;sbitTR1=0x8E;sbitTF0=0x8D;sbitTR0=0x8C;sbitIE1=0x8B;sbitIT1=0x8A;sbitIE0=0x89;sbitIT0=0x88;/*IE*/sbitEA=0xAF;sbitES=0xAC;sbitET1=0xAB;sbitEX1=0xAA;sbitET0=0xA9;sbitEX0=0xA8;/*IP*/sbitPS=0xBC;sbitPT1=0xBB;sbitPX1=0xBA;sbitPT0=0xB9;sbitPX0=0xB8;/*P3*/sbitRD=0xB7;sbitWR=0xB6;sbitT1=0xB5;;sbitT0=0xB4;指定頭文件的方式有兩種:sbitINT1=0xB3;1)以<>包含頭文件名sbitINT0=0xB2;2)以“”包含頭文件名sbitTXD=0xB1;sbitRXD=0xB0;/*SCON*/sbitSM0=0x9F;sbitSM1=0x9E;sbitSM2=0x9D;sbitREN=0x9C;sbitTB8=0x9B;sbitRB8=0x9A;sbitTI=0x99;sbitRI=0x98;#endif聲明區(qū)
聲明程序中所使用的常數(shù)、變量、函數(shù)等,其作用域?qū)U展到整個程序,包括主程序與所有函數(shù)。
在此建議,若程序中有使用到的函數(shù),則可在此聲明所有使用到的函數(shù),這樣,函數(shù)放置的先后順序不受影響。即函數(shù)放置在引用該函數(shù)之前或之后都可以。若沒有在此聲明,則在使用函數(shù)之前必須先定義該函數(shù)。主程序
主程序是以main()為開頭,整個內(nèi)容放置在一對大括號里,其中分為聲明區(qū)與程序區(qū),在聲明區(qū)內(nèi)所聲明的常數(shù)、變量等僅適用于主程序之中,而不影響其他函數(shù)。若在主程序之中使用了某變量,但在之前聲明區(qū)中沒有聲明,也可在主程序的聲明區(qū)中聲明。
程序區(qū)是以語句構(gòu)成的程序內(nèi)容。函數(shù)定義
函數(shù)是一種獨立功能的程序,其結(jié)構(gòu)與主程序類似。函數(shù)可將所要處理的數(shù)據(jù)傳入該函數(shù)里,稱為形式參數(shù)(arguments);也可將函數(shù)處理完成后的結(jié)果返回調(diào)用它的程序,稱為返回值。不管是形式參數(shù)還是返回值,在定義函數(shù)的第一行里應(yīng)該交代清楚。其格式如下:
返回值數(shù)據(jù)類型函數(shù)名稱(數(shù)據(jù)類型形式參數(shù))
例如,要將一個無符號字符實參傳遞給函數(shù),函數(shù)執(zhí)行完成時要返回一個整型,此函數(shù)名稱為My_func,則函數(shù)定義為:
intMy_func(unsignedcharx)
若不要傳入?yún)?shù),則可在小括號內(nèi)指定為void。同樣,若不返回值,則可在函數(shù)名左邊指定為void或不指定。注釋
就是說明,屬于編譯器不處理的部分。以“/*”開始,“*/”結(jié)束。也可用“//”注釋一行。變量、常數(shù)與數(shù)據(jù)類型在C語言里,常數(shù)(constant)與變量(variables)都是為某個數(shù)據(jù)指定存儲器空間,其中常數(shù)是固定不變的,而變量是可變的。聲明常數(shù)或變量的格式如下:
數(shù)據(jù)類型常數(shù)/變量名稱[=默認值];
例如,intX=50;
intX;
int
x,y,z;數(shù)據(jù)類型
既然常數(shù)或變量的聲明是讓編譯器為該常數(shù)或變量保留存儲器空間,就要說明保留多大的空間,這就與常數(shù)或變量的數(shù)據(jù)類型有關(guān)。在聲明常數(shù)或變量的格式中,開始就要指出它們的數(shù)據(jù)類型。KeilC所提供的數(shù)據(jù)類型分為下列幾類:
基本數(shù)據(jù)類型
可用于一般C語言,包括字符(char)、整型(int)、浮點數(shù)(float)和無(void),其中字符與整型又分為有符號(signed)與無符號(unsigned)兩類。
此外還有enum(枚舉),8/16位類型符號關(guān)鍵字數(shù)的表示范圍所占位數(shù)整型字符型實型有無(signed)int16-32768~32767(signed)short16-32768~32767(signed)long32-2147483648~214748364716unsignedint0~65535320~4294967295unsignedlongintunsignedshortint160~65535有float323.4e-38~3.4e38有double641.7e-308~1.7e308有char8-128~127無unsignedchar80~255C-51的數(shù)據(jù)類型擴充定義專為8X51硬件設(shè)置的數(shù)據(jù)類型有:bit、sbit、sfr及sfr16共4種。bit定義一個位變量,將會被指定到0x20-0x2f之間的地址。sbit用于存取內(nèi)部可位尋址的數(shù)據(jù)寄存器,即0x20-0x2f之間的存儲器,或存取可位尋址的特殊功能寄存器(SFR),即0x80-0xff之間的存儲器,若要用sbit,則其聲明方式有以下幾種:a.先聲明一個bdata存儲器形式的變量,再聲明屬于該變量的sbit變量,如:charbdatascan;//聲明scan為bdata存儲器類型的字符sbitinput_0=scan^0;//聲明input_0為scan變量的bit0
當要指明某個變量的第n位,則可在該變量名稱右加上“^n”即可。b.先聲明一個sfr變量,再聲明屬于該變量的sbit變量,如:sfrp0=0x80;//聲明p0為0x80存儲器位置即P0sbitp0_0=p0^0;//聲明p0_0為p0變量的bit0
這種用法最方便,因為8051內(nèi)部特殊功能寄存器的聲明在reg51.h里,而程序開頭都已將這個文件包含進來了。c.直接指定存儲器位置,例如要聲明P0的bit0,則sbitp0_0=0x80^0;
此時,需要熟記每個地址。通常sfr數(shù)據(jù)類型是用于8051內(nèi)部特殊功能寄存器(寄存器名稱大寫),即0X80到0xff地址,與內(nèi)部存儲器的地址相同。但特殊功能寄存器與內(nèi)部存儲器是兩個獨立的區(qū)域,必須以不同的存取方式來區(qū)分。特殊功能寄存器采用直接尋址方式存取,而內(nèi)部存儲器采用間接尋址方式存取。
在KeilC里,所謂直接尋址,就是直接指定其地址,以P0為例,示例如下:sfrP0=0x80;
所謂間接尋址,就是聲明為idata存儲器形式的變量,例如:charidataBCD;//聲明BCD變量為間接尋址的存儲器位置
由于reg51.h里已聲明了8051內(nèi)部特殊功能寄存器,不需要再聲明。通常sfr16數(shù)據(jù)類型是用于8051內(nèi)部16為的特殊功能寄存器,如timer2的捕捉寄存器(RCAP2L、RCAP2H)、timer2的計數(shù)器(TL2、TH2)、數(shù)據(jù)指針寄存器(DPL、DPH)等,以數(shù)據(jù)指針為例,示例如下:sfr16DPTR=0x82;在數(shù)據(jù)類型之后就是變量名稱,而變量名稱的指定除了容易判讀外,還要遵守以下規(guī)則:可使用大/小寫字母、數(shù)字或下劃線第一個字符不能為數(shù)字不可使用變保留字
“保留字”是指編譯程序?qū)⒃撟址A魹槠渌厥庥猛?,ANSI的保留字(小寫)如下:變量名稱與保留字whilesognedbpodvolatile
doifstaticwhileasmauto
double
int
struct
break
else
long
switch
casedoextern
register
typedef
char
float
return
union
continue
for
short
unsigned
const
default
goto
sizeof
entryenumfortransignedstaticunionvoidvolatilewhileKeilC的保留字:
_at__priority__task_alienbdatabitcodecompactdatafaridatainterruptlargepdatareentrantsbitsfrsfr16smallusingxdata變量的作用范圍變量的適用范圍或有效范圍與該變量的聲明位置有關(guān),可分為兩種:全局變量
若在程序開頭的聲明區(qū)或者沒有大括號限制的聲明區(qū)所聲明的變量,其適用范圍為整個程序,稱為全局變量。如下面的LED、SPEAKER就是全局變量。局部變量
若在大括號內(nèi)聲明區(qū)所聲明的變量,其適用范圍將受限于大括號,稱為局部變量。下面的i、j就是局部變量。若在主程序與各函數(shù)之中都有聲明相同名稱的變量,則脫離主程序或函數(shù)時,該變量自動無效。#include<reg51.h>unsignedcharLED,SPEAKER;……main(){intI,j;……LED=0XFF;……}#include<reg51.h>main(){intI,j;……}delay(intx){inti,j;……}8X51的程序設(shè)計屬于硬件的驅(qū)動程序,所以與8X51內(nèi)部結(jié)構(gòu)息息相關(guān),特別是存儲器。1存儲器的形式KeilC對存儲器的管理是將存儲器分成六種形式:
存儲器形式說明適用范圍code程序存儲器0x0000-0xffffdata直接尋址的內(nèi)部數(shù)據(jù)存儲器0x00-0x7fidata間接尋址的內(nèi)部數(shù)據(jù)存儲器0x80-0xffbdata位尋址的內(nèi)部數(shù)據(jù)存儲器0x20-0x2fxdata以DPTR尋址的外部數(shù)據(jù)存儲器64KBpdata以R0、R1尋址的外部數(shù)據(jù)存儲器256Bfar擴展的ROM或RAM外部存儲器,僅最大可達16MB
適用于少數(shù)的芯片,如Philips80C51MX、Dallas390等存儲器的形式與模式程序存儲器
標準的8X51內(nèi)部的4KB程序存儲器可擴展至64KB;8X52內(nèi)部的8KB可擴展至64KB。而新版或兼容的51芯片,其內(nèi)部程序存儲器容量達16KB、32KB,甚至64KB。
程序存儲器也可存放固定數(shù)據(jù),如七段數(shù)碼顯示器的驅(qū)動信號、LED點陣的顯示信號、音樂的驅(qū)動信號、LCM的顯示字符串等,如下所示就是以數(shù)組的方式存儲表格:
charcodeSEG[10={0x30,0x9f,0x25,0x0d,0x99,
0x49,0xc1,0x1f,0x01,0x19};內(nèi)部數(shù)據(jù)存儲器
標準的8X51內(nèi)部的128B數(shù)據(jù)存儲器可擴展至64KB;8X52內(nèi)部256B可擴展至64KB。而新版或兼容的51芯片,其內(nèi)部數(shù)據(jù)存儲器容量為512B、768B等。由于8051內(nèi)部的SFR與數(shù)據(jù)存儲器的地址相同,必須使用不同的尋址方式才能區(qū)分出來。對于匯編語言,可以用不同的指令來區(qū)分直接尋址和間接尋址。
KeilC可以以不同的存儲器形式來區(qū)分操作對象,其中有data、idata和bdata三種存儲器形式。chardatax;//data存儲器形式可以直接存取0x00-0x7f數(shù)據(jù)存儲器
charidatax;//idata可間接存取0x80-0xff數(shù)據(jù)存儲器
bitbdatax;//bdata可為尋址存取0x20-0x2f數(shù)據(jù)存儲器外部數(shù)據(jù)存儲器
對外部數(shù)據(jù)存儲器的存取,匯編語言通過MOVX指令,KeilC沒有專門的指令,必須以存儲器的形式來區(qū)分,若要聲明存取64KB范圍的外部數(shù)據(jù)存儲器的字符變量,聲明方式如下:
charxdatax;
而聲明存取256B范圍的外部數(shù)據(jù)存儲器的字符變量,聲明如下:
charpdatax;2存儲器的模式KeilC提供SMALL、COMPACT和LARGE三種存儲器模式,用以決定未標明存儲器形式的函數(shù)的形參(arguments)、自動變量及變量聲明等預(yù)設(shè)存儲器形式。小型模式SMALL將所有變量預(yù)設(shè)為8X51的內(nèi)部存儲器,其效果就像在聲明區(qū)里明確地聲明data存儲器形式一樣。精簡模式COMPACT將所有變量預(yù)設(shè)為外部存儲器的一頁(page)即256B。其尋址高8位經(jīng)由P2,必須在STARTUP代碼中設(shè)置。就像在聲明區(qū)里聲明pdata存儲器形式一樣。大型模式LARGE將所有變量預(yù)設(shè)為外部存儲器,其效果就像在聲明區(qū)里聲明xdata存儲器形式一樣。
在μVision里,若要設(shè)置存儲器模式,可單擊“”按鈕打開選項對話框,如圖,在MemoryModel中選擇存儲器模式。KeilC的運算符
運算符(Operator)就是程序語句中的操作符號,分以下幾種;算術(shù)運算符
+加–減*乘/除%取余數(shù)程序范例:
main(){intA,B,C,D,E,x,y;x=7;y=2;A=x+y;B=x-y;C=x*y;D=x/y;E=x%y;
}
關(guān)系運算符就是處理兩變量間的大小關(guān)系。==相等!=不等>大于<小于>=大于等于<=小于等于程序范例:
main(){unsignedcharA,B,C,D,E,F,x,y;x=7;y=2;A=(x==y);B=(x!=y);C=(x>y);
D=(x<y);E=(x>=y);F=(x<=y);}邏輯運算符包括AND與、OR或、NOT非運算。
&&與||或!非程序范例:
main(){unsignedcharA,B,C,x,y,z;x=7;y=2;z=5;A=(x>y)&&(y<z);B=(x==y)||(y<=z);C=!(x>z);}布爾運算符與邏輯運算非常相似,差異在于布爾運算符針對變量中的每一個位,邏輯運算符則是對整個變量的操作。
&與|或^異或~取反<<左移>>右移程序范例:
main(){charA,B,C,D,E,F,x,y;chara1,a2,a3,a4,a5,a6;x=0x25;y=0x73;A=x&y;B=x|y;C=x^y;D=~x;E=x<<3;F=x>>4;a1=A;a2=B;a3=C;a4=D;a5=E;a6=F;//輔助觀察運算狀態(tài)}賦值運算符=賦值+=相加賦值-=相減賦值*=相乘賦值/=相除賦值%=取余賦值&=相與賦值|=相或賦值^=異或賦值<<=左移賦值>>=右移賦值程序范例:main(){ungignedcharA=0x52,B=0x3a,C=0x01,D=0x01,E=0xaa,F=0x11,G=0xf0,H=0x1f,I=0x55,J=0x68,K=0x75,x=0x96;unsignedchara1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11;A=x;B+=x;C-=x;D=*x;E/=x;F%=x;G&=x;H|=x;I^=x;J<<=2;K>>=3;a1=A;a2=B;a3=C;a4=D;a5=E;a6=F;…;a11=K;//輔助觀察運算狀態(tài)}自增/自減運算符
++加1--減1程序范例:
main(){charx=5,y=10;x++;y--;}運算符優(yōu)先級1(、)2~、!3++、--4*、/、%5+、-6<<、>>7<、>、<=、>=、==、!=
8&9^10|11&&||=、*=、/=、%=、+=、-=、<<=、>>=&=、^=、|=KeilC的流程控制基本上,程序的結(jié)構(gòu)是由上而下逐行執(zhí)行。也可用流程控制的指令與語句改變程序的流程,KeilC提供的流程控制指令與語句分為3種:循環(huán)、選擇和跳轉(zhuǎn)。循環(huán)指令
將程序流程控制在指定的循環(huán)里,直到負荷指定的條件才脫離循環(huán)繼續(xù)向下執(zhí)行。KeilC的循環(huán)指令有for語句、while語句、do-while語句。
1、計數(shù)循環(huán)
for語句是一個很實用的計數(shù)循環(huán),其格式如下:
for(表達式1;表達式2;表達式3)
{
語句;
[break;]
……
}表達式1為初始值,例如i=0,表示從0開始。表達式2為判斷條件,以此為執(zhí)行循環(huán)的條件,如i<20,表示只要i<20就繼續(xù)循環(huán)。如此表達式空白,如for(i=0;;i++)或for(;;)則會無限制循環(huán)。表達式3為條件運算方式,最常見的是自增或自減。表達式之間的“;”不能缺少。范例1:for(i=0;i<8;i++);//循環(huán)執(zhí)行八次范例2:for(x=100;x>0;x--);//循環(huán)執(zhí)行100次范例3:for(;;)//無限循環(huán)范例4:for(num=0;num=99;num+=5)//循環(huán)執(zhí)行20次
在for語句下面利用一對大括號將所要執(zhí)行的循環(huán)體內(nèi)的指令逐行寫入。若循環(huán)體內(nèi)只有一條語句,可以不用大括號。for(i=0;i<10;i++)P2=table[i];//將table數(shù)組中的數(shù)據(jù)循序輸出到P2
如果循環(huán)未達到跳出條件,因其他判斷因素成立,而要強制跳出循環(huán),則可在循環(huán)內(nèi)添加判斷條件與break語句,例如:for(i=0;i<100,i++){……if(sw1==0)break;……}
2、while循環(huán)
在while語句中將判斷條件放在語句之前,稱為前條件循環(huán),格式如下:while(表達式){
語句;[break];……}
當其中表達式成立時才執(zhí)行其大括號內(nèi)的程序,若表達式為1,則形成無限循環(huán)。若大括號內(nèi)只有一條語句,可以省略大括號。若要強制跳出循環(huán),則可在循環(huán)內(nèi)添加判斷添加與break語句。3、do-while循環(huán)
這個循環(huán)中,先執(zhí)行再判斷,故稱為后條件循環(huán),其格式如下:
do{
語句;[break;]……}while(表達式);
這個循環(huán)先執(zhí)行一次循環(huán)體在判斷條件,所以循環(huán)體至少被執(zhí)行一次;如果循環(huán)體內(nèi)只有一條語句,可以省略大括號;若表達式為1,則為死循環(huán);若要強制跳出循環(huán),則可在循環(huán)體內(nèi)添加判斷語句和break語句。選擇語句
選擇語句是按條件決定程序流程。KeilC提供的選擇指令有if-else語句及switch-case語句。1、if-else語句
格式:if(表達式){
語句1;}
else{
語句2;}
其中else部分也可省略;也可利用elseif串接為多重條件判斷,其格式如下:if(表達式1){語句1;}elseif(表達式2){語句2;}……else{語句n;}2、switch-case語句
提供多重選擇,稱開關(guān)式選擇,這種選擇不會有優(yōu)先級的問題,格式如下:switch(表達式){case(常數(shù)1):{語句1;}break;……case(常數(shù)n-1):{語句n-1;}break;defult:{語句n;}break;}
若沒有一個常數(shù)與表達式的值相同,將執(zhí)行default下的語句。
注意:每個case語句塊結(jié)束時必須有一個break語句。3、跳轉(zhuǎn)語句goto是KeilC提供的無條件跳轉(zhuǎn)語句,格式如下:goto標號;
它與匯編語言的jmp指令一樣,其右邊是一個標號(label)。例如:gotoloop;……Loop:語句;……
數(shù)組(array)是一種將同類型數(shù)據(jù)集合管理的數(shù)據(jù)結(jié)構(gòu);指針(Pointer)是存放存儲器地址的變量。1、數(shù)組
數(shù)組也是一種變量,將一組相同數(shù)據(jù)形態(tài)的變量以一個相同變量名來表示,使用前必須聲明,其格式如下:
數(shù)據(jù)類型數(shù)組名“數(shù)組大?。海?/p>
例如:charLCM[9];//擁有9個字符的數(shù)組,包括LCM[0]-LCM[8]KeilC沒有字符串數(shù)據(jù)類型,以字符數(shù)組來代替字符串。
聲明變量是為該變量指定存儲器位置,對于不同的數(shù)據(jù)類型,系統(tǒng)預(yù)留的存儲器空間各不相同,例如聲明一個字符變量,則預(yù)留一個字節(jié)的存儲器,聲明一個整型變量,則預(yù)留2個字節(jié)的存儲器。
聲明數(shù)組的時候,也可以給它賦初值,如:charLCM[9]=“testing.”;
對以“”定義的字符串,以“\0”為結(jié)束,故需要9個字符。若不知道數(shù)組的大小,可以不指定數(shù)組的長度,如:charstring[]=“welcom!”;KeilC的數(shù)組與指針
若聲明整型、浮點數(shù)組時也要指定其默認值,則可使用大括號,如:intNum[6]={30,21,1,45,26,37};
對多維數(shù)組的聲明,格式如下:
數(shù)據(jù)類型數(shù)組名[數(shù)組大小1][數(shù)組大小2]……[數(shù)組大小n];3x2整型數(shù)組:intNum[3][2]={{10,11},{12,13},{14,15}};2、指針
指針用來存放存儲器地址,聲明格式:
數(shù)據(jù)類型*變量名稱;
通常指針都采用整型數(shù)據(jù)類型,例如:int*ptr;
也可以把同類型的變量與指針放在一起聲明,如:int*ptr1,*ptr2,a,b;
與指針相關(guān)的運算符是“&”,其功能是取得變量的地址,例如:ptr1=&a;//a變量的地址被放入ptr1指針變量
當然,這些操作主要是針對數(shù)組的,,通常會先取得數(shù)組中第一個元素的地址,如:ptr1=&Num[0][0];//Num數(shù)組的第一個地址放入指針變量ptr1
若要將Num[0][0]的內(nèi)容輸出到P2,則:P2=Num[0][0];
或使用指針變量的形式,則:P2=*ptr1;
同理,若要將Num[1][1]輸出到P2,則:P2=Num[1][1];
或:P2=*(ptr1+3);
KeilC的函數(shù)與中斷子程序
一般說來,函數(shù)(Function)、中斷子程序都屬于子程序。1、函數(shù)
函數(shù)的結(jié)構(gòu)與主程序的結(jié)構(gòu)類似,函數(shù)能傳遞參數(shù)、返回值。函數(shù)是一種獨立功能的程序,可將要處理的數(shù)據(jù)傳遞給該函數(shù),稱為形式參數(shù);也可將函數(shù)處理完成后的結(jié)果返回調(diào)用它的程序,稱為返回值。
2、中斷子程序
中斷子程序與函數(shù)結(jié)構(gòu)類似,不過它不能傳遞參數(shù)、返回值,且使用中斷子程序之前不需要聲明,但要在主程序中進行相關(guān)設(shè)置。具體格式如下:
void中斷子程序名(void)interrupt中斷編號using寄存器組
其中各項說明:由于中斷子程序不傳遞參數(shù),不返回值,所以在其左邊標識“void”,在中斷子程序名稱右邊括號里也標識“void”。KeilC提供0-31個中斷編號,8051只使用0-4,8052使用0-5,如聲明INT0,標識為“interrupt0”;聲明T0則標識為“interrupt1”。
寄存器組表示中斷子程序要采用哪個寄存器組,通常主程序使用RB0,在子程序里使用其他寄存器組,若不想指定寄存器組,也可省略該項。
例如,定義INT0的中斷子程序,名稱為“INT”,使用RB1寄存器組,則聲明為:
voidINT(void)interrupt0using1
然后在其下的大括號內(nèi)編寫中斷子程序的內(nèi)容。KeilC的預(yù)處理
預(yù)處理命令是指先經(jīng)過預(yù)處理器處理過后才進行編譯的命令。通常,預(yù)處理命令放置在整個程序的開頭,除非是條件式編譯命令。KeilC提供下列三項預(yù)處理命令。定義命令
#define命令用來指定常數(shù)、字符串或宏函數(shù)的代名詞,與匯編語言的“equ”、“reg”命令一樣。格式如下:
#define代名詞常數(shù)(字符串或宏函數(shù))
例如:#defineoutputsP2
則在程序中就可以用outputs代替P2,即outputs=0xff;
進行編譯時,預(yù)處理處理器會將程序里所有的“outputs”替換為“P2”。這樣做便于程序的修改,比如程序中要將P2輸出改為P0輸出,只需要修改define語句里的定義,而不需要修改程序中出現(xiàn)P2的地方。包含命令
#include命令的功能是將指定的定義或聲明等文件放入程序之中。條件式編譯命令
C語言是一種高度可移植性程序語言,源程序可在不同版本的C語言編譯器下進行編譯,當然,不同的C語言編譯器提供不同的資源與指令語法,這時候就可應(yīng)用條件式編譯命令以區(qū)分不同的編譯器。在8051的程序設(shè)計里也可以應(yīng)用條件式編譯命令,以適應(yīng)不同的外圍與控制方式。
格式如下:#if表達式
程序1#else
程序2
#endifμVision的使用1、認識μVision環(huán)境KeilμVision提供了C語言與匯編語言的編輯、編譯與連接、調(diào)試與仿真等功能,還能產(chǎn)生在線仿真或刻錄到芯片所需的HEX等。
運行μVision4產(chǎn)生如圖的界面,界面中包括菜單欄、文件工具欄、生成工具欄、項目窗口、輸出窗口和狀態(tài)欄。菜單欄
File菜單提供文件操作命令:New、Open、Close、Save、Saveas等命令。
Edit菜單提供編輯命令,如Windows都有的剪貼功能(Copy、Cut、Paste、Undo、Redo),還有文本處理程序的縮進/撤銷縮進功能、書簽功能、查找與替換功能等。
View菜單提供窗口組件的顯示開關(guān):statusBar、FileToolbar、BiuldToolbar、DebugToolbar、ProjectWindow、OutputWindow、SourceBrowser。
Project菜單提供項目管理功能:NewProject、ImportProject、OpenProject和CloseProject。
Debug菜單提供調(diào)試/仿真的操作命令,可直接操作調(diào)試/仿真工具欄上的按鈕。
Flash菜單提供芯片下載與清除的功能。
Peripherals菜單用于設(shè)置是否顯示CPU內(nèi)部各外設(shè)的顯示窗口。
Tools菜單提供PC-Lint程序語法檢查工具。
SVCS菜單提供版本管理功能。
Window菜單提供工作區(qū)的窗口排列功能。
Help菜單提供輔助說明功能。
文件工具欄
將常用的功能放置在該工具欄里,包括文件操作、剪貼功能、撤銷與恢復(fù)等與一般Windows軟件類似的功能。生成工具欄8051程序的開發(fā)分兩個階段,第一階段是程序編輯與生成(build),所謂生成是指程序的編譯/連接及產(chǎn)生可執(zhí)行文件。第二階段是調(diào)試/仿真,以確定程序的正確性??衫谩啊卑粹o設(shè)置,利用“”進行生成;單擊“”進行重新生成;若工具欄消失,可執(zhí)行View菜單下的BuildToolbar重新打開。項目窗口
在項目窗口下方有5個標簽,如圖:
在項目窗口下方有5個標簽,如圖:
File標簽可切換到文件管理窗口。
Regs標簽可切換到寄存器窗口,其中將列出CPU里所有寄存器的內(nèi)容。Books標簽切換到輔助說明窗口,其中將列出所有說明的項目。
Functions標簽切換到函數(shù)窗口,其中將列出所有函數(shù)。
Templates標簽切換到模板窗口,其中列出所有模板。輸出窗口
包括三個子窗口,在Build窗口里將記錄生成的過程與狀態(tài)。在Command窗口里將記錄所有操作的命令。在FindinFiles窗口里將記錄指定文件查找的結(jié)果。狀態(tài)欄
包括7欄:調(diào)試通道欄、執(zhí)行時間欄、光標位置欄、CAP、NUM、SCRL、OVR、R/W或R/O工作區(qū)
所編輯的文件將以窗口的形式出現(xiàn)在此區(qū)域之中。
2、項目的管理與選項
KeilμVision采用項目(Project)管理,所有設(shè)計的開始都源自于項目的建立或打開既有的項目。
若要建立新項目,運行Project菜單下的NewProject命令。
若打開指定的項目,運行Project菜單下的OpenProject命令。
新建項目時,除性能窗口里多出一個Target1項外,工作區(qū)里仍然是空白的,還得進行幾個操作。添加源程序文件
若要將源程序文件添加到當前項目,可在項目窗口左側(cè)單擊Target1節(jié)點下的SourceGroup1項,單擊鼠標右鍵,彈出菜單,再選擇其中的AddFilestoGroup’SourceGroup1’選項。即可出現(xiàn)添加文件對話框。項目選項設(shè)置
單擊“”按鈕可打開設(shè)置選項對話框。
其中可以設(shè)置程序存儲器、時鐘頻率,其默認的為該芯片的最高時鐘頻率,但在實際電路里不一定使用,而是有助于程序設(shè)計與電路控制的頻率,通常是12MHz。若使用內(nèi)部程序存儲器,則選中UseOn-ChipROM選項。若要改變使用其他芯片,可單擊Device標簽,這時可以在其列表框中選擇采用的芯片。
Output標簽:若要產(chǎn)生刻錄或在線仿真所需的HEX文件,則在Output選項卡里選中CreateExecutable選項,再選中CreateHEXFile選項。
其他各選項卡的選項只要采用程序默認值即可,具體功能簡述如下:
Listing:產(chǎn)生列表文件的相關(guān)設(shè)置。
C51:設(shè)置c51編譯器。
A51:設(shè)置A51匯編器。
BL51Locate:設(shè)置BL51連接器的定位選項。
Bl51Misc:設(shè)置BL51連接器的其他選項。
Debug:設(shè)置調(diào)試器。
Utility:設(shè)置通用工具。3、認識調(diào)試/仿真環(huán)境
完成生成后,單擊“”按鈕進入調(diào)試/仿真狀態(tài)。可以看到調(diào)試/仿真工具欄:
復(fù)位CPU,讓程序從頭開始執(zhí)行。全速執(zhí)行程序。停止程序的執(zhí)行。
單步執(zhí)行,若遇到函數(shù),則跳入該函數(shù)。
單步執(zhí)行,若遇到函數(shù),則直接完成該函數(shù)。
完成當時所執(zhí)行的函數(shù),跳出該函數(shù),返回主程序。
執(zhí)行到文字插入點(文字光標)所在的那一行語句。
打開STARTUP.A51窗口,以展示程序相對于匯編語言的執(zhí)行狀態(tài)。
4、外設(shè)操作
在調(diào)試/仿真狀態(tài)下,Peripherals菜單利于觀察外設(shè)端口的狀態(tài)。ResetCPU命令
與單擊“”功能一樣。Interrupt命令
用于設(shè)置是否顯示中斷系統(tǒng)對話框。
其中列出了該芯片中所有中斷源,如果直接選擇所要操作的中斷源,則該中斷源的所有相關(guān)選擇項將呈現(xiàn)在對話框下方,以P3.2/INT0選項為例,對話框?qū)⒊霈F(xiàn)下列選項:
EA:打開中斷源總開關(guān)
IT0:中斷觸發(fā)方式
IE0:該中斷觸發(fā)
EX0:該中斷的中斷狀態(tài)
Pri:該中斷的優(yōu)先級I/O-Ports命令用于設(shè)置是否顯示輸入/輸出端口對話框,選擇該命令后,將彈出輸入/輸出端口菜單。以Port0為例,選擇后將打開其對話框其中分為P0與Pins兩行。P0對應(yīng)為端口的輸出狀態(tài)Pins對應(yīng)為端口的輸入狀態(tài)??梢栽诖诵兄休斎胄盘?,打鉤為1。Serial命令
用于設(shè)置是否顯示串行端口對話框。其中各項:
Mode:串行端口方式;
SCON:Scon寄存器內(nèi)容;
SBUF:串行口緩沖器的內(nèi)容;
SM2:
REN:
TB8:
RB8:SMOD:Baudrate:
TI:
RI:Timer命令
該命令用于設(shè)置是否顯示定時器/計數(shù)器對話框。
Mode:包括兩欄,上面用于設(shè)置定時器/計數(shù)器方式,下面用于設(shè)置內(nèi)部定時和外部計數(shù)。
TCON:程序中所置TCON寄存器內(nèi)容。
TMOD:程序中所置TMOD寄存器內(nèi)容。
TH0:程序中所置TH0中的內(nèi)容。
TL0:程序中所置TL0中的內(nèi)容。
T0Pin:為T0引腳的狀態(tài),若選擇,則T0引腳為高電平。
TF0:為定時器/計數(shù)器的中斷標志。
Status:表示當前是否啟用定時器/計數(shù)器。
TR0:軟件運行定時器/計數(shù)器。
GATE:控制開關(guān)狀態(tài)。GATE=1,外部控制定時器/計數(shù)器運行。INT0#:外部運行定時器/計數(shù)器的引腳,當設(shè)置為外部控制定時器/計數(shù)器運行的情況下,單擊此項可啟動定時
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國機場行業(yè)運營模式發(fā)展規(guī)劃分析報告版
- 2024-2030年中國智能炒菜機行業(yè)發(fā)展趨勢及競爭策略分析報告
- 2024-2030年中國無油螺旋式空壓機項目可行性研究報告
- 工業(yè)廢水處理與水質(zhì)提升方案
- 安全管理小組架構(gòu)及職責
- 高效供熱管網(wǎng)檢測方案
- 人教版七年級生物下冊教學(xué)計劃
- 體育館大型活動安全預(yù)案
- 質(zhì)量與進度保證措施
- 幼兒園與小學(xué)家長溝通方案
- 2022年會計專業(yè)申請留學(xué)申請書
- 義務(wù)(應(yīng)急)消防隊成員花名冊
- 小學(xué)一年級上冊數(shù)學(xué)20以內(nèi)進位加法單元測試卷1
- 中央空調(diào)維保工作實施方案
- (高清版)外墻外保溫工程技術(shù)標準JGJ144-2019
- 未成年人需辦銀行卡證明(模板)
- 慣性導(dǎo)航系統(tǒng)誤差傳播特性分析報告
- 信息化弱電項目試運行方案報告
- 算法導(dǎo)論第三十四章答案
- 不自主運動量表(AIMS)(共3頁)
- 二戰(zhàn)(英語)PPT
評論
0/150
提交評論