第6次:C51語(yǔ)言程序設(shè)計(jì)課件_第1頁(yè)
第6次:C51語(yǔ)言程序設(shè)計(jì)課件_第2頁(yè)
第6次:C51語(yǔ)言程序設(shè)計(jì)課件_第3頁(yè)
第6次:C51語(yǔ)言程序設(shè)計(jì)課件_第4頁(yè)
第6次:C51語(yǔ)言程序設(shè)計(jì)課件_第5頁(yè)
已閱讀5頁(yè),還剩99頁(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)介

四川師范大學(xué)成都學(xué)院騰訊微云:/DSdKRL2013-09-01劉強(qiáng)課件下載四川師范大學(xué)成都學(xué)院騰訊微云:/D課程教學(xué)內(nèi)容緒論第0章計(jì)算機(jī)的基礎(chǔ)知識(shí)第1章單片機(jī)的硬件結(jié)構(gòu)----重點(diǎn)

第2章單片機(jī)的指令系統(tǒng)----了解 第3章單片機(jī)的匯編語(yǔ)言程序設(shè)計(jì)---了解

第4章單片機(jī)的C語(yǔ)言(C51語(yǔ)言)編程----重點(diǎn)第5章單片機(jī)的輸入、輸出口----重點(diǎn) 第6章單片機(jī)的中斷系統(tǒng)----重點(diǎn) 第7章單片機(jī)的定時(shí)器/計(jì)數(shù)器----重點(diǎn) 第8章單片機(jī)的串行接口----重點(diǎn)

第9章單片機(jī)總線與系統(tǒng)擴(kuò)展 第10章單片機(jī)應(yīng)用接口技術(shù)

————后面章節(jié)選擇自學(xué)課程教學(xué)內(nèi)容緒論四川師范大學(xué)成都學(xué)院教師:劉強(qiáng)C51語(yǔ)言程序設(shè)計(jì)四川師范大學(xué)成都學(xué)院教師:劉強(qiáng)C51語(yǔ)言程序設(shè)計(jì)

現(xiàn)在幾乎所有的單片機(jī)都能用C語(yǔ)言編程了,采用C語(yǔ)言編程確實(shí)能帶來(lái)很多好處,至少可讀性比匯編語(yǔ)言強(qiáng)多了?,F(xiàn)在幾乎所有的單片機(jī)都能用C語(yǔ)言編程了,采用C語(yǔ)C語(yǔ)言的基礎(chǔ)知識(shí)不足的同學(xué)希望大家課后找時(shí)間補(bǔ)充!希望同學(xué)們?cè)趯?shí)踐中去學(xué)習(xí)和領(lǐng)悟C語(yǔ)言!接下來(lái)我們來(lái)看C51與C的不同之處!C語(yǔ)言的基礎(chǔ)知識(shí)不足的同學(xué)希望大家課后找時(shí)間補(bǔ)充!單片機(jī)的C語(yǔ)言標(biāo)準(zhǔn)C語(yǔ)言單片機(jī)的C語(yǔ)言(C51語(yǔ)言)單片機(jī)的C是在標(biāo)準(zhǔn)C語(yǔ)言的基礎(chǔ)上擴(kuò)展而成。故我們僅需學(xué)習(xí)與單片機(jī)緊密關(guān)聯(lián)的擴(kuò)展部分,即可達(dá)到快速掌握C51高級(jí)語(yǔ)言的目的。單片機(jī)的C語(yǔ)言標(biāo)準(zhǔn)C語(yǔ)言單片機(jī)的C語(yǔ)言(C51語(yǔ)言)單片機(jī)的“語(yǔ)言不是教出來(lái)的,而是學(xué)出來(lái)的”。那么,C51語(yǔ)言能力也類似:不是背C語(yǔ)言“條文”背出來(lái)的,是讀程序“讀”出來(lái)的,是編程序“編”出來(lái),是在做項(xiàng)目編程序、調(diào)試程序的實(shí)踐中形成和提高的。學(xué)習(xí)C51語(yǔ)言,還必須讀C51源程序范文:從范文中加深對(duì)語(yǔ)言法則的理解,認(rèn)識(shí)并熟悉語(yǔ)言元素、用語(yǔ)范例,理解語(yǔ)言和單片機(jī)硬件行為的關(guān)聯(lián),學(xué)習(xí)程序結(jié)構(gòu)的組織(流程圖設(shè)計(jì)),積累編程的通常技巧和算法。盡量作到讀懂人家的成熟的軟件,領(lǐng)悟、總結(jié)、模仿和借鑒,進(jìn)一步作到能夠根據(jù)自己實(shí)際的需要對(duì)成熟的軟件模塊進(jìn)行仿寫、借代、適配性修改、拼裝,在編程實(shí)踐中逐步提高編程能力。引言(深入軟硬件底層,以達(dá)到知其然知之所以然。)“語(yǔ)言不是教出來(lái)的,而是學(xué)出來(lái)的”。那么,C51語(yǔ)一、函數(shù)定義(一)函數(shù)的定義函數(shù)類型函數(shù)名(形式參數(shù)表)[reentrant][interruptm][usingn]{ 局部變量定義 函數(shù)體}前面部件稱為函數(shù)的首部,后面稱為函數(shù)的尾部,格式說(shuō)明:1.函數(shù)類型函數(shù)類型說(shuō)明了函數(shù)返回值的類型。2.函數(shù)名函數(shù)名是用戶為自定義函數(shù)取的名字以便調(diào)用函數(shù)時(shí)使用。3.形式參數(shù)表形式參數(shù)表用于列錄在主調(diào)函數(shù)與被調(diào)用函數(shù)之間進(jìn)行數(shù)據(jù)傳遞的形式參數(shù)。一、函數(shù)定義(一)函數(shù)的定義voiddelay02s(void) //一般函數(shù)定義 { unsignedchari,j,k; for(i=20;i>0;i--) for(j=20;j>0;j--) for(k=230;k>0;k--);}voiddelay02s(unsignedcharn)//帶參數(shù)傳遞的函數(shù) { unsignedchari,j,k; for(i=n;i>0;i--) for(j=20;j>0;j--) for(k=230;k>0;k--);}intmax(intx,inty)//帶參數(shù)傳遞和有返回值的函數(shù){ intz; z=x>y?x:y; returnz;}例程voiddelay02s(void) unsignedintfac(unsignedintn)reentrant//遞歸調(diào)用必須設(shè)置為重置函數(shù){ unsignedintresult; if(n==0) result=1; else result=n*fac(n-1); return(result);}voidTIMER0_isr()interrupt0using1//中斷函數(shù){ count++; if(count==20) { count=0; P2_0=!P2_0; //時(shí)間到反轉(zhuǎn)電平 }}例程unsignedintfac(unsignedinexternintmax(intx,inty);voidmain(){intc;intx1=13,y1=-8;c=max(x1,y1);while(1);}intmax(intx,inty){intz;z=x>y?x:y;returnz;}fun1.cfun2.c例程externintmax(intx,inty);iexternunsignedintx;externintmax(intx,inty);voidmain(){intc;intx1=x,y1=-8;c=max(x1,y1);while(1);}unsignedintx=13;intmax(intx,inty){intz;z=x>y?x:y;returnz;}fun1.cfun2.c例程externunsignedintx;unsigned(一)普通變量定義的格式[存儲(chǔ)類別]數(shù)據(jù)類型說(shuō)明符[存儲(chǔ)器類型]變量名1[=初值],…;在C51中,變量在使用前必須對(duì)變量進(jìn)行定義,指出變量的數(shù)據(jù)類型和存儲(chǔ)模式。以便編譯系統(tǒng)為它分配相應(yīng)的存儲(chǔ)單元。二、C51的變量此部分需要關(guān)注與標(biāo)準(zhǔn)C不同的地方!二、C51的變量此部分需要關(guān)注與標(biāo)準(zhǔn)C不同的地方!1、變量的存儲(chǔ)類別存儲(chǔ)類別指的是數(shù)據(jù)在內(nèi)存中存儲(chǔ)的方式。存儲(chǔ)類別具體有四種:---編譯器默認(rèn)為auto。

