




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2023/10/131第3章80C51單片機(jī)C語(yǔ)言程序設(shè)計(jì)C51對(duì)標(biāo)準(zhǔn)C的擴(kuò)展3.1C51的指針3.2C51的函數(shù)3.3C51與匯編程序的接口3.42023/10/1323.1C51對(duì)標(biāo)準(zhǔn)C的擴(kuò)展3.1.1C51的數(shù)據(jù)類型數(shù)據(jù)是計(jì)算機(jī)操作的對(duì)象,包含常量和變量。C51擴(kuò)展了ANSIC,以適應(yīng)單片機(jī)的結(jié)構(gòu)和特點(diǎn)。
數(shù)據(jù)類型就是數(shù)據(jù)的格式,它決定數(shù)據(jù)的值域范圍、占用存儲(chǔ)單元的個(gè)數(shù)及能參與哪種運(yùn)算。
編寫C51程序,先要確定數(shù)據(jù)類型、儲(chǔ)存分區(qū)應(yīng)盡可能采用無(wú)符號(hào)格式(unsigned)
C51中,多字節(jié)數(shù)據(jù)采用“大端對(duì)齊”格式數(shù)據(jù)起始字節(jié)置于高地址端2023/10/133數(shù)據(jù)類型長(zhǎng)度(位)取值范圍字符型signedchar8-128~127unsignedchar80~255整型signedint16-32768~32767unsignedint160~65535長(zhǎng)整型signedlong32-21474883648~21474883647unsignedlong320~4294967295浮點(diǎn)型float32±1.75494E-38~±3.402823E+38位型bit10,1sbit10,1訪問(wèn)SFRsfr80~255sfr16160~65535C51數(shù)據(jù)類型表2023/10/134bit定義位變量名字,編譯器在位尋址區(qū)自動(dòng)分配該位變量;Sbit聲明位變量的名字和地址,地址是確定的(SFR區(qū)確定位、位尋址區(qū)變量的某確定位)。幾點(diǎn)說(shuō)明:unsigned
charbdata
ibase;sbit
mybitf=ibase^0;sbitCY=0xD7;bitflag1=0;含義:賦值含義:聲明2023/10/1353.1.2C51數(shù)據(jù)的存儲(chǔ)分區(qū)存儲(chǔ)器類型對(duì)應(yīng)單片機(jī)存儲(chǔ)器bdata片內(nèi)RAM位尋址區(qū),共128位。(亦能字節(jié)訪問(wèn))data直接尋址,共128字節(jié)。idata間接尋址,共256字節(jié)。pdata片外
RAM分頁(yè)間址,共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來(lái)定義不常使用的變量或規(guī)模較大的變量應(yīng)該置于片外RAM中,要用pdata、xdata來(lái)定義bitbdataflags;
//位變量flags定位在片內(nèi)位尋址區(qū)chardatavar;
//字符變量var定位在片內(nèi)RAM區(qū)floatidata
x,y;
//實(shí)型變量x,y定位在片內(nèi)間址RAM區(qū)unsignedcharpdataz;
//無(wú)符號(hào)字符變量z定位在片外分頁(yè)間址RAM區(qū)2023/10/137編譯模式默認(rèn)存儲(chǔ)分區(qū)特點(diǎn)SMALLdata小模式。變量默認(rèn)在片內(nèi)RAM。空間小,速度塊。COMPACTpdata緊湊模式。變量默認(rèn)在片外RAM的頁(yè)(256字節(jié),頁(yè)號(hào)由P2口決定)。LARGExdata大模式。變量默認(rèn)在片外RAM的64KB范圍。空間大,速度慢。編譯模式默認(rèn)的變量存儲(chǔ)分區(qū)3.1.3C51的編譯模式未對(duì)變量存儲(chǔ)分區(qū)定義時(shí),C51編譯器采用默認(rèn)存儲(chǔ)分區(qū)。例如:charvar;
//SMALL模式時(shí),var定位于data存儲(chǔ)區(qū)
//COMPACT模式時(shí),var定位于pdata存儲(chǔ)區(qū)
//LARGE模式時(shí),var定位于xdata存儲(chǔ)區(qū)2023/10/1393.1.4用_at_定義變量絕對(duì)地址用關(guān)鍵字“_at_”定義變量存放的首地址
idata
inty_at_0x30;//idata區(qū)域整型變量y的首地址為0x30例如:又如:xdatacharstring[20]_at_0x3000;//xdata中字符型數(shù)組string的首地址為0x3000
注意,C51編程時(shí)不要輕易使用絕對(duì)地址定位變量。
2023/10/13103.2
C51的指針對(duì)于一個(gè)變量a,利用&a表示變量a的地址。則語(yǔ)句
p=&a;表明把a(bǔ)的地址賦給了指針變量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ù)存儲(chǔ)分區(qū)的指針定義時(shí)就指定了所指向數(shù)據(jù)的存儲(chǔ)分區(qū)。
該指針占1個(gè)字節(jié)(idata*,data*,pdata*)或2個(gè)字節(jié)(code*,xdata*)
示例:char
data*str;
//指針str指向的char型數(shù)據(jù)存于data空間int
xdata*num;
//指針num指向的int型數(shù)據(jù)存于xdata
空間
基于存儲(chǔ)器的指針長(zhǎng)度比通用指針短,可以節(jié)省存儲(chǔ)器空間,運(yùn)行速度快,但它所指對(duì)象具有確定的存儲(chǔ)器空間,兼容性不好。數(shù)據(jù)數(shù)據(jù)分區(qū)2023/10/1312定義時(shí)未指定所指向的數(shù)據(jù)的存儲(chǔ)分區(qū)。也稱通用指針。3.2.2未定義數(shù)據(jù)存儲(chǔ)分區(qū)的指針---通用指針通用指針占3個(gè)字節(jié)第一字節(jié)存放該指針的默認(rèn)存儲(chǔ)器類型編碼(見(jiàn)表)第二字節(jié)存放該指針的高位地址偏移量第三字節(jié)存放該指針的低位地址偏移量
存儲(chǔ)器類型編碼存儲(chǔ)器類型bdata/data/idataxdatapdatacode編碼0x000x010xfe0xff2023/10/1313通用指針定義示例:char*xdata
strptr;
//指針本身存于xdata
空間,它指向char型數(shù)據(jù)int*datanumber;
//指針本身存于data空間,它指向int型數(shù)據(jù)由于指向?qū)ο蟮拇鎯?chǔ)空間在編譯時(shí)無(wú)法確定(運(yùn)行時(shí)確定),因此必須生成通用代碼以保證對(duì)任意空間的對(duì)象進(jìn)行存取。所以通用指針生成的代碼速度較慢。指針char型數(shù)據(jù)指針?lè)謪^(qū)2023/10/13143.2.3利用指針進(jìn)行絕對(duì)地址訪問(wèn)unsignedchardata*p;p=0x40;*p=0x55;
//數(shù)據(jù)0x55送入內(nèi)部RAM的0x40單元
例如:
C51編譯器提供了一組宏定義實(shí)現(xiàn)對(duì)80C51絕對(duì)地址的訪問(wèn)。這組宏定義原型放在absacc.h文件中,形如:
#defineDBYTE((unsignedcharvolatiledata*)0)從而使DBYTE用于以字節(jié)形式對(duì)data區(qū)訪問(wèn),可以寫成:*(DBYTE)=0x55H;或
DBYTE[0]=0x55H;
與此類似:CBYTE用于以字節(jié)形式對(duì)code區(qū)進(jìn)行訪問(wèn);PBYTE用于以字節(jié)形式對(duì)pdata區(qū)進(jìn)行訪問(wèn);XBYTE用于以字節(jié)形式對(duì)xdata區(qū)進(jìn)行訪問(wèn)。CWORD、DWORD、PWORD和XWORD用于以字形式對(duì)code區(qū)、data區(qū)、pdata區(qū)和xdata區(qū)進(jìn)行訪問(wèn)。
3.2.4C51程序編寫示例【例3-1】將30H至3FH共16個(gè)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)自動(dòng)連接了startup.a51生成代碼一是將內(nèi)部RAM的00H~7FH清0;二是設(shè)置堆棧指針SP。
有全局變量賦值時(shí)編譯系統(tǒng)會(huì)自動(dò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)自動(dòng)連接了startup.a51生成代碼一是將內(nèi)部RAM的00H~7FH清0;二是設(shè)置堆棧指針SP。
另:全局變量賦值時(shí)編譯系統(tǒng)會(huì)自動(dò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為中斷號(hào),可以為0~31usingn確定工作寄存器組,取值為0~3
【例3-2】延時(shí)nMs函數(shù)示例(晶振11.0592MHz)。voidDelayMs(unsignedintn)//延時(shí)函數(shù){ unsignedcharj; while(n--) { for(j=0;j<113;j++); }}調(diào)試:Registers窗口中的sec值。
3.3.2C51函數(shù)定義的選項(xiàng)編譯模式
SMALL模式:變量默認(rèn)在片內(nèi)RAM;COMPACT模式:變量默認(rèn)在片外RAM的頁(yè)內(nèi);LARGE模式:變量默認(rèn)在片外RAM的64KB范圍。reentrant定義為重入函數(shù)
ANSIC中,函數(shù)默認(rèn)都是可重入的
C51函數(shù)默認(rèn)是不可重入的,使用可重入函數(shù)會(huì)消耗較多的存儲(chǔ)器資源,應(yīng)該盡量少用。interruptn定義中斷函數(shù)常用的中斷源對(duì)應(yīng)的中斷號(hào)usingn確定中斷服務(wù)函數(shù)所使用的工作寄存器組中斷源外中斷0定時(shí)器0外中斷1定時(shí)器1串行口定時(shí)器2中斷號(hào)012345【例3-3】中斷函數(shù)定義示例#include<reg51.h>sbitP10=P1^0;voidIntSrv(void)interrupt0
{ if(INT0==0) //測(cè)開(kāi)關(guān)狀態(tài)
{ P10=!P10; while(INT0==0); }}3.3.3C51的庫(kù)函數(shù)常用的C51庫(kù)函數(shù)參見(jiàn)附錄B.2
【例3-4】C51庫(kù)函數(shù)調(diào)用示例。#include“intrins.h”//在intrins.h中有對(duì)函數(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(自動(dòng)重裝)TH1=0xFD;//波特率9600 TR1=1;//啟動(dòng)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將嵌有匯編語(yǔ)句的源文件加入工程文件,將鼠標(biāo)指向該文件,選擇右鍵菜單“optionfor‘insertasm.c’”。將屬性properties書簽下的“GenerateAssemblerSRCFile”與“AssembleSRCFile”選項(xiàng)置成“√”。再加入庫(kù)文件(如C51S.LIB),然后編譯。
3.4.2在C51程序中調(diào)用匯編子程序【例3-7】不含參數(shù)傳遞的子程序調(diào)用。先構(gòu)造匯編語(yǔ)言源文件: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對(duì)應(yīng)C51的d1ms()EP4_7B對(duì)應(yīng)ep4_7b.asm編寫C51語(yǔ)言程序如下,完成匯編子程序調(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ù)傳遞可以采用寄存器、固定存儲(chǔ)器位置方式
參數(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中完成固定存儲(chǔ)器位置參數(shù)傳遞80C51單片機(jī)不采用堆棧傳遞參數(shù)。但C51提供一種模擬堆棧,從而支持可重入函數(shù)的遞歸調(diào)用。
函數(shù)返回值使用的寄存器返回?cái)?shù)據(jù)的類型寄存器說(shuō)
明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存儲(chǔ)類型在R1,高字節(jié)在R2,低字節(jié)在R3ThankYou!2023/10/13343.1C51對(duì)標(biāo)準(zhǔn)C的擴(kuò)展3.1.1C51的數(shù)據(jù)類型數(shù)據(jù)是計(jì)算機(jī)操作的對(duì)象,包含常量和變量。C51擴(kuò)展了ANSIC,以適應(yīng)單片機(jī)的結(jié)構(gòu)和特點(diǎn)。
數(shù)據(jù)類型就是數(shù)據(jù)的格式,它決定數(shù)據(jù)的值域范圍、占用存儲(chǔ)單元的個(gè)數(shù)及能參與哪種運(yùn)算。
編寫C51程序,先要確定數(shù)據(jù)類型、儲(chǔ)存分區(qū)應(yīng)盡可能采用無(wú)符號(hào)格式(unsigned)
C51中,多字節(jié)數(shù)據(jù)采用“大端對(duì)齊”格式數(shù)據(jù)起始字節(jié)置于高地址端2023/10/1335數(shù)據(jù)類型長(zhǎng)度(位)取值范圍字符型signedchar8-128~127unsignedchar80~255整型signedint16-32768~32767unsignedint160~65535長(zhǎng)整型signedlong32-21474883648~21474883647unsignedlong320~4294967295浮點(diǎn)型float32±1.75494E-38~±3.402823E+38位型bit10,1sbit10,1訪問(wèn)SFRsfr80~255sfr16160~65535C51數(shù)據(jù)類型表2023/10/1336bit定義位變量名字,編譯器在位尋址區(qū)自動(dòng)分配該位變量;Sbit聲明位變量的名字和地址,地址是確定的(SFR區(qū)確定位、位尋址區(qū)變量的某確定位)。幾點(diǎn)說(shuō)明:unsigned
charbdata
ibase;sbit
mybitf=ibase^0;sbitCY=0xD7;bitflag1=0;含義:賦值含義:聲明2023/10/13373.1.2C51數(shù)據(jù)的存儲(chǔ)分區(qū)存儲(chǔ)器類型長(zhǎng)度(位)對(duì)應(yīng)單片機(jī)存儲(chǔ)器bdata1片內(nèi)RAM位尋址區(qū),共128位。(亦能字節(jié)訪問(wèn))data8直接尋址,共128字節(jié)。idata8間接尋址,共256字節(jié)。pdata8片外
RAM分頁(yè)間址,共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來(lái)定義不常使用的變量或規(guī)模較大的變量應(yīng)該置于片外RAM中,要用pdata、xdata來(lái)定義bitbdataflags;
//位變量flags定位在片內(nèi)位尋址區(qū)chardatavar;
//字符變量var定位在片內(nèi)RAM區(qū)floatidata
x,y;
//實(shí)型變量x,y定位在片內(nèi)間址RAM區(qū)unsignedcharpdataz;
//無(wú)符號(hào)字符變量z定位在片外分頁(yè)間址RAM區(qū)2023/10/1339編譯模式默認(rèn)存儲(chǔ)分區(qū)特點(diǎn)SMALLdata小模式。變量默認(rèn)在片內(nèi)RAM??臻g小,速度塊。COMPACTpdata緊湊模式。變量默認(rèn)在片外RAM的頁(yè)(256字節(jié),頁(yè)號(hào)由P2口決定)。LARGExdata大模式。變量默認(rèn)在片外RAM的64KB范圍??臻g大,速度慢。編譯模式默認(rèn)的變量存儲(chǔ)分區(qū)3.1.3C51的編譯模式未對(duì)變量存儲(chǔ)分區(qū)定義時(shí),C51編譯器采用默認(rèn)存儲(chǔ)分區(qū)。例如:charvar;
//SMALL模式時(shí),var定位于data存儲(chǔ)區(qū)
//COMPACT模式時(shí),var定位于pdata存儲(chǔ)區(qū)
//LARGE模式時(shí),var定位于xdata存儲(chǔ)區(qū)2023/10/13413.1.4用_at_定義變量絕對(duì)地址用關(guān)鍵字“_at_”定義變量存放的首地址
idata
inty_at_0x30;//idata區(qū)域整型變量y的首地址為0x30例如:又如:xdatacharstring[20]_at_0x3000;//xdata中字符型數(shù)組string的首地址為0x3000
注意,C51編程時(shí)不要輕易使用絕對(duì)地址定位變量。
2023/10/13423.2
C51的指針對(duì)于一個(gè)變量a,利用&a表示變量a的地址。則語(yǔ)句
p=&a;表明把a(bǔ)的地址賦給了指針變量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ù)存儲(chǔ)分區(qū)的指針定義時(shí)就指定了所指向數(shù)據(jù)的存儲(chǔ)分區(qū)。
該指針占1個(gè)字節(jié)(idata*,data*,pdata*)或2個(gè)字節(jié)(code*,xdata*)
示例:char
data*str;
//指針str指向的char型數(shù)據(jù)存于data空間int
xdata*num;
//指針num指向的int型數(shù)據(jù)存于xdata
空間
基于存儲(chǔ)器的指針長(zhǎng)度比通用指針短,可以節(jié)省存儲(chǔ)器空間,運(yùn)行速度快,但它所指對(duì)象具有確定的存儲(chǔ)器空間,兼容性不好。數(shù)據(jù)數(shù)據(jù)分區(qū)2023/10/1344定義時(shí)未指定所指向的數(shù)據(jù)的存儲(chǔ)分區(qū)。也稱通用指針。3.2.2未定義數(shù)據(jù)存儲(chǔ)分區(qū)的指針---通用指針通用指針占3個(gè)字節(jié)第一字節(jié)存放該指針的默認(rèn)存儲(chǔ)器類型編碼(見(jiàn)表)第二字節(jié)存放該指針的高位地址偏移量第三字節(jié)存放該指針的低位地址偏移量
存儲(chǔ)器類型編碼存儲(chǔ)器類型bdata/data/idataxdatapdatacode編碼0x000x010xfe0xff2023/10/1345通用指針定義示例:char*xdata
strptr;
//指針本身存于xdata
空間,它指向char型數(shù)據(jù)int*datanumber;
//指針本身存于data空間,它指向int型數(shù)據(jù)由于指向?qū)ο蟮拇鎯?chǔ)空間在編譯時(shí)無(wú)法確定(運(yùn)行時(shí)確定),因此必須生成通用代碼以保證對(duì)任意空間的對(duì)象進(jìn)行存取。所以通用指針生成的代碼速度較慢。指針char型數(shù)據(jù)指針?lè)謪^(qū)2023/10/13463.2.3利用指針進(jìn)行絕對(duì)地址訪問(wèn)unsignedchardata*p;p=0x40;*p=0x55;
//數(shù)據(jù)0x55送入內(nèi)部RAM的0x40單元
例如:
C51編譯器提供了一組宏定義實(shí)現(xiàn)對(duì)80C51絕對(duì)地址的訪問(wèn)。這組宏定義原型放在absacc.h文件中,形如:
#defineDBYTE((unsignedcharvolatiledata*)0)從而使DBYTE用于以字節(jié)形式對(duì)data區(qū)訪問(wèn),可以寫成:*(DBYTE)=0x55H;或
DBYTE[0]=0x55H;
與此類似:CBYTE用于以字節(jié)形式對(duì)code區(qū)進(jìn)行訪問(wèn);PBYTE用于以字節(jié)形式對(duì)pdata區(qū)進(jìn)行訪問(wèn);XBYTE用于以字節(jié)形式對(duì)xdata區(qū)進(jìn)行訪問(wèn)。CWORD、DWORD、PWORD和XWORD用于以字形式對(duì)code區(qū)、data區(qū)、pdata區(qū)和xdata區(qū)進(jìn)行訪問(wèn)。
3.2.4C51程序編寫示例【例3-1】將30H至3FH共16個(gè)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)自動(dòng)連接了startup.a51生成代碼一是將內(nèi)部RAM的00H~7FH清0;二是設(shè)置堆棧指針SP。
有全局變量賦值時(shí)編譯系統(tǒng)會(huì)自動(dò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)自動(dòng)連接了startup.a51生成代碼一是將內(nèi)部RAM的00H~7FH清0;二是設(shè)置堆棧指針SP。
另:全局變量賦值時(shí)編譯系統(tǒng)會(huì)自動(dò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為中斷號(hào),可以為0~31usingn確定工作寄存器組,取值為0~3
【例3-2】延時(shí)nMs函數(shù)示例(晶振11.0592MHz)。voidDelayMs(unsignedintn)//延時(shí)函數(shù){ unsignedcharj; while(n--) { for(j=0;j<113;j++); }}調(diào)試:Registers窗口中的sec值。
3.3.2C51函數(shù)定義的選項(xiàng)編譯模式
SMALL模式:變量默認(rèn)在片內(nèi)RAM;COMPACT模式:變量默認(rèn)在片外RAM的頁(yè)內(nèi);LARGE模式:變量默認(rèn)在片外RAM的64KB范圍。reentrant定義為重入函數(shù)
ANSIC中,函數(shù)默認(rèn)都是可重入的
C51函數(shù)默認(rèn)是不可重入的,使用可重入函數(shù)會(huì)消耗較多的存儲(chǔ)器資源,應(yīng)該盡量少用。interruptn定義中斷函數(shù)常用的中斷源對(duì)應(yīng)的中斷號(hào)usingn確定中斷服務(wù)函數(shù)所使用的工作寄存器組中斷源外中斷0定時(shí)器0外中斷1定時(shí)器1串行口定時(shí)器2中斷號(hào)012345【例3-3】中斷函數(shù)定義示例#include<reg51.h>sbitP10=P1^0;voidIntSrv(void)interrupt0
{ if(INT0==0) //測(cè)開(kāi)關(guān)狀態(tài)
{ P10=!P10; while(INT0==0); }}3.3.3C51的庫(kù)函數(shù)常用的C51庫(kù)函數(shù)參見(jiàn)附錄B.2
【例3-4】C51庫(kù)函數(shù)調(diào)用示例。#include“intrins.h”//在intrins.h中有對(duì)函數(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(自動(dòng)重裝)TH1=0xFD;//波特率9600 TR1=1;//啟動(dòng)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. 本站所有資源如無(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 普惠托育網(wǎng)絡(luò)家長(zhǎng)參與與社會(huì)支持體系的建設(shè)策略
- 分手條約合同范本
- 南充商場(chǎng)保安合同范本
- 商標(biāo)專利合同范本英文
- 勞務(wù)綠化合同范本
- 區(qū)間費(fèi)合同范本
- 員工協(xié)議安全合同范本
- 農(nóng)村交易民房合同范例
- j勞務(wù)合同范本
- 代銷白酒合同范本
- 開(kāi)封市第一屆職業(yè)技能大賽美容項(xiàng)目技術(shù)文件(世賽項(xiàng)目)
- 《全科醫(yī)學(xué)概論》課件-以家庭為單位的健康照顧
- 醫(yī)院窗簾、隔簾采購(gòu) 投標(biāo)方案(技術(shù)方案)
- 控制計(jì)劃課件教材-2024年
- 自來(lái)水廠安全施工組織設(shè)計(jì)
- 川教版2024-2025學(xué)年六年級(jí)下冊(cè)信息技術(shù)全冊(cè)教案
- 《無(wú)人機(jī)測(cè)繪技術(shù)》項(xiàng)目1任務(wù)3無(wú)人機(jī)測(cè)繪基礎(chǔ)知識(shí)
- 招標(biāo)代理機(jī)構(gòu)遴選投標(biāo)方案(技術(shù)標(biāo))
- 彩鋼瓦雨棚施工技術(shù)標(biāo)準(zhǔn)方案
- 2024年新疆(兵團(tuán))公務(wù)員考試《行測(cè)》真題及答案解析
- KTV商務(wù)禮儀培訓(xùn)
評(píng)論
0/150
提交評(píng)論