微處理器C51-4C51簡介_第1頁
微處理器C51-4C51簡介_第2頁
微處理器C51-4C51簡介_第3頁
微處理器C51-4C51簡介_第4頁
微處理器C51-4C51簡介_第5頁
已閱讀5頁,還剩68頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

C51知識(shí)C語言是一種編譯型程序設(shè)計(jì)語言,它兼顧了多種高級(jí)語言的特點(diǎn),并具備匯編語言的功能。目前,使用C語言進(jìn)行程序設(shè)計(jì)已經(jīng)成為軟件開發(fā)的一個(gè)主流。用C語言開發(fā)系統(tǒng)可以大大縮短開發(fā)周期,明顯增強(qiáng)程序的可讀性,便于改進(jìn)、擴(kuò)充和移植。而針對(duì)8051的C語言日趨成熟,成為了專業(yè)化的實(shí)用高級(jí)語言。C51的特點(diǎn)

C語言作為一種非常方便的語言而得到廣泛的支持,很多硬件開發(fā)都用C語言編程,如:各種單片機(jī)、DSP、ARM等.C語言程序本身不依賴于機(jī)器硬件系統(tǒng),基本上不作修改就可將程序從不同的單片機(jī)中移植過來。

C提供了很多數(shù)學(xué)函數(shù)并支持浮點(diǎn)運(yùn)算,開發(fā)效率高,故可縮短開發(fā)時(shí)間,增加程序可讀性和可維護(hù)性。C-51與ASM-51相比,有如下優(yōu)點(diǎn):對(duì)單片機(jī)的指令系統(tǒng)不要求了解,僅要求對(duì)8051的存貯器結(jié)構(gòu)有初步了解;寄存器分配、不同存貯器的尋址及數(shù)據(jù)類型等細(xì)節(jié)可由編譯器管理;程序有規(guī)范的結(jié)構(gòu),可分成不同的函數(shù),這種方式可使程序結(jié)構(gòu)化;提供的庫包含許多標(biāo)準(zhǔn)子程序,具有較強(qiáng)的數(shù)據(jù)處理能力;由于具有方便的模塊化編程技術(shù),使已編好程序可移植;KeilC語言的基本結(jié)構(gòu)一般C語言的程序可看做由一些函數(shù)(function,或視為子程序)所構(gòu)成,其中的主程序是以“main()”開始的函數(shù),而每個(gè)函數(shù)可視為獨(dú)立個(gè)體,就像是模塊(module)一樣,所以C語言是一種非常模塊化的程序語言。C語言的基本結(jié)構(gòu)如下:#include<reg51.h>指定頭文件delay(int);unsignedcharx,y;聲明區(qū)……main()主程序{主程序起始符號(hào)inti,j;unsignedcharLED;聲明區(qū)……LED=0xff;程序區(qū)…..}主程序結(jié)束符號(hào)

delay(intx)函數(shù)定義{函數(shù)起始符號(hào)inti,j;聲明區(qū)……for(i=0;j<x;i++)程序區(qū)……}函數(shù)結(jié)束符號(hào)指定頭文件“頭文件”或稱為包含文件(*.h),這是一種將預(yù)先定義好的基本數(shù)據(jù)存放在一個(gè)文件中。在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(kuò)展到整個(gè)程序,包括主程序與所有函數(shù)。

在此建議,若程序中有使用到的函數(shù),則可在此聲明所有使用到的函數(shù),這樣,函數(shù)放置的先后順序不受影響。即函數(shù)放置在引用該函數(shù)之前或之后都可以。若沒有在此聲明,則在使用函數(shù)之前必須先定義該函數(shù)。主程序

主程序是以main()為開頭,整個(gè)內(nèi)容放置在一對(duì)大括號(hào)里,其中分為聲明區(qū)與程序區(qū),在聲明區(qū)內(nèi)所聲明的常數(shù)、變量等僅適用于主程序之中,而不影響其他函數(shù)。若在主程序之中使用了某變量,但在之前聲明區(qū)中沒有聲明,也可在主程序的聲明區(qū)中聲明。

程序區(qū)是以語句構(gòu)成的程序內(nèi)容。函數(shù)定義

