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