www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]作為一種結(jié)構(gòu)化的程序設(shè)計(jì)語言,C語言的特點(diǎn)就是可以使你盡量少地對(duì)硬件進(jìn)行操作,具有很強(qiáng)的功能性、結(jié)構(gòu)性和可移植性,常常被優(yōu)選作為單片機(jī)系統(tǒng)的編程語言。但是基于單片機(jī)的C語言和標(biāo)準(zhǔn)C語言有很大區(qū)別,如何結(jié)合

作為一種結(jié)構(gòu)化的程序設(shè)計(jì)語言,C語言的特點(diǎn)就是可以使你盡量少地對(duì)硬件進(jìn)行操作,具有很強(qiáng)的功能性、結(jié)構(gòu)性和可移植性,常常被優(yōu)選作為單片機(jī)系統(tǒng)的編程語言。但是基于單片機(jī)的C語言和標(biāo)準(zhǔn)C語言有很大區(qū)別,如何結(jié)合單片機(jī)的系統(tǒng)資源,用C語言開發(fā)符合實(shí)際工程需要的單片機(jī)系統(tǒng),對(duì)用編程者來說具有十分重要的意義。

1 單片機(jī)C語言主要特點(diǎn)

用C 編寫程序比匯編更符合人們的思考習(xí)慣,開發(fā)者可以擺脫與硬件無必要的接觸,更專心的考慮功能和算法而不是考慮一些細(xì)節(jié)問題,這樣就減少了開發(fā)和調(diào)試的時(shí)間。C語言具有良好的程序結(jié)構(gòu),適用于模塊化程序設(shè)計(jì),因此采用C語言設(shè)計(jì)單片機(jī)應(yīng)用系統(tǒng)程序時(shí),首先要盡可能地采用結(jié)構(gòu)化的程序設(shè)計(jì)方法,將功能模塊化,由不同的模塊完成不同的功能[1],這樣可使整個(gè)應(yīng)用系統(tǒng)程序結(jié)構(gòu)清晰,易于調(diào)試和維護(hù)。不同的功能模塊,分別指定相應(yīng)的入口參數(shù)和出口參數(shù),對(duì)于一些要重復(fù)調(diào)用的程序一般把其編成函數(shù),這樣可以減少程序代碼的長度,又便于整個(gè)程序的管理,還可增強(qiáng)可讀性和移植性。

在實(shí)際單片機(jī)程序設(shè)計(jì)中,程序結(jié)構(gòu)一般均采用如下結(jié)構(gòu):
#include<reg51.h>        /*頭文件說明部份*/
unsigned char x1,x2;  /*全局變量聲明部份*/
…Function1(… ){       /*功能函數(shù)定義部份*/
……     }
main() {
  inti,j;          /* 整型變量聲明部份*/ 
Function1(…);  /* 功能函數(shù)說明部份*/
……}

2 單片機(jī)C語言與標(biāo)準(zhǔn)C語言的區(qū)別

由于現(xiàn)在越來越多的產(chǎn)品都采用單片機(jī)開發(fā),所完成的計(jì)算和控制工作也日趨復(fù)雜,但是單片機(jī)系統(tǒng)是一種資源十分有限的系統(tǒng),這主要表現(xiàn)在程序存儲(chǔ)器資源的不足,因此在程序設(shè)計(jì)時(shí)如何使用好這些有限的資源就顯得十分重要。用C語言編程雖然具有許多的優(yōu)點(diǎn),但是生成的代碼相對(duì)要長,要是編程技術(shù)不好,生成的代碼甚至有可能比匯編語言生成的代碼長幾倍,因此對(duì)編程者來說,應(yīng)該注意到單片機(jī)C語言和一般意義上的標(biāo)準(zhǔn)C語言的區(qū)別,對(duì)程序進(jìn)行適當(dāng)?shù)膬?yōu)化。

2.1 數(shù)據(jù)類型的選用

