單片機(jī)原理及應(yīng)用-第3章80C51單片機(jī)C語言程序設(shè)計_第1頁
單片機(jī)原理及應(yīng)用-第3章80C51單片機(jī)C語言程序設(shè)計_第2頁
單片機(jī)原理及應(yīng)用-第3章80C51單片機(jī)C語言程序設(shè)計_第3頁
單片機(jī)原理及應(yīng)用-第3章80C51單片機(jī)C語言程序設(shè)計_第4頁
單片機(jī)原理及應(yīng)用-第3章80C51單片機(jī)C語言程序設(shè)計_第5頁
已閱讀5頁,還剩60頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

2023/10/131第3章80C51單片機(jī)C語言程序設(shè)計C51對標(biāo)準(zhǔn)C的擴(kuò)展3.1C51的指針3.2C51的函數(shù)3.3C51與匯編程序的接口3.42023/10/1323.1C51對標(biāo)準(zhǔn)C的擴(kuò)展3.1.1C51的數(shù)據(jù)類型數(shù)據(jù)是計算機(jī)操作的對象,包含常量和變量。C51擴(kuò)展了ANSIC,以適應(yīng)單片機(jī)的結(jié)構(gòu)和特點。

數(shù)據(jù)類型就是數(shù)據(jù)的格式,它決定數(shù)據(jù)的值域范圍、占用存儲單元的個數(shù)及能參與哪種運算。

編寫C51程序,先要確定數(shù)據(jù)類型、儲存分區(qū)應(yīng)盡可能采用無符號格式(unsigned)

C51中,多字節(jié)數(shù)據(jù)采用“大端對齊”格式數(shù)據(jù)起始字節(jié)置于高地址端2023/10/133數(shù)據(jù)類型長度(位)取值范圍字符型signedchar8-128~127unsignedchar80~255整型signedint16-32768~32767unsignedint160~65535長整型signedlong32-21474883648~21474883647unsignedlong320~4294967295浮點型float32±1.75494E-38~±3.402823E+38位型bit10,1sbit10,1訪問SFRsfr80~255sfr16160~65535C51數(shù)據(jù)類型表2023/10/134bit定義位變量名字,編譯器在位尋址區(qū)自動分配該位變量;Sbit聲明位變量的名字和地址,地址是確定的(SFR區(qū)確定位、位尋址區(qū)變量的某確定位)。幾點說明:unsigned

charbdata

ibase;sbit

mybitf=ibase^0;sbitCY=0xD7;bitflag1=0;含義:賦值含義:聲明2023/10/1353.1.2C51數(shù)據(jù)的存儲分區(qū)存儲器類型對應(yīng)單片機(jī)存儲器bdata片內(nèi)RAM位尋址區(qū),共128位。(亦能字節(jié)訪問)data直接尋址,共128字節(jié)。idata間接尋址,共256字節(jié)。pdata片外

RAM分頁間址,共256字節(jié)。(MOVX@Ri)xdata間接尋址,共64k字節(jié)。(MOVX@DPTR)codeROM間接尋址,共64k字節(jié)。(MOVCA,@A+DPTR)經(jīng)常使用的變量應(yīng)該置于片內(nèi)RAM中,要用bdata、data、idata來定義不常使用的變量或規(guī)模較大的變量應(yīng)該置于片外RAM中,要用pdata、xdata來定義bitbdataflags;

//位變量flags定位在片內(nèi)位尋址區(qū)chardatavar;

//字符變量var定位在片內(nèi)RAM區(qū)floatidata

x,y;

//實型變量x,y定位在片內(nèi)間址RAM區(qū)unsignedcharpdataz;

