日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]一是源程序中直接混合嵌入,二是做成庫函數(shù)調(diào)用,三是做成是中間文件在鏈接中加入?! ≡趩纹瑱C(jī)應(yīng)用系統(tǒng)設(shè)計(jì)中,過去主要采用匯編語言開發(fā)程序。匯編語言編寫的程序?qū)纹瑱C(jī)硬件操作很方便,編寫的程序代碼短,效率

一是源程序中直接混合嵌入,二是做成庫函數(shù)調(diào)用,三是做成是中間文件在鏈接中加入。

  在單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)中,過去主要采用匯編語言開發(fā)程序。匯編語言編寫的程序?qū)纹瑱C(jī)硬件操作很方便,編寫的程序代碼短,效率高,但系統(tǒng)設(shè)計(jì)的周期長,可讀性和可移植性都很差。C語言程序開發(fā)是近年來單片機(jī)系統(tǒng)開發(fā)應(yīng)用所采用的主要開發(fā)方式之一,C 語言功能豐富、表達(dá)能力強(qiáng)、使用靈活方便、開發(fā)周期短、可讀性強(qiáng)、可移植性好。但是,采用C 語言編程還是存在著如對硬件沒有匯編方便、效率沒有匯編高、編寫延時程序精確度不高等缺點(diǎn),因而現(xiàn)在單片機(jī)系統(tǒng)開發(fā)中經(jīng)常用到C 語言與匯編語言混合編程技術(shù)?;旌暇幊碳夹g(shù)可以把C 語言和匯編語言的優(yōu)點(diǎn)結(jié)合起來,編寫出性能優(yōu)良的程序。單片機(jī)混合編程技術(shù)通常是,程序的框架或主體部分用C 語言編寫,對那些使用頻率高、要求執(zhí)行效率高、延時精確的部分用匯編語言編寫,這樣既保證了整個程序的可讀性,又保證了單片機(jī)應(yīng)用系統(tǒng)的性能。

1、混合編程的基本方式
  C 語言與匯編語言混合編程通常有兩種基本方法:在C 語言中嵌入?yún)R編程序和在C 語言中調(diào)用匯編程序。
1.1 在C51 中嵌入?yún)R編程序
  在C51 中嵌入?yún)R編程序主要用于實(shí)現(xiàn)延時或中斷處理,以便生成精練的代碼,減少運(yùn)行時間。嵌入式匯編通常用在當(dāng)匯編函數(shù)不大,且內(nèi)部沒有復(fù)雜的跳轉(zhuǎn)的時候。在單片機(jī)C 語言程序中嵌入?yún)R編程序是通過C51 中的預(yù)處理指令# pragmaasm/endasm 語句實(shí)現(xiàn),格式如下:

#pragmaASM
;匯編程序代碼
#pragmaENDASM

  通過# pragma asm 和# pragma endasm 告訴C51 編譯器它們之間的語句行不用編譯成匯編程序代碼。

1.2  在C51 中調(diào)用匯編程序
  在C51 中調(diào)用匯編程序的方法應(yīng)用較多,C 模塊與匯編模塊的接口較簡單,分別用C51 與A51 對源程序進(jìn)行編譯,然后用L51 將obj 文件連接即可,關(guān)鍵問題在于C 函數(shù)與匯編函數(shù)之間的參數(shù)傳遞和得到正確返回值,以保證模塊間的數(shù)據(jù)交換。
2、C51 與匯編程序的參數(shù)傳遞
  在C51 中嵌入?yún)R編程序或調(diào)用匯編程序,其參數(shù)傳遞的過程是不一樣的。
  2.1在C51 中嵌入?yún)R編程序的參數(shù)傳遞
  對于在C 語言程序中通過# pragma asm 和#pragma endasm 嵌入的匯編程序,C51 編譯器在編譯時只是將當(dāng)中的匯編程序不編譯,而不做其他任何處理,因此不存在函數(shù)調(diào)用時的參數(shù)傳遞和返回值問題。如果要在C 程序中和匯編程序中實(shí)現(xiàn)數(shù)據(jù)傳遞,可以通過變量或特殊功能寄存器來實(shí)現(xiàn),例如,在C 程序的變量定義部分定義Z 變量,在C 語言程序和匯編程序中共同訪問Z 變量,這樣,C 語言程序可以通過Z 變量把參數(shù)傳遞給匯編程序,匯編程序可以通過Z 變量把參數(shù)返回給C語言程序。