單片機(jī)C語言編程不同于一般的C語言編程的顯著的一個(gè)特點(diǎn),就是要和程序存儲(chǔ)器資源結(jié)合起來,雖然其提供的數(shù)據(jù)據(jù)類型十分豐富,但是只有bit和char 等數(shù)據(jù)類型是是機(jī)器語言直接支持的數(shù)據(jù)類型,用此類數(shù)據(jù)類型的語句所生成的代碼較短;而其它的數(shù)據(jù)類型如整型、浮點(diǎn)型等數(shù)據(jù)要有一定的內(nèi)部程序或內(nèi)部函數(shù)的支持,相對(duì)來說用該類數(shù)據(jù)類型的語句生成的代碼要長。有些C語言程序表面上看起來十分的簡單,但在在實(shí)際編譯時(shí),生成的代碼卻相當(dāng)長。因此我們要按照實(shí)際需要,合理地選用數(shù)據(jù),可以大大的減少所生成的代碼長度。例如在C51中每種數(shù)據(jù)類型變量所占用存儲(chǔ)器字節(jié)數(shù)和經(jīng)編譯后生成的代碼長度如表1所示:


表1 不同數(shù)據(jù)類型占用存儲(chǔ)器字節(jié)數(shù)和代碼長度對(duì)比

通過表1我們知道,不同的數(shù)據(jù)類型所生成的機(jī)器代碼長度相差很多,相同類型的數(shù)據(jù)類型有無符號(hào)對(duì)機(jī)器代碼長度也有影響。在程序編譯時(shí)生成機(jī)器代碼長的數(shù)據(jù)類型的優(yōu)先級(jí)越高,不同的數(shù)據(jù)類型在進(jìn)行程序運(yùn)算時(shí)要轉(zhuǎn)化為高優(yōu)先級(jí)的的數(shù)據(jù)類型,相應(yīng)的代碼長度也會(huì)增長[2]。因此我們應(yīng)盡可能地使用 bit,char等機(jī)器語言直接支持的數(shù)據(jù)類型,無符號(hào)數(shù)的變量應(yīng)聲明為無符號(hào)數(shù),盡可能地減少程序中使用的數(shù)據(jù)類型的種類。

2.2 算法設(shè)計(jì)問題

單片機(jī)C語言和標(biāo)準(zhǔn)C語言存在著很大差別,在計(jì)算機(jī)上進(jìn)行C語言程序設(shè)計(jì)時(shí)由于不必考慮程序代碼的長短,只需考慮程序功能實(shí)現(xiàn),但是在單片機(jī)上進(jìn)行C語言程序設(shè)計(jì)就必須考慮系統(tǒng)的硬件資源。有時(shí)并不是程序的算法越簡單、長度越短越好,因?yàn)橛幸恍┧惴ㄒ{(diào)用一些內(nèi)部的子程序和函數(shù),生成的機(jī)器代碼長度非常長。不同的算法對(duì)程序代碼長度影響十分大,因此在進(jìn)行程序設(shè)計(jì)時(shí),就盡量采用程序生成代碼短的算法,在不影響程序功能實(shí)現(xiàn)的情況下可以采用一些優(yōu)化算法 [2]。

在單片機(jī)C語言編譯成機(jī)器代碼時(shí),不同的運(yùn)算生成的機(jī)器代碼的長度相差很大,盡可能地減少程序中對(duì)某種數(shù)據(jù)類型的運(yùn)算種類,越復(fù)雜的數(shù)據(jù)類型效果越明顯。在進(jìn)行數(shù)據(jù)計(jì)算時(shí),在一定的精度范圍內(nèi),可以用一些近似的計(jì)算來完成一些運(yùn)算,既不損失精度又能減少大量的代碼。比如:用邏輯AND/&取模比MOD/%操作更有效。

在用熱敏電阻測(cè)量溫度時(shí),可根據(jù)熱敏電阻—溫度特性公式來求值。數(shù)學(xué)表達(dá)式表示為:
RT=RT0expB(1/T-1/T0)

如果直接按照公式溫度時(shí)程序結(jié)構(gòu)簡單,算法復(fù)雜度不高,但是程序?qū)⒄{(diào)用<Math.h>文件中的對(duì)數(shù)函數(shù),在編譯成機(jī)器碼時(shí)函數(shù)有1K多字節(jié),對(duì)于一般只有幾K字節(jié)的單片機(jī)系統(tǒng)來說,這是十分不合適的??紤]到系統(tǒng)資源問題可以用一種替代方法—查表法來實(shí)現(xiàn)算法。只要給出一定溫度范圍內(nèi)不同溫度值對(duì)應(yīng)熱敏電阻的電阻值,然后建立表格,只要按照系統(tǒng)求出的阻值,進(jìn)行查表,插值,就可以求出相應(yīng)的溫度值。這種算法相比前面的的公式法的算法復(fù)雜高,C語言程序代碼也長,但在編譯成機(jī)器碼時(shí),代碼長度卻很短,只有一、二百字節(jié)。