函數(shù)是一種獨(dú)立功能的程序,其結(jié)構(gòu)與主程序類似。函數(shù)可將所要處理的數(shù)據(jù)傳入該函數(shù)里,稱為形式參數(shù)(arguments);也可將函數(shù)處理完成后的結(jié)果返回調(diào)用它的程序,稱為返回值。不管是形式參數(shù)還是返回值,在定義函數(shù)的第一行里應(yīng)該交代清楚。其格式如下:

返回值數(shù)據(jù)類型函數(shù)名稱(數(shù)據(jù)類型形式參數(shù))

例如,要將一個(gè)無符號(hào)字符實(shí)參傳遞給函數(shù),函數(shù)執(zhí)行完成時(shí)要返回一個(gè)整型,此函數(shù)名稱為My_func,則函數(shù)定義為:

intMy_func(unsignedcharx)

若不要傳入?yún)?shù),則可在小括號(hào)內(nèi)指定為void。同樣,若不返回值,則可在函數(shù)名左邊指定為void或不指定。注釋

就是說明,屬于編譯器不處理的部分。以“/*”開始,“*/”結(jié)束。也可用“//”注釋一行。變量、常數(shù)與數(shù)據(jù)類型在C語言里,常數(shù)(constant)與變量(variables)都是為某個(gè)數(shù)據(jù)指定存儲(chǔ)器空間,其中常數(shù)是固定不變的,而變量是可變的。聲明常數(shù)或變量的格式如下:

數(shù)據(jù)類型常數(shù)/變量名稱[=默認(rèn)值];

例如,intX=50;

intX;

int

x,y,z;數(shù)據(jù)類型

既然常數(shù)或變量的聲明是讓編譯器為該常數(shù)或變量保留存儲(chǔ)器空間,就要說明保留多大的空間,這就與常數(shù)或變量的數(shù)據(jù)類型有關(guān)。在聲明常數(shù)或變量的格式中,開始就要指出它們的數(shù)據(jù)類型。KeilC所提供的數(shù)據(jù)類型分為下列幾類:

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

可用于一般C語言,包括字符(char)、整型(int)、浮點(diǎn)數(shù)(float)和無(void),其中字符與整型又分為有符號(hào)(signed)與無符號(hào)(unsigned)兩類。

此外還有enum(枚舉),8/16位類型符號(hào)關(guān)鍵字?jǐn)?shù)的表示范圍所占位數(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ù)類型擴(kuò)充定義專為8X51硬件設(shè)置的數(shù)據(jù)類型有:bit、sbit、sfr及sfr16共4種。bit定義一個(gè)位變量,將會(huì)被指定到0x20-0x2f之間的地址。sbit用于存取內(nèi)部可位尋址的數(shù)據(jù)寄存器,即0x20-0x2f之間的存儲(chǔ)器,或存取可位尋址的特殊功能寄存器(SFR),即0x80-0xff之間的存儲(chǔ)器,若要用sbit,則其聲明方式有以下幾種:a.先聲明一個(gè)bdata存儲(chǔ)器形式的變量,再聲明屬于該變量的sbit變量,如:charbdatascan;//聲明scan為bdata存儲(chǔ)器類型的字符sbitinput_0=scan^0;//聲明input_0為scan變量的bit0

當(dāng)要指明某個(gè)變量的第n位,則可在該變量名稱右加上“^n”即可。b.先聲明一個(gè)sfr變量,再聲明屬于該變量的sbit變量,如:sfrp0=0x80;//聲明p0為0x80存儲(chǔ)器位置即P0sbitp0_0=p0^0;//聲明p0_0為p0變量的bit0

這種用法最方便,因?yàn)?051內(nèi)部特殊功能寄存器的聲明在reg51.h里,而程序開頭都已將這個(gè)文件包含進(jìn)來了。c.直接指定存儲(chǔ)器位置,例如要聲明P0的bit0,則sbitp0_0=0x80^0;

此時(shí),需要熟記每個(gè)地址。通常sfr數(shù)據(jù)類型是用于8051內(nèi)部特殊功能寄存器(寄存器名稱大寫),即0X80到0xff地址,與內(nèi)部存儲(chǔ)器的地址相同。但特殊功能寄存器與內(nèi)部存儲(chǔ)器是兩個(gè)獨(dú)立的區(qū)域,必須以不同的存取方式來區(qū)分。特殊功能寄存器采用直接尋址方式存取,而內(nèi)部存儲(chǔ)器采用間接尋址方式存取。

在KeilC里,所謂直接尋址,就是直接指定其地址,以P0為例,示例如下:sfrP0=0x80;