//無符號字符變量z定位在片外分頁間址RAM區(qū)2023/10/137編譯模式默認(rèn)存儲分區(qū)特點SMALLdata小模式。變量默認(rèn)在片內(nèi)RAM??臻g小,速度塊。COMPACTpdata緊湊模式。變量默認(rèn)在片外RAM的頁(256字節(jié),頁號由P2口決定)。LARGExdata大模式。變量默認(rèn)在片外RAM的64KB范圍??臻g大,速度慢。編譯模式默認(rèn)的變量存儲分區(qū)3.1.3C51的編譯模式未對變量存儲分區(qū)定義時,C51編譯器采用默認(rèn)存儲分區(qū)。例如:charvar;

//SMALL模式時,var定位于data存儲區(qū)

//COMPACT模式時,var定位于pdata存儲區(qū)

//LARGE模式時,var定位于xdata存儲區(qū)2023/10/1393.1.4用_at_定義變量絕對地址用關(guān)鍵字“_at_”定義變量存放的首地址

idata

inty_at_0x30;//idata區(qū)域整型變量y的首地址為0x30例如:又如:xdatacharstring[20]_at_0x3000;//xdata中字符型數(shù)組string的首地址為0x3000

注意,C51編程時不要輕易使用絕對地址定位變量。

2023/10/13103.2

C51的指針對于一個變量a,利用&a表示變量a的地址。則語句

p=&a;表明把a的地址賦給了指針變量p,則“p指向了變量a”。

可以用*P表示變量a指針變量的定義

char*p;//定義指針變量P

p=30H;//指針變量賦值,30H為片內(nèi)RAM地址x=*p;//30H單元的內(nèi)容送給變量x*P指針變量數(shù)據(jù)變量3.2.1已定義數(shù)據(jù)存儲分區(qū)的指針定義時就指定了所指向數(shù)據(jù)的存儲分區(qū)。

該指針占1個字節(jié)(idata*,data*,pdata*)或2個字節(jié)(code*,xdata*)

示例:char

data*str;

//指針str指向的char型數(shù)據(jù)存于data空間int

xdata*num;

//指針num指向的int型數(shù)據(jù)存于xdata

空間

基于存儲器的指針長度比通用指針短,可以節(jié)省存儲器空間,運行速度快,但它所指對象具有確定的存儲器空間,兼容性不好。數(shù)據(jù)數(shù)據(jù)分區(qū)2023/10/1312定義時未指定所指向的數(shù)據(jù)的存儲分區(qū)。也稱通用指針。3.2.2未定義數(shù)據(jù)存儲分區(qū)的指針---通用指針通用指針占3個字節(jié)第一字節(jié)存放該指針的默認(rèn)存儲器類型編碼(見表)第二字節(jié)存放該指針的高位地址偏移量第三字節(jié)存放該指針的低位地址偏移量

存儲器類型編碼存儲器類型bdata/data/idataxdatapdatacode編碼0x000x010xfe0xff2023/10/1313通用指針定義示例:char*xdata

strptr;

//指針本身存于xdata

空間,它指向char型數(shù)據(jù)int*datanumber;

//指針本身存于data空間,它指向int型數(shù)據(jù)由于指向?qū)ο蟮拇鎯臻g在編譯時無法確定(運行時確定),因此必須生成通用代碼以保證對任意空間的對象進(jìn)行存取。所以通用指針生成的代碼速度較慢。指針char型數(shù)據(jù)指針分區(qū)2023/10/13143.2.3利用指針進(jìn)行絕對地址訪問unsignedchardata*p;p=0x40;*p=0x55;

//數(shù)據(jù)0x55送入內(nèi)部RAM的0x40單元

例如:

C51編譯器提供了一組宏定義實現(xiàn)對80C51絕對地址的訪問。這組宏定義原型放在absacc.h文件中,形如:

#defineDBYTE((unsignedcharvolatiledata*)0)從而使DBYTE用于以字節(jié)形式對data區(qū)訪問,可以寫成:*(DBYTE)=0x55H;或

DBYTE[0]=0x55H;