2.2在C51 中調(diào)用匯編程序的參數(shù)傳遞
  在C51 中調(diào)用匯編程序是通過函數(shù)調(diào)用的形式來實(shí)現(xiàn)的。由于C51 程序函數(shù)有明確的參數(shù)和返回值約定,因此在C51 中調(diào)用匯編程序進(jìn)行參數(shù)傳遞時都必須嚴(yán)格遵守C51 函數(shù)的參數(shù)和返回值相關(guān)約定。
  在C51 中調(diào)用匯編程序進(jìn)行參數(shù)傳遞關(guān)鍵在于要弄清C51 函數(shù)的參數(shù)傳遞規(guī)則。在C51 中調(diào)用匯編程序進(jìn)行參數(shù)傳遞的方式有兩種:一種是通過寄存器傳遞參數(shù);一種是通過固定存儲區(qū)傳遞。
2.2.1 通過寄存器傳遞參數(shù)。
  Franklin C51 規(guī)定調(diào)用函數(shù)最多可通過51 單片機(jī)的工作寄存器傳遞3 個參數(shù),余下的通過固定存儲區(qū)傳遞??梢杂谩癗OREGPARMS”命令取消用寄存器傳遞參數(shù),如果用寄存器傳遞參數(shù)取消或參數(shù)太多,參數(shù)通過固定存儲區(qū)傳遞。用寄存器傳遞參數(shù)的函數(shù),在生成代碼時被Cx51 編譯器在函數(shù)名前加上一個下劃線“_”的前綴,在固定存儲區(qū)傳遞參數(shù)的函數(shù)則沒有下劃線。不同的參數(shù)用到的寄存器不一樣,不同的數(shù)據(jù)類型用到的寄存器也不同。通過寄存器傳遞的參數(shù)如表1 所示。



 表1 中,int 型和long 型數(shù)據(jù)傳遞時高位數(shù)據(jù)在低位寄存器中,低位數(shù)據(jù)在高位寄存器中;float型數(shù)據(jù)滿足32 位的IEEE 格式,指數(shù)和符號位在R7 中;通用指針存儲類型在R3 中,高位在R2 中。函數(shù)參數(shù)傳遞舉例情況如表2 所示。


2.2.2  通過固定存儲區(qū)傳遞。
  用固定存儲區(qū)傳遞參數(shù)給匯編程序,參數(shù)段首地址用段名“ ? function-name ? BYTE”和“ ?function-name ? BIT”保存,function-name 為函數(shù)的名稱,其中“, ? function-name ? BIT”保存位參數(shù)段首地址,“ ? function-name ? BYTE”保存別的參數(shù)段首地址,即使通過寄存器傳遞參數(shù),參數(shù)也將在這些段中分配空間,參數(shù)按聲明的先后在每個段中順序保存。
  用做參數(shù)傳遞的固定存儲區(qū)可在內(nèi)部數(shù)據(jù)區(qū)或外部數(shù)據(jù)區(qū),這由存儲模式?jīng)Q定。 Small 模式的參數(shù)段用內(nèi)部數(shù)據(jù)區(qū),Compact 和Large 模式用外部數(shù)據(jù)區(qū)。
2.2.3  函數(shù)返回值。
  函數(shù)返回值通常用寄存器傳遞,表3 列出了可能的返回值和所用的寄存器。

3、C51 中嵌入?yún)R編程序的實(shí)現(xiàn)方法
  通常,在C51 程序中嵌入?yún)R編程序的處理方法如下:
第一步,在C 文件中以如下方式嵌入?yún)R編程序。

#pragmaASM
;匯編程序
#pragmaENDASM

第二步,在keil C51 軟件的Project 窗口右鍵單擊嵌入?yún)R編程序的C 文件,選擇“Options for ?”,點(diǎn)擊右邊的“Generate Assembler SRC File”和“AssembleSRC File”,使檢查框由灰色變成黑色(有效) 狀態(tài)。


第三步,根據(jù)選擇的編譯模式,把相應(yīng)的庫文件(如Small 模式時, 是Keil C51 Lib C51S。Lib) 加入工程中, 該文件必須作為工程的最后文件。

庫文件與編譯模式的關(guān)系如下:
C51S.LIB - 沒有浮點(diǎn)運(yùn)算的Small model
C51C.LIB - 沒有浮點(diǎn)運(yùn)算的Compact model
C51L.LIB - 沒有浮點(diǎn)運(yùn)算的Large model
C51FPS.LIB - 帶浮點(diǎn)運(yùn)算的Small model
C51FPC.LIB - 帶浮點(diǎn)運(yùn)算的Compact model
C51FPL.LIB - 帶浮點(diǎn)運(yùn)算的Large model
第四步,編譯,即可生成目標(biāo)代碼。

