新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > PIC單片機C語言程序設計(1)

        PIC單片機C語言程序設計(1)

        作者: 時間:2012-07-10 來源:網絡 收藏

        編者按:為了幫助具有匯編知識的技術人員或工程師,快速掌握利用C編寫程序的方法,本刊特推出《C》系列連載文章。丈中給出的C語言程序實例,均是可執行的,讀者可以放心引用。

        本文引用地址:http://www.104case.com/article/171169.htm

          一、匯編語言與C語言

          早期的單片機程序多采用匯編語言編寫。用匯編語言編程,直接、簡捷,可有效地訪問和控制各種硬件設備,如存儲器、I/O口等,目標代碼簡短、占用內存少、執行速度快、語句效率高。然而,由于匯編語言是面向機器的語言,不同廠家或同廠家不同系列的單片機。其匯編語言指令系統往往互不相同,即通常所說的“不兼容”。這就出現了精通51單片機匯編語言的人不能直接編寫PIC或其他單片機的匯編語言源程序,反之亦然的現象,以及產品升級換代和不同單片機問程序移植難的問題。而且,由于匯編語言是采用助記符的低級語言,可讀性較差,當源程序功能多、程序長時,即使加了注釋,閱讀自己編寫的程序也會感到困難,更不用說修改程序和增加功能了。

          目前,單片機的應用越來越廣,各半導體生產廠家不斷推出各種高、中、低檔單片機系列,以適應市場的需求。而客戶對單片機系統的設計人員的基本要求,就是要選擇能夠滿足產品性能和成本要求的單片機,并以最快的速度開發出完全滿足市場需求的智能化產品。用匯編語言編程顯然無法達到要求。

          用C語言開發單片機系統軟件的最大好處,是代碼效率高、軟件調試直觀、維護升級方便、代碼的重復利用率高、便于跨平臺的代碼移植等。因此,C語言在單片機系統設計中得到越來越廣泛的運用。

          C語言是一種高級語言,具有低級語言的特點,原來用各種匯編語言編寫的單片機程序,均可用C語言程序代換。

          二、C語言的特點

          C語言的特點可歸納如下。

          1.語言簡潔

          C是一種小型語言,共有32個關鍵字,9種控制語句,表示方法簡單,只需用規范的方法。就可以構造出功能很強的數據類型、語句和程序結構。如用++表示加1;一一表示減1;運算符省寫等。

          2.表達方式靈活實用

          C語言提供多種運算符和表達式值的方法,對問題的表達可通過多種途徑獲得,其更主動、靈活。它語法限制不太嚴格,自由度大,如對整型量與字符型數據及邏輯型數據可以通用等。

          3. 表達力強

          C語言有豐富的數據結構和運算符。包含了各種數據結構,如整型、數據類型、指針類型和聯合類型等,用來實現各種數據結構的運算。C語言的運算符有34種,范圍很寬,靈活使用各種運算符可以實現難度極大的運算。

          C語言能直接訪問硬件的物理地址,能進行位(bit)操作。兼有高級語言和低級語言的許多優點。

          它既可用來編寫系統軟件,又可用來開發應用軟件,已成為一種通用程序設計語言。

          4.C語言生成的目標代碼質量高

          C語言描述問題比匯編語言迅速,工作量小、可讀性好,易于調試、修改和移植,而代碼質量與匯編語言相當。

          5.結構化程序設計

          C語言是一種結構化語言,提供編寫結構化程序所需的控制流的結構語句,如for、while、do…while、lf…else等;用函數作為程序設計的基本單位,以實現程序的模塊化;其源文件還可分割為多個源文件,以分別對各源文件進行編譯,再連接生成可執行的目標碼(hex)文件。

          6.可移植性

          匯編語言是不可移植的。而C語言在不同機器上的C編譯程序,86%的代碼是公共的,所以C語言的編譯程序便于移植。在一個環境上用C語言編寫的程序,不改動或稍加改動,就可移植到另一個完全不同的環境中運行。

          三、學習方法

          用PIC單片機開發電子產品和用C語言編程,最主要的是要堅持學習,不能中斷。應通過各種實例程序來學習C語言的語法規則。要熟練掌握C語言的數據類型表達方法、各種運算符、各種語句結構。

          最好能背誦。要學會用C函數實現所需功能的方法。實際上,每個C函數都相當于一個功能模塊,一個C函數便可實現一種功能。

          此外,用C語言開發PIC單片機應用產品,必須具有PIC單片機匯編語言知識。如果你已經掌握了用匯編語言編寫PIC單片機源程序的方法,最好將編寫成功的PIC單片機匯編語言源程序,逐個用C語言源文件代換,從中體會C語言的優越性。

          四、簡單的C 語言程序

          為了幫助讀者進入C語言編程環境,要給大家介紹一個簡單的C語言程序。

          下面扼要介紹該程序所用到的C語言基本知識。更多的知識則在后文詳細介紹。

          1.主函數main( )

          C語言程序一般由若干個函數組成。函數是完成某個功能的算法的程序段,是C語言的基本組成單位。組成一個程序的若干函數,可以保存在一個或幾個源程序文件中,這些文件都以。C為擴展名(匯編語言以ASM為擴展名)。一個程序必須有且只能有一個名為main的函數,即是主函數main( )程序運行時,總是從主函數main( )開始執行的。

          2.C語言函數

          C語言程序的基本單位是函數。C語言程序必須有且只能有一個名為main的主函數。主函數可以調用其他函數,其他函數也可相互調用。被調用的函數可以是系統提供的庫函數,也可以是程序設計者自己編寫的函數——對于MCU (如PIC單片機),所用的大多是自己編寫的函數。一個函數由函數頭和函數體兩部分組成,每個函數的形式都相同。

         ?。?)函數頭由函數名(自定義名)、函數標志——( ),即一對圓括號,以及參數表,又稱函數形式參數名和參數說明(定義形式參數類型)組成。

          前兩項必須有,如主函數main( ),后兩項為即可選項。注意:函數名可包括函數類型和函數名字等。

          (2)函數體由一對花括號:{}括起來,括號內由若干語句組成。這些語句有兩種類型:一類是說明語句,又稱變量定義,其作用是定義函數中用到的變量;另一類是執行語句,又稱函數功能的執行部分。

          用于完成一定的功能,即算法處理。注意:有的函數沒有變量定義部分,但有若干執行語句。而在特定的情況下,則既無聲明部分,也無執行部分,如:

          Dump( )

          {}

          這是一個空函數。什么也不做,它也是合法的函數。

          再有,每個語句和數據定義的最后,必須有一個分號“;”(#define……的不加分號)。分號是C語言環境首先接觸到的基本符號,在以后的文章中我們還會深入介紹這些符號的用途。

        (3)賦值運算符賦值號“=”,即賦值運算符。

          賦值運算符有三種表達形式,這里先介紹一種簡單的賦值運算符。

          格式:變量=表達式。

          功能:先計算出表達式值(有些表達式已有結果,勿需計算),并將該值賦給等式左端的變量。賦值運算符是按照“自右而左”的順序進行作業的。例如:

          PORTB=0X0 3

          TRISB=0×0 0

          TRISA=0X0 F (0X代表十六進制)

          分別執行以下操作:把等式右邊的0X0 3送給等式左邊的端口寄存器PORTB口,即B口低兩位為高電平,其余6位為低電平;把0X0 0送給方向寄存器TRISB,即設置B口為輸出;把0×0 F送給方向寄存器TRISA,即設置A 口低四位為輸入,高四位為輸出。

          3.PIC16F84A點燈電路和C語言程序

          下面以控制PIC16F84A單片機端口寄存器PORTB口外接的8只LED任一位的亮滅為例,介紹相關C語言程序的編寫。電路如圖1所示。

          筆者使用的是MPLAB tDE V7 40集成開發環境及PICC編譯器,所生成的C語言源程序又稱源文件。

          在編寫C的源程序時,需要定義硬件的標志頭文件(也稱包含頭文件或頭文件)。因為用戶經常使用的標準寄存器地址和其位地址都被定義在Pic h標志頭文件中,按C語言編譯器編譯源程序的語法規則,在編寫C語言程序時,必須使用#include語句,把這個pic.h頭文件包含到自己的源程序中。即對于PIC中級產品的單片機,C語言程序的開頭是固定格式#includepic.h>。編譯器在編譯處理#includepic.h>語句時,會把pic.h的內容。復制到你的源程序中,這樣PICC才認為用戶使用的標準寄存器的端口地址和端1:3的位地址已經被定義,源程序就會合法地使用這些標準寄存器及其對應的位。關于MPLAP IDE V7.4和picc編譯器,在后文還會詳細介紹。

          4.PIC單片機端口寄存器的位定義

          這里介紹的PIC單片機端口的位定義,屬于需要背誦的內容。

          以PIRTB為例,PIC單片機端口寄存器的位(即8位)定義,實寫如下:

          5.延時函數

          PiC單片機C語言中的延時函數(即延時一定值),有多種等效的編寫,這里介紹一種最簡延時函數,在后文中,我們還會詳細介紹各種延時函數。

          函數中的K為給定的整形值

        6.C語言程序清單

          PIC16F84A單片機PORTB口外接8只LED間亮和位1、2、6外接的LED分別點亮的程序清單如下(源文件名PIC01.C):

          說明:以上是一個完整的,可執行圖1 LED點燈的C程序,主要由端口寄存器PORTB 1:3的位定義,延時函數delay ()定義; 主函數main()、延時函數void delay( )及各種語句等組成。

          該C程序第三行以符號“∥”開頭的說明文是一個注釋,它可在一行內寫完,亦可分多行寫完。注釋可寫在程序的任何位置,用于幫助閱讀和理解程序。說明程序的相關功能、注意事項,以及說明有關算法等。注釋應盡可能簡捷。在編譯時,注釋不產生代碼。C程序還可用“ ”開頭到“ ”結尾之間的內容作注釋,與符號“∥”開頭的注釋是等效的。

          上述程序的第一行,是引導程序開始的用#in—clude語句的頭文件。

          第二行是PIC單片機PORTB口的位定義,這里指8位,即(ddd)*8。

          第三行是第二行端口寄存器PORTB的位定義的注釋。

          第四行~第六行是端口寄存器PORTB口的RBO、RB1、RB6三位的定義,以便在后續程序中對其賦值之用。

          第七行是RBO、RB1、RB6三位的定義注釋。

          第八行是延時函數的定義第九行到結尾的功能(參看相關注釋)。

          關于端口寄存器的位表達方式。在用C語言編寫PIC單片機源文件時,一旦端口的位被定義,即(以端口PORTB為例);#daefine PORTBIT (ddd,bit)((unsigned)(ddd) 8+(bie)),在該條件下,端口PORTB的位有兩種表達方式,在C程序中均是等效的。以PORTB的0位為例:

          它們都是等效的。但一旦位定義中用了PORTB_ O.則在賦值時也應用PORTB—O: 或位定義用了PORT_O,對應賦值時也應用PORT_O。

        (待續)

        c語言相關文章:c語言教程




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 平江县| 松原市| 响水县| 乌苏市| 洛南县| 沈丘县| 大埔区| 新沂市| 三都| 珠海市| 大新县| 福海县| 江华| 南郑县| 新龙县| 六盘水市| 郁南县| 阳朔县| 五莲县| 东乌珠穆沁旗| 洛阳市| 吉水县| 油尖旺区| 从化市| 深泽县| 习水县| 磐安县| 达州市| 新巴尔虎右旗| 刚察县| 沂源县| 谢通门县| 图们市| 蓬安县| 河东区| 宣化县| 虎林市| 招远市| 冷水江市| 金塔县| 彩票|