與此類似:CBYTE用于以字節(jié)形式對code區(qū)進(jìn)行訪問;PBYTE用于以字節(jié)形式對pdata區(qū)進(jìn)行訪問;XBYTE用于以字節(jié)形式對xdata區(qū)進(jìn)行訪問。CWORD、DWORD、PWORD和XWORD用于以字形式對code區(qū)、data區(qū)、pdata區(qū)和xdata區(qū)進(jìn)行訪問。

3.2.4C51程序編寫示例【例3-1】將30H至3FH共16個RAM單元初始化為“55H”。#include<reg52.h>#include<absacc.h>voidmain(void){ unsignedchari; for(i=0;i<=15;i++) { DBYTE[0x30+i]=0x55; } while(1);}編譯系統(tǒng)自動連接了startup.a51生成代碼一是將內(nèi)部RAM的00H~7FH清0;二是設(shè)置堆棧指針SP。

有全局變量賦值時編譯系統(tǒng)會自動連接init.a51生成代碼C:0x0000020011LJMPC:0011C:0x0003E4CLRAC:0x0004FFMOVR7,AC:0x00057430MOVA,#0x30C:0x00072FADDA,R7C:0x0008F8MOVR0,AC:0x00097655MOV@R0,#0x55C:0x000B0FINCR7C:0x000CBF10F6CJNER7,#0x10,C:0005C:0x000F80FESJMPC:000FC:0x0011787FMOVR0,#0x7FC:0x0013E4CLRAC:0x0014F6MOV@R0,AC:0x0015D8FDDJNZR0,C:0014C:0x0017758107MOVSP,#0x07C:0x001A020003LJMPC:0003反匯編如下:編譯系統(tǒng)自動連接了startup.a51生成代碼一是將內(nèi)部RAM的00H~7FH清0;二是設(shè)置堆棧指針SP。

另:全局變量賦值時編譯系統(tǒng)會自動連接init.a51生成代碼2023/10/13193.3

C51的函數(shù)3.3.1C51函數(shù)的定義一般形式:返回值類型函數(shù)名(形式參數(shù)列表)[編譯模式][reentrant][interrupt

n][usingn]{

函數(shù)體}編譯模式為SMALL、COPACT或LARGEreentrant用于定義可重入函數(shù)interruptn用于定義中斷函數(shù),n為中斷號,可以為0~31usingn確定工作寄存器組,取值為0~3

【例3-2】延時nMs函數(shù)示例(晶振11.0592MHz)。voidDelayMs(unsignedintn)//延時函數(shù){ unsignedcharj; while(n--) { for(j=0;j<113;j++); }}調(diào)試:Registers窗口中的sec值。

3.3.2C51函數(shù)定義的選項編譯模式

SMALL模式:變量默認(rèn)在片內(nèi)RAM;COMPACT模式:變量默認(rèn)在片外RAM的頁內(nèi);LARGE模式:變量默認(rèn)在片外RAM的64KB范圍。reentrant定義為重入函數(shù)

ANSIC中,函數(shù)默認(rèn)都是可重入的

C51函數(shù)默認(rèn)是不可重入的,使用可重入函數(shù)會消耗較多的存儲器資源,應(yīng)該盡量少用。interruptn定義中斷函數(shù)常用的中斷源對應(yīng)的中斷號usingn確定中斷服務(wù)函數(shù)所使用的工作寄存器組中斷源外中斷0定時器0外中斷1定時器1串行口定時器2中斷號012345【例3-3】中斷函數(shù)定義示例#include<reg51.h>sbitP10=P1^0;voidIntSrv(void)interrupt0

{ if(INT0==0) //測開關(guān)狀態(tài)

{ P10=!P10; while(INT0==0); }}3.3.3C51的庫函數(shù)常用的C51庫函數(shù)參見附錄B.2

【例3-4】C51庫函數(shù)調(diào)用示例。#include“intrins.h”//在intrins.h中有對函數(shù)_nop_()的定義voidDelay(void){

inti=5000;

