第4章 單片機(jī)的C51語(yǔ)言_第1頁(yè)
第4章 單片機(jī)的C51語(yǔ)言_第2頁(yè)
第4章 單片機(jī)的C51語(yǔ)言_第3頁(yè)
第4章 單片機(jī)的C51語(yǔ)言_第4頁(yè)
第4章 單片機(jī)的C51語(yǔ)言_第5頁(yè)
已閱讀5頁(yè),還剩87頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

重點(diǎn)與難點(diǎn):

C51的數(shù)據(jù)類型、存儲(chǔ)類型和存儲(chǔ)模式;C51的指針定義與使用;C51與匯編語(yǔ)言的混合編程;C51的單片機(jī)片內(nèi)、片外資源編程控制方法。教學(xué)目標(biāo):

※掌握C51語(yǔ)言的數(shù)據(jù)結(jié)構(gòu)相關(guān)內(nèi)容;

※了解C51與匯編語(yǔ)言的混合編程方法;

※熟悉KeiluVision2的C5l仿真開(kāi)發(fā)環(huán)境的使用;

※熟悉KeiluVision2與Proteus聯(lián)合仿真;

※掌握單片機(jī)的工作原理和編程方法。第4章單片機(jī)的C51語(yǔ)言4.1C51的程序結(jié)構(gòu)4.1.1C51語(yǔ)言概述如前所述,用匯編語(yǔ)言編寫MCS-51單片機(jī)程序必須要考慮其存儲(chǔ)器結(jié)構(gòu),尤其是其片內(nèi)數(shù)據(jù)存儲(chǔ)器與特殊功能寄存器的使用以及按實(shí)際地址處理端口數(shù)據(jù)。而用C51語(yǔ)言編寫單片機(jī)應(yīng)用程序,則不用具體組織、分配存儲(chǔ)器資源和處理端口數(shù)據(jù),但對(duì)數(shù)據(jù)類型與變量的定義,必須要與單片機(jī)的存儲(chǔ)結(jié)構(gòu)相關(guān)聯(lián),否則編譯器不能正確地映射定位。與標(biāo)準(zhǔn)C語(yǔ)言相比,C51在數(shù)據(jù)類型、變量存儲(chǔ)模式、輸入/輸出處理、函數(shù)等方面有一定差異,它需要根據(jù)單片機(jī)存儲(chǔ)結(jié)構(gòu)及內(nèi)部資源定義相應(yīng)的數(shù)據(jù)類型和變量,而其他語(yǔ)法規(guī)則、程序結(jié)構(gòu)及程序設(shè)計(jì)方法等與標(biāo)準(zhǔn)的C語(yǔ)言程序設(shè)計(jì)相同。本章著重介紹C51的數(shù)據(jù)結(jié)構(gòu)、C51與匯編語(yǔ)言的混合編程、C51仿真開(kāi)發(fā)環(huán)境以及C51初步編程等內(nèi)容。學(xué)習(xí)本章要注意復(fù)習(xí)標(biāo)準(zhǔn)C語(yǔ)言的基本知識(shí),因?yàn)樵趹?yīng)用實(shí)例中要用到標(biāo)準(zhǔn)C的內(nèi)容。4.1.2C51的程序結(jié)構(gòu)

C51程序的基本單位是函數(shù)。一個(gè)C51源程序至少包含一個(gè)主函數(shù),也可以是一個(gè)主函數(shù)和若干個(gè)其他函數(shù)。主函數(shù)是程序的人口;主函數(shù)中的所有語(yǔ)句執(zhí)行完畢,則程序結(jié)束。以下通過(guò)一個(gè)可實(shí)現(xiàn)開(kāi)關(guān)控制LED燈亮滅功能的源程序說(shuō)明C51程序的基本結(jié)構(gòu)#include<REG51.H>//51單片機(jī)頭文件sbitK1=P3^0;//定義輸入開(kāi)關(guān)sbitL1=P1^0;//定義輸出指示燈voiddelay();//延時(shí)函數(shù)聲明//---------------------------------voidmain(void)//主函數(shù)

{while(1)//無(wú)限循環(huán)體

{if(K1==0)//開(kāi)關(guān)是否合上

{delay();//延時(shí)

if(K1==0)//開(kāi)關(guān)是否合上,不是抖動(dòng)

{L1=0;}//合上,燈亮}else//開(kāi)關(guān)是斷開(kāi)的

{L1=1;}//開(kāi)關(guān)斷開(kāi),燈滅

}}voiddelay(void)//延時(shí)函數(shù)

{unsignedchari;//字符型變量i定義

for(i=200;i>0;i--);

}//循環(huán)延時(shí)開(kāi)關(guān)控制LED燈亮滅.DNS圖4-1模擬開(kāi)關(guān)燈電路原理圖在本例的開(kāi)始處使用了預(yù)處理命令#include,它告訴編譯器在編譯時(shí)將頭文件REG51.H讀入一起編譯。在頭文件REG51.H中包括了對(duì)51單片機(jī)特殊功能寄存器名的集中說(shuō)明。本例中main()是一個(gè)無(wú)返回、無(wú)參數(shù)型函數(shù),雖然參數(shù)表為空,但一對(duì)圓括號(hào)()必須有,不能省略。其中:①sbitL1=P1^0和sbitK1=P3^0是全局變量定義,它將Pl.0端口定義為L(zhǎng)1輸出變量;它將P3.0端口定義為K輸入變量;②unsignedchari是局部變量定義,它說(shuō)明i是位于片內(nèi)RAM且長(zhǎng)度為8的字符型變量;③while(l)是循環(huán)語(yǔ)句,可實(shí)現(xiàn)死循環(huán)功能;④L1=0和L1=1是兩個(gè)賦值語(yǔ)句,等號(hào)=作為賦值運(yùn)算符;⑤if(K1==0)是條件判斷語(yǔ)句,判斷開(kāi)關(guān)是否合上⑥for(i=200,i>0;i--)是沒(méi)有語(yǔ)句體的循環(huán)語(yǔ)句,這里起到軟件延時(shí)的作用。C51語(yǔ)言程序的基本結(jié)構(gòu)為:包含<頭文件>

函數(shù)類型說(shuō)明全局變量定義

main(){局部變量定義

<程序體>}funcl(){局部變量定義

<程序體>}…funcN(){局部變量定義

<程序體>}其中,func1()…funcN()代表用戶定義的函數(shù),程序體指C51提供的任何庫(kù)函數(shù)調(diào)用語(yǔ)句、控制流程語(yǔ)句或其他函數(shù)調(diào)用語(yǔ)句。4.2C51的數(shù)據(jù)結(jié)構(gòu)4.2.1C51的變量在程序執(zhí)行過(guò)程中,數(shù)值可以發(fā)生改變的量稱為變量。變量的基本屬性是變量名和變量值。一旦在程序中定義了一個(gè)變量,C51編譯器就會(huì)給這個(gè)變量分配相應(yīng)的存儲(chǔ)單元。此后變量名就與存儲(chǔ)單元地址相對(duì)應(yīng),變量值就與存儲(chǔ)單元的內(nèi)容相對(duì)應(yīng)。例如,圖4.2所示程序中通過(guò)引用變量i實(shí)現(xiàn)了對(duì)分配內(nèi)存30H單元的數(shù)據(jù)操作。圖4.2C51的變量概念示意圖要在C51程序中使用變量必須先對(duì)其進(jìn)行定義,這樣編譯系統(tǒng)才能為變量分配相應(yīng)的存儲(chǔ)單元。定義一個(gè)變量的格式如下:

[存儲(chǔ)種類]數(shù)據(jù)類型[存儲(chǔ)類型]變量名這說(shuō)明變量具有4大要素,其中數(shù)據(jù)類型和變量名是不能省略的部分。1.存儲(chǔ)種類2.?dāng)?shù)據(jù)類型3.存儲(chǔ)類型

