李宛娜
(哈爾濱遠(yuǎn)東理工學(xué)院,黑龍江 哈爾濱 150025)
試論C語言在單片機(jī)開發(fā)中的運(yùn)用
李宛娜
(哈爾濱遠(yuǎn)東理工學(xué)院,黑龍江 哈爾濱 150025)
對于研究生思想政治教育歷來受到國家的高度重視和關(guān)切,以及研究生群體的擴(kuò)大和未來就業(yè)問題.研究生作為高學(xué)歷人群,群體多元化的結(jié)構(gòu),面對當(dāng)代研究生思想政治教育的現(xiàn)狀,如何有效地解決和正確的分析,成為思想政治教育面臨的重要研究的問題.所以面對研究工作,要全力以赴開辟全新的方式和道路對于當(dāng)代研究生思想政治教育研究是具有重大意義的.
C語言;單片機(jī);開發(fā)
單片機(jī)的開發(fā)離不開大量的編程和算法設(shè)計(jì).而在編程的過程中我們會發(fā)現(xiàn),傳統(tǒng)的單片機(jī)編程用的更多的是匯編語言,而諸如C、C++在內(nèi)的高級編譯語言用的卻很少.面對單片機(jī)系統(tǒng)日趨復(fù)雜以及功能要求不斷提高的現(xiàn)實(shí),如何在單片機(jī)中引入高級語言,已經(jīng)成為了一種必然的趨勢.
單片機(jī)是以一種智能化工具出現(xiàn)在我們面前的,興起于近代,并且是微電子技術(shù)的一個鮮明代表.從計(jì)算機(jī)系統(tǒng)來說,單片機(jī)有兩種類型,即通用系統(tǒng)與嵌入系統(tǒng),這兩種系統(tǒng)作為兩種類型共同引領(lǐng)著如今計(jì)算機(jī)系統(tǒng)的發(fā)展.單片機(jī)具有芯片小、性能強(qiáng)等特點(diǎn),被廣泛運(yùn)用于儀器制造、汽車機(jī)械以及家用電氣等職能設(shè)備之中.
單片機(jī)功能的發(fā)揮有賴于其背后的開發(fā),這種開發(fā)并不是雜亂無序或者任意編碼的,它有著自己的特點(diǎn).首先,外圍擴(kuò)展需要使用串行方式,并需要廣泛使用單片機(jī)的在片程序存儲器技術(shù);其次,它需要在8位機(jī)地位下進(jìn)行全盤CMOS化.這種特性也就決定了其要借助C語言編程語言.就目前用于單片機(jī)開發(fā)的語言來說,主要包括匯編語言和以C語言為代表的高級編程語言.兩種編程語言各有千秋,匯編語言具有很高的可控性和簡便性,但C語言則有著很好的移植性和繼承性,因此受到單片機(jī)系統(tǒng)研究和開發(fā)者的高度重視,C語言在處理器中運(yùn)用的增多就是最好的證明.
C語言較匯編語言有著自身諸如可移植性強(qiáng)、繼承性強(qiáng)的優(yōu)勢,使C語言運(yùn)用于單片機(jī)開成為可能.C語言作為一種高級的編譯語言,有著匯編帶有的那種操作簡便、性能強(qiáng)等特點(diǎn)及強(qiáng)大的可移植性,極大地增加了單片機(jī)開發(fā)的便捷性.因?yàn)镃語言倡導(dǎo)使用結(jié)構(gòu)化的設(shè)計(jì)方式,并且依照自上而下的形式展開,這就使得相關(guān)單片機(jī)開發(fā)人員可以在不了解單片機(jī)內(nèi)部硬件結(jié)構(gòu)信息的情況下對整個存儲單位進(jìn)行有效、合理的分配,使得單片機(jī)程序的運(yùn)行十分可靠、便捷.
除其可移植性強(qiáng)外,C語言作為一種結(jié)構(gòu)化的編譯程序在程序開發(fā)上也有自身的優(yōu)點(diǎn).一方面,它功能性強(qiáng),結(jié)構(gòu)性很好,可以在不同的機(jī)型上運(yùn)行,并且憑借自身強(qiáng)大庫函數(shù)以及編譯運(yùn)算能力而具有很強(qiáng)的可讀性;另一方面,相關(guān)程序人員在使用C語言進(jìn)行編程時,可以專心地進(jìn)行編程,不需要擔(dān)心硬件的不兼容,而且C語言的簡單好記、邏輯性強(qiáng)等特點(diǎn)也減輕了編程人員的壓力.另外,C語言也可以憑借著其修改和擴(kuò)充簡單的優(yōu)點(diǎn)而使得在進(jìn)行模塊化程序設(shè)計(jì)時,因?yàn)槠涿總€模塊都有很好的分工和任務(wù),從而變得尤為簡便.
在單片機(jī)開發(fā)中運(yùn)用C語言時,需要依據(jù)專門的運(yùn)用步驟.首先,我們需要對目標(biāo)源程序進(jìn)行編譯,并將目標(biāo)代碼進(jìn)行連接和替換;其次,在程序設(shè)計(jì)完成之后還需要將源程序轉(zhuǎn)換為單片機(jī)所能識別和運(yùn)行的代碼形式.整個C語言的單片機(jī)開發(fā)過程可以簡要地概括為軟件安裝、創(chuàng)建C源文件、編譯并調(diào)試以及生成HEX文件等幾個步驟環(huán)節(jié).
C語言能夠?qū)纹瑱C(jī)的系統(tǒng)資源進(jìn)行合理、有效的分配,而這種分配實(shí)際上是以指針結(jié)構(gòu)的合理配置、指針數(shù)組和關(guān)系理清等方面為前提的.也就是說,要將C語言運(yùn)用到單片機(jī)開發(fā)當(dāng)中,就需要加強(qiáng)對這幾方面的認(rèn)識和控制.為了更好地說明C語言在單片機(jī)中的運(yùn)用,本文從指針結(jié)構(gòu)、指針尋址這兩個方面進(jìn)行介紹和說明.
首先,是指針結(jié)構(gòu).一般來說,C語言中關(guān)于指針的聲明一般都是采用類型標(biāo)識符*指針變量名的形式,而就單片機(jī)的存儲結(jié)構(gòu)來說,C語言指針的定義,與普通的C語言定義,有著格式上的不同點(diǎn),需要設(shè)立存儲指針變量的數(shù)據(jù)存儲區(qū)以及存儲指針變量指向數(shù)據(jù)的存儲區(qū).因此我們在進(jìn)行指針結(jié)構(gòu)的聲明時,采用不一樣的聲明格式,即:類型標(biāo)識符[存儲區(qū)類型];指針變量名[指針變量存儲區(qū)類型].其中,在對數(shù)據(jù)格式的設(shè)定上,主要包括data等幾種,并且在進(jìn)行指針變量控制時,采用如下的應(yīng)用格式:
unsigned char xdata indata[6];
unsigned char xdata*data yc;
yc=indata.
在將其進(jìn)行匯編語言轉(zhuǎn)換過后,我們發(fā)現(xiàn)其編譯結(jié)果對應(yīng)為:
MOV 08H,#00H;
其中0x08與0x09分別是指針變量地地址空間的所在.
其次,是對指針進(jìn)行尋址.通常來說,在單片機(jī)系統(tǒng)中的C語言數(shù)組尋址方式與一般系統(tǒng)上的尋址方式是一樣的.由于數(shù)組存儲在單片機(jī)片內(nèi),而片內(nèi)的RAM資源空間相對來說比較有限,因此我們在進(jìn)行數(shù)組使用時,盡量避開過大的數(shù)組,從而簡化其數(shù)據(jù)結(jié)構(gòu).實(shí)際上,我們在進(jìn)行指針尋址時,需要實(shí)現(xiàn)data區(qū)的指針尋址,通過A/D轉(zhuǎn)換的模式將外部數(shù)據(jù)轉(zhuǎn)進(jìn)單片機(jī)之中.比如,在進(jìn)行十次數(shù)據(jù)求和時,我們編寫了以下的程序代碼:
unsigned char data inputdata[10];
unsigned int data sum,i;
unsigned char data*data yc;
void main()
{sum=0;
collectdata();
yc=inputdata;
sum+=*yc;
}
當(dāng)然,在實(shí)現(xiàn)指向data區(qū)的指針尋址之后,我們還需要實(shí)現(xiàn)其指向程序存儲區(qū)的指針尋址.然而,就指針指向數(shù)據(jù)存儲而言,它可以利用指針來實(shí)現(xiàn)對函數(shù)的調(diào)用,而這種調(diào)用一般來說需要依照特定的調(diào)用格式,即:類型標(biāo)識符(*指針變量名)([參數(shù)1],[參數(shù)2]……).在對數(shù)據(jù)定義完整之后,我們在后續(xù)的代碼程序中,就可以使用(*指針變量名)([參數(shù)],[參數(shù)]……)的代碼對之前編寫好的函數(shù)進(jìn)行調(diào)用,例如,我們事先編寫了一個查詢函數(shù)scan(),想在之后通過一個鍵盤對其進(jìn)行調(diào)用,其可以用以下代碼實(shí)現(xiàn):
Void scan()
Void main()
{void(*yc)();
Yc=scan;
高校思政實(shí)踐課旨在實(shí)踐中服務(wù)學(xué)生的成長與成才。大致流程如下:以實(shí)踐教學(xué)班級為主要目標(biāo),以一個完整學(xué)期作為朋輩導(dǎo)師的服務(wù)期限,在高年級學(xué)生中精心選拔出一批優(yōu)秀分子作為儲備導(dǎo)師,并在實(shí)踐課前給予針對性的培訓(xùn),而后將其以“課程導(dǎo)師”的身份配備給每個教學(xué)班級,從思路拓展、實(shí)踐規(guī)劃、資源整合、團(tuán)隊(duì)建設(shè)、條件保障、技能學(xué)習(xí)和提升、實(shí)踐過程監(jiān)控和調(diào)整、實(shí)踐總結(jié)與展望等方面進(jìn)行引導(dǎo)和幫扶,從而實(shí)現(xiàn)共同成長的目的。
For(;;)
{(*yc)();}
}
就目前的工業(yè)控制計(jì)算機(jī)來說,其由于缺乏看門狗電路,而在使計(jì)算機(jī)復(fù)位時,讓看門狗發(fā)生動作,這也就是習(xí)慣上的熱啟動.而在熱啟動的實(shí)際過程中,卻因?yàn)椴辉试S從頭開始,而使得已有的測量值或計(jì)算值復(fù)位,并最終導(dǎo)致系統(tǒng)異常.為了應(yīng)對這一問題,我們通常需要利用程序?qū)崿F(xiàn)對其冷熱啟動進(jìn)行判別.一般來說,我們要確立其標(biāo)志位(通常以某內(nèi)存單位為準(zhǔn)),并讓計(jì)算機(jī)啟動時首先讀取這些帶有標(biāo)志位的內(nèi)容,如果該內(nèi)容與預(yù)先設(shè)定的值相同,則稱其為熱啟動,否則為冷啟動.為了實(shí)現(xiàn)這一功能,我們設(shè)置了一個指針,并且使其指向特定的內(nèi)存單元0x7f,編制了以下C語言程序:
void main()
{char data*HotPoint=(char*)0x7f;
if((*HotPoint==0xaa)&&(*(--HotPoi-nt)==0xaa))
{/*熱啟動的處理*/}
else
{HotPoint=0x7e;*HotPoint=0xaa;
*(++HotPoint)=0xaa;}
}
然而,我們在對其進(jìn)行編譯和運(yùn)行過后發(fā)現(xiàn),無論是熱啟動還是冷啟動,開機(jī)后的內(nèi)存單元復(fù)位均為0,這顯然無法滿足熱啟動的要求,因?yàn)橛肅語言編程時,開機(jī)時執(zhí)行的代碼并非是從main()函數(shù)的第一句語句開始的.在main()函數(shù)的第一句語句執(zhí)行前要先執(zhí)行一段“起始代碼”,正是這段代碼執(zhí)行了清零的工作.為此,我們需要對在編譯過后形成的startup.a51源文件進(jìn)行修改,然后用編譯程序所附帶的a51.exe程序?qū)tartup.a51編譯,得到startup.obj文件,然后用這段代碼代替原來的起始代碼.
〔1〕孫靜.C語言在單片機(jī)開發(fā)中的應(yīng)用[J].電子世界,2012(7).
TP368.1
A
1673-260X(2014)09-0026-02
黑龍江省科學(xué)技術(shù)研究指導(dǎo)項(xiàng)目:實(shí)踐教學(xué)中機(jī)器人技術(shù)的應(yīng)用(12533044)
赤峰學(xué)院學(xué)報·自然科學(xué)版2014年18期