while(i--)_nop_();}【例3-5】C51標(biāo)準(zhǔn)輸入輸出函數(shù)調(diào)用示例。#include<reg51.h>#include<stdio.h>voidInitSPort(void){SCON=0x50;//串口方式1,允許接收TMOD=0x20;//T1方式2(自動重裝)TH1=0xFD;//波特率9600 TR1=1;//啟動T1TI=1;//發(fā)送中斷置1}voidmain(void){

InitSPort();

printf("HelloWorld\n");while(1);}標(biāo)準(zhǔn)I/O的重定向!

在調(diào)試狀態(tài):ViewSerialWindowsUART#13.4

C51與匯編程序的接口3.4.1在C51程序中嵌入?yún)R編指令【例3-6】利用預(yù)編譯指令。#include"reg51.h"voidInit(void);voidmain(){while(1){Init();}}voidInit(void){

#pragma

asm MOVR7,#16 MOVR1,#20H MOVA,#55HLP:MOV@R1,A INCR1 DJNZR7,LP

#pragma

endasm return;}要進(jìn)行以下設(shè)置:2023/10/1327將嵌有匯編語句的源文件加入工程文件,將鼠標(biāo)指向該文件,選擇右鍵菜單“optionfor‘insertasm.c’”。將屬性properties書簽下的“GenerateAssemblerSRCFile”與“AssembleSRCFile”選項置成“√”。再加入庫文件(如C51S.LIB),然后編譯。

3.4.2在C51程序中調(diào)用匯編子程序【例3-7】不含參數(shù)傳遞的子程序調(diào)用。先構(gòu)造匯編語言源文件:d1ms:MOVR6,#249;DL:NOP ;1μsNOP ;1μsDJNZR6,DL;2μs,循環(huán)內(nèi)約1msRET

END

?PR?d1ms?EP4_7BSEGMENTCODE

PUBLICd1ms RSEG?PR?d1ms?EP4_7B注:d1ms對應(yīng)C51的d1ms()EP4_7B對應(yīng)ep4_7b.asm編寫C51語言程序如下,完成匯編子程序調(diào)用:#include<reg51.h>sbitP2_0=P2^0;externvoidd1ms(void);voidmain(){ for(;;) { P2_0=0;

d1ms();/*調(diào)用匯編子程序*/ P2_0=1;

d1ms();/*調(diào)用匯編子程序*/ }}主調(diào)函數(shù)要向被調(diào)函數(shù)傳遞所需的參數(shù)傳遞給被調(diào)函數(shù)的數(shù)據(jù)稱為實參實參向形參的傳遞是單向的參數(shù)傳遞可以采用寄存器、固定存儲器位置方式

參數(shù)傳遞寄存器參數(shù)傳遞傳遞的參數(shù)char、1字節(jié)指針int、2字節(jié)指針long、float通用指針參數(shù)1R7R6、R7R4~R7R1、R2、R3參數(shù)2R5R4、R5R4~R7R1、R2、R3參數(shù)3R3R2、R3R1、R2、R3SMALL模式下,在內(nèi)部RAM中完成COMPACT模式下,在外部RAM中完成LARGER模式下,在外部RAM中完成固定存儲器位置參數(shù)傳遞80C51單片機(jī)不采用堆棧傳遞參數(shù)。但C51提供一種模擬堆棧,從而支持可重入函數(shù)的遞歸調(diào)用。

函數(shù)返回值使用的寄存器返回數(shù)據(jù)的類型寄存器說

明bitC進(jìn)位標(biāo)志位char、unsignedchar、1字節(jié)指針R7int、unsignedint、2字節(jié)指針R6、R7高字節(jié)在R6,低字節(jié)在R7long、unsignedlongR4、R5、R6、R7最高字節(jié)在R4,最低字節(jié)在R7floatR4、R5、R6、R732位IEEE格式通用指針R1、R2、R3存儲類型在R1,高字節(jié)在R2,低字節(jié)在R3ThankYou!2023/10/13343.1C51對標(biāo)準(zhǔn)C的擴(kuò)展3.1.1C51的數(shù)據(jù)類型數(shù)據(jù)是計算機(jī)操作的對象,包含常量和變量。C51擴(kuò)展了ANSIC,以適應(yīng)單片機(jī)的結(jié)構(gòu)和特點。

