版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第三章 單片機(jī)的C51語(yǔ)言 3.1.1 C51語(yǔ)言概述【P60】 C51是在標(biāo)準(zhǔn)C的基礎(chǔ)上,根據(jù)單片機(jī)存儲(chǔ)器硬件結(jié)構(gòu)及內(nèi)部資源,擴(kuò)展了相應(yīng)的數(shù)據(jù)類(lèi)型和變量,而C51在語(yǔ)法規(guī)定、程序結(jié)構(gòu)與設(shè)計(jì)方法上,都與標(biāo)準(zhǔn)C基本相同。Keil C語(yǔ)言的編譯器及編譯過(guò)程如圖3-1所示。圖3-1 Keil C語(yǔ)言的編譯器及編譯過(guò)程C語(yǔ)言是美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì)(ANSI)制定的編程語(yǔ)言標(biāo)準(zhǔn),1987年ANSI公布87 ANSI C,即標(biāo)準(zhǔn)C語(yǔ)言。Keil C51語(yǔ)言是在ANSI C的基礎(chǔ)上針對(duì)51單片機(jī)的硬件特點(diǎn)進(jìn)行的擴(kuò)展,并向51單片機(jī)上移植,經(jīng)過(guò)多年努力,C51語(yǔ)言已經(jīng)成為公認(rèn)的高效、簡(jiǎn)潔而又貼近51單片機(jī)硬件的實(shí)
2、用高級(jí)編程語(yǔ)言。目前大多數(shù)的51單片機(jī)用戶都在使用C51語(yǔ)言來(lái)進(jìn)行程序設(shè)計(jì)。用C51進(jìn)行單片機(jī)軟件開(kāi)發(fā),有如下優(yōu)點(diǎn):(1)可讀性好。C51語(yǔ)言程序比匯編語(yǔ)言程序的可讀性好,因而編程效率高,程序便于修改?!綪53的匯編程序】(2)模塊化開(kāi)發(fā)與資源共享。用C51開(kāi)發(fā)出來(lái)的程序模塊可以不經(jīng)修改,直接被其他項(xiàng)目所用,這使得開(kāi)發(fā)者能夠很好地利用已有的大量的標(biāo)準(zhǔn)C程序資源與豐富的庫(kù)函數(shù),減少重復(fù)勞動(dòng)。(3)可移植性好。為某種型號(hào)單片機(jī)開(kāi)發(fā)的C語(yǔ)言程序,只需將與硬件相關(guān)之處和編譯連接的參數(shù)進(jìn)行適當(dāng)修改,就可以方便地移植到其他型號(hào)的單片機(jī)上。例如,為51單片機(jī)編寫(xiě)的程序通過(guò)改寫(xiě)頭文件以及少量的程序行,就可以方
3、便地移植到PIC單片機(jī)上。(4)代碼效率高。當(dāng)前較好的C51語(yǔ)言編譯系統(tǒng)編譯出來(lái)的代碼效率只比直接使用匯編語(yǔ)言低1020%左右,如果使用優(yōu)化編譯選項(xiàng),效果會(huì)更好。3.1.2 C51的程序結(jié)構(gòu)C51程序的基本單位是函數(shù)。一個(gè)C51源程序至少包含一個(gè)主函數(shù),也可以是一個(gè)主函數(shù)和若干其他函數(shù)。主函數(shù)是程序的入口。下面通過(guò)一個(gè)可實(shí)現(xiàn)LED閃爍控制功能的源程序說(shuō)明C51程序的基本結(jié)構(gòu)。程序如下:【P60】#include <reg51.h> / 51單片機(jī)頭文件void delay(); /延時(shí)函數(shù)聲明sbit p1_0=P10; /輸出端口定義main() /主函數(shù)While(1) /無(wú)限
4、循環(huán)p1_0=0; /p1.0=“0”,LED亮delay(); /延時(shí)p1_0=1; /p1.0=“1”,LED滅delay(); /延時(shí)void delay(void) /延時(shí)函數(shù)unsigned char i; /字符型變量i定義for (i=200;i>0;i-); /循環(huán)延時(shí) 【在仿真時(shí),可以不用連接電源,晶體振蕩器,復(fù)位電路】3.1.3 Keil C51的開(kāi)發(fā)環(huán)境Keil C51是德國(guó)Keil Software公司開(kāi)發(fā)的用于51系列單片機(jī)的C51語(yǔ)言開(kāi)發(fā)軟件。Keil C51在兼容ANSI C的基礎(chǔ)上,又增加很多與51單片機(jī)硬件相關(guān)的編譯特性,使得開(kāi)發(fā)51系列單片機(jī)程序更為方
5、便和快捷,程序代碼運(yùn)行速度快,所需存儲(chǔ)器空間小,完全可以和匯編語(yǔ)言相媲美。它支持眾多的MCS-51架構(gòu)的芯片,同時(shí)集編輯、編譯、仿真等功能于一體,具有強(qiáng)大的軟件調(diào)試功能,是眾多的單片機(jī)應(yīng)用開(kāi)發(fā)軟件中最優(yōu)秀的軟件之一。Keil C51已被完全集成到一個(gè)功能強(qiáng)大的全新集成開(kāi)發(fā)環(huán)境(IDE)µVision3中【版本在不斷更新】,該環(huán)境集成了文件編輯處理、編譯鏈接、項(xiàng)目(Project)管理、窗口、工具引用和仿真軟件模擬器以及Monitor51硬件目標(biāo)調(diào)試器等多種功能,這些功能可在Keil µVision3環(huán)境中進(jìn)行操作。µVision3內(nèi)部集成了源程序編輯器,并允許用戶
6、在編輯源文件時(shí)就可設(shè)置程序調(diào)試斷點(diǎn),便于在程序調(diào)試過(guò)程中快速檢查和修改程序。此外,µVision3還支持軟件模擬仿真(Simulator)和用戶目標(biāo)板調(diào)試(Monitor51)兩種工作方式。在軟件模擬仿真方式下不需任何51單片機(jī)及其外圍硬件即可完成用戶程序仿真調(diào)試。在用戶目標(biāo)板調(diào)試方式下,利用硬件目標(biāo)板中的監(jiān)控程序可以直接調(diào)試目標(biāo)硬件系統(tǒng),使用戶節(jié)省購(gòu)買(mǎi)硬件仿真器的費(fèi)用。3.1.4 C51與標(biāo)準(zhǔn)C的主要區(qū)別不同的嵌入式處理器的C編譯系統(tǒng)與標(biāo)準(zhǔn)C的不同之處,主要是它們所針對(duì)的嵌入式處理器的硬件系統(tǒng)不同。Keil C51的基本語(yǔ)法與標(biāo)準(zhǔn)C相同,但對(duì)標(biāo)準(zhǔn)C進(jìn)行了擴(kuò)展。理解Keil C51對(duì)
7、標(biāo)準(zhǔn)C的擴(kuò)展部分是掌握Keil C51的關(guān)鍵。C51與標(biāo)準(zhǔn)C的主要區(qū)別如下:(1)頭文件的差異。51系列單片機(jī)廠家有多個(gè),它們的差異在于內(nèi)部資源如定時(shí)器、中斷、I/O等數(shù)量以及功能的不同,而對(duì)使用者來(lái)說(shuō),只需要將相應(yīng)的功能寄存器的頭文件加載在程序內(nèi),就可實(shí)現(xiàn)所具有的功能。因此,Keil C51系列的頭文件集中體現(xiàn)了各系列芯片的不同資源及功能。(2)數(shù)據(jù)類(lèi)型的不同。51系列單片機(jī)包含位操作空間和位操作指令,因此Keil C51與ANSI C相比又?jǐn)U展了4種類(lèi)型,以便能夠靈活地進(jìn)行操作。(3)數(shù)據(jù)存儲(chǔ)類(lèi)型的不同。C語(yǔ)言最初是為通用計(jì)算機(jī)設(shè)計(jì)的,在通用計(jì)算機(jī)中只有一個(gè)程序和數(shù)據(jù)統(tǒng)一尋址的內(nèi)存空間,而
8、51系列單片機(jī)有片內(nèi)、外程序存儲(chǔ)器,還有片內(nèi)、外數(shù)據(jù)存儲(chǔ)器。標(biāo)準(zhǔn)C并沒(méi)有提供這部分存儲(chǔ)器的地址范圍的定義。此外,對(duì)于80C51單片機(jī)中大量的特殊功能寄存器也沒(méi)有定義。(4)標(biāo)準(zhǔn)C語(yǔ)言沒(méi)有處理單片機(jī)中斷的定義。(5)Keil C51與標(biāo)準(zhǔn)C的庫(kù)函數(shù)有較大的不同。由于標(biāo)準(zhǔn)C的中的部分庫(kù)函數(shù)不適于嵌入式處理器系統(tǒng),因此被排除在Keil C51之外,如字符屏幕和圖形函數(shù)。有一些庫(kù)函數(shù)可以繼續(xù)使用,但這些庫(kù)函數(shù)都必須針對(duì)51單片機(jī)的硬件特點(diǎn)來(lái)作出相應(yīng)的開(kāi)發(fā),與標(biāo)準(zhǔn)C庫(kù)函數(shù)的構(gòu)成與用法有很大的不同。例如庫(kù)函數(shù)printf和scanf,在標(biāo)準(zhǔn)C中,這兩個(gè)函數(shù)通常用于屏幕打印和接收字符,而在Keil C51中
9、,它們主要用于串行口數(shù)據(jù)的收發(fā)。(6)程序結(jié)構(gòu)的差異。由于51單片機(jī)的硬件資源有限,它的編譯系統(tǒng)不允許太多的程序嵌套。其次,標(biāo)準(zhǔn)C所具備的遞歸特性不被Keil C51支持,在C51中,要使用遞歸特性,必須用reentrant進(jìn)行聲明才能使用。但是從數(shù)據(jù)運(yùn)算操作、程序控制語(yǔ)句以及函數(shù)的使用上來(lái)說(shuō),Keil C51與標(biāo)準(zhǔn)C幾乎沒(méi)有什么明顯的差別。如果程序設(shè)計(jì)者具備了有關(guān)標(biāo)準(zhǔn)C的編程基礎(chǔ),只要注意Keil C51與標(biāo)準(zhǔn)C的不同之處,并熟悉AT89S51單片機(jī)的硬件結(jié)構(gòu),就能夠較快地掌握Keil C51的編程。3.2 C51語(yǔ)言程序設(shè)計(jì)基礎(chǔ)3.2.1 C51語(yǔ)言中的數(shù)據(jù)1. 數(shù)據(jù)類(lèi)型【P63】Keil
10、 C51的基本數(shù)據(jù)類(lèi)型如表3-1所示。針對(duì)80C51單片機(jī)的硬件特點(diǎn),C51在標(biāo)準(zhǔn)C的基礎(chǔ)上,擴(kuò)展了4種數(shù)據(jù)類(lèi)型(見(jiàn)表中最后4行)。注意:擴(kuò)展的4種數(shù)據(jù)類(lèi)型,不能使用指針對(duì)它們存取。表3-1 Keil C51支持的數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型位數(shù)字節(jié)數(shù)值 域unsigned char810255signed char81-128+127unsigned int162065535signed int162-32768+32767unsigned long32404294967295signed long324-2147483648+2147483647float32410-3810E+38double648
11、10-30810E+308bit10或1sbit10或1sfr810255sfr16162065536其中,有符號(hào)數(shù)據(jù)類(lèi)型,可以忽略signed標(biāo)識(shí)符,如signed int 等價(jià)于int,signed char 等價(jià)于char等。在C51語(yǔ)言程序中,有可能會(huì)出現(xiàn)在運(yùn)算中數(shù)據(jù)類(lèi)型不一致的情況。C51允許任何標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型的隱式轉(zhuǎn)換。隱式轉(zhuǎn)換的優(yōu)先級(jí)順序如下:Bitcharintlongfloatsignedunsigned也就是說(shuō),當(dāng)char型與int型進(jìn)行運(yùn)算時(shí),先自動(dòng)對(duì)char型擴(kuò)展為int型,然后與int型進(jìn)行運(yùn)算,運(yùn)算結(jié)果為int型。C51除了支持隱式類(lèi)型轉(zhuǎn)換外,還可以通過(guò)強(qiáng)制類(lèi)型轉(zhuǎn)換符
12、“()”對(duì)數(shù)據(jù)類(lèi)型進(jìn)行人為的強(qiáng)制轉(zhuǎn)換。2. C51的擴(kuò)展數(shù)據(jù)類(lèi)型【P64】 80C51系列單片機(jī)用特殊功能寄存器SFR來(lái)控制定時(shí)器、計(jì)數(shù)器、串口、并口和外圍設(shè)備。它們分別用位、字節(jié)和字進(jìn)行訪問(wèn)。與此對(duì)應(yīng),編譯器提供bit、sbit、sfr和sfr16數(shù)據(jù)類(lèi)型訪問(wèn)SFR。下面對(duì)表3-1中擴(kuò)展的4種數(shù)據(jù)類(lèi)型進(jìn)行說(shuō)明。(1) 位變量bit類(lèi)型 利用它可以定義一個(gè)位變量或位函數(shù),但不能定義位指針,也不能定義位數(shù)組。它的值可以是1(true), 也可以是0(false)。在C51中,允許用戶通過(guò)位類(lèi)型符定義位變量。位類(lèi)型符有兩個(gè):bit和sbit??梢远x兩種位變量。bit位類(lèi)型符用于定義一般的可位處理
13、位變量。它的格式如下: bit 位變量名;例如:bit flag1;bit flag2;所有的bit變量存放在80C51內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)的(20H2FH)位段。因?yàn)檫@個(gè)區(qū)域只有16個(gè)字節(jié)長(zhǎng),所以在某個(gè)范圍內(nèi)最多只能定義128個(gè)位變量。(2)特殊功能寄存器sfr類(lèi)型特殊功能寄存器可以用sfr 來(lái)定義,通過(guò)名字或地址來(lái)引用特殊功能寄存器。51系列特殊功能寄存器在片內(nèi)RAM區(qū)的80HFFH之間,“sfr” 數(shù)據(jù)類(lèi)型占用一個(gè)內(nèi)存單元。利用它可訪問(wèn)80C51內(nèi)部的所有特殊功能寄存器。 格式如下: sfr sfr_name=地址常數(shù);sfr_name是特殊功能寄存器名,“地址常數(shù)”必須是一個(gè)常數(shù),不允許用帶
14、操作數(shù)的表達(dá)式。其數(shù)值范圍必須在特殊功能寄存器的地址范圍,即位于0x800xffH之間。例如:sfr P0=0x80這一語(yǔ)句定義P0口在片內(nèi)的寄存器,在后面語(yǔ)句中可用“P0=0xff”(使P0的所有引腳輸出為高電平)之類(lèi)的語(yǔ)句來(lái)操作特殊功能寄存器。 同樣: sfr P1=0x90; sfr P2=0xa0;sfr P3=0xb0;P1、P2和P3是聲明的SFR名?!緦?shí)際上,這些定義在REG51.H文件中已經(jīng)定義過(guò)】(3)特殊功能寄存器sfr16類(lèi)型“sfr16”數(shù)據(jù)類(lèi)型占用兩個(gè)內(nèi)存單元,用來(lái)定義16 位的特殊功能寄存器。sfr16和sfr一樣用于操作特殊功能寄存器。所不同的是它用于操作占兩個(gè)字
15、節(jié)的特殊功能寄存器。特殊功能寄存器名一般用大寫(xiě)字母表示。地址一般用直接地址形式(常數(shù))。不允許用帶操作數(shù)的表達(dá)式。而且必須是低位和高位字節(jié)中的低位字節(jié)的地址。例如DPTR。通過(guò)名字或地址來(lái)引用特殊功能寄存器。編譯器提供sfr16數(shù)據(jù)類(lèi)型,將兩個(gè)8位的SFR作為一個(gè)16位的SFR來(lái)訪問(wèn)。例如: sfr16 DPTR=0x82語(yǔ)句定義了片內(nèi)16位數(shù)據(jù)指針寄存器DPTR,其低8位字節(jié)地址為82H,高8位字節(jié)地址為83H。在后面的語(yǔ)句中可以對(duì)DPTR進(jìn)行操作。(4)特殊功能位 sbit在51系列單片機(jī)中,經(jīng)常要訪問(wèn)特殊功能寄存器中的某些位,可位尋址的特殊功能寄存器的位變量定義用關(guān)鍵字sbit。格式如下
16、:sbit 位變量名=位地址;位地址可有2種形式:位直接地址,其取值范圍為0x800xff特殊功能寄存器名帶位號(hào),特殊功能寄存器與位號(hào)之間一般用“”作間隔?!境S谩坷纾簊bit EA=0xAF; 【IE寄存器的D7,即IE.7】【參見(jiàn)P27的表2.3】sbit EA=IE7; 【IE寄存器的D7,即IE.7】符號(hào)“”前面是特殊功能寄存器的名字,“”的后面數(shù)字定義特殊功能寄存器可尋址位在寄存器中的位置,取值必須是07。注意,不要把bit與sbit混淆。bit用來(lái)定義普通的位變量,值只能是二進(jìn)制的0或1(位變量存放在RAM:20H2FH之間)。而sbit定義的是特殊功能寄存器的可尋址位,其值是可
17、進(jìn)行位尋址的特殊功能寄存器的位絕對(duì)地址(地址在80HFFH之間)?!纠?-5】sbit型變量的定義。sbit P=0xd0;【 sbit P=PSW0; 】【見(jiàn)P27】sbit CY=0xd7;【 sbit P=PSW7; 】sfr P1=0x90;sbit P1_0=P10;sbit P1_1=P11;sbit P1_2=P12;sbit P1_3=P13;sbit P1_4=P14;sbit P1_5=P15;sbit P1_6=P16;sbit P1_7=P17;在C51中,為了用戶處理方便,C51編譯器把MCS-51單片機(jī)的常用的特殊功能寄存器和特殊位進(jìn)行了定義,放在一個(gè)“reg51.
18、h”或“reg52.h”的頭文件中,當(dāng)用戶要使用時(shí),只需要在使用之前用一條預(yù)處理命令#include <reg51.h>或#include <reg52.h>把這個(gè)頭文件包含到程序中,然后就可在程序中使用殊功能寄存器名和某些特殊位名稱(chēng)。典型reg51.h頭文件的部分內(nèi)容如下:C51編譯器在頭文件“reg51.h”中定義了全部sfr/sfr16和sbit變量。用一條預(yù)處理命令#include <reg51.h>把這個(gè)頭文件包含到C51程序中,無(wú)需重定義即可直接使用它們的名稱(chēng)。REG51.H文件中定義的內(nèi)容Header file for generic 80C5
19、1 and 80C31 microcontroller.-*/#ifndef _REG51_H_#define _REG51_H_/* BYTE Register */ 字節(jié)寄存器【21個(gè)】sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;sfr TMOD = 0x89;sfr TL0 = 0x8A
20、;sfr TL1 = 0x8B;sfr TH0 = 0x8C;sfr TH1 = 0x8D;sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98;sfr SBUF = 0x99;/* BIT Register */ 可位尋址的位變量/* PSW */【程序狀態(tài)字】sbit CY = 0xD7;sbit AC = 0xD6;sbit F0 = 0xD5;sbit RS1 = 0xD4;sbit RS0 = 0xD3;sbit OV = 0xD2;sbit P = 0xD0;/* TCON */sbit TF1 = 0x8F;sbit TR1 = 0x8E;sbi
21、t TF0 = 0x8D;sbit TR0 = 0x8C;sbit IE1 = 0x8B;sbit IT1 = 0x8A;sbit IE0 = 0x89;sbit IT0 = 0x88;/* IE */sbit EA = 0xAF;sbit ES = 0xAC;sbit ET1 = 0xAB;sbit EX1 = 0xAA;sbit ET0 = 0xA9;sbit EX0 = 0xA8;/* IP */ sbit PS = 0xBC;sbit PT1 = 0xBB;sbit PX1 = 0xBA;sbit PT0 = 0xB9;sbit PX0 = 0xB8;/* P3 */sbit RD =
22、 0xB7;sbit WR = 0xB6;sbit T1 = 0xB5;sbit T0 = 0xB4;sbit INT1 = 0xB3;sbit INT0 = 0xB2;sbit TXD = 0xB1;sbit RXD = 0xB0;/* SCON */sbit SM0 = 0x9F;sbit SM1 = 0x9E;sbit SM2 = 0x9D;sbit REN = 0x9C;sbit TB8 = 0x9B;sbit RB8 = 0x9A;sbit TI = 0x99;sbit RI = 0x98;#endif3. 數(shù)據(jù)的存儲(chǔ)類(lèi)型【P65】 針對(duì)80C51存儲(chǔ)空間的特點(diǎn),可以利用存儲(chǔ)空間的修
23、飾符,來(lái)指明所定義的變量應(yīng)分配在什么樣的存儲(chǔ)空間。C51存儲(chǔ)類(lèi)型與80C51的實(shí)際存儲(chǔ)空間的對(duì)應(yīng)關(guān)系見(jiàn)表3-2。下面對(duì)表3-2作以說(shuō)明。(1)片內(nèi)數(shù)據(jù)存儲(chǔ)器 片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)是可讀/寫(xiě)的。80C51系列最多可有256字節(jié)的內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)。內(nèi)部數(shù)據(jù)區(qū),可以分成3個(gè)不同的存儲(chǔ)類(lèi)型data、idata和bdata。data:片內(nèi)直接尋址區(qū),位于片內(nèi)RAM的低128字節(jié)。為片內(nèi)直接尋址的RAM空間,尋址范圍為0127(00H7FH,主要在30H7FH之間)。在此空間內(nèi),存取速度最快。idata:片內(nèi)間接尋址區(qū),片內(nèi)RAM所有地址單元(00HFFH)。為片內(nèi)間接尋址的RAM空間,尋址范圍0255。由于只能
24、間接尋址,訪問(wèn)速度比直接尋址慢?!局挥?2系列才有】bdata:片內(nèi)位尋址區(qū),位于片內(nèi)RAM位尋址區(qū)20H2FH,位地址范圍位0127。在此空間允許按字節(jié)和按位尋址混合訪問(wèn)?!救绻挥梦蛔兞?,仍然可以作為字節(jié)地址訪問(wèn)】bit定義的變量,嚴(yán)格來(lái)說(shuō)只能是bdata。例如:unsigned char bdata flag; 表3-2 存儲(chǔ)器類(lèi)型說(shuō) 明data直接訪問(wèn)的內(nèi)部數(shù)據(jù)存儲(chǔ)器,訪問(wèn)速度最快(位于片內(nèi)RAM的低128字節(jié),字節(jié)地址:00H7FH)bdata可位尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器,可用字節(jié)方式,也可用位方式訪問(wèn),位于20H2FH(16個(gè)字節(jié))idata間接訪問(wèn)的內(nèi)部數(shù)據(jù)存儲(chǔ)器,可以訪問(wèn)所有的內(nèi)部
25、存儲(chǔ)空間(256字節(jié))【只有52系列才有】pdata片外RAM的一個(gè)分頁(yè)尋址區(qū),每頁(yè)256字節(jié)xdata外部數(shù)據(jù)存儲(chǔ)器RAM(64KB),常用于存放不常用的變量或等待處理的數(shù)據(jù),字節(jié)地址:0000HFFFFHcode外部程序存儲(chǔ)器空間(64KB),常用于存放數(shù)據(jù)表格、常數(shù)等固定信息(2)片外數(shù)據(jù)存儲(chǔ)器 外部數(shù)據(jù)存儲(chǔ)區(qū)是可讀/寫(xiě)的??赏ㄟ^(guò)一個(gè)數(shù)據(jù)指針加載一個(gè)地址來(lái)間接訪問(wèn)外部數(shù)據(jù)區(qū)。因此,訪問(wèn)外部數(shù)據(jù)區(qū)比訪問(wèn)內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)慢。 外部數(shù)據(jù)存儲(chǔ)區(qū)最多可有64KB。由于硬件設(shè)計(jì)時(shí),要把外圍設(shè)備映射到該存儲(chǔ)區(qū),所以這些地址不一定都能用來(lái)作為數(shù)據(jù)存儲(chǔ)區(qū)。 編譯器提供兩種不同的存儲(chǔ)類(lèi)型來(lái)訪問(wèn)外部數(shù)據(jù)xdat
26、a和pdata。 xdata該標(biāo)識(shí)是指外部數(shù)據(jù)存儲(chǔ)區(qū)(64KB)內(nèi)的任何地址,尋址范圍為065535【字節(jié)地址:0000HFFFFH】。pdata該標(biāo)識(shí)符僅指一頁(yè)或256字節(jié)的外部數(shù)據(jù)存儲(chǔ)區(qū),尋址范圍為0255。 在定義變量時(shí),通過(guò)指明存儲(chǔ)器類(lèi)型,可以將所定義的變量存儲(chǔ)在指定的存儲(chǔ)區(qū)域中。 訪問(wèn)內(nèi)部數(shù)據(jù)存儲(chǔ)器比訪問(wèn)外部數(shù)據(jù)存儲(chǔ)器快得多。因此,應(yīng)該把頻繁使用的變量放置在內(nèi)部數(shù)據(jù)存儲(chǔ)器中,把很少使用的變量放在外部數(shù)據(jù)存儲(chǔ)器中。 在變量聲明中,可以包括存儲(chǔ)器類(lèi)型和singed或unsinged屬性。例如: unsigned char data var1; unsigned char code tex
27、t=”Enter Parameter”; unsigned long xdata array100; unsigned char xdata vector1044; unsigned char bdata flag; 【如果位變量區(qū)有未用的單元,可以進(jìn)行字節(jié)訪問(wèn)】unsigned char code data=0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,;/把常數(shù)放到程序存儲(chǔ)器中如果在變量的定義中,沒(méi)有包括存儲(chǔ)器類(lèi)型,那么將自動(dòng)選用默認(rèn)的存儲(chǔ)器類(lèi)型。(
28、3)片外程序存儲(chǔ)器code:外部程序存儲(chǔ)器的64KB空間。程序存儲(chǔ)區(qū)用來(lái)存放程序代碼、數(shù)據(jù)及表格(數(shù)據(jù)及表格中的數(shù)據(jù)是不變的)。程序的代碼(CODE)存儲(chǔ)區(qū)是只讀的,不能寫(xiě)入。硬件決定最多可能有64KB的程序存儲(chǔ)區(qū)?!疽?yàn)槭?6位】用code標(biāo)識(shí)符來(lái)訪問(wèn)片內(nèi)、片外統(tǒng)一編址的程序存儲(chǔ)區(qū),尋址范圍為065535?!綪66】如果在定義變量時(shí),省略了存儲(chǔ)類(lèi)型說(shuō)明,C51編譯器會(huì)根據(jù)當(dāng)前編譯模式自動(dòng)認(rèn)定默認(rèn)的存儲(chǔ)類(lèi)型。編譯模式分為:小編譯模式(SMALL)、緊湊編譯模式(COMPACT)和大編譯模式(LARGE)3種,具體的內(nèi)容見(jiàn)下表:【在keil中要進(jìn)行選擇,目前只用SMALL就可以了】3種編譯模式的
29、特點(diǎn)小結(jié)編譯模式變量存儲(chǔ)區(qū)域默認(rèn)存儲(chǔ)類(lèi)型特點(diǎn)SMALL片內(nèi)低128RAMdata訪問(wèn)數(shù)據(jù)的速度最快,但由于存儲(chǔ)容量較小,難于滿足需要定義較多變量的場(chǎng)合COMPACT片外頁(yè)256BRAMpdata介于兩者之間,且受片外RAM的容量限制LARGE片外64KBRAMxdata訪問(wèn)數(shù)據(jù)的效率不高,但由于存儲(chǔ)容量大,可滿足需要定義較多變量的場(chǎng)合所以,在SMALL編譯模式下,語(yǔ)句char a 等價(jià)于char data a;而在LARGE編譯模式下,語(yǔ)句char a等價(jià)于char xdata a。一般采用SMALL模式,所以,在變量聲明中,如果沒(méi)有修飾符,則數(shù)據(jù)默認(rèn)的存儲(chǔ)空間為data型,也就是在片內(nèi)RAM
30、中。對(duì)單片機(jī)編程,正確地定義數(shù)據(jù)類(lèi)型以及存儲(chǔ)類(lèi)型,是所有編程者在編程前都需要首先考慮的問(wèn)題。在資源有限的條件下,如何節(jié)省存儲(chǔ)單元并保證運(yùn)行效率,是對(duì)開(kāi)發(fā)者的一個(gè)考驗(yàn)。只有對(duì)C51中的各種數(shù)據(jù)類(lèi)型以及存儲(chǔ)類(lèi)型非常熟練的掌握,才能運(yùn)用自如。定義變量類(lèi)型應(yīng)考慮如下問(wèn)題:程序運(yùn)行時(shí)該變量可能的取值范圍,是否有負(fù)值,絕對(duì)值有多大,以及相應(yīng)需要的存儲(chǔ)空間大小。在夠用的情況下,盡量選擇8位即一個(gè)字節(jié)的char型,特別是unsiged char。對(duì)于51系列這樣的定點(diǎn)機(jī)而言,浮點(diǎn)類(lèi)型變量將明顯增加運(yùn)算時(shí)間和程序長(zhǎng)度,如果可以的話,盡量使用靈活巧妙的算法來(lái)避免浮點(diǎn)變量的引入。定義數(shù)據(jù)的存儲(chǔ)類(lèi)型通常遵循如下原則:
31、只要條件滿足,盡量選擇內(nèi)部直接尋址的存儲(chǔ)類(lèi)型data,然后選擇idata即內(nèi)部間接尋址。對(duì)于那些經(jīng)常使用的變量要使用內(nèi)部尋址。在內(nèi)部數(shù)據(jù)存儲(chǔ)器數(shù)量有限或不能滿足要求的情況下才使用外部數(shù)據(jù)存儲(chǔ)器。選擇外部數(shù)據(jù)存儲(chǔ)器可先選擇pdata類(lèi)型,最后選用xdata類(lèi)型。需指出,擴(kuò)展片外存儲(chǔ)器,原理上雖很簡(jiǎn)單,但在實(shí)際開(kāi)發(fā)中,很多時(shí)候,會(huì)帶來(lái)不必要的麻煩,如可能降低系統(tǒng)穩(wěn)定性、增加成本、拉長(zhǎng)開(kāi)發(fā)和調(diào)試周期等,推薦充分利用片內(nèi)存儲(chǔ)空間。另外,通常的單片機(jī)應(yīng)用都是面對(duì)小型的控制,代碼比較短,對(duì)于程序存儲(chǔ)區(qū)的大小要求很低,常常是片內(nèi)RAM很緊張而片內(nèi)Flash ROM很富裕,因此如果實(shí)時(shí)性要求不高,可考慮將一些
32、子函數(shù)的常量數(shù)據(jù)做成數(shù)據(jù)表,放置在程序存儲(chǔ)區(qū),當(dāng)程序運(yùn)行時(shí),進(jìn)入子函數(shù)動(dòng)態(tài)調(diào)用下載至RAM即可,退出子函數(shù)后立即釋放該內(nèi)存空間。3.2.3 一個(gè)簡(jiǎn)單的C51程序一個(gè)C51源程序是由一個(gè)個(gè)模塊化的函數(shù)所構(gòu)成,函數(shù)是指程序中的一個(gè)模塊,main()函數(shù)為程序的主函數(shù),其他若干個(gè)函數(shù)可以理解為一些子程序。一個(gè)C51源程序無(wú)論包含了多少函數(shù),它總是從main()函數(shù)開(kāi)始執(zhí)行,不論main()函數(shù)位于程序的什么位置。程序設(shè)計(jì)者就是編寫(xiě)一系列的函數(shù)模塊,并在需要的時(shí)候調(diào)用這個(gè)函數(shù),實(shí)現(xiàn)程序所要求的功能。1. C51程序與函數(shù)下面通過(guò)一個(gè)簡(jiǎn)單C51程序,認(rèn)識(shí)C51程序與函數(shù)?!纠?-1】 在80C51的P1
33、.0腳接有一只發(fā)光二極管,二極管的陰極接P1.0腳,陽(yáng)極通過(guò)限流電阻接+5V,現(xiàn)在讓發(fā)光二極管每隔800ms閃滅,占空比為50%。已知單片機(jī)時(shí)鐘晶振為12MHz,即每個(gè)機(jī)器周期1s,采用軟件延時(shí)的方法,參考程序如下:#include <reg51.h> / 包含reg51.h 頭文件sbit P10=P10; / 定義位變量P1.0 ,也可使用sbit P10=0x90void delay(unsigned int count) / 延時(shí)函數(shù)Delay( ),count是形式參數(shù) / 兩個(gè)花括號(hào)之間為函數(shù)Delay( )的函數(shù)體unsigned int i,j; / 定義變量i,j
34、for(i=0; i<count;i+) / 如果i<count,則i加1 /在時(shí)鐘頻率為12MHz時(shí),循環(huán)120次,大約為1ms for(j=0;j<120;j+) / 如果j<120,則j加1 / unsigned char j;可以節(jié)約一個(gè)單元空間void main(void) / 主函數(shù)main( )while(1) / 主程序輪詢 P10=1; / P1.0輸出高電平,發(fā)光二極管滅 delay(800) ; / 將實(shí)際參數(shù)800傳遞給形式參數(shù)i,延時(shí)800ms P10=0; / P1.0輸出低電平,發(fā)光二極管亮 delay(800) / 將實(shí)際參數(shù)800傳遞給
35、形式參數(shù)i,延時(shí)800ms 【問(wèn)題】void delay(unsigned int count)能否改為void delay(unsigned char count)否?下面對(duì)程序進(jìn)行簡(jiǎn)要說(shuō)明。程序的第1行是“文件包含”,是將另一個(gè)文件“reg51.h”的內(nèi)容全部包含進(jìn)來(lái)。文件“reg51.h”包含了51單片機(jī)全部的特殊功能寄存器的字節(jié)地址及大多數(shù)可尋址位的位地址定義。程序包含reg51.h的目的就是為了使用P1這個(gè)符號(hào),即通知程序中所寫(xiě)的P1是指80C51的P1端口,而不是其他變量。打開(kāi)reg51.h文件可以看到“sfr P1=0x90;”,即定義符號(hào)P1與地址0x90對(duì)應(yīng),而P1口的地址就
36、是0x90。雖然這里的“文件包含”只有一行,但C編譯器在處理的時(shí)候卻要處理幾十行或幾百行。 程序的第2行用符號(hào)P10來(lái)表示P1.0引腳。在C51中,如果直接寫(xiě)“P1.0”編譯器并不能識(shí)別,而且P1.0也不是一個(gè)合法的C51語(yǔ)言程序變量名【因?yàn)樵趓eg51.h中,沒(méi)有定義,需要用戶自己定義】,所以必須給它起一個(gè)另外的名字,這里起的名字是P10,可是P10是否就是P1.0呢,所以必須給它們建立聯(lián)系,這里使用了C51的關(guān)鍵字“sbit”來(lái)進(jìn)行定義。第3行第8行對(duì)函數(shù)delay進(jìn)行了事先定義,只有這樣,才能在主程序中被主函數(shù)main ( )調(diào)用。自行編寫(xiě)的函數(shù)delay( )的用途是軟件延時(shí),調(diào)用時(shí)使
37、用的這個(gè)“800”被稱(chēng)為“實(shí)際參數(shù)”,以延時(shí)800ms的時(shí)間。注意,若delay( )的定義寫(xiě)在main函數(shù)的后面,則需要先作出聲明,否則編譯無(wú)法通過(guò),因?yàn)榫幾g到main函數(shù)中的delay( )語(yǔ)句時(shí),找不到相應(yīng)的函數(shù)體。main為“主函數(shù)”,每一個(gè)C語(yǔ)言程序有且只有一個(gè)主函數(shù),主函數(shù)后面一定有一對(duì)花括號(hào)“”,在花括號(hào)里面書(shū)寫(xiě)該函數(shù)的代碼行。2. 用戶自定義函數(shù)與庫(kù)函數(shù)用戶自定義函數(shù)用戶根據(jù)自己需要所編寫(xiě)的函數(shù)。如例3-1中的delay函數(shù)。編寫(xiě)時(shí),需要注意以下幾點(diǎn)。函數(shù)的首部(函數(shù)的第1行),包括函數(shù)名、函數(shù)類(lèi)型、函數(shù)屬性、函數(shù)參數(shù)(形式參數(shù))名、參數(shù)類(lèi)型。例如:void Delay(uns
38、igned int i)函數(shù)體,即函數(shù)首部下面的花括號(hào)“ ”內(nèi)的部分。如果一個(gè)函數(shù)體內(nèi)有多個(gè)花括號(hào),則最外層的一對(duì)“ ”為函數(shù)體的范圍。C51區(qū)分大小寫(xiě),例如Delay與delay,編譯時(shí)是不同的兩個(gè)名稱(chēng)。每個(gè)語(yǔ)句最后必須有一個(gè)分號(hào),分號(hào)是C語(yǔ)句的必要組成部分。從函數(shù)的定義的形式上劃分可以有三種形式:無(wú)參數(shù)函數(shù)、有參數(shù)函數(shù)和空函數(shù)。(1)無(wú)參數(shù)函數(shù) 此種函數(shù)在被調(diào)用時(shí),既無(wú)參數(shù)輸入,也不返回結(jié)果給調(diào)用函數(shù),只是為完成某種操作而編寫(xiě)的。(2)有參數(shù)函數(shù) 調(diào)用此種函數(shù)時(shí),必須提供實(shí)際的輸入函數(shù),必須說(shuō)明與實(shí)際參數(shù)一一對(duì)應(yīng)的形式參數(shù),并在函數(shù)結(jié)束時(shí)返回結(jié)果,供調(diào)用它的函數(shù)使用。(3)空函數(shù)函數(shù)體內(nèi)無(wú)
39、語(yǔ)句,是空白的。調(diào)用空函數(shù)時(shí),什么工作也不做,不起任何作用。定義空函數(shù)的目的,是為以后程序功能的擴(kuò)充。程序最初設(shè)計(jì)時(shí),往往只涉及最基本的功能模塊的函數(shù),其他模塊的功能函數(shù)可以在以后補(bǔ)上。因此先將非基本模塊的功能函數(shù)定義成空函數(shù),用一個(gè)空語(yǔ)句“;”占好位置,并寫(xiě)好注釋?zhuān)院笤儆靡粋€(gè)編好的函數(shù)代替它。3. 函數(shù)調(diào)用程序設(shè)計(jì)者的任務(wù)就是編寫(xiě)一系列的用戶自定義函數(shù)模塊,并在需要的時(shí)候調(diào)用這些函數(shù)以及庫(kù)函數(shù),實(shí)現(xiàn)程序所要求的功能。調(diào)用格式為:函數(shù)名(實(shí)際參數(shù)1,實(shí)際參數(shù)2,)例如,例3-1中主函數(shù)main ( )里的子函數(shù)調(diào)用語(yǔ)句“delay(800);”,其中800為實(shí)際參數(shù)。3.2.4 C51的運(yùn)算
40、符在程序中實(shí)現(xiàn)運(yùn)算,要熟悉常用的運(yùn)算符。本節(jié)對(duì)C51中用到的標(biāo)準(zhǔn)C運(yùn)算符進(jìn)行回顧,為C51的程序設(shè)計(jì)打下基礎(chǔ)。1. 算術(shù)運(yùn)算符如表3-3所示。表3-3 算術(shù)運(yùn)算符及其說(shuō)明符 號(hào)說(shuō) 明加法運(yùn)算減法運(yùn)算*乘法運(yùn)算/除法運(yùn)算【商】%取模運(yùn)算【余數(shù)】自增1自減1對(duì)于“/”和“%”這兩個(gè)符號(hào)都涉及除法運(yùn)算,但“/”運(yùn)算是取商,而“%” 運(yùn)算為取余數(shù)。例如“5/3”的結(jié)果(商)為1,而“5%3”的結(jié)果為2(余數(shù))。表3-3中的自增和自減運(yùn)算符是使變量自動(dòng)加1或減1,自增和自減運(yùn)算符放在變量前和變量之后是不同的。+i,-i:在使用i之前,先使i值加(減)1。i+,i-:在使用i之后,再使i值加(減)1。例如
41、:若i=4,則執(zhí)行x=+i時(shí),先使i加1,再引用結(jié)果,即x=5,運(yùn)算結(jié)果為i=5,x=5。再如:若i=4,則執(zhí)行x=i+時(shí),先引用i值,即x=4,再使i加1,運(yùn)算結(jié)果為i=5,x=4。2. 邏輯運(yùn)算符邏輯運(yùn)算符及其說(shuō)明如表3-4所示。表3-4 邏輯運(yùn)算符及其說(shuō)明符號(hào)說(shuō) 明&&邏輯與|邏輯或!邏輯非3. 關(guān)系運(yùn)算符判斷兩個(gè)數(shù)之間的關(guān)系。關(guān)系運(yùn)算符及其說(shuō)明如表3-5。表3-5 關(guān)系運(yùn)算符及其說(shuō)明符號(hào)說(shuō) 明>大于<小于>=大于或等于<=小于或等于=等于!=不等于4. 位運(yùn)算C51中的位運(yùn)算符及其說(shuō)明如表3-6所示。表3-6 位運(yùn)算其說(shuō)明符號(hào)說(shuō) 明&按位
42、與按位或按位異或按位取反<<左移>>右移【例】設(shè)a=0x54=01010100B,b=0x3b=00111011B,則a&b、a|b、ab、a、a<<2、b>>2分別為多少?a=0x54=01010100Bb=0x3b=00111011B a&b=00010000b=0x10 a|b=01111111B=0x7f ab=01101111B=0x6f a=10101011B=0xab a<<2=01010000B=0x50 【a<<=2】 b>>2=00001110B=0x0e 【b>>
43、;=2】5 復(fù)合賦值運(yùn)算符C51語(yǔ)言中支持在賦值運(yùn)算符“=”的前面加上其它運(yùn)算符,組成復(fù)合賦值運(yùn)算符。下面是C51中支持的復(fù)合賦值運(yùn)算符:+= 加法賦值 -+ 減法賦值*= 乘法賦值 /= 除法賦值%= 取模賦值 &= 邏輯與賦值 |= 邏輯或賦值 = 邏輯異或賦值= 邏輯非賦值 >>= 右移位賦值 <<= 左移位賦值復(fù)合賦值運(yùn)算的一般格式如下: 變量 復(fù)合運(yùn)算賦值符 表達(dá)式 它的處理過(guò)程:先把變量與后面的表達(dá)式進(jìn)行某種運(yùn)算,然后將運(yùn)算的結(jié)果賦給前面的變量。其實(shí)這是C51語(yǔ)言中簡(jiǎn)化程序的一種方法,大多數(shù)二目運(yùn)算都可以用復(fù)合賦值運(yùn)算符簡(jiǎn)化表示。例如:a+=6相當(dāng)于
44、a=a+6;a*=5相當(dāng)于a=a*5;b&=0x55相當(dāng)于b=b&0x55;x>>=2相當(dāng)于x=x>>2。3.2.5 C51的分支與循環(huán)程序結(jié)構(gòu)程序結(jié)構(gòu)上可把程序分為三類(lèi),即順序、分支和循環(huán)結(jié)構(gòu)。順序結(jié)構(gòu)是程序的基本結(jié)構(gòu),程序自上而下,從main()的函數(shù)開(kāi)始一直到程序運(yùn)行結(jié)束,程序只有一條路可走,沒(méi)有其他的路徑可以選擇。順序結(jié)構(gòu)比較簡(jiǎn)單和便于理解,這里介紹分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。1. 分支結(jié)構(gòu)程序(1) 只有兩條分支的時(shí)候用If (條件) 分支1else 分支2(2) 分支較多時(shí)在分支較多時(shí)的情況下使用switch語(yǔ)句。switch ( ) case( )
45、:語(yǔ)句; break; case( ):語(yǔ)句;break;default:語(yǔ)句;break;注意:每個(gè)switch分支必須有一個(gè)break語(yǔ)句,否則程序并不能跳出switch,就會(huì)繼續(xù)執(zhí)行case后面的case語(yǔ)句。2. 循環(huán)結(jié)構(gòu)程序循環(huán)語(yǔ)句有以下三種。(1)for循環(huán)格式為:for(循環(huán)體初始化;循環(huán)體執(zhí)行條件;循環(huán)體執(zhí)行后操作) 循環(huán)體 花括號(hào)中為循環(huán)體內(nèi)容。(2)while循環(huán)格式為:while(循環(huán)體執(zhí)行條件) 花括號(hào)中為循環(huán)體內(nèi)容。 (3)do while循環(huán)格式為:do 花括號(hào) 中為循環(huán)體內(nèi)容while(循環(huán)體執(zhí)行條件)前兩種循環(huán)是先判斷循環(huán)條件是否滿足,才決定循環(huán)體是否執(zhí)行;而“
46、do while循環(huán)”是在執(zhí)行完循環(huán)體后再判斷條件是否滿足,再?zèng)Q定循環(huán)體是否繼續(xù)執(zhí)行。三種循環(huán)中,經(jīng)常使用的是for語(yǔ)句和while語(yǔ)句。下面來(lái)說(shuō)明for語(yǔ)句的應(yīng)用。關(guān)于循環(huán),需說(shuō)明的是,在無(wú)操作系統(tǒng)的控制器和處理器上運(yùn)行的程序,主體通常采用輪詢方式,即把所有的操作包含在一個(gè)while(1)中,如例3-1。這樣的無(wú)限循環(huán)在面向通用計(jì)算機(jī)的軟件設(shè)計(jì)中是不被允許的,然而嵌入式系統(tǒng)軟件設(shè)計(jì)中,則由于其硬件構(gòu)成和使用需求,常常采用這種無(wú)限循環(huán)。3.2.6 絕對(duì)地址訪問(wèn)使用C51運(yùn)行庫(kù)中預(yù)定義宏C51編譯器提供了一組宏定義來(lái)對(duì)51系列單片機(jī)的code、data、pdata和xdata空間進(jìn)行絕對(duì)尋址。規(guī)
47、定只能以無(wú)符號(hào)數(shù)方式訪問(wèn),定義了8個(gè)宏定義,其函數(shù)原型如下:#define CBYTE (unsigned char volatile code *) 0)#define DBYTE (unsigned char volatile data *) 0)#define PBYTE (unsigned char volatile pdata *) 0)#define XBYTE (unsigned char volatile xdata *) 0)#define CWORD (unsigned int volatile code *) 0)#define DWORD (unsigned int v
48、olatile data *) 0)#define PWORD (unsigned int volatile pdata *) 0)#define XWORD (unsigned int volatile xdata *) 0)這些函數(shù)原型放在absacc.h文件中。使用時(shí)須用預(yù)處理命令把該頭文件包含到文件中,形式為:#include <absacc.h>。其中:CBYTE以字節(jié)形式對(duì)code區(qū)尋址,DBYTE以字節(jié)形式對(duì)data區(qū)尋址,PBYTE以字節(jié)形式對(duì)pdata區(qū)尋址,XBYTE以字節(jié)形式對(duì)xdata區(qū)尋址,CWORD以字形式對(duì)code區(qū)尋址,DWORD以字形式對(duì)data區(qū)
49、尋址,PWORD以字形式對(duì)pdata區(qū)尋址,XWORD以字形式對(duì)xdata區(qū)尋址。訪問(wèn)形式如下: 宏名地址 宏名為CBYTE、DBYTE、PBYTE、XBYTE、CWORD、DWORD、PWORD或XWORD。地址為存儲(chǔ)單元的絕對(duì)地址,一般用十六進(jìn)制形式表示。【例4-7】絕對(duì)地址對(duì)存儲(chǔ)單元的訪問(wèn)。#include <absacc.h> /將絕對(duì)地址頭文件包含在文件中#include <reg51.h> /將寄存器頭文件包含在文件中#define uchar unsigned char /定義符號(hào)uchar為數(shù)據(jù)類(lèi)型符unsigned char#define uint u
50、nsigned int /定義符號(hào)uint為數(shù)據(jù)類(lèi)型符unsigned intvoid main(void)uchar var1;uint var2;var1=XBYTE0x0005; /XBYTE0x0005訪問(wèn)片外RAM的0005字節(jié)單元var2=XWORD0x0002; /XWORD0x0002訪問(wèn)片外RAM的0002字單元xval=XBYTE0x0002; /把外部存儲(chǔ)區(qū)地址0x0002的數(shù)據(jù)存入變量xval中XWORD0x0002=0x2000; /把0x2000送到外部存儲(chǔ)區(qū)地址為0x0002的單元#define DAC0832 XBYTE0x7fff /定義DAC0832的端口地
51、址DAC0832=0x80; /啟動(dòng)一次D/A轉(zhuǎn)換.while(1);在上面程序中,其中XBYTE0x0005就是以絕對(duì)地址方式訪問(wèn)的片外RAM 0005字節(jié)單元;XWORD0x0002就是以絕對(duì)地址方式訪問(wèn)的片外RAM 0002字單元。3.2.7 使用C51擴(kuò)展關(guān)鍵字“_at_” 使用_at_對(duì)指定的存儲(chǔ)器空間的絕對(duì)地址進(jìn)行訪問(wèn),一般格式如下: 存儲(chǔ)器類(lèi)型 數(shù)據(jù)類(lèi)型說(shuō)明符 變量名 _at_ 地址常數(shù); 其中,存儲(chǔ)器類(lèi)型為data、bdata、idata、pdata等C51能識(shí)別的數(shù)據(jù)類(lèi)型,如省略則按存儲(chǔ)模式規(guī)定的默認(rèn)存儲(chǔ)器類(lèi)型確定變量的存儲(chǔ)器區(qū)域;數(shù)據(jù)類(lèi)型為C51支持的數(shù)據(jù)類(lèi)型。地址常數(shù)用于
52、指定變量的絕對(duì)地址,必須位于有效的存儲(chǔ)器空間之內(nèi);使用“_at_”定義的變量必須為全局變量。【例】通過(guò)_at_實(shí)現(xiàn)絕對(duì)地址的訪問(wèn)。#define uchar unsigned char/定義符號(hào)uchar為數(shù)據(jù)類(lèi)型符unsigned char#define uint unsigned int /定義符號(hào)uint為數(shù)據(jù)類(lèi)型符unsigned intvoid main(void)data uchar x1 _at_ 0x40; /在data區(qū)中定義字節(jié)變量x1,它的地址為40Hxdata uint x2 _at_ 0x2000; /在xdata區(qū)中定義字變量x2,它的地址為2000Hx1=0xff
53、;x2=0x1234;.while(1);3.2.7 C51中斷服務(wù)函數(shù)的定義 由于標(biāo)準(zhǔn)C沒(méi)有處理單片機(jī)中斷的定義,為直接編寫(xiě)中斷服務(wù)程序,C51編譯器對(duì)函數(shù)的定義進(jìn)行了擴(kuò)展,增加了一個(gè)擴(kuò)展關(guān)鍵字interrupt,使用該關(guān)鍵字可以將一個(gè)函數(shù)定義成中斷服務(wù)程序。由于C51編譯器在編譯時(shí)對(duì)聲明為中斷服務(wù)程序的函數(shù)自動(dòng)添加了相應(yīng)的現(xiàn)場(chǎng)保護(hù)、阻斷其他中斷、返回時(shí)恢復(fù)現(xiàn)場(chǎng)等處理的程序段,因而在編寫(xiě)中斷服務(wù)函數(shù)時(shí)可不必考慮這些問(wèn)題,減輕了用匯編語(yǔ)言編寫(xiě)中斷服務(wù)程序的繁瑣程度,而把精力放在如何處理引發(fā)中斷請(qǐng)求的事件上。中斷服務(wù)函數(shù)的一般形式為:void 函數(shù)名(void)interrupt n using m在函數(shù)聲明時(shí),用“interrupt n”語(yǔ)句,可以把所聲明的函數(shù)定義為一個(gè)中斷服務(wù)程序。從定
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 磨面機(jī)產(chǎn)品供應(yīng)鏈分析
- 2024年黃山市屯溪區(qū)人民醫(yī)院招聘專(zhuān)業(yè)技術(shù)人員4人筆試模擬試題及答案解析
- 行業(yè)內(nèi)保安服務(wù)標(biāo)準(zhǔn)的探索與制定計(jì)劃
- 行業(yè)發(fā)展戰(zhàn)略開(kāi)展技術(shù)交流合作計(jì)劃
- 旅游地產(chǎn)開(kāi)發(fā)合作協(xié)議三篇
- 水務(wù)行業(yè)的數(shù)字經(jīng)濟(jì)應(yīng)用計(jì)劃
- 新學(xué)年教學(xué)工作目標(biāo)計(jì)劃
- 第三方財(cái)產(chǎn)保護(hù)協(xié)議書(shū)范文
- 傳統(tǒng)電能質(zhì)量分析與改善措施
- 離婚協(xié)議書(shū)范文無(wú)財(cái)產(chǎn)2022標(biāo)準(zhǔn)版
- xx市足球協(xié)會(huì)章程
- 小學(xué)健康教育校本教材
- 部編版道德與法治五年級(jí)上冊(cè)第三單元《我們的國(guó)土 我們的家園》大單元作業(yè)設(shè)計(jì)
- 守株待兔兒童故事繪本PPT
- 人教版部編版二上11葡萄溝1
- 貫徹落實(shí)八項(xiàng)規(guī)定實(shí)施細(xì)則實(shí)施辦法
- 2022年小學(xué)美術(shù)新課程標(biāo)準(zhǔn)考試模擬試題及部分答案(共五套)
- 行車(chē)組織-課件-7.1行車(chē)安全概述.培訓(xùn)講學(xué)
- YY 0600.3-2007醫(yī)用呼吸機(jī)基本安全和主要性能專(zhuān)用要求第3部分:急救和轉(zhuǎn)運(yùn)用呼吸機(jī)
- GB/T 19266-2008地理標(biāo)志產(chǎn)品五常大米
- GB/T 1239.2-2009冷卷圓柱螺旋彈簧技術(shù)條件第2部分:壓縮彈簧
評(píng)論
0/150
提交評(píng)論