所謂間接尋址,就是聲明為idata存儲(chǔ)器形式的變量,例如:charidataBCD;//聲明BCD變量為間接尋址的存儲(chǔ)器位置

由于reg51.h里已聲明了8051內(nèi)部特殊功能寄存器,不需要再聲明。通常sfr16數(shù)據(jù)類型是用于8051內(nèi)部16為的特殊功能寄存器,如timer2的捕捉寄存器(RCAP2L、RCAP2H)、timer2的計(jì)數(shù)器(TL2、TH2)、數(shù)據(jù)指針寄存器(DPL、DPH)等,以數(shù)據(jù)指針為例,示例如下:sfr16DPTR=0x82;在數(shù)據(jù)類型之后就是變量名稱,而變量名稱的指定除了容易判讀外,還要遵守以下規(guī)則:可使用大/小寫字母、數(shù)字或下劃線第一個(gè)字符不能為數(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ū)或者沒有大括號(hào)限制的聲明區(qū)所聲明的變量,其適用范圍為整個(gè)程序,稱為全局變量。如下面的LED、SPEAKER就是全局變量。局部變量

若在大括號(hào)內(nèi)聲明區(qū)所聲明的變量,其適用范圍將受限于大括號(hào),稱為局部變量。下面的i、j就是局部變量。若在主程序與各函數(shù)之中都有聲明相同名稱的變量,則脫離主程序或函數(shù)時(shí),該變量自動(dòng)無效。#include<reg51.h>unsignedcharLED,SPEAKER;……main(){intI,j;……LED=0XFF;……}#include<reg51.h>main(){intI,j;……}delay(intx){inti,j;……}8X51的程序設(shè)計(jì)屬于硬件的驅(qū)動(dòng)程序,所以與8X51內(nèi)部結(jié)構(gòu)息息相關(guān),特別是存儲(chǔ)器。1存儲(chǔ)器的形式KeilC對(duì)存儲(chǔ)器的管理是將存儲(chǔ)器分成六種形式:

存儲(chǔ)器形式說明適用范圍code程序存儲(chǔ)器0x0000-0xffffdata直接尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器0x00-0x7fidata間接尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器0x80-0xffbdata位尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器0x20-0x2fxdata以DPTR尋址的外部數(shù)據(jù)存儲(chǔ)器64KBpdata以R0、R1尋址的外部數(shù)據(jù)存儲(chǔ)器256Bfar擴(kuò)展的ROM或RAM外部存儲(chǔ)器,僅最大可達(dá)16MB

適用于少數(shù)的芯片,如Philips80C51MX、Dallas390等存儲(chǔ)器的形式與模式程序存儲(chǔ)器

標(biāo)準(zhǔn)的8X51內(nèi)部的4KB程序存儲(chǔ)器可擴(kuò)展至64KB;8X52內(nèi)部的8KB可擴(kuò)展至64KB。而新版或兼容的51芯片,其內(nèi)部程序存儲(chǔ)器容量達(dá)16KB、32KB,甚至64KB。

程序存儲(chǔ)器也可存放固定數(shù)據(jù),如七段數(shù)碼顯示器的驅(qū)動(dòng)信號(hào)、LED點(diǎn)陣的顯示信號(hào)、音樂的驅(qū)動(dòng)信號(hào)、LCM的顯示字符串等,如下所示就是以數(shù)組的方式存儲(chǔ)表格:

charcodeSEG[10={0x30,0x9f,0x25,0x0d,0x99,

0x49,0xc1,0x1f,0x01,0x19};內(nèi)部數(shù)據(jù)存儲(chǔ)器

標(biāo)準(zhǔn)的8X51內(nèi)部的128B數(shù)據(jù)存儲(chǔ)器可擴(kuò)展至64KB;8X52內(nèi)部256B可擴(kuò)展至64KB。而新版或兼容的51芯片,其內(nèi)部數(shù)據(jù)存儲(chǔ)器容量為512B、768B等。由于8051內(nèi)部的SFR與數(shù)據(jù)存儲(chǔ)器的地址相同,必須使用不同的尋址方式才能區(qū)分出來。對(duì)于匯編語言,可以用不同的指令來區(qū)分直接尋址和間接尋址。

KeilC可以以不同的存儲(chǔ)器形式來區(qū)分操作對(duì)象,其中有data、idata和bdata三種存儲(chǔ)器形式。chardatax;//data存儲(chǔ)器形式可以直接存取0x00-0x7f數(shù)據(jù)存儲(chǔ)器

charidatax;//idata可間接存取0x80-0xff數(shù)據(jù)存儲(chǔ)器

bitbdatax;//bdata可為尋址存取0x20-0x2f數(shù)據(jù)存儲(chǔ)器外部數(shù)據(jù)存儲(chǔ)器

對(duì)外部數(shù)據(jù)存儲(chǔ)器的存取,匯編語言通過MOVX指令,KeilC沒有專門的指令,必須以存儲(chǔ)器的形式來區(qū)分,若要聲明存取64KB范圍的外部數(shù)據(jù)存儲(chǔ)器的字符變量,聲明方式如下:

charxdatax;

而聲明存取256B范圍的外部數(shù)據(jù)存儲(chǔ)器的字符變量,聲明如下:

charpdatax;2存儲(chǔ)器的模式KeilC提供SMALL、COMPACT和LARGE三種存儲(chǔ)器模式,用以決定未標(biāo)明存儲(chǔ)器形式的函數(shù)的形參(arguments)、自動(dòng)變量及變量聲明等預(yù)設(shè)存儲(chǔ)器形式。小型模式SMALL將所有變量預(yù)設(shè)為8X51的內(nèi)部存儲(chǔ)器,其效果就像在聲明區(qū)里明確地聲明data存儲(chǔ)器形式一樣。精簡模式COMPACT將所有變量預(yù)設(shè)為外部存儲(chǔ)器的一頁(page)即256B。其尋址高8位經(jīng)由P2,必須在STARTUP代碼中設(shè)置。就像在聲明區(qū)里聲明pdata存儲(chǔ)器形式一樣。大型模式LARGE將所有變量預(yù)設(shè)為外部存儲(chǔ)器,其效果就像在聲明區(qū)里聲明xdata存儲(chǔ)器形式一樣。

在μVision里,若要設(shè)置存儲(chǔ)器模式,可單擊“”按鈕打開選項(xiàng)對(duì)話框,如圖,在MemoryModel中選擇存儲(chǔ)器模式。KeilC的運(yùn)算符

運(yùn)算符(Operator)就是程序語句中的操作符號(hào),分以下幾種;算術(shù)運(yùn)算符

+加–減*乘/除%取余數(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)系運(yù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);}邏輯運(yùn)算符包括AND與、OR或、NOT非運(yùn)算。

&&與||或!非程序范例:

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);}布爾運(yùn)算符與邏輯運(yùn)算非常相似,差異在于布爾運(yùn)算符針對(duì)變量中的每一個(gè)位,邏輯運(yùn)算符則是對(duì)整個(gè)變量的操作。

&與|或^異或~取反<<左移>>右移程序范例:

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;//輔助觀察運(yùn)算狀態(tài)}賦值運(yùn)算符=賦值+=相加賦值-=相減賦值*=相乘賦值/=相除賦值%=取余賦值&=相與賦值|=相或賦值^=異或賦值<<=左移賦值>>=右移賦值程序范例: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;//輔助觀察運(yùn)算狀態(tài)}自增/自減運(yùn)算符

++加1--減1程序范例:

main(){charx=5,y=10;x++;y--;}運(yùn)算符優(yōu)先級(jí)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)里,直到負(fù)荷指定的條件才脫離循環(huán)繼續(xù)向下執(zhí)行。KeilC的循環(huán)指令有for語句、while語句、do-while語句。

1、計(jì)數(shù)循環(huán)

for語句是一個(gè)很實(shí)用的計(jì)數(shù)循環(huán),其格式如下:

for(表達(dá)式1;表達(dá)式2;表達(dá)式3)

{

語句;

[break;]

……

}表達(dá)式1為初始值,例如i=0,表示從0開始。表達(dá)式2為判斷條件,以此為執(zhí)行循環(huán)的條件,如i<20,表示只要i<20就繼續(xù)循環(huán)。如此表達(dá)式空白,如for(i=0;;i++)或for(;;)則會(huì)無限制循環(huán)。表達(dá)式3為條件運(yùn)算方式,最常見的是自增或自減。表達(dá)式之間的“;”不能缺少。范例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語句下面利用一對(duì)大括號(hào)將所要執(zhí)行的循環(huán)體內(nèi)的指令逐行寫入。若循環(huán)體內(nèi)只有一條語句,可以不用大括號(hào)。for(i=0;i<10;i++)P2=table[i];//將table數(shù)組中的數(shù)據(jù)循序輸出到P2