數(shù)據(jù)類型就是數(shù)據(jù)的格式,它決定數(shù)據(jù)的值域范圍、占用存儲單元的個數(shù)及能參與哪種運算。

編寫C51程序,先要確定數(shù)據(jù)類型、儲存分區(qū)應(yīng)盡可能采用無符號格式(unsigned)

C51中,多字節(jié)數(shù)據(jù)采用“大端對齊”格式數(shù)據(jù)起始字節(jié)置于高地址端2023/10/1335數(shù)據(jù)類型長度(位)取值范圍字符型signedchar8-128~127unsignedchar80~255整型signedint16-32768~32767unsignedint160~65535長整型signedlong32-21474883648~21474883647unsignedlong320~4294967295浮點型float32±1.75494E-38~±3.402823E+38位型bit10,1sbit10,1訪問SFRsfr80~255sfr16160~65535C51數(shù)據(jù)類型表2023/10/1336bit定義位變量名字,編譯器在位尋址區(qū)自動分配該位變量;Sbit聲明位變量的名字和地址,地址是確定的(SFR區(qū)確定位、位尋址區(qū)變量的某確定位)。幾點說明:unsigned

charbdata

ibase;sbit

mybitf=ibase^0;sbitCY=0xD7;bitflag1=0;含義:賦值含義:聲明2023/10/13373.1.2C51數(shù)據(jù)的存儲分區(qū)存儲器類型長度(位)對應(yīng)單片機(jī)存儲器bdata1片內(nèi)RAM位尋址區(qū),共128位。(亦能字節(jié)訪問)data8直接尋址,共128字節(jié)。idata8間接尋址,共256字節(jié)。pdata8片外

RAM分頁間址,共256字節(jié)。(MOVX@Ri)xdata16間接尋址,共64k字節(jié)。(MOVX@DPTR)code16ROM間接尋址,共64k字節(jié)。(MOVCA,@A+DPTR)經(jīng)常使用的變量應(yīng)該置于片內(nèi)RAM中,要用bdata、data、idata來定義不常使用的變量或規(guī)模較大的變量應(yīng)該置于片外RAM中,要用pdata、xdata來定義bitbdataflags;

//位變量flags定位在片內(nèi)位尋址區(qū)chardatavar;

//字符變量var定位在片內(nèi)RAM區(qū)floatidata

x,y;

//實型變量x,y定位在片內(nèi)間址RAM區(qū)unsignedcharpdataz;

//無符號字符變量z定位在片外分頁間址RAM區(qū)2023/10/1339編譯模式默認(rèn)存儲分區(qū)特點SMALLdata小模式。變量默認(rèn)在片內(nèi)RAM??臻g小,速度塊。COMPACTpdata緊湊模式。變量默認(rèn)在片外RAM的頁(256字節(jié),頁號由P2口決定)。LARGExdata大模式。變量默認(rèn)在片外RAM的64KB范圍??臻g大,速度慢。編譯模式默認(rèn)的變量存儲分區(qū)3.1.3C51的編譯模式未對變量存儲分區(qū)定義時,C51編譯器采用默認(rèn)存儲分區(qū)。例如:charvar;

//SMALL模式時,var定位于data存儲區(qū)

//COMPACT模式時,var定位于pdata存儲區(qū)

//LARGE模式時,var定位于xdata存儲區(qū)2023/10/13413.1.4用_at_定義變量絕對地址用關(guān)鍵字“_at_”定義變量存放的首地址

idata

inty_at_0x30;//idata區(qū)域整型變量y的首地址為0x30例如:又如:xdatacharstring[20]_at_0x3000;//xdata中字符型數(shù)組string的首地址為0x3000