4.變量名存儲(chǔ)種類是指變量在程序執(zhí)行過(guò)程中的作用范圍。變量的存儲(chǔ)種類有4種:自動(dòng)(auto)、外部(extern)、靜態(tài)(static)和寄存器(register)。使用存儲(chǔ)種類說(shuō)明符auto定義的變量稱為自動(dòng)變量。自動(dòng)變量的作用范圍在定義它的函數(shù)體或復(fù)合語(yǔ)句內(nèi)部。在定義它的函數(shù)體或復(fù)合語(yǔ)句被執(zhí)行時(shí),C51才為該變量分配內(nèi)存空間,當(dāng)函數(shù)調(diào)用結(jié)束返回或復(fù)合語(yǔ)句執(zhí)行結(jié)束時(shí),自動(dòng)變量所占用的內(nèi)存空間被釋放,這些內(nèi)存空間又可被其他的函數(shù)體或復(fù)合語(yǔ)句使用。在定義變量時(shí),如果省略存儲(chǔ)種類,則變量默認(rèn)為自動(dòng)(auto)變量。由于89C51單片機(jī)訪問(wèn)片內(nèi)RAM速度很快,通常將函數(shù)體內(nèi)和復(fù)合語(yǔ)句中使用頻繁的變量放在片內(nèi)RAM中,且定義為自動(dòng)變量,這樣可有效地利用片內(nèi)有限的RAM資源。使用存儲(chǔ)種類說(shuō)明符extern定義的變量稱為外部變量。在一個(gè)函數(shù)體內(nèi),要使用一個(gè)已在該函數(shù)體外或別的程序模塊文件中定義過(guò)的外部變量時(shí),該變量在本函數(shù)體內(nèi)要用extern說(shuō)明。外部變量被定義后,即分配了固定的內(nèi)存空間,在程序的整個(gè)執(zhí)行期間都是有效的。通常將多個(gè)函數(shù)或模塊共享的變量定義為外部變量。外部變量是全局變量,在程序執(zhí)行期間一直占有固定的內(nèi)存空間。當(dāng)片內(nèi)RAM資源緊張時(shí),不應(yīng)將外部變量放在片內(nèi)RAM。使用static定義的變量稱為靜態(tài)變量,它又分為內(nèi)部靜態(tài)變量和外部靜態(tài)變量。在函數(shù)體內(nèi)部定義的靜態(tài)變量為內(nèi)部靜態(tài)變量,它在對(duì)應(yīng)的函數(shù)體內(nèi)有效,但在函數(shù)體外不可見(jiàn),這樣不僅使變量在定義它的函數(shù)體外被保護(hù),還可以實(shí)現(xiàn)當(dāng)離開(kāi)函數(shù)時(shí)值不被改變。外部靜態(tài)變量是在函數(shù)外部定義的靜態(tài)變量,它在程序中一直可見(jiàn),但在定義的范圍之外是不可見(jiàn)的。如在多文件或多模塊處理中,外部靜態(tài)變量只在文件內(nèi)部或模塊內(nèi)部有效。

1.存儲(chǔ)種類2.?dāng)?shù)據(jù)類型表4-1C51支持的基本數(shù)據(jù)類型數(shù)據(jù)類型長(zhǎng)度值域字符型(char)signedchar單字節(jié)0~255unsignedchar單字節(jié)-128~+127整型(int)signedint雙字節(jié)0~65535unsignedint雙字節(jié)-32768~+32767長(zhǎng)整型signedlong4字節(jié)0~4294967295unsignedlong4字節(jié)-2147483648~+2147483647浮點(diǎn)型float4字節(jié)10-38~1038double8字節(jié)10-308~10308指針型普通指針*1~3字節(jié)0~65535數(shù)據(jù)的不同格式叫做數(shù)據(jù)類型,C51支持的基本數(shù)據(jù)類型與標(biāo)準(zhǔn)C相同其中,有符號(hào)數(shù)據(jù)類型可以忽略signed標(biāo)識(shí)符,如signedchar等價(jià)于char,signedint等價(jià)于int等。C51還增加了一些特殊的數(shù)據(jù)類型,它們分別對(duì)應(yīng)于bit、sfr、sfr16和sbit4個(gè)關(guān)鍵字。

(l)bit位型。bit位型是C51編譯器的一種擴(kuò)充數(shù)據(jù)類型,利用它可定義一個(gè)位變量或位函數(shù),但不能定義位指針,也不能定義位數(shù)組。它的值是一個(gè)二進(jìn)制位,不是0就是1。

(2)sfr特殊功能寄存器型。51系列單片機(jī)內(nèi)有21個(gè)特殊功能寄存器(SFR),分散在片內(nèi)RAM區(qū)的高128字節(jié),地址為80H~FFH。為了能直接訪問(wèn)這些SFR,需要通過(guò)關(guān)鍵字sfr對(duì)其進(jìn)行定義,語(yǔ)法如下:

sfrsfr_name=地址常數(shù);