自動(dòng)的(auto) 靜態(tài)的(static) 寄存器的(register) 外部的(extern)

在C語(yǔ)言中,存儲(chǔ)的方式分為兩大類:

(1)靜態(tài)存儲(chǔ):程序運(yùn)行期間分配固定存儲(chǔ)空間。(2)動(dòng)態(tài)存儲(chǔ):程序運(yùn)行期間根據(jù)需要?jiǎng)討B(tài)分配存儲(chǔ)空間。

1、變量的存儲(chǔ)類別數(shù)據(jù)類型長(zhǎng)度值域bit1位0或1signedchar1字節(jié)-128~+127unsignedchar1字節(jié)0~255signedint2字節(jié)-32768~+32867unsignedint2字節(jié)0~65535signedlong4字節(jié)-2147483648~+2147483647unsignedlong4字節(jié)0~4294967295float4字節(jié)±1.176E-38~±3.40E+38指針1~3字節(jié)對(duì)象地址(物理地址)sbit1位0或1sfr1字節(jié)0~255sfr162字節(jié)0~655352、數(shù)據(jù)類型說(shuō)明符數(shù)據(jù)類型長(zhǎng)度值域bit1位0或1signedchar3、c51擴(kuò)展的存儲(chǔ)器類型

----C51特有存儲(chǔ)類型尋址空間數(shù)據(jù)長(zhǎng)度(bit)值域范圍bdata片內(nèi)可位尋址的RAM(20H~2FH)10~127data片內(nèi)直接尋址RAM(00~7FH)80~128idata片內(nèi)間接尋址RAM(00~0FFH)80~255pdata分頁(yè)尋址片外RAM(0000H~00FFH)80~255xdata片外RAM(64K)(0000H~0FFFFH)160~65535code片內(nèi)、外統(tǒng)一編址ROM(64K)(0000H~0FFFFH)160~655353、c51擴(kuò)展的存儲(chǔ)器類型----C51特有存儲(chǔ)類型尋址存儲(chǔ)器類型映射圖databdatacode外部程序空間60KB內(nèi)部4KBEA=1外部4KBEA=0外部數(shù)據(jù)存儲(chǔ)器64KB0FFFH0000H0000H0FFFFH0FFFH0000H片內(nèi)RAM(256B)片外RAM(64KB)0FFFFH1000H片內(nèi)、外ROM(64KB)特殊功能寄存器SFR數(shù)據(jù)緩沖區(qū)(普通RAM區(qū))80H00H1FH20H2FH30H7FH80H52子系列才有的擴(kuò)展RAM區(qū)128B位地址區(qū)工作寄存器區(qū)0FFH00FFHidataxdatapdata0FFH存儲(chǔ)器類型映射圖databdatacode外部程內(nèi)部外部外部例:變量定義存儲(chǔ)種類和存儲(chǔ)器類型相關(guān)情況。

unsignedchardatavarl;

//在片內(nèi)RAM中的data區(qū)定義無(wú)符號(hào)字符型變量Var1

unsignedintidatavar2;

//在片內(nèi)RAM中的idata區(qū)定義無(wú)符號(hào)整型變量Var2

externfloatxdatavar3;

//在片外RAM中的xdata區(qū)定義實(shí)型外部變量Var3

intcodevar4=5;

//在ROM空間定義整型變量var4并賦值4*/

unsignedcharbdatavar5;

//在片內(nèi)RAM中的bdata區(qū)定義可字節(jié)處理和位處理的無(wú)符號(hào)字符型變量var5第6次:C51語(yǔ)言程序設(shè)計(jì)課件思考inti;內(nèi)部數(shù)據(jù)存儲(chǔ)器外部數(shù)據(jù)存儲(chǔ)器程序存儲(chǔ)器省略存儲(chǔ)器類型關(guān)鍵字定義的i被編譯后會(huì)放在哪里????思考inti;內(nèi)部數(shù)據(jù)外部數(shù)據(jù)程序省略存儲(chǔ)器類三種存儲(chǔ)模式變量默認(rèn)為data存儲(chǔ)類型小模式變量默認(rèn)為pdata存儲(chǔ)類型中模式變量默認(rèn)為xdata存儲(chǔ)類型大模式缺省默認(rèn)情況(二)變量的存儲(chǔ)模式

---C51特有

三種存儲(chǔ)模式變量默認(rèn)為data存儲(chǔ)類型小模式變量默第6次:C51語(yǔ)言程序設(shè)計(jì)課件(三)指針聲明方式數(shù)據(jù)類型存儲(chǔ)類型(指針指向位置)存儲(chǔ)類型(指針存放位置)

*變量名

如:unsignedcharxdata*datap1;如:unsignedintxdata*datap2;指向idata、data和pdata的存儲(chǔ)器指針用1個(gè)字節(jié)保存

指向code和xdata的存儲(chǔ)器指針用2個(gè)字節(jié)保存idata

、bdata、data、pdata、xdataidata

、bdata、data、code、pdata、xdata(三)指針聲明方式數(shù)據(jù)類型存儲(chǔ)類型存儲(chǔ)類型*變量名如3個(gè)字節(jié),通用型指針,未指明存儲(chǔ)器空間 unsignedchar*point1; unsignedint*point2;2個(gè)字節(jié),指向16位尋址的存儲(chǔ)器空間 unsigned

intcode*point1; unsigned

intxdata*point2;1個(gè)字節(jié),指向8位尋址的存儲(chǔ)器空間 unsigned

chardata*point1; unsigned

charidata*point2; unsigned

charpdata*point3;

采用指針的方法,可以實(shí)現(xiàn)在C51程序中對(duì)任意指定的存儲(chǔ)器單元進(jìn)行訪問(wèn)。3個(gè)字節(jié),通用型指針,未指明存儲(chǔ)器空間顯示指針與通用指針的對(duì)比描述idata指針xdata指針通用指針C源程序idatachar*ip;charval;val=*ip;xdatachar*xp;charval;val=*xp;char*p;charval;val=*p;編譯后的匯編代碼MOVR0,ipMOVval,@R0MOVDPL,xp+1MOVDPH,xpMOVXA,@DPTRMOVval,AMOVDPL,pMOVDPH,p+1MOVB,p+2LCALL__gptrget指針大小1字節(jié)2字節(jié)3字節(jié)代碼長(zhǎng)度4字節(jié)9字節(jié)11字節(jié)+庫(kù)調(diào)用執(zhí)行時(shí)間4周期7周期遠(yuǎn)大于13周期通用指針使用方便,但速度慢顯式指針效率高、速度快,但尋址范圍小顯示指針與通用指針的對(duì)比描述idata指針xdata指針通例1:通過(guò)指針實(shí)現(xiàn)絕對(duì)地址的訪問(wèn)。typedefunsignedcharuchar;//定義符號(hào)uchar為數(shù)據(jù)類型符unsignedchartypedefunsignedintuint;//定義符號(hào)uint為數(shù)據(jù)類型符unsignedintvoidmain(void){