注意,C51編程時不要輕易使用絕對地址定位變量。

2023/10/13423.2

C51的指針對于一個變量a,利用&a表示變量a的地址。則語句

p=&a;表明把a的地址賦給了指針變量p,則“p指向了變量a”。

可以用*P表示變量a指針變量的定義

char*p;//定義指針變量P

p=30H;//指針變量賦值,30H為片內(nèi)RAM地址x=*p;//30H單元的內(nèi)容送給變量x*P指針變量數(shù)據(jù)變量3.2.1已定義數(shù)據(jù)存儲分區(qū)的指針定義時就指定了所指向數(shù)據(jù)的存儲分區(qū)。

該指針占1個字節(jié)(idata*,data*,pdata*)或2個字節(jié)(code*,xdata*)

示例:char

data*str;

//指針str指向的char型數(shù)據(jù)存于data空間int

xdata*num;

//指針num指向的int型數(shù)據(jù)存于xdata

空間

基于存儲器的指針長度比通用指針短,可以節(jié)省存儲器空間,運行速度快,但它所指對象具有確定的存儲器空間,兼容性不好。數(shù)據(jù)數(shù)據(jù)分區(qū)2023/10/1344定義時未指定所指向的數(shù)據(jù)的存儲分區(qū)。也稱通用指針。3.2.2未定義數(shù)據(jù)存儲分區(qū)的指針---通用指針通用指針占3個字節(jié)第一字節(jié)存放該指針的默認(rèn)存儲器類型編碼(見表)第二字節(jié)存放該指針的高位地址偏移量第三字節(jié)存放該指針的低位地址偏移量

存儲器類型編碼存儲器類型bdata/data/idataxdatapdatacode編碼0x000x010xfe0xff2023/10/1345通用指針定義示例:char*xdata

strptr;

//指針本身存于xdata

空間,它指向char型數(shù)據(jù)int*datanumber;

//指針本身存于data空間,它指向int型數(shù)據(jù)由于指向?qū)ο蟮拇鎯臻g在編譯時無法確定(運行時確定),因此必須生成通用代碼以保證對任意空間的對象進(jìn)行存取。所以通用指針生成的代碼速度較慢。指針char型數(shù)據(jù)指針分區(qū)2023/10/13463.2.3利用指針進(jìn)行絕對地址訪問unsignedchardata*p;p=0x40;*p=0x55;

//數(shù)據(jù)0x55送入內(nèi)部RAM的0x40單元

例如:

C51編譯器提供了一組宏定義實現(xiàn)對80C51絕對地址的訪問。這組宏定義原型放在absacc.h文件中,形如:

#defineDBYTE((unsignedcharvolatiledata*)0)從而使DBYTE用于以字節(jié)形式對data區(qū)訪問,可以寫成:*(DBYTE)=0x55H;或

DBYTE[0]=0x55H;

與此類似:CBYTE用于以字節(jié)形式對code區(qū)進(jìn)行訪問;PBYTE用于以字節(jié)形式對pdata區(qū)進(jìn)行訪問;XBYTE用于以字節(jié)形式對xdata區(qū)進(jìn)行訪問。CWORD、DWORD、PWORD和XWORD用于以字形式對code區(qū)、data區(qū)、pdata區(qū)和xdata區(qū)進(jìn)行訪問。

3.2.4C51程序編寫示例【例3-1】將30H至3FH共16個RAM單元初始化為“55H”。#include<reg52.h>#include<absacc.h>voidmain(void){ unsignedchari; for(i=0;i<=15;i++) { DBYTE[0x30+i]=0x55; } while(1);}編譯系統(tǒng)自動連接了startup.a51生成代碼一是將內(nèi)部RAM的00H~7FH清0;二是設(shè)置堆棧指針SP。

