今天我們要說的不是stm32是關于單片機開發中所應用到的C語言基礎的,如果文字看不下去可以看文章尾部視頻,主要是在要寫這一篇文章開始我也是頭疼的,原因就是有點長,當然也有借鑒的地方!!嘿嘿
C是單片機開發的必備基礎,也是一定要學的,但是單片機的C語言和純C語言開發相比學的東西要少很多,也正是因為這樣剛剛學習單片機的朋友不要看到要學習C語言就開始發怵,其實這個是沒有必要的,其學習深度是不一樣的,多以不要過于擔心!!
下面來進入今天的主題單片機C語言編程基礎。
用一個簡單的c程序例子,介紹c語言的基本構成、格式、以及良好的書寫風格,使小伙伴對c語言有個初步認識。
例1:計算兩個整數之和的c程序:
#include main() { int a,b,sum; /*定義變量a,b,sum為整型變量*/ a=20; /*把整數20賦值給整型變量a*/ b=15; /*把整數15賦值給整型變量b*/ sum=a+b; /*把兩個數之和賦值給整型變量sum*/ printf(“a=%d,b=%d,sum=%dn”,a,b,sum); /*把計算結果輸出到顯示屏上*/ }
重點說明:
1、任何一個c語言程序都必須包括以下格式:
main() { }
這是c語言的基本結構,任何一個程序都必須包含這個結構。括號內可以不寫任何內容,那么該程序將不執行任何結果。
2、main()----在c語言中稱之為“主函數”,一個c程序有且僅有一個main函數,任何一個c程序總是從main函數開始執行,main函數后面的一對圓括號不能省略。
3、被大括號{ }括起來的內容稱為main函數的函數體,這部分內容就是計算機要執行的內容。
4、在{ }里面每一句話后面都有一個分號(;),在c語言中,我們把以一個分號結尾的一句話叫做一個c語言的語句,分號是語句結束的標志。
5、printf(“a=%d,b=%d,sum=%dn”,a,b,sum); ----通過執行這條c語言系統提供給我們直接使用的屏幕輸出函數,用戶即可看到運行結果,本程序運行后,將在顯示器上顯示如下結果:
a=20,b=15,sum=35
6、#include
注意:(1)以#號開頭 (2)不以分號結尾 這一行沒有分號,所以不是語句,在c語言中稱之為命令行,或者叫做“預編譯處理命令”。
7、程序中以 /*開頭并且以*/結尾的部分表示程序的注釋部分,注釋可以添加在程序的任何位置,為了提高程序的可讀性而添加,但計算機在執行主函數內容時完全忽略注釋部分,換而言之就是計算機當做注釋部分不存在于主函數中。
C程序的生成過程
C程序是先由源文件經編譯生成目標文件,然后經過連接生成可執行文件。
源程序的擴展名為 .c ,目標程序的擴展名為 .obj , 可執行程序的擴展名為 .exe 。
在編寫程序時,必須為函數、變量等命名,這個名字稱為標識符。C語言中標識符的命名規則如下:
標識符只能由字母、數字、下劃線組成;
標識符的第一個字母必須是字母和下劃線;
標識符區分大小寫字母,如If和if是兩個完全不同的標識符。
合法標識符如下: A6, b_3 , _mn 非法的標識符如下: ab#12 , 8m , tr3:4 , yes no
標識符不能與程序中具有特殊意義的關鍵字相同,不能與用戶編制的函數名、C語言庫函數相同,在程序中各種標識符盡量不要重復,以便區分。選擇變量名和其他標識符時,應注意做到 “見名知義”。
標識符分為如下三類:
1、關鍵字
關鍵字是具有特定含義的,專門用來說明c語言特定成分的一類標識符,不能用作用戶的標識符。
auto break case char union do double else enum extern goto if int long short signed static sizof struct switch void for while typedef float return typedef default
2、預定義標識符
預定義標識符在c語言中也有特定的含義,但可以用作用戶標識符,預定義標識符分為兩類:
(1)、庫函數名字,比如(printf,scanf,sin,isdigit等) (2)、編譯處理命令名,比如(define,include)
3、用戶標識符
用戶根據需要自己定義的標識符稱為用戶標識符。無論如何自定義標識符,都必須符合標識符的三條命名規則。
常量
在程序運行中,其值不能被改變的量稱為常量。常量有5種類型:整型常量、實型常量、字符常量、字符串常量和符號常量。
(一)數值轉換
數字的四種表現形式:
①:二進制:所有數字由0,1構成,逢二進一,二進制數中不會出現2.。 例:
②:八進制:以數字0(注意不是以字母O,o)開頭,所有數字由0~7構成,逢八進一,八進制數中不會出現8。 例:0112,0123,077等
③:十進制:所有數字由0~9構成,逢十進一,十進制數中不會出現10。 例:0,12,-15等
④:十六進制:以0x或者0X(數字0加字母x)開頭,所有數字由0~9,A~F(或者a~f)構成,逢十六進一(其中A、B、C、D、E、F分別代表10、11、12、13、14、15) 例:0x4A、0X14c7等
在計算機內部,數字均以二進制形式表示和存放,用戶輸入的普通十進制數字都要被計算機轉換成二進制才能在計算機內部存儲,同樣計算機的運算結果也為二進制,一般要將其轉換成十進制數再輸出給用戶閱讀,這種轉換通常由計算機自動實現。
(1)將十進制轉換二進制、八進制和十六進制
除法:將十進制數除以2,記錄余數,得到的商繼續除以2,直到商為0,然后將各次相處所得的余數從后往前逆序排列,所得余數數字序列就是該十進制數對應的二進制數。八進制和十六進制轉換方法同上。
例:十進制數13轉換成二進制數的值為1101,轉換八進制為015,轉換成十六進制為D.
(2)將二進制、八進制和十六進制轉換成十進制
乘積求和:將二進制的每一位從低位到高位(右邊為低位,左邊為高位)分別乘以20,21,22。。。。,然后將這些積求和。
例如:=(13)10 (317)8= (23E)16=
(3)二進制與八進制、十六進制數之間的相互轉換
①:二進制轉八進制:從右往左每三位一組轉換成十進制數,將所得數據組合就是對應的八進制數(注意:高位不足三位補零)。 例:(010 110 111)2=(267)8
②:二進制轉十六進制:從右往左每四位一組轉換成十進制數,將所得數據組合就是對應的十六進制數(注意:高位不足四位補零)。 例:(0101 1011)2=(5B)16
③:八進制轉化二進制:每一位數字轉換為三位二進制數字 例:(13)8=(001 011)2= (注意:去掉前面的兩個00,因為0在高位沒有意義)
④:十六進制轉化二進制:每一位數字轉換為四位二進制數字 例:(E3)16=(1110 0011)2
(二)整型常量
整型常量有3種形式:十進制整型常量、八進制整型常量和十六進制整型常量。
(注意:c語言中沒有直接表示二進制的整型常量,在c語言源程序中不會出現二進制。)
書寫方式如下:
十進制整型常量:123 , 0 ,-24 , 85L(長整型常量) 等 八進制整型常量:051 ,-026 ,0773 等 十六進制整型常量:0x55 , 0x1101 , 0x , 0x5AC0 , -0xFF。 其中L為長整型。
(三)實型常量
實型常量有兩種表示形式:小數形式和指數形式。
小數形式:5.4 0.074 -23.0 指數形式:5.4e0 4.3e-3 -3.3e4
(1)小數部分為0的實型常量,可以寫為453.0 或453。 (2)用小數表示時,小數點的兩邊必須有數,不能寫成“ .453“和“453.“,而應該寫成“0.453“和“453.0“。 (3)用指數寫法時,e前必須有數字,e后面的指數必須為整數(注意:整數階碼可以是正數,負數,也可以是八進制數、十六進制數,但必須為整數)。
(四)字符常量
字符常量的標志是一對單引號‘ ’,c語言中的字符常量有兩類:
(1)由一對單引號括起來的一個字符,如‘a ’, ‘r’ ,‘#’。注意: ′a′ 和 ′A′ 是兩個不同的字符常量。
(2)由一對單引號括起來,以反斜杠開頭,后跟若干數字或者字母,比如‘n’,其中““是轉義的意思,后面跟不同的字符表示不同的意思,這類字符常量叫轉義字符。具體如圖所示 。
轉義字符 轉義字符的意義 ASCII碼
n 回車換行 10 t 橫向跳到下一制表位置 9 b 退格 8 r 回車 13 f 走紙換頁 12 反斜線符"" 92 ' 單引號符 39 ” 雙引號符 34 a 鳴鈴 7 ddd 1~3位八進制數所代表的字符 xhh 1~2位十六進制數所代表的字符
(五)字符串常量
C語言中,以雙引號括起來的,由若干個字符組成的序列即為字符串常量。
例:“ni hao” “happy”等等。
(六)符號常量
符號常量是由宏定義“#define“定義的常量,在C程序中可用標識符代表一個常量。
例:計算圓的面積的c程序。
#include #define PI 3. main() { float r,s; r=12.5; S=PI *r*r; printf(“s= %f ”,s); }
說明:
#define 是宏定義,此程序中所有出現PI的地方都代表3.,同時PI稱為符號常量。習慣上我們用大寫字母來表示符號常量,小寫字母表示變量,這樣比較容易區別。
變量
變量就是其值可以改變的量。變量要有變量名,在內存中占據一定的存儲單元,存儲單元里存放的是該變量的值。不同類型的變量其存儲單元的大小不同,變量在使用前必須定義。
(一)整型變量
整型變量分為4種:基本型(int)、短整型(short int 或short)、長整型(long int 或 long)和無符號型( int , short, long)。
不同的編譯系統對上述四種整型數據所占用的位數和數值范圍有不同的規定。
類型說明符
單詞signed來說明“有符號”(即有正負數之分),不寫signed也隱含說明為有符號,用來說明“無符號”(只表示正數)。
(二)實型變量
C語言中,實型變量分為單精度類型( float )和雙精度類型( double )兩種。如:
float a , b ; double m ;
在vc中,float 型數據在內存中占4個字節(32位),double型數據占8個字節。單精度實數提供7位有效數字,雙精度實數提供15~16位有效數字。實型常量不分float型和double型,一個實型常量可以賦給一個float 型或double型變量,但變量根據其類型截取實型常量中相應的有效數字。
注意:實型變量只能存放實型值,不能用整型變量存放實型值,也不能用實型變量存放整型值。
(三)字符變量
字符變量用來存放字符常量,定義形式:
char 變量名;
其中關鍵字char定義字符型數據類型,占用一個字節的存儲單元。
例:char cr1,cr2; cr1= ‘A’ , cr2=‘B’ ;
將一個字符賦給一個字符變量時,并不是將該字符本身存儲到內存中,而是將該字符對應的ASCII碼存儲到內存單元中。例如,字符 ′A′ 的ASCII碼為65,在內存中的存放形式如下:0
由于在內存中字符以ASCII碼存放,它的存儲形式和整數的存儲形式類似,所以C語言中字符型數據與整型數據之間可以通用,一個字符能用字符的形式輸出,也能用整數的形式輸出,字符數據也能進行算術運算,此時相當于對它們的ASCII碼進行運算。
類型的自動轉換和強制轉換
當同一表達式中各數據的類型不同時,編譯程序會自動把它們轉變成同一類型后再進行計算。轉換優先級為:
char < int < float < double
即左邊級別“低“的類型向右邊轉換。具體地說,若在表達式中優先級最高的數據是double型,則此表達式中的其他數據均被轉換成double型,且計算結果也是double型;若在表達式中優先級最高的數據是float型,則此表達式中的其他數據均被轉換成float型,且計算結果也是float型。
在做賦值運算時,若賦值號左右兩邊的類型不同,則賦值號右邊的類型向左邊的類型轉換;當右邊的類型高于左邊的類型時,則在轉換時對右邊的數據進行截取。
除自動轉換外,還有強制轉換,表示形式是:
( 類型 )(表達式); 例:(int)(a+b)
討論:當a值賦值為3.4,b值賦值為2.7,(int)(a+b)和(int)a+b的值分別為多少?
C運算符認識
C語言的運算符范圍很廣,可分為以下幾類:
、算術運算符:用于各類數值運算。包括加(+)、減(-)、乘(*)、除(/)、求余(%)、自增(++)、自減(--)共七種。
、賦值運算符:用于賦值運算,分為簡單賦值(=)、復合算術賦值(+=,-=,*=,/=,%=)和復合位運算賦值(&=,|=,^=,>>=, & ∧ | 。
例1:左移運算符“”右邊的數指定移動的位數。
例如: 設 a=15, a>>2 表示把右移為十進制3)。
應該說明的是,對于有符號數,在右移時,符號位將隨同移動。當為正數時,最高位補0,而為負數時,符號位為1,最高位是補0或是補1 取決于編譯系統的規定。
例3:設二進制數a是00 ,若通過異或運算a∧b 使a的高4位取反,低4位不變,則二進制數b是。
解析:異或運算常用來使特定位翻轉,只要使需翻轉的位與1進行異或操作就可以了,因為原數中值為1的位與1進行異或運算得0 ,原數中值為0的位與1進行異或運算結果得1。而與0進行異或的位將保持原值。異或運算還可用來交換兩個值,不用臨時變量。
如 int a=3 , b=4;,想將a與b的值互換,可用如下語句實現: a=a∧b;
b=b∧a;
a=a∧b;
所以本題的答案為: 。
C語言作為一門非常適合編程入門的語言也是嵌入式單片機行業必備的開發語言,打好基礎的重要性不言而喻。
開始就說了文章結尾會有視頻這就給大家奉上C語言基礎視頻資料
嵌入式/物聯網-C語言編程基礎