這里sfr_name是一個(gè)特殊功能寄存器名,“=”后面必須是常數(shù),其數(shù)值范圍必須在特殊功能寄存器地址范圍內(nèi),即位于0x80~0xFF之間。例如:

sfrP1=0x90;//定義P1口地址90HsfrPSW=0xD0;//定義PSW地址D0H

對(duì)于16位SFR,可使用關(guān)鍵字sfr16,語(yǔ)法與8位SFR相同,定義的地址必須是16位

SFR的低端地址,例如:

sfr16DPTR=0x82;//定義DPTR,其DPL=82H,DPH=83H

注意:這種定義適用于所有新的SFR,但不能定義定時(shí)/計(jì)數(shù)器0和1,因?yàn)樗麄兊牡刂凡皇沁B續(xù)的。

(3)sbit可位尋址型。在51系列單片機(jī)中,經(jīng)常要訪問(wèn)特殊功能寄存器中的某些位,用關(guān)鍵字sbit定義可位尋址的特殊功能寄存器的位尋址對(duì)象。用關(guān)鍵字sbit定義可位尋址的特殊功能寄存器的位尋址對(duì)象。定義方法有如下3種:

1)sbit位變量名=位地址將位的絕對(duì)地址賦給位變量名,位地址必須位于0x80~0xFF之間。例如:

sbitCY=0xD7;//將位的絕對(duì)地址賦給變量

2)sbit位變量名=SFR名稱^位位置當(dāng)可尋址位位于特殊功能寄存器中時(shí),可采用這種方法。其中SFR名稱必須是已定義的SFR的名字,位位置是一個(gè)0~7之間的常數(shù)。例如:

sfrPSW=0xD0;sbitCY=PSW^7;//定義CY位為PSW.7,位地址為0xD7

3)sbit位變量名=字節(jié)地址^位位置這種方法是以一個(gè)常數(shù)(字節(jié)地址)作為基地址,該常數(shù)必須在0x80~0xFF之間。位位置是一個(gè)0~7之間的常數(shù)。例如:

sbitCY=0xD0^7;//將位的相對(duì)地址賦給變量注意sbit和bit的區(qū)別:sbit定義特殊功能寄存器中的可尋址位,而bit則定義了一個(gè)普通的位變量,一個(gè)函數(shù)中可包含bit類型的參數(shù),函數(shù)返回值也可為bit類型。典型REG51.h頭文件的部分內(nèi)容如圖4-3所示圖4-3reg51.h頭文件部分內(nèi)容示意圖

3.存儲(chǔ)類型

51系列單片機(jī)具有3個(gè)存儲(chǔ)空間:片內(nèi)低128BRAM、片外64KBRAM和片內(nèi)外統(tǒng)一編址的64KBROM,對(duì)于8052型單片機(jī)還有片內(nèi)高128BRAM空間。這些存儲(chǔ)空間與存儲(chǔ)類型的對(duì)應(yīng)關(guān)系如圖4-4和表4-2所示。data區(qū)code區(qū)xdata區(qū)bdata區(qū)pdata區(qū)idata區(qū)圖4-451系列單片機(jī)存儲(chǔ)空間示意圖表4-2C51的存儲(chǔ)類型與存儲(chǔ)空間對(duì)應(yīng)關(guān)系存儲(chǔ)類型存儲(chǔ)空間位置字節(jié)地址說(shuō)明data片內(nèi)低128B存儲(chǔ)區(qū)00H~7FH訪問(wèn)速度快,可作為常用變量或臨時(shí)性變量存儲(chǔ)區(qū)bdata片內(nèi)可位尋址存儲(chǔ)區(qū)20H~2FH允許位與字節(jié)混合訪問(wèn)idata片內(nèi)高128B存儲(chǔ)區(qū)80H~FFH只有52系列單片機(jī)才有pdata片外頁(yè)RAM00H~FFH常用于外部設(shè)備訪問(wèn)xdata片外64KBRAM0000H~FFFFH常用于存放不常用的變量或等待處理的數(shù)據(jù)code程序ROM0000H~FFFFH常用于存放數(shù)據(jù)表格等固定信息一個(gè)變量除了與存儲(chǔ)單元相對(duì)應(yīng)外,還與它所在的存儲(chǔ)空間有關(guān),即還需要指出其存儲(chǔ)類型。例如語(yǔ)句chardataa聲明了a是位于片內(nèi)低128BRAM區(qū)的字符型變量。如果在定義變量時(shí)省略了存儲(chǔ)類型說(shuō)明符,C51編譯器會(huì)根據(jù)當(dāng)前編譯模式自動(dòng)認(rèn)定默認(rèn)的存儲(chǔ)類型。編譯模式共分為:小編譯模式(SMALL)、緊湊編譯模式(COMPACT)和大編譯模式(LARGE)3種模式。表4-33種編譯模式的特點(diǎn)小結(jié)編譯模式變量存儲(chǔ)區(qū)域默認(rèn)存儲(chǔ)類型特點(diǎn)SMALL片內(nèi)低128BRAMdata訪問(wèn)數(shù)據(jù)的速度最快,但由于存儲(chǔ)容量小,難以滿足需要定義變量更多的場(chǎng)合COMPACT片外頁(yè)256BRAMpdata介于兩者之間,且受片外RAM的容量限制LARGE片外64KBRAMxdata訪問(wèn)數(shù)據(jù)的效率不高,但由于存儲(chǔ)容量大,可以滿足需要定義變量更多的場(chǎng)合由表4-3可知,在SMALL編譯模式下,語(yǔ)句chara等價(jià)于chardataa,而在LARGE編譯模式下,語(yǔ)句chara等價(jià)于charxdataa。

4.變量名