uchardata*dp1;//定義一個(gè)指向data區(qū)的指針dp1 uintxdata*dp2;//定義一個(gè)指向xdata區(qū)的指針dp2 dp1=0x30;//dp1指針賦值,指向data區(qū)的30H單元 dp2=0x1000;//dp2指針賦值,指向xdata區(qū)的1000H單元 *dp1=0x55;//將數(shù)據(jù)0x55送到片外RAM30H單元 *dp2=0x1234;//將數(shù)據(jù)0x1234送到片外RAM1000H單元 while(1);}例1:通過(guò)指針實(shí)現(xiàn)絕對(duì)地址的訪問(wèn)。(二)特殊功能寄存器變量的定義---C51特有

定義后可實(shí)現(xiàn)C51中對(duì)特殊功能寄存器的訪問(wèn)databdata特殊功能寄存器sfr數(shù)據(jù)緩沖區(qū)(普通RAM區(qū))80H00H1FH20H2FH30H7FH80H0FFH52子系列才有的RAM區(qū)位地址區(qū)工作寄存器區(qū)0FFH0FFHidata片內(nèi)RAM(256B)(二)特殊功能寄存器變量的定義---C51特有datMSC-51系列包括多種寄存器,其中一些具有特殊功能,如定時(shí)器,端口的控制寄存器等,為了能夠直接訪問(wèn)這些寄存器,C51編譯器提供了一種定義的自主形式,這是必要的,因?yàn)檫@些定義與標(biāo)準(zhǔn)C語(yǔ)言是不兼容的。為了支持這些特殊功能寄存器(SFR)的聲明,引入了關(guān)鍵詞“sfr”,語(yǔ)法如下:

sfr特殊功能寄存器名=地址;sfr16特殊功能寄存器名=地址;//定義8051的8位寄存器:

sfrP0=0x80;

//定義8051的狀態(tài)字寄存器P0,地址為0X80。sfrP1=0x90;

//定義8051的狀態(tài)字寄存器P1,地址為0X90。sfrPSW=0xd0;//定義8051的狀態(tài)字寄存器PSW,地址為0XD0。sfrSCON=0x98;//定義8051的串行控制寄存器SCON,地址為0X98。sfrTMOD=0x89;//定義8051的定時(shí)器模式寄存器TMOD,地址為0X89。//定義8051的其他16位寄存器:sfr16DPTR=0x82;//sfrDPH=0X83sfrDPL=0X82

(二)特殊功能寄存器變量的定義---C51特有

定義后可實(shí)現(xiàn)C51中對(duì)特殊功能寄存器的訪問(wèn)MSC-51系列包括多種寄存器,其中一些具有特殊例:sfrP0=0X80;sfrP1=0X90;sfr16DPTR=0X82;voidmain(void){ P0=0X55; P1=0X66; DPTR=0X1234;

while(1);}可以改成以下程序#include<regx51.h>sfr16DPTR=0X82;voidmain(void){ P0=0X55; P1=0X66; DPTR=0X1234;

while(1);}大家可以看看書上后面的單片機(jī)的程序,一般都包含有#include<regx51.h>例:可以改成以下程序大家可以看看書上后面的單片機(jī)的程序,一般(三)位變量的定義---C51特有

定以后實(shí)現(xiàn)C51中對(duì)位地址的訪問(wèn)databdata特殊功能寄存器sfr數(shù)據(jù)緩沖區(qū)(普通RAM區(qū))80H00H1FH20H2FH30H7FH80H0FFH52子系列才有的RAM區(qū)位地址區(qū)工作寄存器區(qū)0FFH0FFHidata片內(nèi)RAM(256B)(三)位變量的定義---C51特有databdata低128字節(jié)RAM區(qū)—128個(gè)高128字節(jié)RAM區(qū)(SFR區(qū))--83個(gè)低128字節(jié)高128字節(jié)

在C51中,允許用戶通過(guò)位類型符定義位變量。位類型符有兩個(gè):bit和sbit。可以定義兩種位變量。(1)bit位類型符用于定義一般的可位處理位變量。格式:bit位變量名;

在格式中可以加上各種修飾,但注意存儲(chǔ)器類型只能是bdata、data、idata。只能是片內(nèi)RAM的可位尋址區(qū),嚴(yán)格來(lái)說(shuō)只能是bdata。例:bit型變量的定義。 bitidataflag1; √ bitdataflag2; √ bitbdataflag3; √ bitpdataflag4; × bitxdataflag5; × bit*p ×

bitstring[5] ×

bitfunc(bita1,bita2)

√可以定義函數(shù)在C51中,允許用戶通過(guò)位類型符定義位變量。例1: voidmain(void) { bitbdataflag1,flag2; flag1=0; flag2=1; while(1); }例2:

bitbdataflag1,flag2;voidmain(void) {

flag1=0; flag2=1; while(1); }低128字節(jié)RAM區(qū)—128個(gè)例1: voidmain(void)例2:bitb在典型的8051單片機(jī)應(yīng)用問(wèn)題中,經(jīng)常需要單獨(dú)訪問(wèn)SFR中的位,C51擴(kuò)充功能使之成為可能,特殊位,象SFR一樣,不與標(biāo)準(zhǔn)C語(yǔ)言兼容,使用保留字“sbit”可訪問(wèn)位尋址對(duì)象。與SFR聲明一樣,用保留字“sbit”聲明某些特殊位接受符號(hào)名,“=”后語(yǔ)句將絕對(duì)值地址賦給變量名,這種地址分配有三種方法:方法1:sbit變量名=sfr_name^int_constant當(dāng)字節(jié)是特殊功能寄存器的地址可用這個(gè)方法。sfr_name必須是已定義的SFR的名字,“^”后的語(yǔ)句定義了基地址上的特殊位的位置,該位置必須是一個(gè)0~7的數(shù)。例1: sfrPSW=0xD0; sbitOV=PSW^2; sbitCY=PSW^7;(2)sbit位類型符在典型的8051單片機(jī)應(yīng)用問(wèn)題中,經(jīng)常需要單獨(dú)方法2:sbit變量名=int_constant^int_constant這種方法以一整常數(shù)作基地址,該值必須在0x80~0xFF之間,并能被8整除,確定位的位置方法同上。 例2:sbitOV=0xD0^2; sbitCV=0xD0^7;

方法3:sbit變量名=int_constant----此方法最常用

這種方法是將位的絕對(duì)地址賦給變量,地址必須位于0x80~0xFF之間。 例3:sbitOV=0xD2; sbitCY=0xD7;特殊功能位代表了一個(gè)獨(dú)立的聲明類,它不能與其它聲明和位域互換。方法2:sbit變量名=int_constant^高128字節(jié)RAM區(qū)(SFR區(qū))--83個(gè)例:sbitP0_0=0x80;sbitP0_0=0X80^0;sfrP0=0X80;

sbitP0_0=P0^0;

voidmain(void){ P0_0=0; P0_0=1; while(1);}方法一方法二方法三高128字節(jié)例:sbitP0_0=0x80;低128字節(jié)RAM區(qū)—128個(gè)unsignedcharbdataflag;sbitflag0=flag^0;voidmain(void){ flag=0x55; flag0=1; while(1);}---------------------------------unsignedintbdataflag;sbitflag0=flag^15;voidmain(void){ flag=0x55; flag0=1; while(1);}

