天天看點

《迷人的8051單片機》----第3章 入門C語言 3.1資料和運算

本節書摘來自華章出版社《迷人的8051單片機》一書中的第3章,第3.1節,作者高顯生,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

<b>第3章</b>

<b>入門c語言</b>

單片機是一種可程式設計的器件,我們需要将程式預先編寫好,并儲存到單片機的存儲器中,單片機才能按照預先的設定執行程式。在給單片機開發應用程式時,使用c語言編寫代碼已經是一種趨勢,c語言博大精深,學精不易,但入門卻十分簡單,本章将帶領你用最便捷的方式快速學習c語言,并且在短時間内學會編寫c應用程式。

<b>3.1 資料和運算</b>

<b>3.1.1 c語言的由來</b>

語言是編寫程式時人與單片機之間的交流方式,最初人們使用機器碼(0與1組合)來給單片機編寫程式,後來開始使用彙編語言來編寫程式,彙編語言和單片機的硬體結合性好,代碼簡潔高效,使用彙編語言開發的程式在單片機存儲空間有限的環境裡能大顯身手。随着近年來flash存儲器技術被大量地應用,單片機的存儲空間已經不再是瓶頸,使用彙編語言開發程式的優勢已經不複存在,而c語言因其具有描述能力強、可移植性好、邏輯缜密、子產品化結構等諸多優點,非常适合大型程式的開發,近年來在嵌入式系統的程式開發中被越來越廣泛地應用。

c語言有着悠久的曆史和衆多使用者群。1970年,美國貝爾實驗室的 ken thompson,以bcpl語言為基礎,設計出既簡單又接近硬體的b語言,并且用b語言編寫了第一個unix作業系統。1972年,美國貝爾實驗室的 d.m.ritchie 在b語言的基礎上設計出一種新的語言,并且以bcpl語言的第二個字母作為這種語言的名字,即c語言。1977年,d.m.ritchie發表了不依賴于具體機器系統的c語言編譯文本——《可移植的c語言編譯程式》,使c語言程式可以使用在任意架構的處理器上,隻要該處理器具有對應的c語言編譯器和庫,然後将c源代碼編譯、連結成目标二進制檔案之後即可在目标處理器上運作。

1982年,很多有識之士和美國國家标準學會(ansi)為了使c語言健康地發展下去,成立了c标準委員會,建立了c語言的标準。1989年,ansi釋出了第一個完整的c語言标準ansi x3.159#1989,簡稱“c89”,也就是我們經常說的“ansi c”,c語言從此步入了規範化的道路。

<b>3.1.2 數的進制</b>

我們在日常生活中大多使用十進制,即逢十進一,這主要是由人們的使用習慣決定的。其實在生活中還有許多不同的進位制度,如時間的表示方法是六十進制,即一小時等于六十分鐘,一分鐘等于六十秒等,還有常用的表示數量的機關“一打”是十二進制等。在計算機中,常用的進位制度有二進制、十進制、八進制和十六進制。

<b>1. 二進制(binary)</b>

二進制數由0和1兩個符号來表示,基數為2,按逢2進1、借1算2的規則計數。

例如:

<b>2. 十進制(decimal)</b>

十進制數由0、1、2、3、4、5、6、7、8、9十個數字元号表示,基數為10,按逢10進1、借1算10的規則計數。例如:

<b>3. 八進制(octal)</b>

八進制數由0、1、2、3、4、5、6、7八個數字元号表示,基數為8,按逢8進1、借1算8的規則計數。例如:

<b>4. 十六進制(hexadecimal)</b>

十六進制數由0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f十六個數字元号表示,基數為16,按逢16進1、借1算16的規則計數。在c語言中表示十六進制數時,大小寫字母的含義相同。例如:

對于不同進制的數字間的轉換在這裡不做太多的叙述,對于初學者來講,使用pc中的電腦來進行不同進制數字間的轉換是一個友善快捷的辦法,電腦的使用如圖3-1所示。打開電腦軟體,如要将十進制數“254”轉換成二進制數,可以首先在電腦中選擇十進制,輸入數字“254”,再用滑鼠單擊選擇二進制,這時電腦中即可顯示經轉換後的二進制數“11111110”。