C51規(guī)定變量名可以由字母、數(shù)字和下劃線3種字符組成,且第一個(gè)字符必須為字母或下劃線,變量名長(zhǎng)度無(wú)統(tǒng)一規(guī)定,隨編譯系統(tǒng)而定。使用時(shí)應(yīng)注意:大寫的變量和小寫的變量是兩個(gè)不同的變量,如SUM和sum。習(xí)慣上變量用小寫表示。另外,變量名除了應(yīng)避免使用標(biāo)準(zhǔn)C語(yǔ)言的32個(gè)關(guān)鍵字外,還要避免使用C51擴(kuò)展的新關(guān)鍵字。表4-4C51擴(kuò)展的21個(gè)關(guān)鍵字一覽表關(guān)鍵字用途說(shuō)明_at_地址定位為變量進(jìn)行存儲(chǔ)器絕對(duì)空間地址定位alien函數(shù)特性聲明聲明與PL/M-51編譯器的接口bdata存儲(chǔ)類型說(shuō)明可位尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器bit位變量聲明聲明一個(gè)位變量或位函數(shù)code存儲(chǔ)器類型聲明程序存儲(chǔ)器compact存儲(chǔ)模式聲明聲明一個(gè)緊湊編譯存儲(chǔ)模式data存儲(chǔ)器類型聲明直接尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器far遠(yuǎn)變量聲明Keil用3BYTE指針來(lái)引用它idata存儲(chǔ)器類型聲明間接尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器interrupt中斷函數(shù)聲明定義一個(gè)中斷服務(wù)函數(shù)large存儲(chǔ)模式聲明聲明一個(gè)大編譯存儲(chǔ)模式pdata存儲(chǔ)器類型聲明分頁(yè)尋址的外部數(shù)據(jù)存儲(chǔ)器_priority_多任務(wù)優(yōu)先聲明規(guī)定RTX51或RTX51Tiny的任務(wù)優(yōu)先級(jí)reentrant再入函數(shù)聲明用于把函數(shù)定義為可重人函數(shù)sbit擴(kuò)充數(shù)據(jù)類型聲明聲明一個(gè)可位尋址變量sfr擴(kuò)充數(shù)據(jù)類型聲明聲明一個(gè)特殊功能寄存器sfr16擴(kuò)充數(shù)據(jù)類型聲明聲明一個(gè)16位的特殊功能寄存器small存儲(chǔ)模式聲明聲明一個(gè)小編譯存儲(chǔ)模式_task_任務(wù)聲明定義實(shí)時(shí)多任務(wù)函數(shù)using寄存器組定義定義51單片機(jī)工作寄存器組xdata存儲(chǔ)器類型聲明外部數(shù)據(jù)存儲(chǔ)器所有變量在使用前必須聲明,即變量須“先定義,后使用”,凡未被定義的,不作為變量名,這樣可保證程序中變量名使用的正確性。

unsignedchardatasystem_status=0;//定義system_status為無(wú)符號(hào)字符型自動(dòng)變

//量,該變量位于data區(qū)中且初值為0unsignedcharbdatastatus_byte;//定義status_byte為無(wú)符號(hào)字符型自動(dòng)變量,

//該變量位于bdata區(qū)中

unsignedintcodeunit_id[2]={Ox1234,Ox89ab};//定義unit_id[2]為無(wú)符號(hào)整型自

//動(dòng)變量,該變量位于code區(qū)中,且

//為長(zhǎng)度為2的數(shù)組,初值為0x1234//和0x89abstaticcharm,n;//定義m和n為2個(gè)位于data區(qū)中的有符號(hào)字符型靜態(tài)變量

externfloatxdatavar4;//在片外RAM64KB空間定義外部實(shí)型變量var4#pragmaCOMPACT//設(shè)置編譯模式,指定默認(rèn)存儲(chǔ)類型

chark2;//定義k2為有符號(hào)字符型自動(dòng)變量,且默認(rèn)為pdata型

4.2.2C51的指針標(biāo)準(zhǔn)C語(yǔ)言指針的一般定義形式為:

數(shù)據(jù)類型*指針變量名其中“*指針變量名”表示這是一個(gè)指針變量,它指向一個(gè)由“數(shù)據(jù)類型”說(shuō)明的變量。被指向變量和指針變量都位于C編譯器默認(rèn)的存儲(chǔ)區(qū)中。例如:inta='A';int*p1=&a;

這表示p1是一個(gè)指向int型變量的指針變量,此時(shí)p1的值為int型變量a的地址,而a和p1兩個(gè)變量都位于C編譯器默認(rèn)的內(nèi)存區(qū)域中。對(duì)于C51來(lái)講,除上述信息外,指針定義還應(yīng)包括以下信息:(1)指針變量自身位于哪個(gè)存儲(chǔ)區(qū)中(2)被指向變量位于哪個(gè)存儲(chǔ)區(qū)中故C51指針的一般定義形式為:

數(shù)據(jù)類型[存儲(chǔ)類型1]*[存儲(chǔ)類型2]指針變量名;其中“數(shù)據(jù)類型”是被指向變量的數(shù)據(jù)類型,如int型或char型等;“存儲(chǔ)類型1”是被指向變量所在的存儲(chǔ)區(qū)類型,如data,code,xdata等,缺省時(shí)根據(jù)該變量的定義語(yǔ)句確定;“存儲(chǔ)類型2”是指針變量所在的存儲(chǔ)區(qū)類型,如data,code,xdata等,缺省時(shí)根據(jù)C51編譯模式的默認(rèn)值確定;指針變量名可按C51變量名的規(guī)則選取。

例4-1charxdataa='A’;char*ptr=&a;

解:在這個(gè)例子里,ptr是一個(gè)指向char型變量的指針變量,它本身位于SMALL編譯模式默認(rèn)的data存儲(chǔ)區(qū)里,它的值是位于xdata存儲(chǔ)區(qū)里的char型變量a的地址。

例4-2charxdataa='A';char*ptr=&a;charidatab='B';*ptr=&b;

解:在這個(gè)例子里,前兩句與例4-1相同。而后兩句里,由于變量b位于idata存儲(chǔ)區(qū)中,所以當(dāng)執(zhí)行完*ptr=&b之后,ptr的值是位于idata存儲(chǔ)區(qū)里的char型變量b的地址。從此可看出,以char*ptr形式定義的指針變量,其數(shù)值既可以是位于xdata存儲(chǔ)區(qū)的char型變量的地址,也可以是位于idata存儲(chǔ)區(qū)的char型變量的地址,具體結(jié)果由賦值操作關(guān)系決定。例4-3charxdataa='A';charxdata*ptr=&a;

解:這里變量a是位于xdata存儲(chǔ)區(qū)里的char型變量,而ptr是位于data存儲(chǔ)區(qū)且固定指向xdata存儲(chǔ)區(qū)的char型變量的指針變量,此時(shí)ptr的值為變量a的地址(不能像例4-2那樣再將idata存儲(chǔ)區(qū)的char型變量b的地址賦予ptr)。

例4-4charxdataa='A';charxdata*idataptr=&a;