有全局變量賦值時編譯系統(tǒng)會自動連接init.a51生成代碼C:0x0000020011LJMPC:0011C:0x0003E4CLRAC:0x0004FFMOVR7,AC:0x00057430MOVA,#0x30C:0x00072FADDA,R7C:0x0008F8MOVR0,AC:0x00097655MOV@R0,#0x55C:0x000B0FINCR7C:0x000CBF10F6CJNER7,#0x10,C:0005C:0x000F80FESJMPC:000FC:0x0011787FMOVR0,#0x7FC:0x0013E4CLRAC:0x0014F6MOV@R0,AC:0x0015D8FDDJNZR0,C:0014C:0x0017758107MOVSP,#0x07C:0x001A020003LJMPC:0003反匯編如下:編譯系統(tǒng)自動連接了startup.a51生成代碼一是將內(nèi)部RAM的00H~7FH清0;二是設(shè)置堆棧指針SP。

另:全局變量賦值時編譯系統(tǒng)會自動連接init.a51生成代碼2023/10/13513.3

C51的函數(shù)3.3.1C51函數(shù)的定義一般形式:返回值類型函數(shù)名(形式參數(shù)列表)[編譯模式][reentrant][interrupt

n][usingn]{

函數(shù)體}編譯模式為SMALL、COPACT或LARGEreentrant用于定義可重入函數(shù)interruptn用于定義中斷函數(shù),n為中斷號,可以為0~31usingn確定工作寄存器組,取值為0~3

【例3-2】延時nMs函數(shù)示例(晶振11.0592MHz)。voidDelayMs(unsignedintn)//延時函數(shù){ unsignedcharj; while(n--) { for(j=0;j<113;j++); }}調(diào)試:Registers窗口中的sec值。

3.3.2C51函數(shù)定義的選項編譯模式

SMALL模式:變量默認(rèn)在片內(nèi)RAM;COMPACT模式:變量默認(rèn)在片外RAM的頁內(nèi);LARGE模式:變量默認(rèn)在片外RAM的64KB范圍。reentrant定義為重入函數(shù)

ANSIC中,函數(shù)默認(rèn)都是可重入的

C51函數(shù)默認(rèn)是不可重入的,使用可重入函數(shù)會消耗較多的存儲器資源,應(yīng)該盡量少用。interruptn定義中斷函數(shù)常用的中斷源對應(yīng)的中斷號usingn確定中斷服務(wù)函數(shù)所使用的工作寄存器組中斷源外中斷0定時器0外中斷1定時器1串行口定時器2中斷號012345【例3-3】中斷函數(shù)定義示例#include<reg51.h>sbitP10=P1^0;voidIntSrv(void)interrupt0

{ if(INT0==0) //測開關(guān)狀態(tài)

{ P10=!P10; while(INT0==0); }}3.3.3C51的庫函數(shù)常用的C51庫函數(shù)參見附錄B.2

【例3-4】C51庫函數(shù)調(diào)用示例。#include“intrins.h”//在intrins.h中有對函數(shù)_nop_()的定義voidDelay(void){

inti=5000;

while(i--)_nop_();}【例3-5】C51標(biāo)準(zhǔn)輸入輸出函數(shù)調(diào)用示例。#include<reg51.h>#include<stdio.h>voidInitSPort(void){SCON=0x50;//串口方式1,允許接收TMOD=0x20;//T1方式2(自動重裝)TH1=0xFD;//波特率9600 TR1=1;//啟動T1TI=1;//發(fā)送中斷置1}voidmain(void){

InitSPort();

printf("HelloWorld\n");while(1);}標(biāo)準(zhǔn)I/O的重定向!

在調(diào)試狀態(tài):ViewSerialWindowsUART#13.4

C51與匯編程序的接口3.4.1在C51程序中嵌入?yún)R編指令【例3-6】利用預(yù)編譯指令。#include"reg51.h"voidInit(void);voidmain(){while(1)

溫馨提示

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

最新文檔

評論

0/150

提交評論