如果循環(huán)未達(dá)到跳出條件,因其他判斷因素成立,而要強(qiáng)制跳出循環(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(表達(dá)式){

語句;[break];……}

當(dāng)其中表達(dá)式成立時(shí)才執(zhí)行其大括號(hào)內(nèi)的程序,若表達(dá)式為1,則形成無限循環(huán)。若大括號(hào)內(nèi)只有一條語句,可以省略大括號(hào)。若要強(qiáng)制跳出循環(huán),則可在循環(huán)內(nèi)添加判斷添加與break語句。3、do-while循環(huán)

這個(gè)循環(huán)中,先執(zhí)行再判斷,故稱為后條件循環(huán),其格式如下:

do{

語句;[break;]……}while(表達(dá)式);

這個(gè)循環(huán)先執(zhí)行一次循環(huán)體在判斷條件,所以循環(huán)體至少被執(zhí)行一次;如果循環(huán)體內(nèi)只有一條語句,可以省略大括號(hào);若表達(dá)式為1,則為死循環(huán);若要強(qiáng)制跳出循環(huán),則可在循環(huán)體內(nèi)添加判斷語句和break語句。選擇語句

選擇語句是按條件決定程序流程。KeilC提供的選擇指令有if-else語句及switch-case語句。1、if-else語句

格式:if(表達(dá)式){

語句1;}

else{

語句2;}

其中else部分也可省略;也可利用elseif串接為多重條件判斷,其格式如下:if(表達(dá)式1){語句1;}elseif(表達(dá)式2){語句2;}……else{語句n;}2、switch-case語句

提供多重選擇,稱開關(guān)式選擇,這種選擇不會(huì)有優(yōu)先級(jí)的問題,格式如下:switch(表達(dá)式){case(常數(shù)1):{語句1;}break;……case(常數(shù)n-1):{語句n-1;}break;defult:{語句n;}break;}

若沒有一個(gè)常數(shù)與表達(dá)式的值相同,將執(zhí)行default下的語句。

注意:每個(gè)case語句塊結(jié)束時(shí)必須有一個(gè)break語句。3、跳轉(zhuǎn)語句goto是KeilC提供的無條件跳轉(zhuǎn)語句,格式如下:goto標(biāo)號(hào);

它與匯編語言的jmp指令一樣,其右邊是一個(gè)標(biāo)號(hào)(label)。例如:gotoloop;……Loop:語句;……

數(shù)組(array)是一種將同類型數(shù)據(jù)集合管理的數(shù)據(jù)結(jié)構(gòu);指針(Pointer)是存放存儲(chǔ)器地址的變量。1、數(shù)組

數(shù)組也是一種變量,將一組相同數(shù)據(jù)形態(tài)的變量以一個(gè)相同變量名來表示,使用前必須聲明,其格式如下:

數(shù)據(jù)類型數(shù)組名“數(shù)組大小:;

例如:charLCM[9];//擁有9個(gè)字符的數(shù)組,包括LCM[0]-LCM[8]KeilC沒有字符串?dāng)?shù)據(jù)類型,以字符數(shù)組來代替字符串。

聲明變量是為該變量指定存儲(chǔ)器位置,對(duì)于不同的數(shù)據(jù)類型,系統(tǒng)預(yù)留的存儲(chǔ)器空間各不相同,例如聲明一個(gè)字符變量,則預(yù)留一個(gè)字節(jié)的存儲(chǔ)器,聲明一個(gè)整型變量,則預(yù)留2個(gè)字節(jié)的存儲(chǔ)器。

聲明數(shù)組的時(shí)候,也可以給它賦初值,如:charLCM[9]=“testing.”;

對(duì)以“”定義的字符串,以“\0”為結(jié)束,故需要9個(gè)字符。若不知道數(shù)組的大小,可以不指定數(shù)組的長度,如:charstring[]=“welcom!”;KeilC的數(shù)組與指針

若聲明整型、浮點(diǎn)數(shù)組時(shí)也要指定其默認(rèn)值,則可使用大括號(hào),如:intNum[6]={30,21,1,45,26,37};

對(duì)多維數(shù)組的聲明,格式如下:

數(shù)據(jù)類型數(shù)組名[數(shù)組大小1][數(shù)組大小2]……[數(shù)組大小n];3x2整型數(shù)組:intNum[3][2]={{10,11},{12,13},{14,15}};2、指針

指針用來存放存儲(chǔ)器地址,聲明格式:

數(shù)據(jù)類型*變量名稱;

通常指針都采用整型數(shù)據(jù)類型,例如:int*ptr;

也可以把同類型的變量與指針放在一起聲明,如:int*ptr1,*ptr2,a,b;

與指針相關(guān)的運(yùn)算符是“&”,其功能是取得變量的地址,例如:ptr1=&a;//a變量的地址被放入ptr1指針變量

當(dāng)然,這些操作主要是針對(duì)數(shù)組的,,通常會(huì)先取得數(shù)組中第一個(gè)元素的地址,如:ptr1=&Num[0][0];//Num數(shù)組的第一個(gè)地址放入指針變量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ù)是一種獨(dú)立功能的程序,可將要處理的數(shù)據(jù)傳遞給該函數(shù),稱為形式參數(shù);也可將函數(shù)處理完成后的結(jié)果返回調(diào)用它的程序,稱為返回值。

2、中斷子程序

中斷子程序與函數(shù)結(jié)構(gòu)類似,不過它不能傳遞參數(shù)、返回值,且使用中斷子程序之前不需要聲明,但要在主程序中進(jìn)行相關(guān)設(shè)置。具體格式如下:

void中斷子程序名(void)interrupt中斷編號(hào)using寄存器組

其中各項(xiàng)說明:由于中斷子程序不傳遞參數(shù),不返回值,所以在其左邊標(biāo)識(shí)“void”,在中斷子程序名稱右邊括號(hào)里也標(biāo)識(shí)“void”。KeilC提供0-31個(gè)中斷編號(hào),8051只使用0-4,8052使用0-5,如聲明INT0,標(biāo)識(shí)為“interrupt0”;聲明T0則標(biāo)識(shí)為“interrupt1”。

寄存器組表示中斷子程序要采用哪個(gè)寄存器組,通常主程序使用RB0,在子程序里使用其他寄存器組,若不想指定寄存器組,也可省略該項(xiàng)。

例如,定義INT0的中斷子程序,名稱為“INT”,使用RB1寄存器組,則聲明為:

voidINT(void)interrupt0using1

然后在其下的大括號(hào)內(nèi)編寫中斷子程序的內(nèi)容。KeilC的預(yù)處理

預(yù)處理命令是指先經(jīng)過預(yù)處理器處理過后才進(jìn)行編譯的命令。通常,預(yù)處理命令放置在整個(gè)程序的開頭,除非是條件式編譯命令。KeilC提供下列三項(xiàng)預(yù)處理命令。定義命令

#define命令用來指定常數(shù)、字符串或宏函數(shù)的代名詞,與匯編語言的“equ”、“reg”命令一樣。格式如下:

#define代名詞常數(shù)(字符串或宏函數(shù))

例如:#defineoutputsP2

則在程序中就可以用outputs代替P2,即outputs=0xff;

進(jìn)行編譯時(shí),預(yù)處理處理器會(huì)將程序里所有的“outputs”替換為“P2”。這樣做便于程序的修改,比如程序中要將P2輸出改為P0輸出,只需要修改define語句里的定義,而不需要修改程序中出現(xiàn)P2的地方。包含命令

#include命令的功能是將指定的定義或聲明等文件放入程序之中。條件式編譯命令

C語言是一種高度可移植性程序語言,源程序可在不同版本的C語言編譯器下進(jìn)行編譯,當(dāng)然,不同的C語言編譯器提供不同的資源與指令語法,這時(shí)候就可應(yīng)用條件式編譯命令以區(qū)分不同的編譯器。在8051的程序設(shè)計(jì)里也可以應(yīng)用條件式編譯命令,以適應(yīng)不同的外圍與控制方式。

格式如下:#if表達(dá)式

程序1#else

程序2

#endifμVision的使用1、認(rèn)識(shí)μVision環(huán)境KeilμVision提供了C語言與匯編語言的編輯、編譯與連接、調(diào)試與仿真等功能,還能產(chǎn)生在線仿真或刻錄到芯片所需的HEX等。

運(yùn)行μVision4產(chǎn)生如圖的界面,界面中包括菜單欄、文件工具欄、生成工具欄、項(xiàng)目窗口、輸出窗口和狀態(tài)欄。菜單欄

File菜單提供文件操作命令:New、Open、Close、Save、Saveas等命令。

Edit菜單提供編輯命令,如Windows都有的剪貼功能(Copy、Cut、Paste、Undo、Redo),還有文本處理程序的縮進(jìn)/撤銷縮進(jìn)功能、書簽功能、查找與替換功能等。

View菜單提供窗口組件的顯示開關(guān):statusBar、FileToolbar、BiuldToolbar、DebugToolbar、ProjectWindow、OutputWindow、SourceBrowser。

Project菜單提供項(xiàng)目管理功能: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ā)分兩個(gè)階段,第一階段是程序編輯與生成(build),所謂生成是指程序的編譯/連接及產(chǎn)生可執(zhí)行文件。第二階段是調(diào)試/仿真,以確定程序的正確性。可利用“”按鈕設(shè)置,利用“”進(jìn)行生成;單擊“”進(jìn)行重新生成;若工具欄消失,可執(zhí)行View菜單下的BuildToolbar重新打開。項(xiàng)目窗口

