PIC單片機C語(yǔ)言程序設計(1)
編者按:為了幫助具有PIC單片機匯編語(yǔ)言知識的技術(shù)人員或工程師,快速掌握利用C語(yǔ)言編寫(xiě)PIC單片機程序的方法,本刊特推出《PIC單片機C語(yǔ)言程序設計》系列連載文章。丈中給出的C語(yǔ)言程序實(shí)例,均是可執行的,讀者可以放心引用。
本文引用地址:http://dyxdggzs.com/article/171169.htm一、匯編語(yǔ)言與C語(yǔ)言
早期的單片機程序多采用匯編語(yǔ)言編寫(xiě)。用匯編語(yǔ)言編程,直接、簡(jiǎn)捷,可有效地訪(fǎng)問(wèn)和控制各種硬件設備,如存儲器、I/O口等,目標代碼簡(jiǎn)短、占用內存少、執行速度快、語(yǔ)句效率高。然而,由于匯編語(yǔ)言是面向機器的語(yǔ)言,不同廠(chǎng)家或同廠(chǎng)家不同系列的單片機。其匯編語(yǔ)言指令系統往往互不相同,即通常所說(shuō)的“不兼容”。這就出現了精通51單片機匯編語(yǔ)言的人不能直接編寫(xiě)PIC或其他單片機的匯編語(yǔ)言源程序,反之亦然的現象,以及產(chǎn)品升級換代和不同單片機問(wèn)程序移植難的問(wèn)題。而且,由于匯編語(yǔ)言是采用助記符的低級語(yǔ)言,可讀性較差,當源程序功能多、程序長(cháng)時(shí),即使加了注釋?zhuān)喿x自己編寫(xiě)的程序也會(huì )感到困難,更不用說(shuō)修改程序和增加功能了。
目前,單片機的應用越來(lái)越廣,各半導體生產(chǎn)廠(chǎng)家不斷推出各種高、中、低檔單片機系列,以適應市場(chǎng)的需求。而客戶(hù)對單片機系統的設計人員的基本要求,就是要選擇能夠滿(mǎn)足產(chǎn)品性能和成本要求的單片機,并以最快的速度開(kāi)發(fā)出完全滿(mǎn)足市場(chǎng)需求的智能化產(chǎn)品。用匯編語(yǔ)言編程顯然無(wú)法達到要求。
用C語(yǔ)言開(kāi)發(fā)單片機系統軟件的最大好處,是代碼效率高、軟件調試直觀(guān)、維護升級方便、代碼的重復利用率高、便于跨平臺的代碼移植等。因此,C語(yǔ)言在單片機系統設計中得到越來(lái)越廣泛的運用。
C語(yǔ)言是一種高級語(yǔ)言,具有低級語(yǔ)言的特點(diǎn),原來(lái)用各種匯編語(yǔ)言編寫(xiě)的單片機程序,均可用C語(yǔ)言程序代換。
二、C語(yǔ)言的特點(diǎn)
C語(yǔ)言的特點(diǎn)可歸納如下。
1.語(yǔ)言簡(jiǎn)潔
C是一種小型語(yǔ)言,共有32個(gè)關(guān)鍵字,9種控制語(yǔ)句,表示方法簡(jiǎn)單,只需用規范的方法。就可以構造出功能很強的數據類(lèi)型、語(yǔ)句和程序結構。如用++表示加1;一一表示減1;運算符省寫(xiě)等。
2.表達方式靈活實(shí)用
C語(yǔ)言提供多種運算符和表達式值的方法,對問(wèn)題的表達可通過(guò)多種途徑獲得,其程序設計更主動(dòng)、靈活。它語(yǔ)法限制不太嚴格,程序設計自由度大,如對整型量與字符型數據及邏輯型數據可以通用等。
3. 表達力強
C語(yǔ)言有豐富的數據結構和運算符。包含了各種數據結構,如整型、數據類(lèi)型、指針類(lèi)型和聯(lián)合類(lèi)型等,用來(lái)實(shí)現各種數據結構的運算。C語(yǔ)言的運算符有34種,范圍很寬,靈活使用各種運算符可以實(shí)現難度極大的運算。
C語(yǔ)言能直接訪(fǎng)問(wèn)硬件的物理地址,能進(jìn)行位(bit)操作。兼有高級語(yǔ)言和低級語(yǔ)言的許多優(yōu)點(diǎn)。
它既可用來(lái)編寫(xiě)系統軟件,又可用來(lái)開(kāi)發(fā)應用軟件,已成為一種通用程序設計語(yǔ)言。
4.C語(yǔ)言生成的目標代碼質(zhì)量高
C語(yǔ)言描述問(wèn)題比匯編語(yǔ)言迅速,工作量小、可讀性好,易于調試、修改和移植,而代碼質(zhì)量與匯編語(yǔ)言相當。
5.結構化程序設計
C語(yǔ)言是一種結構化語(yǔ)言,提供編寫(xiě)結構化程序所需的控制流的結構語(yǔ)句,如for、while、do…while、lf…else等;用函數作為程序設計的基本單位,以實(shí)現程序的模塊化;其源文件還可分割為多個(gè)源文件,以分別對各源文件進(jìn)行編譯,再連接生成可執行的目標碼(hex)文件。
6.可移植性
匯編語(yǔ)言是不可移植的。而C語(yǔ)言在不同機器上的C編譯程序,86%的代碼是公共的,所以C語(yǔ)言的編譯程序便于移植。在一個(gè)環(huán)境上用C語(yǔ)言編寫(xiě)的程序,不改動(dòng)或稍加改動(dòng),就可移植到另一個(gè)完全不同的環(huán)境中運行。
三、學(xué)習方法
用PIC單片機開(kāi)發(fā)電子產(chǎn)品和用C語(yǔ)言編程,最主要的是要堅持學(xué)習,不能中斷。應通過(guò)各種實(shí)例程序來(lái)學(xué)習C語(yǔ)言的語(yǔ)法規則。要熟練掌握C語(yǔ)言的數據類(lèi)型表達方法、各種運算符、各種語(yǔ)句結構。
最好能背誦。要學(xué)會(huì )用C函數實(shí)現所需功能的方法。實(shí)際上,每個(gè)C函數都相當于一個(gè)功能模塊,一個(gè)C函數便可實(shí)現一種功能。
此外,用C語(yǔ)言開(kāi)發(fā)PIC單片機應用產(chǎn)品,必須具有PIC單片機匯編語(yǔ)言知識。如果你已經(jīng)掌握了用匯編語(yǔ)言編寫(xiě)PIC單片機源程序的方法,最好將編寫(xiě)成功的PIC單片機匯編語(yǔ)言源程序,逐個(gè)用C語(yǔ)言源文件代換,從中體會(huì )C語(yǔ)言的優(yōu)越性。
四、簡(jiǎn)單的C 語(yǔ)言程序
為了幫助讀者進(jìn)入C語(yǔ)言編程環(huán)境,要給大家介紹一個(gè)簡(jiǎn)單的C語(yǔ)言程序。
下面扼要介紹該程序所用到的C語(yǔ)言基本知識。更多的知識則在后文詳細介紹。
1.主函數main( )
C語(yǔ)言程序一般由若干個(gè)函數組成。函數是完成某個(gè)功能的算法的程序段,是C語(yǔ)言的基本組成單位。組成一個(gè)程序的若干函數,可以保存在一個(gè)或幾個(gè)源程序文件中,這些文件都以。C為擴展名(匯編語(yǔ)言以ASM為擴展名)。一個(gè)程序必須有且只能有一個(gè)名為main的函數,即是主函數main( )程序運行時(shí),總是從主函數main( )開(kāi)始執行的。
2.C語(yǔ)言函數
C語(yǔ)言程序的基本單位是函數。C語(yǔ)言程序必須有且只能有一個(gè)名為main的主函數。主函數可以調用其他函數,其他函數也可相互調用。被調用的函數可以是系統提供的庫函數,也可以是程序設計者自己編寫(xiě)的函數——對于MCU (如PIC單片機),所用的大多是自己編寫(xiě)的函數。一個(gè)函數由函數頭和函數體兩部分組成,每個(gè)函數的形式都相同。
?。?)函數頭由函數名(自定義名)、函數標志——( ),即一對圓括號,以及參數表,又稱(chēng)函數形式參數名和參數說(shuō)明(定義形式參數類(lèi)型)組成。
前兩項必須有,如主函數main( ),后兩項為即可選項。注意:函數名可包括函數類(lèi)型和函數名字等。
?。?)函數體由一對花括號:{}括起來(lái),括號內由若干語(yǔ)句組成。這些語(yǔ)句有兩種類(lèi)型:一類(lèi)是說(shuō)明語(yǔ)句,又稱(chēng)變量定義,其作用是定義函數中用到的變量;另一類(lèi)是執行語(yǔ)句,又稱(chēng)函數功能的執行部分。
用于完成一定的功能,即算法處理。注意:有的函數沒(méi)有變量定義部分,但有若干執行語(yǔ)句。而在特定的情況下,則既無(wú)聲明部分,也無(wú)執行部分,如:
Dump( )
{}
這是一個(gè)空函數。什么也不做,它也是合法的函數。
再有,每個(gè)語(yǔ)句和數據定義的最后,必須有一個(gè)分號“;”(#define……的不加分號)。分號是C語(yǔ)言環(huán)境首先接觸到的基本符號,在以后的文章中我們還會(huì )深入介紹這些符號的用途。
(3)賦值運算符賦值號“=”,即賦值運算符。
賦值運算符有三種表達形式,這里先介紹一種簡(jiǎn)單的賦值運算符。
格式:變量=表達式。
功能:先計算出表達式值(有些表達式已有結果,勿需計算),并將該值賦給等式左端的變量。賦值運算符是按照“自右而左”的順序進(jìn)行作業(yè)的。例如:
PORTB=0X0 3
TRISB=0×0 0
TRISA=0X0 F (0X代表十六進(jìn)制)
分別執行以下操作:把等式右邊的0X0 3送給等式左邊的端口寄存器PORTB口,即B口低兩位為高電平,其余6位為低電平;把0X0 0送給方向寄存器TRISB,即設置B口為輸出;把0×0 F送給方向寄存器TRISA,即設置A 口低四位為輸入,高四位為輸出。
3.PIC16F84A點(diǎn)燈電路和C語(yǔ)言程序
下面以控制PIC16F84A單片機端口寄存器PORTB口外接的8只LED任一位的亮滅為例,介紹相關(guān)C語(yǔ)言程序的編寫(xiě)。電路如圖1所示。
筆者使用的是MPLAB tDE V7 40集成開(kāi)發(fā)環(huán)境及PICC編譯器,所生成的C語(yǔ)言源程序又稱(chēng)源文件。
在編寫(xiě)C的源程序時(shí),需要定義硬件的標志頭文件(也稱(chēng)包含頭文件或頭文件)。因為用戶(hù)經(jīng)常使用的標準寄存器地址和其位地址都被定義在Pic h標志頭文件中,按C語(yǔ)言編譯器編譯源程序的語(yǔ)法規則,在編寫(xiě)C語(yǔ)言程序時(shí),必須使用#include語(yǔ)句,把這個(gè)pic.h頭文件包含到自己的源程序中。即對于PIC中級產(chǎn)品的單片機,C語(yǔ)言程序的開(kāi)頭是固定格式#includepic.h>。編譯器在編譯處理#includepic.h>語(yǔ)句時(shí),會(huì )把pic.h的內容。復制到你的源程序中,這樣PICC才認為用戶(hù)使用的標準寄存器的端口地址和端1:3的位地址已經(jīng)被定義,源程序就會(huì )合法地使用這些標準寄存器及其對應的位。關(guān)于MPLAP IDE V7.4和picc編譯器,在后文還會(huì )詳細介紹。
4.PIC單片機端口寄存器的位定義
這里介紹的PIC單片機端口的位定義,屬于需要背誦的內容。
以PIRTB為例,PIC單片機端口寄存器的位(即8位)定義,實(shí)寫(xiě)如下:
5.延時(shí)函數
PiC單片機C語(yǔ)言中的延時(shí)函數(即延時(shí)一定值),有多種等效的編寫(xiě),這里介紹一種最簡(jiǎn)延時(shí)函數,在后文中,我們還會(huì )詳細介紹各種延時(shí)函數。
函數中的K為給定的整形值
6.C語(yǔ)言程序清單
PIC16F84A單片機PORTB口外接8只LED間亮和位1、2、6外接的LED分別點(diǎn)亮的程序清單如下(源文件名PIC01.C):
說(shuō)明:以上是一個(gè)完整的,可執行圖1 LED點(diǎn)燈的C程序,主要由端口寄存器PORTB 1:3的位定義,延時(shí)函數delay ()定義; 主函數main()、延時(shí)函數void delay( )及各種語(yǔ)句等組成。
該C程序第三行以符號“∥”開(kāi)頭的說(shuō)明文是一個(gè)注釋?zhuān)稍谝恍袃葘?xiě)完,亦可分多行寫(xiě)完。注釋可寫(xiě)在程序的任何位置,用于幫助閱讀和理解程序。說(shuō)明程序的相關(guān)功能、注意事項,以及說(shuō)明有關(guān)算法等。注釋?xiě)M可能簡(jiǎn)捷。在編譯時(shí),注釋不產(chǎn)生代碼。C程序還可用“ ”開(kāi)頭到“ ”結尾之間的內容作注釋?zhuān)c符號“∥”開(kāi)頭的注釋是等效的。
上述程序的第一行,是引導程序開(kāi)始的用#in—clude語(yǔ)句的頭文件。
第二行是PIC單片機PORTB口的位定義,這里指8位,即(ddd)*8。
第三行是第二行端口寄存器PORTB的位定義的注釋。
第四行~第六行是端口寄存器PORTB口的RBO、RB1、RB6三位的定義,以便在后續程序中對其賦值之用。
第七行是RBO、RB1、RB6三位的定義注釋。
第八行是延時(shí)函數的定義第九行到結尾的功能(參看相關(guān)注釋?zhuān)?/font>
關(guān)于端口寄存器的位表達方式。在用C語(yǔ)言編寫(xiě)PIC單片機源文件時(shí),一旦端口的位被定義,即(以端口PORTB為例);#daefine PORTBIT (ddd,bit)((unsigned)(ddd) 8+(bie)),在該條件下,端口PORTB的位有兩種表達方式,在C程序中均是等效的。以PORTB的0位為例:
它們都是等效的。但一旦位定義中用了PORTB_ O.則在賦值時(shí)也應用PORTB—O: 或位定義用了PORT_O,對應賦值時(shí)也應用PORT_O。
(待續)
c語(yǔ)言相關(guān)文章:c語(yǔ)言教程
評論