《迷人的8051單片機》----第3章 入門C語言 3.1資料和運算

<b>3.1.3 碼制</b>

在計算機内部,所有的資訊都要使用二進制的方法來表示,因為二進制的0和1兩個數字恰好與存儲單元的“有”和“無”相對應。不僅如此,數的符号“+”或“-”也需要用二進制數來表示,在通常情況下,用0表示正數的符号“+”,用1表示負數的符号“-”。當數的符号和數值表示方法使用二進制時,這樣的數被稱為“機器碼”。機器碼有不同的碼制,對應不同的表示方法,常用的碼制有原碼、反碼和補碼三種。

1)原碼:原碼用最高位表示數的符号位,數值部分用二進制的絕對值表示。

2)反碼:正數的反碼與其原碼相同,負數的反碼是将符号位除外,其他各位按位取反。

3)補碼:正數的補碼與其原碼相同,負數的補碼是其反碼加1。

數的原碼、反碼和補碼的表示方法詳見表3-1。

《迷人的8051單片機》----第3章 入門C語言 3.1資料和運算

<b>3.1.4 資料類型</b>

程式運作的目的是對資料進行處理,在c語言中資料是有類型區分的,具體分類如下:

在以上的資料類型分類中,基本類型是不可以再次拆分為其他資料類型的;構造類型則是在基本類型的基礎上,按照一定方式組合而成的資料類型;指針類型是一種特殊的資料類型,其值通常用來表示某一個量在記憶體中的存放位址;空類型是指在對函數進行定義時,若函數沒有傳回值,我們會在函數的名稱前面加上“void”,以此表明該函數是“空類型”。

《迷人的8051單片機》----第3章 入門C語言 3.1資料和運算

<b>3.1.5 常量</b>

常量是指在程式的運作過程中,其值不能被改變的量。常量的種類有整型、實型、字元型和字元串常量四種。

1)整型常量:十進制的整數表示方法非常簡單,如29、-18、156等。十六進制的整數通常以0x(或0x)開頭,如0xfe、0xd7a9、0x7d等。八進制的整數則以0開頭,如057,其值相當于十進制的47。

2)實型常量:實數有兩種表示方法,一種是十進制的小數形式,如0.625、-16.5等;另一種是采用指數形式,即用e(或e)後面跟一個整數,表示以10為底的幂指數,如256.5的表示方法是2.565e2。

3)字元型常量:字元型常量的表示方法是用單引号引出,如‘a’、‘b’等。

4)字元串常量:字元串常量用雙引号引出,如“good”“thank you”等。

<b>3.1.6 變量</b>

變量是指在程式運作過程中其值可以改變的量。在c語言中使用變量時,要先給變量命名,還要給變量定義資料類型,有時還須指定變量的存儲地點。

為什麼要給變量定義資料類型呢?在數學上,一個數可以是+∞也可以是-∞,但是在計算機中,存儲單元是有限的,是以必須根據資料的大小為其配置設定合适的存儲空間。定義資料類型實際上就是為變量在記憶體中配置設定特定的存儲空間,以便于用這個空間來存儲相關的資料。如果将變量比喻成用于存儲資料的盒子,指定資料類型就是指定盒子的大小,既要裝下要裝的東西,又不會造成空間的浪費。c語言中變量的資料類型詳見表3-2。

《迷人的8051單片機》----第3章 入門C語言 3.1資料和運算

變量在程式中需要先定義後使用。定義變量的方法是先給變量指定名稱和資料類型,這樣編譯器才能為變量配置設定相應的存儲空間。定義變量的方式如下:

資料類型 變量名表;(多個變量名稱之間要用逗号分隔)

在c程式中定義變量的方法可以參考如下語句:

<b>3.1.7 運算符</b>

c語言的運算符非常豐富,在程式中使用這些運算符來處理各種基礎操作,進而完成特定的功能。c語言的運算符主要有以下幾種:

<b>1. 算術運算符</b>

+ :加法運算符,或為取正值運算符。例如,3+5、a+b、+23。

– :減法運算符,或為取負值運算符。例如,18-17、time1-time2、-78。