注意:在此區(qū)域不允許使用:sbitflag0=0x20;或sbitflag0=0x24^0;低128字節(jié)RAM區(qū)—128個(gè)unsignedchar三、C51絕對(duì)地址的訪問(wèn)databdatacode外部程序空間60K內(nèi)部4KEA=1外部4KEA=0外部數(shù)據(jù)存儲(chǔ)器64KB0FFFH0000H0000H0FFFFH0FFFH0000H片內(nèi)RAM(256B)片外RAM(64KB)0FFFFH1000H0FFFFH片內(nèi)、外ROM(64KB)特殊功能寄存器sfr數(shù)據(jù)緩沖區(qū)(普通RAM區(qū))80H00H1FH20H2FH30H7FH80H0FFH52子系列才有的RAM區(qū)位地址區(qū)工作寄存器區(qū)0FFH0FFH00FFHidataxdatapdata三、C51絕對(duì)地址的訪問(wèn)databdatacode外部程內(nèi)C51編譯器提供了一組宏定義來(lái)對(duì)51系列單片機(jī)的code、data、pdata和xdata空間進(jìn)行絕對(duì)尋址。規(guī)定只能以無(wú)符號(hào)數(shù)方式訪問(wèn),定義了8個(gè)宏定義,其函數(shù)原型如下:

#defineCBYTE((unsignedcharvolatilecode*)0)#defineDBYTE((unsignedcharvolatiledata*)0)#definePBYTE((unsignedcharvolatilepdata*)0)#defineXBYTE((unsignedcharvolatilexdata*)0)#defineCWORD((unsignedintvolatilecode*)0)#defineDWORD((unsignedintvolatiledata*)0)#definePWORD((unsignedintvolatilepdata*)0)#defineXWORD((unsignedintvolatilexdata*)0)這些函數(shù)原型放在absacc.h文件中。使用時(shí)須用預(yù)處理命令把該頭文件包含到文件中,形式為:#include<absacc.h>。(一)采用C51中的預(yù)定義宏的方式訪問(wèn)C51編譯器提供了一組宏定義來(lái)對(duì)51系列單片機(jī)例1:絕對(duì)地址對(duì)存儲(chǔ)單元的訪問(wèn)#include<absacc.h>//將絕對(duì)地址頭文件包含在文件中typedefunsignedcharuchar;typedefunsignedintuint;voidmain(void){

ucharvar1;//定義變量var1 uintvar2;//定義變量var2

var1=XBYTE[0x0005];

//XBYTE[0x0005]訪問(wèn)片外RAM的0005字節(jié)單元 var2=XWORD[0x0002];//

XWORD[0x0002]實(shí)質(zhì)是訪問(wèn)的是片外RAM的0002字單元

DBYTE[0x30]=0X55; XBYTE[0x0002]=0X66; DWORD[0x40]=0X1234; XWORD[0x0000]=0X1234; while(1);}例1:絕對(duì)地址對(duì)存儲(chǔ)單元的訪問(wèn)(二)通過(guò)指針?lè)绞皆L問(wèn)3個(gè)字節(jié),通用型指針,未指明存儲(chǔ)器空間 unsignedchar*point1; unsignedint*point2;2個(gè)字節(jié),指向16位尋址的存儲(chǔ)器空間 unsigned

intcode*point1; unsigned

intxdata*point2;1個(gè)字節(jié),指向8位尋址的存儲(chǔ)器空間 unsigned

chardata*point1; unsigned

charidata*point2; unsigned

charpdata*point3;

采用指針的方法,可以實(shí)現(xiàn)在C51程序中對(duì)任意指定的存儲(chǔ)器單元進(jìn)行訪問(wèn)。(二)通過(guò)指針?lè)绞皆L問(wèn)3個(gè)字節(jié),通用型指針,未指明存儲(chǔ)器空間例1:通過(guò)指針實(shí)現(xiàn)絕對(duì)地址的訪問(wèn)。typedefunsignedcharuchar;//定義符號(hào)uchar為數(shù)據(jù)類型符unsignedchartypedefunsignedintuint;//定義符號(hào)uint為數(shù)據(jù)類型符unsignedintvoidmain(void){

uchardata*dp1;//定義一個(gè)指向data區(qū)的指針dp1 uintxdata*dp2;//定義一個(gè)指向xdata區(qū)的指針dp2 dp1=0x30;//dp1指針賦值,指向data區(qū)的30H單元 dp2=0x1000;//dp2指針賦值,指向xdata區(qū)的1000H單元 *dp1=0x55;//將數(shù)據(jù)0x55送到片外RAM30H單元 *dp2=0x1234;//將數(shù)據(jù)0x1234送到片外RAM1000H單元 while(1);}例1:通過(guò)指針實(shí)現(xiàn)絕對(duì)地址的訪問(wèn)。例2:通過(guò)指針實(shí)現(xiàn)絕對(duì)地址的訪問(wèn)。typedefunsignedcharuchar;typedefunsignedintuint;

voidmain(void){ uchardatax; ucharidata*p1;//定義一個(gè)指向idata區(qū)的指針p1 p1=&x;//p1指針指向data區(qū)的x變量 *p1=0x55;//等價(jià)于給變量x賦值0x55 while(1);}例2:通過(guò)指針實(shí)現(xiàn)絕對(duì)地址的訪問(wèn)。例3:通過(guò)指針實(shí)現(xiàn)絕對(duì)地址的訪問(wèn)。typedefunsignedcharuchar;typedefunsignedintuint;voidmain(void){ uchardatax=9,y; ucharidata*p1;//定義一個(gè)指向idata區(qū)的指針p1 p1=&x;//p1指針指向data區(qū)的x變量 y=*p1;//執(zhí)行完后y的值位9 while(1);}例3:通過(guò)指針實(shí)現(xiàn)絕對(duì)地址的訪問(wèn)。例4:統(tǒng)計(jì)片外RAM中2000H地址開(kāi)始的16個(gè)單元中0的個(gè)數(shù),將統(tǒng)計(jì)個(gè)數(shù)存入片外的2100單元。typedefunsignedcharuchar;typedefunsignedintuint;voidmain(void){

uintn=0,i;

ucharxdata*p=0x2000;//指針p指向xdata區(qū)的2000H單元 for(i=0;i<16;i++) {

if(*p==0)n++;//若該單元內(nèi)容為零,則n+1 p++; //指針指向下一單元 } p=0x2100; //指針p指向2100H單元 *p=n; //把個(gè)數(shù)放在2100H單元中

while(1);}例4:統(tǒng)計(jì)片外RAM中2000H地址開(kāi)始的16個(gè)單元中0的個(gè)使用_at_對(duì)指定的存儲(chǔ)器空間的絕對(duì)地址進(jìn)行訪問(wèn)。一般格式:數(shù)據(jù)類型說(shuō)明符[存儲(chǔ)器類型]變量名_at_地址常數(shù);其中,存儲(chǔ)器類型為data、bdata、idata、pdata等C51能識(shí)別的數(shù)據(jù)類型,如省略則按存儲(chǔ)模式規(guī)定的默認(rèn)存儲(chǔ)器類型確定變量的存儲(chǔ)器區(qū)域;數(shù)據(jù)類型為C51支持的數(shù)據(jù)類型。

