李銳,呂瓊
摘要:MCS-51單片機(jī)是目前應(yīng)用最為廣泛的8位單片機(jī),單片機(jī)的編程方式主要有匯編、C語言以及兩者混合三種方式,掌握三種編程方式,在具體應(yīng)用中靈活運(yùn)用是非常重要的,該文通過這三種編程方式對(duì)MCS-51單片機(jī)的應(yīng)用進(jìn)行了詳細(xì)的討論。
關(guān)鍵詞:?jiǎn)纹瑱C(jī);匯編語言;C語言;混合編程
中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2012)20-4994-03
Discuss of Three Methods of Programming for MCS-51 Single Chip Microcomputer
LI Rui,LV Qiong
(College of Physics and Electronic Engineering, Qujing Normal University,Qujing 655011,China)
Abstract: MCS-51 is the most popular in the 8 bit single chip microcomputer at present. Single chip microcomputer are three ways for programming, they are assembly language, C language and complex programming. Used the techniques with great facility is very import. The document discuss the methods in detail.
Key words: single chip microcomputer; assembly language; C language; complex programming
MCS-51系列單片機(jī)是Intel公司的8位單片機(jī),其中DIP封裝的AT89S52單片機(jī)是美國(guó)Atmel公司生產(chǎn)的低電壓、高性能CMOS 8位單片機(jī),其片內(nèi)含有8KB可在線編程的Flash閃速存儲(chǔ)器,芯片采用Atmel公司的高密度、非易失性存儲(chǔ)技術(shù)生產(chǎn),與標(biāo)準(zhǔn)的MCS-51單片機(jī)的指令系統(tǒng)及引腳兼容、功能強(qiáng)大,適合于許多較多較為復(fù)雜的控制應(yīng)用場(chǎng)合[1]。目前開發(fā)MCS-51系列單片機(jī)最流行的軟件是美國(guó)Keil Software公司出品的Keil軟件,這是一個(gè)功能強(qiáng)大的集成開發(fā)環(huán)境(μVision)。
1 MCS-51單片機(jī)的三種編程方式
1.1匯編方式
匯編語言是面向機(jī)器的程序設(shè)計(jì)語言,也稱為符號(hào)語言。匯編語言中,用符號(hào)代替機(jī)器語言的二進(jìn)制碼,使之比機(jī)器語言易于讀寫、易于調(diào)試和修改,同時(shí)也具有機(jī)器語言執(zhí)行速度快,占內(nèi)存空間少等優(yōu)點(diǎn),但在編寫復(fù)雜程序時(shí)具有明顯的局限性,匯編語言依賴于具體的機(jī)型,不能通用,也不能在不同機(jī)型之間移植。
1.2 C語言方式
C語言是一種高級(jí)語言,其編寫的程序比用匯編語言更符合人們的思考習(xí)慣,具有良好的模塊化,容易閱讀和維護(hù)等優(yōu)點(diǎn),開發(fā)者可以更專心地考慮算法而不是考慮一些細(xì)節(jié)問題,這樣就減少了開發(fā)和調(diào)試的時(shí)間。同時(shí)C語言不依賴于硬件,這使其具有了很好的移植性[2]。另外,C語言還還有豐富的庫(kù)函數(shù)支持,繪圖能力也比較強(qiáng)。但C語言代碼編譯后的目標(biāo)代碼體積大,意味著存在占用空間多,執(zhí)行速度較慢的問題。
1.3匯編與C語言混合方式
根據(jù)匯編和C語言的特點(diǎn),選擇編程語言的一種折中方式就是匯編和C語言混合編程?;旌暇幊谭绞街饕袃煞N形式,一種是在C語言中嵌入?yún)R編代碼,另一種是匯編和C語言相互調(diào)用函數(shù),實(shí)現(xiàn)方法是通過關(guān)鍵詞進(jìn)行標(biāo)識(shí),如果涉及參數(shù)傳遞,主要是通過R2—R7這幾個(gè)工作寄存器來存取。在應(yīng)用中,通常在對(duì)時(shí)效性要求比較嚴(yán)格的時(shí)候,這部分代碼使用匯編是唯一的選擇,比如時(shí)鐘的中斷計(jì)時(shí)服務(wù)程序等,而其它時(shí)候,使用C語言比較方便。
2三種編程方式的應(yīng)用——經(jīng)典流水燈實(shí)驗(yàn)
2.1匯編方式
ORG 0000H;標(biāo)記程序起始位置
SJMP MAIN;跳轉(zhuǎn)到主程序地址
ORG 000BH;計(jì)時(shí)/計(jì)數(shù)器0的中斷入口地址
AJMP TIMER0;跳轉(zhuǎn)到計(jì)時(shí)中斷服務(wù)程序
ORG 0033H;標(biāo)記主程序起始的絕對(duì)位置MAIN: MOV TMOD,#02H ;設(shè)置為計(jì)時(shí)器工作方式2
MOV TH0,#06H;預(yù)設(shè)溢出的自動(dòng)賦值數(shù)據(jù)MOV TL0,#06H;預(yù)設(shè)一次計(jì)時(shí)的初值
SETB ET0;打開計(jì)時(shí)/計(jì)數(shù)器中斷控制
SETB EA;打開總中斷控制
SETB TR0;開啟計(jì)時(shí)
MOV R1,#00H
MOV R0,#00H
MOV A,#01H;初始化狀態(tài)數(shù)據(jù)LOOP: MOV P0,A;點(diǎn)亮發(fā)光二極管
SJMP LOOP
TIMER0: INC R1;機(jī)器周期計(jì)時(shí)
CJNE R1,#250,EXT ;而方式2使用的是8位字長(zhǎng),因此使用了R0和R1擴(kuò)展
MOV R1,#00H
INC R0
CJNE R0,#32,EXT
MOV R0,#00H
RL A;循環(huán)左移點(diǎn)亮狀態(tài)數(shù)據(jù)
EXT:RETI;中斷返回
END;程序結(jié)束
2.2 C語言方式
unsigned int t=0;//計(jì)時(shí)變量
unsigned char s=0x01;//發(fā)光二極管點(diǎn)亮狀態(tài)數(shù)據(jù)變量void timer0() interrupt 1 using 1{ //中斷函數(shù)申明
t++;//每次中斷,計(jì)時(shí)變量加1
if(t==8000){//需要8000次中斷,時(shí)間才到1秒
s=_crol_(s,1);//點(diǎn)亮狀態(tài)數(shù)據(jù)變?yōu)橄乱粻顟B(tài)
t=0;//到1秒后,賦0重新計(jì)時(shí)
}
}
void main(){
TMOD=0x02;//設(shè)置計(jì)時(shí)/計(jì)數(shù)器的工作方式
TH0=0x06;//自動(dòng)賦值設(shè)置TL0=0x06;//設(shè)置計(jì)時(shí)初值
ET0=1;//打開計(jì)時(shí)中斷控制EA=1;//打開總中斷控制
TR0=1;//開啟計(jì)時(shí)
do{//死循環(huán)等待中斷
P0=s;//點(diǎn)亮發(fā)光二極管
}while(1);
}
2.3匯編和C語言混合方式
2.3.1 C語言中嵌入?yún)R編
實(shí)際應(yīng)用中,如果對(duì)中斷有嚴(yán)格的要求,可以把中斷程序代碼改為匯編,也就是嵌入?yún)R編語言的形式,這種方式實(shí)現(xiàn)比較簡(jiǎn)單,而且C語言下定義的變量也可以直接使用,只不過超過單字節(jié)長(zhǎng)度的變量的算法比較麻煩。
2.3.2 C語言和匯編相互調(diào)用
匯編代碼既可以直接嵌入C語言中,也可以單獨(dú)分離出來,下面的實(shí)例中把中斷函數(shù)單獨(dú)寫為匯編語言,另外,為了方便說明匯編對(duì)C語言的調(diào)用,把邏輯循環(huán)左移函數(shù)重新自定義。在應(yīng)用中,混合編程方式最麻煩就的相互代碼和變量的調(diào)用,在MCS-51系列單片機(jī)中,存在一套規(guī)則,如表1。
2.4編譯時(shí)需注意的問題
1)生成目標(biāo)程序文件
使用Keil編譯,可以生成16進(jìn)制的后綴為.HEX的目標(biāo)程序文件,這個(gè)文件可以直接寫入單片機(jī)運(yùn)行,但Keil默認(rèn)是不生成. HEX文件的,需要進(jìn)行設(shè)置,方法是在選中“Project Workspace”窗口中的“Target 1”,點(diǎn)鼠標(biāo)右鍵,選擇“Options for……”,在“Output”選項(xiàng)下進(jìn)行設(shè)置。
2)編譯混合方式的程序
首先,在Project窗口中的C文件上點(diǎn)鼠標(biāo)右鍵,選擇“Options for……”,使“Generate Assembler SRC File”和“Assemble SRC File”選項(xiàng)變成黑色(有效)狀態(tài);然后,根據(jù)選擇的編譯模式,把相應(yīng)的庫(kù)文件(如Small模式時(shí),是KeilC51LibC51S.Lib)加入工程中,該文件必須作為工程的最后文件;最后進(jìn)行編譯,即可生成目標(biāo)代碼。
3結(jié)束語
以上代碼均通過Keil的編譯,并通過在線編程系統(tǒng)寫入AT89S52單片機(jī)內(nèi)部程序存儲(chǔ)中,使用單片機(jī)最小系統(tǒng)能正常運(yùn)行。三種編程方式在具體的應(yīng)用中是很靈活的,需要根據(jù)其特點(diǎn)和使用者的經(jīng)驗(yàn)來選擇使用。對(duì)于初學(xué)者,熟練掌握前兩種方式是非常必要的,而對(duì)于經(jīng)驗(yàn)豐富的程序員,第三種方式不失為一種高效實(shí)用的方法。
參考文獻(xiàn)
[1]鄧興成,姜寶鈞.單片機(jī)原理與實(shí)踐指導(dǎo)[M].北京:機(jī)械工業(yè)出版社,2009:1.
[2]趙亮,侯國(guó)銳.單片機(jī)C語言編程與實(shí)例[M].北京:人民郵電出版社,2003:1.
[3] Keil Elektronik GmbH. and Keil software. Cx51 Compiler, Users Guide 2001:118-132.
[4] Keil Elektronik GmbH. and Keil software. Macro Assembler and Utilities, Users Guide 2001:99-137.