解:這里表示,ptr是固定指向xdata存儲(chǔ)區(qū)的char型變量的指針變量,它自身存放在idata存儲(chǔ)區(qū)中,此時(shí)ptr的值為位于xdata存儲(chǔ)區(qū)中的char型變量a的地址。4.3C51與匯編語(yǔ)言的混合編程C51語(yǔ)言提供了豐富的庫(kù)函數(shù),具有很強(qiáng)的數(shù)據(jù)處理能力,可生成高效簡(jiǎn)潔的目標(biāo)代碼,在絕大多數(shù)場(chǎng)合采用C51語(yǔ)言編程即可完成預(yù)期的任務(wù)。盡管如此,有時(shí)仍需要采用一定的匯編語(yǔ)言程序,如對(duì)于某些特殊的I/O接口地址的處理、中斷向量地址的安排、提高程序代碼的執(zhí)行速度等。為此,C51編譯器提供了與匯編語(yǔ)言程序的接口規(guī)則,按此規(guī)則可以方便地實(shí)現(xiàn)C51語(yǔ)言程序與匯編語(yǔ)言程序的相互調(diào)用。

4.3.1在C51中調(diào)用匯編程序要實(shí)現(xiàn)在C51函數(shù)中調(diào)用匯編函數(shù),需要了解C51編譯器的編譯規(guī)則。下面我們從一個(gè)實(shí)例人手,介紹有關(guān)內(nèi)容,即在兩個(gè)給定數(shù)據(jù)中選出較大的那個(gè)數(shù)據(jù),其程序源代碼如下://以下代碼在main.c文件中實(shí)現(xiàn)voidmax(chara,charb);//由匯編語(yǔ)言實(shí)現(xiàn)main(){chara=30,b=40,C;C=max(a,b);}在上面的主函數(shù)中,voidmax(chara,charb)函數(shù)是在下面的匯編文件中實(shí)現(xiàn)的:

;以下代碼在匯編文件max.asm中實(shí)現(xiàn)

PUBLICMAXDESEGMENTCODERSEGDE_MAX:MOVA,R7;取第一個(gè)參數(shù)

MOV30H,R5;取第二個(gè)參數(shù)

CJNEA,30H,TAG SJMPEXITTAG:JNCEXITMOVA,R5;

MOVR7,A;返回第二個(gè)參數(shù)

EXIT:RET;返回第一個(gè)參數(shù)END要想使以匯編語(yǔ)言實(shí)現(xiàn)的函數(shù)能夠在C程序中被調(diào)用,需要解決下面3個(gè)問(wèn)題:①程序的尋址。在main()中調(diào)用的max()函數(shù),如何與匯編文件中的相應(yīng)代碼對(duì)應(yīng)起來(lái);②參數(shù)傳遞,從main()中傳遞給max()函數(shù)的參數(shù)a和b,存放在何處可使匯編程序能夠獲取它們的值;③返回值傳遞,匯編語(yǔ)言計(jì)算得到的結(jié)果,存放在何處可使C語(yǔ)言程序能夠獲取。程序的尋址是通過(guò)在匯編文件中定義同名的“函數(shù)”來(lái)實(shí)現(xiàn)的,例如上面匯編代碼中的:

PUBLICMAXDESEGMENTCODERSEGDE_MAX:…

在上面的例子中,

“_MAX”與C程序中的max相對(duì)應(yīng)。在C程序和匯編語(yǔ)言之間,函數(shù)名的轉(zhuǎn)換規(guī)則見(jiàn)表4-5。表4-5函數(shù)名的轉(zhuǎn)換規(guī)則C程序的函數(shù)聲明匯編語(yǔ)言的符號(hào)名解釋voidfunc(void)FUNC無(wú)參數(shù)傳遞或不含寄存器參數(shù)的函數(shù)名不做改變地傳人目標(biāo)文件中,名字只是簡(jiǎn)單地轉(zhuǎn)換為大寫形式voidfunc(char)_FUNC帶寄存器參數(shù)的函數(shù)名轉(zhuǎn)為大寫,并加上“_”前綴voidfunc(void)reentrant_?FUNC重人函數(shù)須使用前綴“_?”傳遞參數(shù)的簡(jiǎn)單辦法是使用寄存器,這種做法能夠產(chǎn)生精煉高效的代碼,具體規(guī)則見(jiàn)表4-6。

表4-6參數(shù)傳遞規(guī)則參數(shù)類型charintlong,float一般指針第1個(gè)參數(shù)R7R6,R7R4~R7R1,R2,R3第2個(gè)參數(shù)R5R4,R5R4~R7R1.R2,R3第3個(gè)參數(shù)R3R2,R3無(wú)R1.R2,R3在前面的例子語(yǔ)句voidmax(chara,charb);中,第一個(gè)char型參數(shù)a放在寄存器R7中,第二個(gè)char型參數(shù)b放在寄存器R5中。因此在后面的匯編代碼中,就是分別從R7和R5中取這兩個(gè)參數(shù):

…MAX:MOVA,R7;取第一個(gè)參數(shù)

MOV30H,R5;取第二個(gè)參數(shù)

…匯編語(yǔ)言通過(guò)寄存器或存儲(chǔ)器傳遞參數(shù)給C語(yǔ)言程序。匯編語(yǔ)言通過(guò)寄存器傳遞參數(shù)給C語(yǔ)言的返回值見(jiàn)表4-7。

表4-7匯編語(yǔ)言返回值返回值寄存器說(shuō)明bitC進(jìn)位標(biāo)志(unsigned)charR7(unsigned)intR6.R7高位在R6,低位在R7(unsigned)longR4~R7高位在R4,低位在R7floatR4~R732位IEEE格式,指數(shù)和符號(hào)位在R7指針R1,R2,R3R3存放寄存器類型,高位在R2,低位在R1在前面的例子中,匯編程序就是通過(guò)把兩個(gè)數(shù)中較大的一個(gè)保存在寄存器R7中返回給C函數(shù)的。

4.3.2在C51中嵌入?yún)R編代碼在C51函數(shù)內(nèi)嵌入?yún)R編代碼,可以有3種不同的方法。

方法1

直接在函數(shù)體內(nèi)的每個(gè)匯編語(yǔ)句前加“asm”預(yù)編譯指令。例如:

voidreset__data(void){asmMOVR1,#0AHasmLOOP:INCA

asmDJNZR0,LOOPreturn;

}

方法2把a(bǔ)sm作為關(guān)鍵字,后續(xù)的匯編語(yǔ)句用大括號(hào)括起來(lái)即可。例如:

voidreset__data(void){asm{MOVR1,#0AHLOOP:INCADJNZR0,LOOP}return;}

方法3在C模塊內(nèi)通過(guò)語(yǔ)句“#pragma”嵌入?yún)R編代碼。例如:

voidreset(void){#pragmaasmMOVR1,#0AHLOOP:INCADJNZR0,LOOP#pragmaendasmreturn;

}4.4C51仿真開(kāi)發(fā)環(huán)境4.4.1Keil的編譯環(huán)境μVision2Keil是德國(guó)KeilSoftware公司出品的單片機(jī)集成開(kāi)發(fā)軟件,該軟件支持51單片機(jī)的所有變種(目前共有400多種型號(hào))。Keil提供了包括C編譯器、宏匯編、連接器、庫(kù)管理及一個(gè)功能強(qiáng)大的仿真調(diào)試器在內(nèi)的完整開(kāi)發(fā)方案,并通過(guò)一個(gè)集成開(kāi)發(fā)環(huán)境(μVision2)將這些部分組合在一起。Keil單片機(jī)集成開(kāi)發(fā)軟件可以運(yùn)行在Windows98/NT/2000及XP等操作系統(tǒng)下。

μVision2的軟件界面包括4大組成部分,即菜單工具欄、工程管理窗口、文件窗口和輸出窗口(如圖4.5所示)。以下僅針對(duì)組成結(jié)構(gòu)做個(gè)簡(jiǎn)單介紹,具體使用方法將在本書(shū)附錄A中結(jié)合實(shí)驗(yàn)需要進(jìn)行介紹。圖4-5μvision2的軟件界面①菜單工具欄:菜單為標(biāo)準(zhǔn)的Windows風(fēng)格,μVision2中共有11個(gè)下拉菜單。②工程管理窗口:工程管理窗口用于管理工程文件目錄,它由5個(gè)子窗口組成,可以通過(guò)子窗口下方的標(biāo)簽進(jìn)行切換,它們分別是文件窗口、寄存器窗口、幫助窗口、函數(shù)窗口及模板窗口。③文件窗口:文件窗口用于顯示打開(kāi)的程序文件,多個(gè)文件可以通過(guò)窗口下方的文件標(biāo)簽進(jìn)行切換。④輸出窗口:輸出窗口用于輸出編譯過(guò)程中的信息,由三個(gè)子窗口組成,可以通過(guò)子窗口下方的標(biāo)簽進(jìn)行切換,它們分別是編譯窗口、命令窗口和搜尋窗口。為了掌握程序運(yùn)行信息,Keil軟件在調(diào)試程序時(shí)還提供了許多信息窗口,包括輸出窗口、觀察窗口、存儲(chǔ)器窗口、反匯編窗口以及串行窗口等。為了能夠比較直觀地了解單片機(jī)中定時(shí)器、中斷、并行端口、串行端口等常用外設(shè)的使用情況,Keil還提供了一些外圍接口對(duì)話框。然而,Keil的這些調(diào)試手段都是通過(guò)數(shù)值變化來(lái)監(jiān)測(cè)程序運(yùn)行的,很難直接看出程序的實(shí)際運(yùn)行效果,特別是對(duì)于包含測(cè)量、控制、人機(jī)交互等外部設(shè)備的單片機(jī)應(yīng)用系統(tǒng)來(lái)講缺乏直觀性。具有強(qiáng)大仿真功能的Proteus軟件雖然較好地解決了外圍電路與單片機(jī)混合仿真的問(wèn)題,它卻沒(méi)有C51仿真功能。Proteus與KeilC的聯(lián)合使用則可使這兩個(gè)仿真軟件優(yōu)勢(shì)互補(bǔ),組建單片機(jī)應(yīng)用系統(tǒng)在C51條件下的整機(jī)虛擬實(shí)驗(yàn)環(huán)境。該虛擬實(shí)驗(yàn)環(huán)境包括一個(gè)硬件執(zhí)行環(huán)境和一個(gè)軟件執(zhí)行環(huán)境,其中Proteus提供硬件仿真與運(yùn)行環(huán)境,Keil提供軟件執(zhí)行環(huán)境。4.4.2基于KeilC和Proteus的程序開(kāi)發(fā)過(guò)程在PC機(jī)上安裝KeiluVision2軟件,完成后先要建立一個(gè)項(xiàng)目,如圖4-6所示,啟動(dòng)KeiluVision2,單擊“Project菜單/New…”選項(xiàng):圖4-6建立新項(xiàng)目圖4-7保存新項(xiàng)目

從彈出的窗口中,選擇要保存項(xiàng)目的路徑,并輸入項(xiàng)目文件名“ADC0809.uv2”,然后點(diǎn)擊保存按鈕,如圖4-7所示:這時(shí)會(huì)彈出一個(gè)選擇CPU型號(hào)的對(duì)話框,可以根據(jù)所使用的單片機(jī)來(lái)選擇,如圖4-8所示選擇SST89x516RD2,選定CPU型號(hào)之后從窗口右邊一欄可以看到對(duì)這個(gè)單片機(jī)的基本說(shuō)明,點(diǎn)擊確定按鈕后會(huì)彈出如圖4-9所示窗口,詢問(wèn)是否要將啟動(dòng)代碼“StartupCode”加入到項(xiàng)目中,對(duì)于采用高級(jí)語(yǔ)言C51編寫的程序,點(diǎn)擊“是”按鈕,對(duì)于采用匯編語(yǔ)言編寫的程序可以不用啟動(dòng)代碼“StartupCode”,因此點(diǎn)擊否按鈕。圖4-8選擇CPU圖4-9添加啟動(dòng)代碼圖4-10創(chuàng)建程序文件接下來(lái)要?jiǎng)?chuàng)建程序文件,如圖4-10所示,單擊“File菜單/New…”選項(xiàng):在彈出的編輯窗口中輸入如下C51源程序://********************************************************************************//********************************************************************************//**<程序名>:數(shù)字電壓表 **//**<功能>:使用LCD顯示被檢測(cè)電壓,精度為0.05V,范圍是0~5V。**//**<版本說(shuō)明>:這是第1版,使用16X2LCD顯示。 **//**<作者>:皮大能 **//**<完成時(shí)間>:2010年2月8日 **//**<聯(lián)系方式>:pidaneng@163.com;QQ:399676777 **//********************************************************************************//*******************************頭文件及宏定義*******************************//********************************************************************************#include<REG52.h>#include"delay.h"http://插入延時(shí)頭文件(見(jiàn)4.5)#include"LCD1602.h"http://插入LCD1602顯示頭文件#defineTIME0H0x3C//定時(shí)初值高八位#defineTIME0L0xB0//定時(shí)初值高低位#defineucharunsignedchar#defineuintunsignedint//*************************************************************************//***********************端口設(shè)置宏定義************************************//*************************************************************************sbitSTART=P2^4;//ATART,ALE接口。0->1->0:啟動(dòng)AD轉(zhuǎn)換。sbitOE=P2^3;//讀ADC0809數(shù)據(jù),低電平有效sbitEOC=P3^3;//轉(zhuǎn)換完畢由0變1.#defineOUTPORTP0//ADC0809數(shù)據(jù)接口//**************************************************************************//********************************全局變量**********************************//**************************************************************************ucharuc_Clock=0; //定時(shí)器0中斷計(jì)數(shù)bitb_ADTransform=0;//啟動(dòng)A/D轉(zhuǎn)換時(shí)間到標(biāo)志,為1時(shí)啟動(dòng)A/D轉(zhuǎn)換//*************************************************************************//******************************函數(shù)聲明***********************************voidDelay(); //延時(shí)函數(shù)。voidWR_CMD(ucharucCommand);//把1個(gè)命令寫入LCD函數(shù)。voidInitialize(); //LCD初始化函數(shù)voidWR_Data(ucharucData); //把1個(gè)數(shù)據(jù)寫入LCD。voidShow_1_Char(ucharucChar);//把1個(gè)字符寫入LCD.voidShow_Char(ucharucaChar[]);//把組字符寫入LCD.voidvShowVoltage(unintuiNumber);//uintuiADTransform();//AD轉(zhuǎn)換函數(shù),返回轉(zhuǎn)換結(jié)果.voidTime0();//定時(shí)器0中斷函數(shù).//**************************************************************************//AD轉(zhuǎn)換函數(shù)//AD轉(zhuǎn)換函數(shù),返回轉(zhuǎn)換結(jié)果。//轉(zhuǎn)換結(jié)果是3位數(shù),小數(shù)點(diǎn)在百位與十位之間。//**************************************************************************uintuiADTransform(){uintuiResult;OUTPORT=0x00;//選ADC0809的0通道START=1; //啟動(dòng)AD轉(zhuǎn)換。0->1->0START=0;while(EOC==0);//等待轉(zhuǎn)換結(jié)束。