keil軟件中c編程如何制作一個庫函數(shù)并在其他地方隨意調(diào)用?

在項(xiàng)目的Output設(shè)置中選擇輸出lib而不是可執(zhí)行目標(biāo)文件。
4、C51 中調(diào)用匯編程序的實(shí)現(xiàn)方法
  為了能夠在C 語言中調(diào)用匯編程序,要求匯編程序的編寫必須符合C 語言的相關(guān)命名規(guī)則。
  C51 程序在調(diào)用匯編程序時,除了前面參數(shù)傳遞的相關(guān)規(guī)則外,函數(shù)及其相關(guān)段也需要滿足一定的規(guī)則。
  一個C51 源程序模塊被編譯后,其中的每一個函數(shù)以“ ? PR ? 函數(shù)名? 模塊名”為名的命名規(guī)則被分配到一個獨(dú)立的CODE 段。 例如,如果模塊“FUNC51”內(nèi)包含一個名為“func”的函數(shù), 則其CODE 段的名字是“ ? PR ? FUNC ? FUNC51”,如果函數(shù)中還包含有data 和bit 對象的局部變量,編譯器將按“ ? 函數(shù)名? BYTE 和? 函數(shù)名? BIT”命令規(guī)則建立一個data 和bit 段,它們代表所要傳遞參數(shù)的起始位置,其偏移值為零。段內(nèi)代碼與數(shù)據(jù)定義也遵循一定的規(guī)則。這些段是公開的,它們的地址可被其他模塊訪問。另外,這些段被編譯器賦予“OVERLAYABLE”標(biāo)志,其可被L51 連接P定位器做覆蓋分析。
  下面是一個簡單的C51 程序編譯時形成的匯編程序。
  C 語言源程序如下:

#defineucharunsignedchar
ucharmax(ucharx,uchary){
ucharz;
z=(x>=y)?x:y;
return(z);
}

  匯編后形成的SRC 文件(只須擴(kuò)展名改為.a51就變成匯編程序) 如下:

NAME  A1              ;定義模塊名稱
?PR?_max?  A1  SEGMENTCODE ;定義程序代碼
  PUBLIC  _max         ;定義公共符號
;#defineucharunsignedchar
;ucharmax(ucharx,uchary)
  RSEG  ?PR?_max?  A1;程序代碼段
_max:                ;起始地址
  USING  0
    ;SOURCELINE#2
;??Variable’y?041’assignedtoRegister’R5’??
;??Variable’x?040’assignedtoRegister’R7’??
;{
    ;SOURCELINE#3
;ucharz;
;z=(x>=y)?x:y;
    ;SOURCELINE#5
  MOV  A,R7          ;R7中為第二個字節(jié)參數(shù)
  CLR  C
  SUBB A,R5          ;R5中為第一個字節(jié)參數(shù)
  JC  ?C0001
  SJMP ?C0002
?C0001:
  MOV  R7,AR5         ;R7中為返回值
?C0002:
;??Variable’z?042’assignedtoRegister’R7’??
;return(z);
    ;SOURCELINE#6
    ;SOURCELINE#7
;}
?C0003:
  RET
;ENDOF-max
  END

  可以看出,要編寫為C51 調(diào)用的匯編程序,除了參數(shù)必須按前面規(guī)定的寄存器或存儲器傳送外,程序格式也有相應(yīng)的規(guī)則。這些規(guī)則比較繁瑣,在實(shí)際處理中往往按下面方式處理:
第一步,先用C 語言程序編寫出程序框架,如文件名為a1.c (注意參數(shù)) 。
第二步,在keil C51 的Project 窗口中用右鍵單擊該C 語言文件,在右鍵菜單中選擇“Options for?”,點(diǎn)擊右邊的“Generate Assembler SRCFile”和“Assemble SRC File”,使檢查框由灰色變成黑色(有效) 狀態(tài)。
第三步,根據(jù)選擇的編譯模式,把相應(yīng)的庫文件(如Small 模式時,是Keil C51 Lib C51S.Lib) 加入工程中,該文件必須作為工程的最后文件。 庫文件與編譯模式的關(guān)系如前面所述。
第四步,編譯后將會產(chǎn)生一個SRC 的文件,將這個文件擴(kuò)展名改為ASM。這樣就形成了可供C51程序調(diào)用的匯編程序。隨后可在該文件的代碼段中加入所需指令代碼。
第五步,將該匯編程序與調(diào)用它的主程序一起加到工程文件中,這時工程文件中不再需要原來的C 語言文件和庫文件,主程序只需要在程序開始處用EXTERN 對所調(diào)用的匯編程序中的函數(shù)作聲明,主程序中可調(diào)用匯編程序中的函數(shù)。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