地址常數(shù)用于指定變量的絕對(duì)地址,必須位于有效的存儲(chǔ)器空間之內(nèi);使用_at_定義的變量必須為全局變量。(三)使用關(guān)鍵字_at_的方式訪問(wèn)使用_at_對(duì)指定的存儲(chǔ)器空間的絕對(duì)地址例1:通過(guò)_at_實(shí)現(xiàn)絕對(duì)地址的訪問(wèn)。unsignedchardatax_at_0x40;

//在data區(qū)中定義字節(jié)變量x,它的地址為40Hunsignedintxdatay_at_0x2000;//在xdata區(qū)中定義字變量y,它的地址為2000Hvoidmain(void){

x=0x55; //等價(jià)于向片內(nèi)RAM的40單元寫入了0x55 y=0x1234;

//等價(jià)于向片外RAM的2000單元寫入了0x12,2001單元寫入了0x34

while(1);}例1:通過(guò)_at_實(shí)現(xiàn)絕對(duì)地址的訪問(wèn)。C51中常用的頭文件regx51.h(定義單片機(jī)的特殊功能寄存器和端口)absacc.h(外部絕對(duì)地址訪問(wèn)函數(shù)庫(kù))intrins.h(此文件很實(shí)用,以后常用)stdio.h(標(biāo)準(zhǔn)輸入輸出函數(shù)庫(kù))math.h(標(biāo)準(zhǔn)數(shù)學(xué)函數(shù)庫(kù))ctype.h(字符函數(shù)庫(kù))string.h(字符串?dāng)?shù)組函數(shù)庫(kù))C51中常用的頭文件regx51.h(定義單片機(jī)的特殊功能Question&Answer任何建議和疑問(wèn),請(qǐng)不要猶豫!劉強(qiáng):liuliu408@163.comQuestion&Answer9.1概述發(fā)動(dòng)機(jī)車廂輪胎底盤一輛汽車可分為若干個(gè)部件,由若干廠家分頭獨(dú)立生產(chǎn),我來(lái)負(fù)責(zé)組裝?,F(xiàn)代編程重要思想:模塊化程序設(shè)計(jì)9.1概述發(fā)動(dòng)機(jī)車廂輪胎底盤一輛汽車可分為若干個(gè)基本思想:將一個(gè)大的程序按功能分割成一些小模塊,每個(gè)模塊實(shí)現(xiàn)一個(gè)特定的功能。各模塊相對(duì)獨(dú)立、功能單一、接口統(tǒng)一。從而降低了程序設(shè)計(jì)的復(fù)雜性,縮短了開(kāi)發(fā)周期,使程序易于維護(hù)和功能擴(kuò)充。特點(diǎn):

★各模塊相對(duì)獨(dú)立、功能單一、結(jié)構(gòu)清晰、接口簡(jiǎn)單;★控制了程序設(shè)計(jì)的復(fù)雜性;★提高元件的可靠性;★縮短開(kāi)發(fā)周期;★避免程序開(kāi)發(fā)的重復(fù)勞動(dòng);★易于維護(hù)和功能擴(kuò)充。開(kāi)發(fā)方法:自上向下,逐步分解,分而治之?,F(xiàn)代編程重要思想:模塊化程序設(shè)計(jì)基本思想:現(xiàn)代編程重要思想:模塊化程序設(shè)計(jì)Question&Answer任何建議和疑問(wèn),請(qǐng)不要猶豫!劉強(qiáng):liuliu408@163.comQuestion&Answer外部程序空間60K內(nèi)部4KEA=1外部4KEA=00FFFH0000H0000H0FFFFH0FFFH0000H片內(nèi)RAM(256B)片外RAM(64KB)0FFFFH1000H0000H0FFFFH片內(nèi)、外ROM(64KB)特殊功能寄存器SFR數(shù)據(jù)緩沖區(qū)(普通RAM區(qū))80H00H1FH20H2FH30H7FH80H0FFH52子系列才有的RAM區(qū)位地址區(qū)工作寄存器區(qū)0FFH0FFH外部數(shù)據(jù)存儲(chǔ)器64KB直接尋址寄存器間接尋址直接尋址、寄存器間接尋址

直接尋址、寄存器間接尋址

位尋址、直接尋址、寄存器間接尋址

寄存器尋址、寄存器間接尋址立即尋址、變址尋址、相對(duì)尋址復(fù)習(xí):尋址方式涉及的存儲(chǔ)器空間外部程內(nèi)部外部0FFFH0000H0000H0FFFFH0F四川師范大學(xué)成都學(xué)院騰訊微云:/DSdKRL2013-09-01劉強(qiáng)課件下載四川師范大學(xué)成都學(xué)院騰訊微云:/D課程教學(xué)內(nèi)容緒論第0章計(jì)算機(jī)的基礎(chǔ)知識(shí)第1章單片機(jī)的硬件結(jié)構(gòu)----重點(diǎn)

第2章單片機(jī)的指令系統(tǒng)----了解 第3章單片機(jī)的匯編語(yǔ)言程序設(shè)計(jì)---了解

第4章單片機(jī)的C語(yǔ)言(C51語(yǔ)言)編程----重點(diǎn)第5章單片機(jī)的輸入、輸出口----重點(diǎn) 第6章單片機(jī)的中斷系統(tǒng)----重點(diǎn) 第7章單片機(jī)的定時(shí)器/計(jì)數(shù)器----重點(diǎn) 第8章單片機(jī)的串行接口----重點(diǎn)

第9章單片機(jī)總線與系統(tǒng)擴(kuò)展 第10章單片機(jī)應(yīng)用接口技術(shù)

————后面章節(jié)選擇自學(xué)課程教學(xué)內(nèi)容緒論四川師范大學(xué)成都學(xué)院教師:劉強(qiáng)C51語(yǔ)言程序設(shè)計(jì)四川師范大學(xué)成都學(xué)院教師:劉強(qiáng)C51語(yǔ)言程序設(shè)計(jì)

現(xiàn)在幾乎所有的單片機(jī)都能用C語(yǔ)言編程了,采用C語(yǔ)言編程確實(shí)能帶來(lái)很多好處,至少可讀性比匯編語(yǔ)言強(qiáng)多了?,F(xiàn)在幾乎所有的單片機(jī)都能用C語(yǔ)言編程了,采用C語(yǔ)C語(yǔ)言的基礎(chǔ)知識(shí)不足的同學(xué)希望大家課后找時(shí)間補(bǔ)充!希望同學(xué)們?cè)趯?shí)踐中去學(xué)習(xí)和領(lǐng)悟C語(yǔ)言!接下來(lái)我們來(lái)看C51與C的不同之處!C語(yǔ)言的基礎(chǔ)知識(shí)不足的同學(xué)希望大家課后找時(shí)間補(bǔ)充!單片機(jī)的C語(yǔ)言標(biāo)準(zhǔn)C語(yǔ)言單片機(jī)的C語(yǔ)言(C51語(yǔ)言)單片機(jī)的C是在標(biāo)準(zhǔn)C語(yǔ)言的基礎(chǔ)上擴(kuò)展而成。故我們僅需學(xué)習(xí)與單片機(jī)緊密關(guān)聯(lián)的擴(kuò)展部分,即可達(dá)到快速掌握C51高級(jí)語(yǔ)言的目的。單片機(jī)的C語(yǔ)言標(biāo)準(zhǔn)C語(yǔ)言單片機(jī)的C語(yǔ)言(C51語(yǔ)言)單片機(jī)的“語(yǔ)言不是教出來(lái)的,而是學(xué)出來(lái)的”。那么,C51語(yǔ)言能力也類似:不是背C語(yǔ)言“條文”背出來(lái)的,是讀程序“讀”出來(lái)的,是編程序“編”出來(lái),是在做項(xiàng)目編程序、調(diào)試程序的實(shí)踐中形成和提高的。學(xué)習(xí)C51語(yǔ)言,還必須讀C51源程序范文:從范文中加深對(duì)語(yǔ)言法則的理解,認(rèn)識(shí)并熟悉語(yǔ)言元素、用語(yǔ)范例,理解語(yǔ)言和單片機(jī)硬件行為的關(guān)聯(lián),學(xué)習(xí)程序結(jié)構(gòu)的組織(流程圖設(shè)計(jì)),積累編程的通常技巧和算法。盡量作到讀懂人家的成熟的軟件,領(lǐng)悟、總結(jié)、模仿和借鑒,進(jìn)一步作到能夠根據(jù)自己實(shí)際的需要對(duì)成熟的軟件模塊進(jìn)行仿寫、借代、適配性修改、拼裝,在編程實(shí)踐中逐步提高編程能力。引言(深入軟硬件底層,以達(dá)到知其然知之所以然。)“語(yǔ)言不是教出來(lái)的,而是學(xué)出來(lái)的”。那么,C51語(yǔ)一、函數(shù)定義(一)函數(shù)的定義函數(shù)類型函數(shù)名(形式參數(shù)表)[reentrant][interruptm][usingn]{ 局部變量定義 函數(shù)體}前面部件稱為函數(shù)的首部,后面稱為函數(shù)的尾部,格式說(shuō)明:1.函數(shù)類型函數(shù)類型說(shuō)明了函數(shù)返回值的類型。2.函數(shù)名函數(shù)名是用戶為自定義函數(shù)取的名字以便調(diào)用函數(shù)時(shí)使用。3.形式參數(shù)表形式參數(shù)表用于列錄在主調(diào)函數(shù)與被調(diào)用函數(shù)之間進(jìn)行數(shù)據(jù)傳遞的形式參數(shù)。一、函數(shù)定義(一)函數(shù)的定義voiddelay02s(void) //一般函數(shù)定義 { unsignedchari,j,k; for(i=20;i>0;i--) for(j=20;j>0;j--) for(k=230;k>0;k--);}voiddelay02s(unsignedcharn)//帶參數(shù)傳遞的函數(shù) { unsignedchari,j,k; for(i=n;i>0;i--) for(j=20;j>0;j--) for(k=230;k>0;k--);}intmax(intx,inty)//帶參數(shù)傳遞和有返回值的函數(shù){ intz; z=x>y?x:y; returnz;}例程voiddelay02s(void) unsignedintfac(unsignedintn)reentrant//遞歸調(diào)用必須設(shè)置為重置函數(shù){ unsignedintresult; if(n==0) result=1; else result=n*fac(n-1); return(result);}voidTIMER0_isr()interrupt0using1//中斷函數(shù){ count++; if(count==20) { count=0; P2_0=!P2_0; //時(shí)間到反轉(zhuǎn)電平 }}例程unsignedintfac(unsignedinexternintmax(intx,inty);voidmain(){intc;intx1=13,y1=-8;c=max(x1,y1);while(1);}intmax(intx,inty){intz;z=x>y?x:y;returnz;}fun1.cfun2.c例程externintmax(intx,inty);iexternunsignedintx;externintmax(intx,inty);voidmain(){intc;intx1=x,y1=-8;c=max(x1,y1);while(1);}unsignedintx=13;intmax(intx,inty){intz;z=x>y?x:y;returnz;}fun1.cfun2.c例程externunsignedintx;unsigned(一)普通變量定義的格式[存儲(chǔ)類別]數(shù)據(jù)類型說(shuō)明符[存儲(chǔ)器類型]變量名1[=初值],…;在C51中,變量在使用前必須對(duì)變量進(jìn)行定義,指出變量的數(shù)據(jù)類型和存儲(chǔ)模式。以便編譯系統(tǒng)為它分配相應(yīng)的存儲(chǔ)單元。二、C51的變量此部分需要關(guān)注與標(biāo)準(zhǔn)C不同的地方!二、C51的變量此部分需要關(guān)注與標(biāo)準(zhǔn)C不同的地方!1、變量的存儲(chǔ)類別存儲(chǔ)類別指的是數(shù)據(jù)在內(nèi)存中存儲(chǔ)的方式。存儲(chǔ)類別具體有四種:---編譯器默認(rèn)為auto。