OUTPORT=0xff;//數(shù)據(jù)口設(shè)為輸入狀態(tài)

OE=0;//打開(kāi)ADC0809的數(shù)據(jù)口三態(tài)門uiResult=OUTPORT;//出入轉(zhuǎn)換結(jié)果。

OE=1;//關(guān)閉ADC0809的數(shù)據(jù)口uiResult=(100*uiResult)/51;//處理運(yùn)算結(jié)果。returnuiResult;//帶處理好的AD轉(zhuǎn)換結(jié)果返回}//**************************************************************************//電壓數(shù)據(jù)寫入LCD函數(shù)//**************************************************************************voidvShowVoltage(unintuiNumber){ucharucaNumber[3],ucCount;if(uiNumber>999) {uiNumber=999;} ucaNumber[0]=uiNumber/100;//把計(jì)算數(shù)字的每個(gè)位存入數(shù)組。取整數(shù)部分

ucaNumber[1]=(uiNumber/10)%10;//取小數(shù)點(diǎn)后第1位數(shù)

ucaNumber[2]=uiNumber%10;//取小數(shù)點(diǎn)后第2位數(shù)

for(ucCount=0;ucCount<3;ucCount++) { Show_1_Char(ucaNumber[ucCount]+48); //從首位到末位逐一輸出。

if(ucCount==0) {Show_1_Char('.');} }}//**************************************************************************//*********************************主函數(shù)***********************************//**************************************************************************voidmain(){TMOD=0x01; //定時(shí)器0,模式1。TH0=TIME0H;//定時(shí)器初值的高八位送入TH0TL0=TIME0L;//定時(shí)器初值的低八位送入TL0uc_Clock=5;//設(shè)定時(shí)計(jì)數(shù)初值TR0=1;//啟動(dòng)定時(shí)器。ET0=1;//開(kāi)定時(shí)器中斷。EA=1;//開(kāi)總中斷LCD_Initial1();//LCD初始化WR_CMD(0x84);//寫入顯示"Voltage:"的起始地址Show_Char("Voltage:");//寫入"Voltage:"到LCD顯示W(wǎng)R_CMD(0xC9);//寫入顯示"(V)"的起始地址Show_Char("(V)");//寫入"(V)"到LCD顯示while(1){if(b_ADTransform==1)//如果A/D采樣時(shí)間到就啟動(dòng)A/D轉(zhuǎn)換

{ b_ADTransform=0;//清采樣時(shí)間到標(biāo)志

WR_CMD(0xC4);//寫入顯示電壓數(shù)據(jù)的起始地址

vShowVoltage(uiADTransform()); } }}//**************************************************************************//***************************定時(shí)器0中斷函數(shù)********************************//**************************************************************************voidTime0()interrupt1{TH0=TIME0H;//恢復(fù)定時(shí)器0的初值。TL0=TIME0L;uc_Clock--;//定時(shí)計(jì)數(shù)器減1if(uc_Clock==0){ uc_Clock=5;//定時(shí)計(jì)數(shù)器置初值

b_ADTransform=1;//置采樣周期到標(biāo)志}}//**************************************************************************//*LCD1602驅(qū)動(dòng)程序 *// 文件名:LCD1602.h//**************************************************************************#ifndef__LCD1602_H__#define__LCD1602_H__//*****************************************************#include<REG52.h>//插入52特殊功能寄存器頭文件#include<intrins.h>#include"delay.h"http://插入延時(shí)頭文件(見(jiàn)4.5)//*************************************************************************#defineuintunsignedint#defineucharunsignedchar//***********************端口設(shè)置宏定義************************************//*************************************************************************sbitLCDRS=P2^0;//寄存器選擇信號(hào)sbitLCDRW=P2^1;//讀寫信號(hào)sbitLCDE=P2^2;//片選信號(hào),當(dāng)輸入下降沿信號(hào)時(shí),執(zhí)行指令或傳送數(shù)據(jù)。#defineLCDDBPP0//LCD數(shù)據(jù)接口。/***********1602液晶顯示部分子程序****************///內(nèi)部等待函數(shù)*********************************************unsignedcharLCD_Wait(void){chardatamykey;LCDE=0;//操作脈沖信號(hào)置低電平_nop_();LCDRS=0;//LCD設(shè)為命令模式_nop_();LCDRW=1;//LCD設(shè)為讀狀態(tài)