采用51單片機(jī)最小開發(fā)板,由8位自制獨(dú)立按鍵控制。單片機(jī)芯片為STC89C52RC,晶振為@12.000 mhz。8X8LED點(diǎn)陣屏模塊由MAX7219驅(qū)動,MAX7219包含一個自動掃描電路。你只需要把要顯示的數(shù)據(jù)發(fā)送...

關(guān)鍵字: 51單片機(jī) MAX7219 寄存器

在嵌入式系統(tǒng)開發(fā)的廣闊領(lǐng)域,51單片機(jī)和STM32無疑是兩種極具代表性的微控制器。對于初學(xué)者而言,選擇學(xué)習(xí)路徑時往往會面臨一個抉擇:是直接跨越51單片機(jī),挑戰(zhàn)更高層次的STM32,還是從51開始,逐步進(jìn)階?本文旨在探討直...

關(guān)鍵字: 51單片機(jī) STM32

在嵌入式系統(tǒng)開發(fā)中,特別是在使用8051系列單片機(jī)(簡稱C51)進(jìn)行編程時,數(shù)據(jù)類型的選擇與定義對程序的性能和可讀性至關(guān)重要。C51語言在標(biāo)準(zhǔn)C語言的基礎(chǔ)上進(jìn)行了擴(kuò)展,以適應(yīng)單片機(jī)特有的硬件結(jié)構(gòu)和操作需求。本文將深入探討...

關(guān)鍵字: C51數(shù)據(jù) 51單片機(jī)

在嵌入式系統(tǒng)領(lǐng)域,51單片機(jī)作為一種經(jīng)典的微控制器,廣泛應(yīng)用于各種自動化控制系統(tǒng)中。其外部引腳作為單片機(jī)與外界交互的接口,承載著數(shù)據(jù)傳輸、控制信號輸出等重要功能。本文將通過對51單片機(jī)外部引腳的案例分析,結(jié)合實(shí)際代碼,深...

關(guān)鍵字: 51單片機(jī) 單片機(jī)

在電子技術(shù)的浩瀚星空中,LED(發(fā)光二極管)以其獨(dú)特的魅力成為了一顆璀璨的明星。而結(jié)合51單片機(jī)這一經(jīng)典的嵌入式開發(fā)平臺,LED的應(yīng)用更是被賦予了無限可能,其中,花樣流水燈便是一個生動而富有創(chuàng)意的實(shí)例。本文將帶您深入探索...

關(guān)鍵字: 51單片機(jī) LED

在現(xiàn)代嵌入式系統(tǒng)設(shè)計(jì)中,51單片機(jī)作為一種經(jīng)典的微控制器,憑借其豐富的功能和廣泛的應(yīng)用領(lǐng)域,仍然受到工程師們的青睞。定時器中斷是51單片機(jī)中一個非常實(shí)用的功能,它可以在特定的時間間隔內(nèi)自動觸發(fā)中斷,執(zhí)行預(yù)設(shè)的操作,從而提...

關(guān)鍵字: 51單片機(jī) 定時器

STM32與51單片機(jī)之間有什么差異呢?兩者可以說是一場科技與性能的較量了。在科技飛速發(fā)展的今天,微控制器(MCU)已廣泛應(yīng)用于各類電子設(shè)備和系統(tǒng)中,發(fā)揮著舉足輕重的作用。其中,STM32和51單片機(jī)作為兩種常見的微控制...

關(guān)鍵字: STM32 51單片機(jī) MCU

51單片機(jī)將是下述內(nèi)容的主要介紹對象,通過這篇文章,小編希望大家可以對51單片機(jī)的相關(guān)情況以及信息有所認(rèn)識和了解,詳細(xì)內(nèi)容如下。

關(guān)鍵字: 單片機(jī) 51單片機(jī)

在嵌入式系統(tǒng)開發(fā)中,單片機(jī)是不可或缺的重要組成部分。其中,STM32單片機(jī)和51單片機(jī)是兩種常見的單片機(jī)芯片。本文將對比分析這兩種單片機(jī)的區(qū)別,并探討STM32單片機(jī)的優(yōu)勢。

關(guān)鍵字: stm32單片 51單片機(jī)

51單片機(jī)是指由美國INTEL公司生產(chǎn)的一系列單片機(jī)的總稱,這一系列單片機(jī)包括了許多品種,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的產(chǎn)品,該系列其它單片機(jī)都是在8051的基...

關(guān)鍵字: 51單片機(jī) 串行通信
關(guān)閉