3  數(shù)據(jù)存儲(chǔ)器的分配

單片機(jī)內(nèi)部數(shù)據(jù)存儲(chǔ)器RAM只有幾百字節(jié),如果擴(kuò)展外部存儲(chǔ)器RAM來提高數(shù)據(jù)存儲(chǔ)量話必將會(huì)增加了硬件成本,使系統(tǒng)更加的復(fù)雜,訪問外部存儲(chǔ)器比訪問內(nèi)部存儲(chǔ)器所需的代碼也要長得多。有效地使用片內(nèi)存儲(chǔ)器、提高存儲(chǔ)器空間的利用率對(duì)開發(fā)者來說十分關(guān)鍵。

內(nèi)部處理器、內(nèi)部堆棧、壓縮棧、所有程序變量和所有包含進(jìn)來的庫函數(shù)都將使用數(shù)量有限的內(nèi)部數(shù)據(jù)存儲(chǔ)器RAM。因?yàn)镃語言采用了存儲(chǔ)器的覆蓋技術(shù)[2],可以在程序進(jìn)行連接時(shí),它將那些已經(jīng)被其它程序段釋放了的存儲(chǔ)器空間重新定義給另一個(gè)程序段的變量使用,當(dāng)這個(gè)程序運(yùn)行結(jié)束時(shí)再將這些存儲(chǔ)器釋放以供其它程序段使用。全局變量的作用范圍是整個(gè)程序,因此不能被釋放;靜態(tài)變量由于在函數(shù)的調(diào)用中專用不變,也不能被釋放;只有局部變量中的動(dòng)態(tài)變量可以被釋放。

因此在進(jìn)行程序設(shè)計(jì)時(shí)應(yīng)該盡量的使用局部變量,提高內(nèi)部數(shù)據(jù)存儲(chǔ)器的使用率。在C語言中程序中間結(jié)果及參數(shù)傳傳遞是通過內(nèi)部的寄存器來完成的,要是內(nèi)部的存儲(chǔ)器不夠,將會(huì)給你的程序帶來許多莫名其妙的錯(cuò)誤。例如在進(jìn)行程序設(shè)計(jì)時(shí)語句不應(yīng)該太長,一個(gè)長語句可以分成多個(gè)語句,這樣的話可以大的減少中間變量,當(dāng)然太長時(shí)就會(huì)造成臨時(shí)寄存器的不夠用,導(dǎo)致計(jì)算出錯(cuò)。

4 單片機(jī)C語言與匯編語言的混合編程

在絕大多數(shù)場(chǎng)合采用C語言編程即可完成預(yù)期的目的,但是對(duì)實(shí)時(shí)時(shí)鐘系統(tǒng)、要求執(zhí)行效率高的的系統(tǒng)就不適合采用C語言編程,對(duì)這些特殊情況進(jìn)行編程時(shí)要結(jié)合匯編語言。匯編語言具有直接和硬件打道、執(zhí)行代碼的效率高等特點(diǎn),可以做到C語言所不能做到的一些事情,例如對(duì)時(shí)鐘要求很嚴(yán)格時(shí),使用匯編語言成了唯一的選擇。這種混合編程[2]的方法將C語言和匯編語言的優(yōu)點(diǎn)結(jié)合起來,已經(jīng)成為目前單片機(jī)開發(fā)最流行的編程方法。

目前大多數(shù)據(jù)單片機(jī)系統(tǒng),在C語言中使用匯編語言有兩種情況:一種是匯編程序部分和C程序部分為不同的模塊,或不同的文件,通常由C程序調(diào)用匯編程序模塊的變量和函數(shù)(也可稱為子程序或過程);另一種是嵌入式匯編,即在C語言程序中嵌入一段匯編語言程序。