在項(xiàng)目窗口下方有5個(gè)標(biāo)簽,如圖:

在項(xiàng)目窗口下方有5個(gè)標(biāo)簽,如圖:

File標(biāo)簽可切換到文件管理窗口。

Regs標(biāo)簽可切換到寄存器窗口,其中將列出CPU里所有寄存器的內(nèi)容。Books標(biāo)簽切換到輔助說明窗口,其中將列出所有說明的項(xiàng)目。

Functions標(biāo)簽切換到函數(shù)窗口,其中將列出所有函數(shù)。

Templates標(biāo)簽切換到模板窗口,其中列出所有模板。輸出窗口

包括三個(gè)子窗口,在Build窗口里將記錄生成的過程與狀態(tài)。在Command窗口里將記錄所有操作的命令。在FindinFiles窗口里將記錄指定文件查找的結(jié)果。狀態(tài)欄

包括7欄:調(diào)試通道欄、執(zhí)行時(shí)間欄、光標(biāo)位置欄、CAP、NUM、SCRL、OVR、R/W或R/O工作區(qū)

所編輯的文件將以窗口的形式出現(xiàn)在此區(qū)域之中。

2、項(xiàng)目的管理與選項(xiàng)

KeilμVision采用項(xiàng)目(Project)管理,所有設(shè)計(jì)的開始都源自于項(xiàng)目的建立或打開既有的項(xiàng)目。