自動(dòng)的(auto) 靜態(tài)的(static) 寄存器的(register) 外部的(extern)

在C語(yǔ)言中,存儲(chǔ)的方式分為兩大類:

(1)靜態(tài)存儲(chǔ):程序運(yùn)行期間分配固定存儲(chǔ)空間。(2)動(dòng)態(tài)存儲(chǔ):程序運(yùn)行期間根據(jù)需要?jiǎng)討B(tài)分配存儲(chǔ)空間。

1、變量的存儲(chǔ)類別數(shù)據(jù)類型長(zhǎng)度值域bit1位0或1signedchar1字節(jié)-128~+127unsignedchar1字節(jié)0~255signedint2字節(jié)-32768~+32867unsignedint2字節(jié)0~65535signedlong4字節(jié)-2147483648~+2147483647unsignedlong4字節(jié)0~4294967295float4字節(jié)±1.176E-38~±3.40E+38指針1~3字節(jié)對(duì)象地址(物理地址)sbit1位0或1sfr1字節(jié)0~255sfr162字節(jié)0~655352、數(shù)據(jù)類型說(shuō)明符數(shù)據(jù)類型長(zhǎng)度值域bit1位0或1signedchar3、c51擴(kuò)展的存儲(chǔ)器類型

----C51特有存儲(chǔ)類型尋址空間數(shù)據(jù)長(zhǎng)度(bit)值域范圍bdata片內(nèi)可位尋址的RAM(20H~2FH)10~127data片內(nèi)直接尋址RAM(00~7FH)80~128idata片內(nèi)間接尋址RAM(00~0FFH)80~255pdata分頁(yè)尋址片外RAM(0000H~00FFH)80~255xdata片外RAM(64K)(0000H~0FFFFH)160~65535code片內(nèi)、外統(tǒng)一編址ROM(64K)(0000H~0FFFFH)160~655353、c51擴(kuò)展的存儲(chǔ)器類型----C51特有存儲(chǔ)類型尋址存儲(chǔ)器類型映射圖databdatacode外部程序空間60KB內(nèi)部4KBEA=1外部4KBEA=0外部數(shù)據(jù)存儲(chǔ)器64KB0FFFH0000H0000H0FFFFH0FFFH0000H片內(nèi)RAM(256B)片外RAM(64KB)0FFFFH1000H片內(nèi)、外ROM(64KB)特殊功能寄存器SFR數(shù)據(jù)緩沖區(qū)(普通RAM區(qū))80H00H1FH20H2FH30H7FH80H52子系列才有的擴(kuò)展RAM區(qū)128B位地址區(qū)工作寄存器區(qū)0FFH00FFHidataxdatapdata0FFH存儲(chǔ)器類型映射圖databdatacode外部程內(nèi)部外部外部例:變量定義存儲(chǔ)種類和存儲(chǔ)器類型相關(guān)情況。