當(dāng)匯編程序和C程序?yàn)椴煌K時(shí)程序一般可分為若于個(gè)C程序模塊和匯編程序模塊,C程序模塊通常是程序的主體框架,而匯編程序模塊通常由用C語言實(shí)現(xiàn)效率不高的函數(shù)組成,也可以是已經(jīng)成熟的、沒有必要再轉(zhuǎn)化成C語言的匯編子程序。在這種混合編程技術(shù)中,關(guān)鍵是參數(shù)的傳遞和函數(shù)的返回值。它們必須有完整的約定,否則數(shù)據(jù)的交換就可能出錯(cuò)。

對(duì)于嵌入式匯編,可以在C程序中使用一些關(guān)鍵字嵌入下些匯編程序,這種方法主要用于實(shí)現(xiàn)數(shù)學(xué)運(yùn)算或中斷處理,以便生成精練的代碼,減少運(yùn)行時(shí)間。當(dāng)匯編函數(shù)不大,且內(nèi)部沒有復(fù)雜的跳轉(zhuǎn)時(shí),可以用嵌入式匯編實(shí)現(xiàn)。

下面就以AT89C2051單片機(jī)在模擬電壓檢測(cè)中的應(yīng)用為例說明C語言程序與匯編語言程序的調(diào)用。電路圖如圖1所示:

AT89C2051單片機(jī)內(nèi)置模擬比較器,13腳即P1.1是比較器的負(fù)輸入端,12腳即P1.0是比較器的正輸入端,比較器的輸出端做在了CPU內(nèi)部即P3.6未被引出,CPU可以直接讀?。?.6狀態(tài)來判定兩輸入端比較的結(jié)果其和一個(gè)外部電阻及一個(gè)外部電容器就可以設(shè)計(jì)成一個(gè)A/D轉(zhuǎn)換器,采用RC模擬轉(zhuǎn)換的原理,來檢測(cè)外部P1.1引腳的輸入電壓。由于系統(tǒng)對(duì)時(shí)鐘要求很嚴(yán)格,因此就采用了C語言和匯編語言混合編程技術(shù),程序調(diào)用形式如下:

匯編子程序:
PUBLIC  _AD           ;入口地址
con  SEGMENT CODE     ;程序段
RSEG    con
_AD:   SETB  P3.7       ;充電
Loop:    JB  p3.6,AD_END   ;開始計(jì)數(shù)匹配
INC A       
CJNE  A,#100,Loop
AD_END:  CLR P3.7  ;放電       
CJNE  A,#100,Ret_Val   ;看結(jié)果是否有溢出,有溢出說明結(jié)果不對(duì)
SJMP  Con_OV;返回值         
Ret_Val:DEC A
MOV R7,A         ;A/D轉(zhuǎn)換的結(jié)果保存在R7中,傳遞給主程序
Con_OV: RET 
        END


 
單片機(jī)C程序:
 include<reg51.h>
unsigned char AD(unsigned char);//在C程序中聲明匯編模數(shù)轉(zhuǎn)換子程序
……………
 void timer0(void) interrupt 1 using 1{   
    ………
 unsigned char x;           
 x=AD();             //在C程序中調(diào)用匯編程序
    ………
}
Main{                 //主程序
………
}

在以上程序中,函數(shù)的返回值為一無符號(hào)字符型數(shù),根據(jù)調(diào)用規(guī)則,返回值在R7中,這樣才可保證數(shù)據(jù)的傳遞不出錯(cuò)。另外,在調(diào)用過程中,必須注意寄存器的入棧。這樣在以后用到A/D轉(zhuǎn)換時(shí),在C語言中調(diào)用匯編語言子程序AD()即可。

5 結(jié)束語

C語言具有很強(qiáng)的功能性和結(jié)構(gòu)性,可以縮短單片機(jī)控制系統(tǒng)的開發(fā)周期,而且易于調(diào)試和維護(hù),已經(jīng)成為目前單片機(jī)語言中最流行的編程語言。

本文就單片機(jī)C語言的特點(diǎn)以及在開發(fā)過程中的一些問題給予分析并提供了解決方法,為廣大單片機(jī)開發(fā)人員提供了可借鑒的經(jīng)驗(yàn)。

參考文獻(xiàn)
1 王平,邢建春,王林.一種快速有效攔截彈飛的單片機(jī)程序新方法. 微計(jì)算機(jī)信息,1997,4(13):80-81.
2 馬忠梅,籍順心,張凱,馬巖.單片機(jī)的C語言應(yīng)用程序設(shè)計(jì).北京:北京航空航天大學(xué)出版社,1999.
 

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

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