_nop_();LCDE=1;//產(chǎn)生操作脈沖上升沿

_nop_();mykey=LCDDBP&0x80;//讀LCD的狀態(tài)信息LCDE=0;returnmykey;//帶LCD狀態(tài)信息返回

}//**************************************************************************//把1個(gè)命令寫入LCD函數(shù)//**************************************************************************voidWR_CMD(unsignedcharCommand) {LCDE=0;//操作脈沖信號(hào)置低電平_nop_();LCDRS=0;//LCD設(shè)為命令模式_nop_();LCDRW=0;//LCD設(shè)為寫狀態(tài)LCDE=1;//產(chǎn)生操作脈沖上升沿_nop_(); LCDDBP=Command;//輸出命令。_nop_();LCDE=0;//最后執(zhí)行命令。while((LCD_Wait())==0x80);//測(cè)試操作完否}//**************************************************************************//把1個(gè)數(shù)據(jù)寫入LCD函數(shù)//**************************************************************************voidWR_Data(unsignedcharData) {LCDE=0;//操作脈沖信號(hào)置低電平_nop_();LCDRS=1;//LCD設(shè)為數(shù)據(jù)模式_nop_();LCDRW=0;//LCD設(shè)為寫狀態(tài)_nop_();LCDE=1;//然后把LCD改為寫入數(shù)據(jù)狀態(tài)。_nop_(); LCDDBP=Data;//再輸出數(shù)據(jù)。LCDE=0;//最后顯示數(shù)據(jù)。while((LCD_Wait())==0x80);//測(cè)試操作完否}//**************************************************************************//設(shè)置顯示模式************************************************************#defineLCD_SHOW 0x04//顯示開(kāi)#defineLCD_HIDE 0x00//顯示關(guān)#defineLCD_CURSOR 0x02//顯示光標(biāo)#defineLCD_NO_CURSOR 0x00//無(wú)光標(biāo)#defineLCD_CLEAR_SCREEN 0x01//清屏#defineLCD_HOMING 0x02//光標(biāo)返回原點(diǎn)#defineLCD_FLASH 0x01//光標(biāo)閃動(dòng)#defineLCD_NO_FLASH 0x00//光標(biāo)不閃動(dòng)voidLCD_SetDisplay(unsignedcharDisplayMode){WR_CMD(0x08|DisplayMode);}//設(shè)置輸入模式************************************************************#defineLCD_AC_UP 0x02#defineLCD_AC_DOWN 0x00//default#defineLCD_MOVE 0x01//畫面可平移#defineLCD_NO_MOVE 0x00//defaultvoidLCD_SetInput(unsignedcharInputMode){WR_CMD(0x04|InputMode);}//LCD初始化1************************************************************voidLCD_Initial1(){LCDE=0;//操作脈沖信號(hào)置低電平WR_CMD(0x38);//8位數(shù)據(jù)端口,2行顯示,5*7點(diǎn)陣LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);//開(kāi)啟顯示,無(wú)光標(biāo)WR_CMD(LCD_CLEAR_SCREEN);//清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);//AC遞增,畫面不動(dòng)}//LCD初始化2************************************************************voidLCD_Initial2(){LCDE=0;//操作脈沖信號(hào)置低電平WR_CMD(0x38);//8位數(shù)據(jù)端口,2行顯示,5*7點(diǎn)陣LCD_SetDisplay(LCD_SHOW|LCD_CURSOR|LCD_FLASH);//開(kāi)啟顯示,有光標(biāo),光標(biāo)閃動(dòng)WR_CMD(LCD_CLEAR_SCREEN);//清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);//AC遞增,畫面不動(dòng)}//************************************************************************** //把1個(gè)字符寫入LCD函數(shù)//**************************************************************************voidShow_1_Char(unsignedcharucChar){WR_Data(ucChar);}//調(diào)用寫數(shù)據(jù)函數(shù)//**************************************************************************//把一組字符寫入LCD函數(shù)//**************************************************************************voidShow_Char(unsignedcharucaChar[]){unsignedchari;for(i=0;;i++){Show_1_Char(ucaChar[i]);//調(diào)用一個(gè)字符寫入LCD函數(shù)if(ucaChar[i+1]=='\0')//如果下一個(gè)字符是'\0'就退出

{break;}}}//***********************************************************//液晶字符輸入的位置*****************************************voidGotoXY(unsignedcharx,unsignedchary){if(y==0)//是0行嗎?

{WR_CMD(0x80|x);}//是,寫入0行的寫入數(shù)據(jù)的首地址

if(y==1)//是1行嗎?

{WR_CMD(0x80|(x-0x40));}////是,寫入1行的寫入數(shù)據(jù)的首地址}//------------------------------------------------------------#endif程序輸入完成后,單擊“File菜單/Saveas…”選項(xiàng),如圖4-11示:圖4-11存程序文件從彈出的窗口中,選擇要保存程序文件的路徑,并輸入程序文件名“ADC0809.c”,然后點(diǎn)擊保存按鈕,如圖4.12示:圖4.12保存程序文件圖4-13添加程序文件下面需要將剛才創(chuàng)建的程序文件添加到項(xiàng)目中去。先用鼠標(biāo)左建點(diǎn)擊uVision2左邊“項(xiàng)目窗口”中“Target1”前面的“+”號(hào),展開(kāi)里面的內(nèi)容“SourceGroup1”,然后將鼠標(biāo)指向“SoureceGroup1”并單擊右鍵,彈出一個(gè)右鍵菜單,單擊右鍵菜單中的“AddFilestoGuoup'SourceGroup1'”選項(xiàng),如圖4-13所示:圖4-14選擇添加程序文件從彈出的窗口中選擇剛才保存的文件“ADC0809.c”添加到項(xiàng)目中去,如圖4-14所示。圖4-15設(shè)置目標(biāo)選項(xiàng)程序文件添加完畢后,還要設(shè)置當(dāng)前項(xiàng)目的目標(biāo)選項(xiàng),將鼠標(biāo)指向“Target1”并單擊右鍵,再?gòu)膹棾龅挠益I菜單中單擊“OptionsforTarget”選項(xiàng),如圖4-15所示:從彈出的“Options”窗口中選擇“Target”標(biāo)簽欄,并如圖4-16所示設(shè)置其中各項(xiàng):圖4-16設(shè)置Target選項(xiàng)圖

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論