若要建立新項(xiàng)目,運(yùn)行Project菜單下的NewProject命令。

若打開指定的項(xiàng)目,運(yùn)行Project菜單下的OpenProject命令。

新建項(xiàng)目時(shí),除性能窗口里多出一個(gè)Target1項(xiàng)外,工作區(qū)里仍然是空白的,還得進(jìn)行幾個(gè)操作。添加源程序文件

若要將源程序文件添加到當(dāng)前項(xiàng)目,可在項(xiàng)目窗口左側(cè)單擊Target1節(jié)點(diǎn)下的SourceGroup1項(xiàng),單擊鼠標(biāo)右鍵,彈出菜單,再選擇其中的AddFilestoGroup’SourceGroup1’選項(xiàng)。即可出現(xiàn)添加文件對(duì)話框。項(xiàng)目選項(xiàng)設(shè)置

單擊“”按鈕可打開設(shè)置選項(xiàng)對(duì)話框。

其中可以設(shè)置程序存儲(chǔ)器、時(shí)鐘頻率,其默認(rèn)的為該芯片的最高時(shí)鐘頻率,但在實(shí)際電路里不一定使用,而是有助于程序設(shè)計(jì)與電路控制的頻率,通常是12MHz。若使用內(nèi)部程序存儲(chǔ)器,則選中UseOn-ChipROM選項(xiàng)。若要改變使用其他芯片,可單擊Device標(biāo)簽,這時(shí)可以在其列表框中選擇采用的芯片。

Output標(biāo)簽:若要產(chǎn)生刻錄或在線仿真所需的HEX文件,則在Output選項(xiàng)卡里選中CreateExecutable選項(xiàng),再選中CreateHEXFile選項(xiàng)。

其他各選項(xiàng)卡的選項(xiàng)只要采用程序默認(rèn)值即可,具體功能簡述如下:

Listing:產(chǎn)生列表文件的相關(guān)設(shè)置。

C51:設(shè)置c51編譯器。

A51:設(shè)置A51匯編器。

BL51Locate:設(shè)置BL51連接器的定位選項(xiàng)。

Bl51Misc:設(shè)置BL51連接器的其他選項(xiàng)。

Debug:設(shè)置調(diào)試器。

Utility:設(shè)置通用工具。3、認(rèn)識(shí)調(diào)試/仿真環(huán)境

完成生成后,單擊“”按鈕進(jìn)入調(diào)試/仿真狀態(tài)??梢钥吹秸{(diào)試/仿真工具欄:

復(fù)位CPU,讓程序從頭開始執(zhí)行。全速執(zhí)行程序。停止程序的執(zhí)行。

單步執(zhí)行,若遇到函數(shù),則跳入該函數(shù)。

單步執(zhí)行,若遇到函數(shù),則直接完成該函數(shù)。

完成當(dāng)時(shí)所執(zhí)行的函數(shù),跳出該函數(shù),返回主程序。

執(zhí)行到文字插入點(diǎn)(文字光標(biāo))所在的那一行語句。

打開STARTUP.A51窗口,以展示程序相對(duì)于匯編語言的執(zhí)行狀態(tài)。

4、外設(shè)操作

在調(diào)試/仿真狀態(tài)下,Peripherals菜單利于觀察外設(shè)端口的狀態(tài)。ResetCPU命令

與單擊“”功能一樣。Interrupt命令

用于設(shè)置是否顯示中斷系統(tǒng)對(duì)話框。

其中列出了該芯片中所有中斷源,如果直接選擇所要操作的中斷源,則該中斷源的所有相關(guān)選擇項(xiàng)將呈現(xiàn)在對(duì)話框下方,以P3.2/INT0選項(xiàng)為例,對(duì)話框?qū)⒊霈F(xiàn)下列選項(xiàng):

EA:打開中斷源總開關(guān)

IT0:中斷觸發(fā)方式

IE0:該中斷觸發(fā)

EX0:該中斷的中斷狀態(tài)

Pri:該中斷的優(yōu)先級(jí)I/O-Ports命令用于設(shè)置是否顯示輸入/輸出端口對(duì)話框,選擇該命令后,將彈出輸入/輸出端口菜單。以Port0為例,選擇后將打開其對(duì)話框其中分為P0與Pins兩行。P0對(duì)應(yīng)為端口的輸出狀態(tài)Pins對(duì)應(yīng)為端口的輸入狀態(tài)。可以在此行中輸入信號(hào),打鉤為1。Serial命令

用于設(shè)置是否顯示串行端口對(duì)話框。其中各項(xiàng):

Mode:串行端口方式;

SCON:Scon寄存器內(nèi)容;

SBUF:串行口緩沖器的內(nèi)容;

SM2:

REN:

TB8:

RB8:SMOD:Baudrate:

TI:

RI:Timer命令

該命令用于設(shè)置是否顯示定時(shí)器/計(jì)數(shù)器對(duì)話框。

Mode:包括兩欄,上面用于設(shè)置定時(shí)器/計(jì)數(shù)器方式,下面用于設(shè)置內(nèi)部定時(shí)和外部計(jì)數(shù)。

TCON:程序中所置TCON寄存器內(nèi)容。

TMOD:程序中所置TMOD寄存器內(nèi)容。

TH0:程序中所置TH0中的內(nèi)容。

TL0:程序中所置TL0中的內(nèi)容。

T0Pin:為T0引腳的狀態(tài),若選擇,則T0引腳為高電平。

TF0:為定時(shí)器/計(jì)數(shù)器的中斷標(biāo)志。

Status:表示當(dāng)前是否啟用定時(shí)器/計(jì)數(shù)器。

TR0:軟件運(yùn)行定時(shí)器/計(jì)數(shù)器。

GATE:控制開關(guān)狀態(tài)。GATE=1,外部控制定時(shí)器/計(jì)數(shù)器運(yùn)行。INT0#:外部運(yùn)行定時(shí)器/計(jì)數(shù)器的引腳,當(dāng)設(shè)置為外部控制定時(shí)器/計(jì)數(shù)器運(yùn)行的情況下,單擊此項(xiàng)可啟動(dòng)定時(shí)

溫馨提示

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

評(píng)論

0/150

提交評(píng)論