* :乘法運算符。例如,5*8、ad*af。

/ :除法運算符。在這裡除法運算符和一般的算術運算規則有所不同,如果是兩個浮點數相除,結果也是浮點數。如果兩個整數相除,結果也是整數。例如,10.0/20.0 結果為0.5,7/2結果為3,而不是3.5。

% :求餘運算符。%兩側均應是整數。例如,10%3結果為1。

在上述的運算符中,我們同樣可以用“()”來改變運算的優先級,這同我們在國小時學的是一樣的,如(a+b)* c 就需要先計算a與b的和,再計算與c的積。

<b>2. 指派運算符</b>

= :指派運算符。在c語言中用于給變量指派,其方法可以參考以下語句:

<b>3. 自增、自減運算符</b>

++ :自增運算符。作用是使變量的值自增1。例如,i++,表示讓變量i的值自增1。

- - :自減運算符。作用是使變量的值自減1。例如,a--,表示讓變量a的值自減1。

<b>4. 關系運算符</b>

關系運算符通常是用來判别兩個變量是否符合某個條件的,是以使用關系運算符的運算結果隻有“真”或“假”,即“1”或“0”兩種。

&gt; :大于。例如,a&gt;b。

&lt; :小于。例如,num1&lt;num2。

&gt;= :大于等于。例如,u&gt;=5。

&lt;= :小于等于。例如,p&lt;=7。

= = :等于。例如,team1= =team2 ,在這裡要差別于指派運算符“=”,它表示的意思不是将team2的值賦給team1,而是用來判定team1是不是同team2的值相等。

!= :不等于。例如,a!=b。

<b>5. 位運算符</b>

位運算是c語言的一大特色。所謂位運算形象地說就是指将數值以二進制位的方式進行相關的運算,參與位運算的數必須是整型或字元型的資料,實型(浮點型)的數不能參與位運算。

&amp; :按位“與”運算符。它是實作“必須都有,否則就沒有”的運算。它的規則如下。

在實際應用中,按位“與”運算常用來對某些位清零或保留某些位。

例如,a的值為: a=1001 0010

隻想保留a的高四位,則用: a &amp; 1111 0000

“與”運算後a的值為: 1001 0000

| :按位“或”運算符。它是實作“隻要其中之一有,就有”的運算。它的規則如下。

在實際應用中,“或”運算常用來将一個數值的某些位定值為“1”。

想将a的低四位定值為1, 則用: a|0000 1111

“或”運算後a的值為: 1001 1111

^ :按位“異或”運算符。它是實作“兩個不同就有,相同就沒有”的運算。它的規則如下。

在實際應用中,“異或”運算常用來使數值的特定位翻轉。

例如,a的值為: a=1001 1010

想将a的低四位翻轉,即0變1,1變0,則用: a ^ 0000 1111

“異或”運算後a的值為: 1001 0101

~ :按位“取反”運算符。它是實作“是非颠倒”的運算。它的運算規則如下。

例如,a的值為: 1001 1010

按位“取反”運算後,其值為: 0110 0101

&lt;&lt; :“左移”運算符。它是實作将一個二進制數的每一位都左移若幹位的運算。“左移”運算的方法如圖3-2所示。

&gt;&gt; :“右移”運算符。它是實作将一個二進制數的每一位都右移若幹位的運算。“右移”運算的方法如圖3-3所示。

《迷人的8051單片機》----第3章 入門C語言 3.1資料和運算
《迷人的8051單片機》----第3章 入門C語言 3.1資料和運算

<b>3.1.8 複合指派運算符</b>

在指派運算符“=”之前加上其他雙目運算符,就可以構成複合指派運算符。複合指派運算符有+=、-=、*=、/=、%=、&lt;&lt;=、&gt;&gt;=、&amp;=、^= 和 |=。

構成複合指派表達式的方式為:

變量 雙目運算符 = 表達式

它相當于:

變量 = 變量 運算符 表達式

對于初學者來說,複合指派運算符的這種書寫方法也許不太習慣,但它有利于編譯器的編譯和處理,可以産生高品質的目标代碼。

繼續閱讀