unsignedchardatavarl;

//在片內(nèi)RAM中的data區(qū)定義無(wú)符號(hào)字符型變量Var1

unsignedintidatavar2;

//在片內(nèi)RAM中的idata區(qū)定義無(wú)符號(hào)整型變量Var2

externfloatxdatavar3;

//在片外RAM中的xdata區(qū)定義實(shí)型外部變量Var3

intcodevar4=5;

//在ROM空間定義整型變量var4并賦值4*/

unsignedcharbdatavar5;

//在片內(nèi)RAM中的bdata區(qū)定義可字節(jié)處理和位處理的無(wú)符號(hào)字符型變量var5第6次:C51語(yǔ)言程序設(shè)計(jì)課件思考inti;內(nèi)部數(shù)據(jù)存儲(chǔ)器外部數(shù)據(jù)存儲(chǔ)器程序存儲(chǔ)器省略存儲(chǔ)器類型關(guān)鍵字定義的i被編譯后會(huì)放在哪里????思考inti;內(nèi)部數(shù)據(jù)外部數(shù)據(jù)程序省略存儲(chǔ)器類三種存儲(chǔ)模式變量默認(rèn)為data存儲(chǔ)類型小模式變量默認(rèn)為pdata存儲(chǔ)類型中模式變量默認(rèn)為xdata存儲(chǔ)類型大模式缺省默認(rèn)情況(二)變量的存儲(chǔ)模式

---C51特有

三種存儲(chǔ)模式變量默認(rèn)為data存儲(chǔ)類型小模式變量默第6次:C51語(yǔ)言程序設(shè)計(jì)課件(三)指針聲明方式數(shù)據(jù)類型存儲(chǔ)類型(指針指向位置)存儲(chǔ)類型(指針存放位置)

*變量名

如:unsignedcharxdata*datap1;如:unsignedintxdata*datap2;指向idata、data和pdata的存儲(chǔ)器指針用1個(gè)字節(jié)保存

指向code和xdata的存儲(chǔ)器指針用2個(gè)字節(jié)保存idata

、bdata、data、pdata、xdataidata

、bdata、data、code、pdata、xdata(三)指針聲明方式數(shù)據(jù)類型存儲(chǔ)類型存儲(chǔ)類型*變量名如3個(gè)字節(jié),通用型指針,未指明存儲(chǔ)器空間 unsignedchar*point1; unsignedint*point2;2個(gè)字節(jié),指向16位尋址的存儲(chǔ)器空間 unsigned

intcode*point1; unsigned

intxdata*point2;1個(gè)字節(jié),指向8位尋址的存儲(chǔ)器空間 unsigned

chardata*point1; unsigned

charidata*point2; unsigned

charpdata*point3;

采用指針的方法,可以實(shí)現(xiàn)在C51程序中對(duì)任意指定的存儲(chǔ)器單元進(jìn)行訪問(wèn)。3個(gè)字節(jié),通用型指針,未指明存儲(chǔ)器空間顯示指針與通用指針的對(duì)比描述idata指針xdata指針通用指針C源程序idatachar*ip;charval;val=*ip;xdatachar*xp;charval;val=*xp;char*p;charval;val=*p;編譯后的匯編代碼MOVR0,ipMOVval,@R0MOVDPL,xp+1MOVDPH,xpMOVXA,@DPTRMOVval,AMOVDPL,pMOVDPH,p+1MOVB,p+2LCALL__gptrget指針大小1字節(jié)2字節(jié)3字節(jié)代碼長(zhǎng)度4字節(jié)9字節(jié)11字節(jié)+庫(kù)調(diào)用執(zhí)行時(shí)間4周期7周期遠(yuǎn)大于13周期通用指針使用方便,但速度慢顯式指針效率高、速度快,但尋址范圍小顯示指針與通用指針的對(duì)比描述idata指針xdata指針通例1:通過(guò)指針實(shí)現(xiàn)絕對(duì)地址的訪問(wèn)。typedefunsignedcharuchar;//定義符號(hào)uchar為數(shù)據(jù)類型符unsignedchartypedefunsignedintuint;//定義符號(hào)uint為數(shù)據(jù)類型符unsignedintvoidmain(void){

uchardata*dp1;//定義一個(gè)指向data區(qū)的指針dp1 uintxdata*dp2;//定義一個(gè)指向xdata區(qū)的指針dp2 dp1=0x30;//dp1指針賦值,指向data區(qū)的30H單元 dp2=0x1000;//dp2指針賦值,指向xdata區(qū)的1000H單元 *dp1=0x55;//將數(shù)據(jù)0x55送到片外RAM30H單元 *dp2=0x1234;//將數(shù)據(jù)0x1234送到片外RAM1000H單元 while(1);}例1:通過(guò)指針實(shí)現(xiàn)絕對(duì)地址的訪問(wèn)。(二)特殊功能寄存器變量的定義---C51特有

定義后可實(shí)現(xiàn)C51中對(duì)特殊功能寄存器的訪問(wèn)databdata特殊功能寄存器sfr數(shù)據(jù)緩沖區(qū)(普通RAM區(qū))80H00H1FH20H2FH30H7FH80H0FFH52子系列才有的RAM區(qū)位地址區(qū)工作寄存器區(qū)0FFH0FFHidata片內(nèi)RAM(256B)(二)特殊功能寄存器變量的定義---C51特有datMSC-51系列包括多種寄存器,其中一些具有特殊功能,如定時(shí)器,端口的控制寄存器等,為了能夠直接訪問(wèn)這些寄存器,C51編譯器提供了一種定義的自主形式,這是必要的,因?yàn)檫@些定義與標(biāo)準(zhǔn)C語(yǔ)言是不兼容的。為了支持這些特殊功能寄存器(SFR)的聲明,引入了關(guān)鍵詞“sfr”,語(yǔ)法如下:

sfr特殊功能寄存器名=地址;sfr16特殊功能寄存器名=地址;//定義8051的8位寄存器:

sfrP0=0x80;

//定義8051的狀態(tài)字寄存器P0,地址為0X80。sfrP1=0x90;

//定義8051的狀態(tài)字寄存器P1,地址為0X90。sfrPSW=0xd0;//定義8051的狀態(tài)字寄存器PSW,地址為0XD0。sfrSCON=0x98;//定義8051的串行控制寄存器SCON,地址為0X98。sfrTMOD=0x89;//定義8051的定時(shí)器模式寄存器TMOD,地址為0X89。//定義8051的其他16位寄存器:sfr16DPTR=0x82;//sfrDPH=0X83sfrDPL=0X82

(二)特殊功能寄存器變量的定義---C51特有

定義后可實(shí)現(xiàn)C51中對(duì)特殊功能寄存器的訪問(wèn)MSC-51系列包括多種寄存器,其中一些具有特殊例:sfrP0=0X80;sfrP1=0X90;sfr16DPTR=0X82;voidmain(void){ P0=0X55; P1=0X66; DPTR=0X1234;

while(1);}可以改成以下程序#include<regx51.h>sfr16DPTR=0X82;voidmain(void){ P0=0X55; P1=0X66; DPTR=0X1234;

while(1);}大家可以看看書上后面的單片機(jī)的程序,一般都包含有#include<regx51.h>例:可以改成以下程序大家可以看看書上后面的單片機(jī)的程序,一般(三)位變量的定義---C51特有

定以后實(shí)現(xiàn)C51中對(duì)位地址的訪問(wèn)databdata特殊功能寄存器sfr數(shù)據(jù)緩沖區(qū)(普通RAM區(qū))80H00H1FH20H2FH30H7FH80H0FFH52子系列才有的RAM區(qū)位地址區(qū)工作寄存器區(qū)0FFH0FFHidata片內(nèi)RAM(256B)(三)位變量的定義---C51特有databdata低128字節(jié)RAM區(qū)—128個(gè)高128字節(jié)RAM區(qū)(SFR區(qū))--83個(gè)低128字節(jié)高128字節(jié)

在C51中,允許用戶通過(guò)位類型符定義位變量。位類型符有兩個(gè):bit和sbit??梢远x兩種位變量。(1)bit位類型符用于定義一般的可位處理位變量。格式:bit位變量名;

在格式中可以加上各種修飾,但注意存儲(chǔ)器類型只能是bdata、data、idata。只能是片內(nèi)RAM的可位尋址區(qū),嚴(yán)格來(lái)說(shuō)只能是bdata。例:bit型變量的定義。 bitidataflag1; √ bitdataflag2; √ bitbdataflag3; √ bitpdataflag4; × bitxdataflag5; × bit*p ×

bitstring[5] ×

bitfunc(bita1,bita2)

√可以定義函數(shù)在C51中,允許用戶通過(guò)位類型符定義位變量。例1: voidmain(void) { bitbdataflag1,flag2; flag1=0; flag2=1; while(1); }例2:

bitbdataflag1,flag2;voidmain(void) {

flag1=0; flag2=1; while(1); }低128字節(jié)RAM區(qū)—128個(gè)例1: voidmain(void)例2:bitb在典型的8051單片機(jī)應(yīng)用問(wèn)題中,經(jīng)常需要單獨(dú)訪問(wèn)SFR中的位,C51擴(kuò)充功能使之成為可能,特殊位,象SFR一樣,不與標(biāo)準(zhǔn)C語(yǔ)言兼容,使用保留字“sbit”可訪問(wèn)位尋址對(duì)象。與SFR聲明一樣,用保留字“sbit”聲明某些特殊位接受符號(hào)名,“=”后語(yǔ)句將絕對(duì)值地址賦給變量名,這種地址分配有三種方法:方法1:sbit變量名=sfr_name^int_constant當(dāng)字節(jié)是特殊功能寄存器的地址可用這個(gè)方法。sfr_name必須是已定義的SFR的名字,“^”后的語(yǔ)句定義了基地址上的特殊位的位置,該位置必須是一個(gè)0~7的數(shù)。例1: sfrPSW=0xD0; sbitOV=PSW^2; sbitCY=PSW^7;(2)sbit位類型符在典型的8051單片機(jī)應(yīng)用問(wèn)題中,經(jīng)常需要單獨(dú)方法2:sbit變量名=int_constant^int_constant這種方法以一整常數(shù)作基地址,該值必須在0x80~0xFF之間,并能被8整除,確定位的位置方法同上。 例2:sbitOV=0xD0^2; sbitCV=0xD0^7;

方法3:sbit變量名=int_constant----此方法最常用

這種方法是將位的絕對(duì)地址賦給變量,地址必須位于0x80~0xFF之間。 例3:sbitOV=0xD2; sbitCY=0xD7;特殊功能位代表了一個(gè)獨(dú)立的聲明類,它不能與其它聲明和位域互換。方法2:sbit變量名=int_constant^高128字節(jié)RAM區(qū)(SFR區(qū))--83個(gè)例:sbitP0_0=0x80;sbitP0_0=0X80^0;sfrP0=0X80;

sbitP0_0=P0^0;

voidmain(void){ P0_0=0; P0_0=1; while(1);}方法一方法二方法三高128字節(jié)例:sbitP0_0=0x80;低128字節(jié)RAM區(qū)—128個(gè)unsignedcharbdataflag;sbitflag0=flag^0;voidmain(void){ flag=0x55; flag0=1; while(1);}---------------------------------unsignedintbdataflag;sbitflag0=flag^15;voidmain(void){ flag=0x55; flag0=1; while(1);}

注意:在此區(qū)域不允許使用:sbitflag0=0x20;或sbitflag0=0x24^0;低128字節(jié)RAM區(qū)—128個(gè)unsignedchar三、C51絕對(duì)地址的訪問(wèn)databdatacode外部程序空間60K內(nèi)部4KEA=1外部4KEA=0外部數(shù)據(jù)存儲(chǔ)器64KB0FFFH0000H0000H0FFFFH0FFFH0000H片內(nèi)RAM(256B)片外RAM(64KB)0FFFFH1000H0FFFFH片內(nèi)、外ROM(64KB)特殊功能寄存器sfr數(shù)據(jù)緩沖區(qū)(普通RAM區(qū))80H00H1FH20H2FH30H7FH80H0FFH52子系列才有的RAM區(qū)位地址區(qū)工作寄存器區(qū)0FFH0FFH00FFHidataxdatapdata三、C51絕對(duì)地址的訪問(wèn)databdatacode外部程內(nèi)C51編譯器提供了一組宏定義來(lái)對(duì)51系列單片機(jī)的code、data、pdata和xdata空間進(jìn)行絕對(duì)尋址。規(guī)定只能以無(wú)符號(hào)數(shù)方式訪問(wèn),定義了8個(gè)宏定義,其函數(shù)原型如下:

#defineCBYTE((unsignedcharvolatilecode*)0)#defineDBYTE((unsignedcharvolatiledata*)0)#definePBYTE((unsignedcharvolatilepdata*)0)#defineXBYTE((unsignedcharvolatilexdata*)0)#defineCWORD((unsignedintvolatilecode*)0)#defineDWORD((unsignedintvolatiledata*)0)#definePWORD((unsignedintvolatilepdata*)0)#defineXWORD((unsignedintvolatilexdata*)0)這些函數(shù)原型放在absacc.h文件中。使用時(shí)須用預(yù)處理命令把該頭文件包含到文件中,形式為:#include<absacc.h>。(一)采用C51中的預(yù)定義宏的方式訪問(wèn)C51編譯器提供了一組宏定義來(lái)對(duì)51系列單片機(jī)例1:絕對(duì)地址對(duì)存儲(chǔ)單元的訪問(wèn)#include<absacc.h>//將絕對(duì)地址頭文件包含在文件中typedefunsignedcharuchar;typedefunsignedintuint;voidmain(void){

ucharvar1;//定義變量var1 uintvar2;//定義變量var2

var1=XBYTE[0x0005];

//XBYTE[0x0005]訪問(wèn)片外RAM的0005字節(jié)單元 var2=XWORD[0x0002];//

XWORD[0x0002]實(shí)質(zhì)是訪問(wèn)的是片外RAM的0002字單元

DBYTE[0x30]=0X55; XBYTE[0x0002]=0X66; DWORD[0x40]=0X1234; XWORD[0x0000]=0X1234; while(1);}例1:絕對(duì)地址對(duì)存儲(chǔ)單元的訪問(wèn)(二)通過(guò)指針?lè)绞皆L問(wèn)3個(gè)字節(jié),通用型指針,未指明存儲(chǔ)器空間 unsignedchar*point1; unsignedint*point2;2個(gè)字節(jié),指向16位尋址的存儲(chǔ)器空間 unsign

溫馨提示

  • 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)論