PIC单晶片的C语言.ppt_第1页
PIC单晶片的C语言.ppt_第2页
PIC单晶片的C语言.ppt_第3页
PIC单晶片的C语言.ppt_第4页
PIC单晶片的C语言.ppt_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PIC單片機的C語言程式設計 一 PIC單片機C語言程式設計簡介用C語言來開發單片機系統軟體最大的好處是編寫代碼效率高 軟體調試直觀 維護升級方便 代碼的重複利用率高等 因此C語言程式設計在單片機系統設計中已得到越來越廣泛的運用 PIC單片機的軟體發展 同樣可以用C語言實現 Microchip公司沒有自行開發PIC單片機的C語言編譯器 但其他公司有開發眾多支援PIC單片機的C語言編譯器 常見的有Hitech CCS IAR Bytecraft等公司 其中最常用的是Hitech公司的PICC編譯器 它穩定可靠 編譯生成的代碼效率高 在用PIC單片機開發者中得到廣泛認可 Hitech PICC編譯器基本上符合ANSIC標準 但是不支援函數的遞迴呼叫 其主要原因是因為PIC單片機特殊的堆疊結構 PIC單片機的堆疊是硬體實現的 其深度已隨晶片固定 無法實現需要大量堆疊操作的遞迴演算法 二 PICCC編譯器的安裝PICCC編譯器可以運行在Windows作業系統上 可以在MPLABIDE整合式開發環境下進行專案開發 下面介紹在MPLABIDE7 00集成環境下安裝和設置PICCV8 05PL1PICC編譯器 以及在此環境下編譯和調試來源程式的基本方法 PICCC編譯器的安裝 安裝PICCV8 05PL1運行檔picc8 05 pl1 exe即可進入安裝過程 在安裝過程中會出現下圖所示的編譯器安裝路徑和磁碟空間需求情況的提示畫面 注意 應使用英文路徑和檔案名 不要使用中文 圖中的C HT PIC是編譯器缺省安裝路徑 若要改變安裝路徑 可以通過Browse按鈕選擇安裝路徑 指定路徑後 按一下圖中的Next按鈕 出現如下所示的開始安裝PICCV8 05PL1編譯器畫面 按一下圖中Next按鈕 會進入PICCC編譯器安裝過程 經過一段時間後 出現如下所示的提示畫面 按一下畫面上的 是 按鈕 安裝即成功 並要求重新啟動 啟動PICCC編譯器安裝完PICCV8 05PL1編譯器 其安裝目錄下還有一個picc mplab6 setup exe檔 這是PICCV8 05PL1編譯器運行在MPLABV6 0以上版本的支援檔 PICCV8 05PL1編譯器在安裝完成後應在啟動後使用 如果不啟動只能作為DEMO版使用 DEMO版使用有時間限制 PICCV8 05PL1編譯器的啟動方法是 按一下PICC編譯器開始功能表中的CompilerActivation項 可出現如下所示的編譯器啟動視窗 找到啟動編譯器所需的Serial CompanyName Registration和Activation項的相關資訊 分別填入編譯器啟動視窗對應的文字方塊中 按一下 下一步 按鈕 編譯器即被啟動 PICCC編譯器的啟動運行PICCC編譯器安裝完成後 便可以在MPLABIDE整合式開發環境下運行 設置PICC的編譯環境 設置PICC的編譯環境為便於PICC編譯器的編譯環境設置 應先在MPLABIDE整合式開發環境下創建一個PICCC編譯器的項目 創建項目具體操作步驟如下 第1步 啟動MPLABIDE7 00整合式開發環境窗口 第2步 選擇整合式開發環境中的Project New功能表項目 打開如下所示的新項目對話方塊 在此對話方塊中設置專案名和專案路徑 第3步 在專案名文字方塊中輸入專案名led 在專案路徑文字方塊中輸入專案路徑D led 也可以通過按一下Browse按鈕選擇專案名的保存路徑 第4步 按一下新項目對話方塊的OK按鈕 出現如下所示的專案樹視窗 說明專案已經建立 選擇器件在開始其他工作之前 應先選擇開發過程中所需器件 其操作過程如下所示 首先在MPLAB整合式開發環境中打開Configure功能表 然後按一下SelectDevice功能表項目 彈出如下所示的器件選擇對話方塊 此處可以選擇PICl6F877A作為開發晶片 設置專案 選擇語言元件在創建項目和選定器件後 接下來就可以設置工程的編譯環境 首先介紹語言元件的設置 操作步驟如下 第1步 在MPLAB整合式開發環境中打開Project SelectLanguageToolsuite功能表 彈出如下的選擇語言元件對話方塊 第2步 上圖所示對話方塊用來選擇開發工具元件 在ActiveToolsuite下拉式清單方塊中選擇HI TECHPICCToolsuite作為開發工具元件 然後在ToolsuiteContents清單方塊中選擇PICCCompiler項 如下圖所示 第3步 按一下對話方塊中的Browse按鈕 彈出如下圖所示的打開文件對話方塊 在缺省PICCV8 05PL1編譯器安裝目錄C HT PIC bin 下 選擇plcc exe作為編譯器 然後按一下 打開 按鈕 可以發現PICCCompiler項已選擇picc exe作為編譯器 同樣 PICCAssembler和PICCLinker都選擇picc exe作為彙編和連結程式 如下圖所示 第4步 選擇完成後 按一下上圖OK按鈕 完成選擇工具元件的工作 設置語言元件其操作步驟如下 第1步 在MPLAB中打開Project SetLanguageToolsuite功能表 彈出如下圖所示的設置語言元件對話方塊 第2步 在設置語言元件對話方塊中 選擇HI TECHPICCToolsuite項 按一下HI TECHPICCToolsuite項前的 號 打開目錄樹 如下圖所示 上圖中 子目錄Executables下 PICCCompiler PICCAssembler和PICCLinker在選擇語言工具元件中都已選擇picc exe作為編譯 彙編 連結的處理常式 第3步 在目錄樹的子目錄DefaultSearchPaths Directories下 IncludeSearchPath和LibrarySearchPath分別選擇C HT PIC include和C HT PIC lib作為搜索路徑 第4步 設置完包含檔路徑和庫檔路徑後 在設置語言元件的對話方塊中 按一下OK按鈕 設置語言元件完成 至此PICC的項目設置完畢 可以對項目進行編譯 調試和運行了 三 PICC基本程式設計 PICC中的基本變數類型PICC支援的基本變數類型見下表 PICC中的高級變數基於上表的基本變數 除了bit型位元變數外 PICC完全支援陣列 結構和聯合等複合型高級變數 這和標準的C語言所支援的高級變數類型沒有什麼區別 例如 數組 unsignedintdata 10 結構體 structcommInData unsignedcharinBuff 8 unsignedchargetPtr putPtr 聯合體 unionint Byte unsignedcharc 2 unsignedinti PICC對資料寄存器bank的管理在PIC單片機程式設計時 單片機資料寄存器的bank是由程式設計員管理的 因此在定義變數時必須決定這些變數具體放在哪一個bank中 缺省時 所定義的變數將被定位在bank0中 例如下面所定義的這些變數 unsignedcharbuffer 32 bitflag1 flag2 floatval 8 以上變數都是分佈在bank0中 定義在其它bank內的變數前面必須加上相應的bank序號 例如 bank1unsignedcharbuffer 32 變數定位在bank1中bank2bitflag1 flag2 變數定位在bank2中bank3floatval 8 變數定位在bank3中 volatile修飾詞PICC中還有一個特殊的變數修飾詞 volatile 用來說明一個變數的值是會隨機變化的 即使程式沒有刻意對它進行任何賦值操作 在單片機中 作為輸入的IO埠其內容將是隨意變化的 很多特殊功能寄存器的值也將隨著指令的運行而動態改變 所有這種類型的變數必須將它們明確定義成 volatile 類型 例如 volatileunsignedcharSTATUS 0 x03 volatilebitcommFlag 標準庫函數PICC提供了較完整的C標準庫函數支援 其中包括數學運算函數和字串操作函數 在程式中使用這些現成的庫函數時需要注意的是入口參數必須在bank0中 如果需要用到數學函數 則用 include 包含標頭檔 如果要使用字串操作函數 就需要包含 include 標頭檔 在這些標頭檔中提供了函數類型的聲明 直接查看這些標頭檔就可以知道PICC提供了哪些標準庫函數 C語言中的格式化輸出函數 printf sprintf 用在單片機的程式中時要特別謹慎 printf sprintf是一個非常大的函數 一旦使用 你的程式碼長度就會增加很多 C和彙編混合程式設計 用C語言進行單片機應用程式開發時經常要使用彙編語句 比如 單片機的一些特殊指令操作在標準的C語言語法中沒有直接對應的描述 例如PIC單片機的清看門狗指令 clrwdt 和休眠指令 sleep 這樣 一個項目中就會出現C和彙編混合程式設計的情形 我們在此討論一些混合程式設計的基本方法和技巧 在C原程式中直接嵌入彙編指令是最直接最容易的方法 如果只需要嵌入少量幾條的彙編指令 PICC提供了一個類似於函數的語句 asm clrwdt 雙引號中可以編寫任何一條PIC的標準彙編指令 例如 for asm clrwdt 清看門狗asm sleep 休眠asm nop 空操作延時 如果需要編寫一段連續的彙編指令 PICC支援另外一種語法描述 用 asm 開始彙編指令段 用 endasm 結束 例如下面的一段嵌入彙編指令實現了將0 x20 0 x7F間的RAM全部清零 asmmovlw0 x20movwf FSRclrf INDFincf FSR fbtfss FSR 7goto 3 endasm 四 程式設計實例 PICC的標頭檔PICC支持下的C程式碼中一定要包含pic h標頭檔 該檔安裝在HT PIC include目錄下 它是很多頭檔的集合 C編譯器在pic h中根據使用者選擇的晶片自動載入相應的其它標頭檔 例如使用者選擇的晶片是PIC16F877 則pic h會把pic1687x h載入 例如使用者選擇的晶片是PIC16F877A 則pic h會把pic168xa h載入 載入的標頭檔中其實是聲明晶片的寄存器和一些函數 例如以下程式片段 staticvolatileunsignedcharTMR0 0 x01 staticvolatileunsignedcharPCL 0 x02 staticvolatileunsignedcharSTATUS 0 x03 staticvolatileunsignedcharPORTA 0 x05 staticvolatileunsignedcharPORTB 0 x06 staticunsignedcharbank1OPTION 0 x81 staticunsignedcharbank1TRISA 0 x85 staticunsignedcharbank1TRISB 0 x86 符號表示位址的意思 這些聲明和PIC彙編中的定義寄存器是差不多的 例如 TMR0EQU0 x01 PCLEQU0 x02 STATUSEQU0X03 對於特殊功能寄存器的位位址在標頭檔中也有定義 比如PORTB埠的位位址定義如下 PORTBbits staticvolatilebitRB7 unsigned 其中RB7代表PORTB的bit7 我們可以模仿pic h檔的定義方法定義RAM中檔寄存器的方法 定義bank0的20h 21h 22h為檔寄存器以及他們的位位址 假設我們把20h取名RAM20H 其位地址分別是RAM20H7 RAM20H021h取名RAM21H 其位地址分別是RAM21H7 RAM21H022h取名RAM22H 其位地址分別是RAM22H7 RAM22H0 定義如下 staticvolatileunsignedcharRAM20H 0 x20 staticvolatileunsignedcharRAM21H 0 x21 staticvolatileunsignedcharRAM22H 0 x22 RAM20H的位地址定義如下 staticvolatilebitRAM20H7 unsigned RAH21H和RAH22H的位位址也可以類似定義 staticvolatilebitRAM21H7 unsigned 將這些定義加入到相應的標頭檔中 或者直接寫在來源程式中 這樣就可以直接對通過變數RAM20H對bank0的20h單元進行位元組操作 可以通過RAM20H7 RAM20H0對bank0的20h單元進行位元操作 例如 includemain RAM20H 0 x20 把0 x20賦值給20hRAM21H 0 x21 把0 x21賦值給21hRAM22H RAM20H RAM21H while 1 以上程式中假設RAM20H RAM21H和RAM22H的聲明已經加入到相應的標頭檔中 那麼在來源程式中就可以直接使用 簡單的PICC程式 例1 由於PIC16F877指令系統中沒有乘 除指令 用組合語言編寫乘 除運算難度較大 特別是多位元組運算時 可以用C語言編寫就十分簡便 includemain RAM20H 0 x20 RAM21H 0 x05 RAM22H RAM20H RAM21H while 1 C和彙編的混合程式設計 例2 該例能將檔寄存器20h的低4位放入21h 高4位放入22h includemain RAM20H 0 x35 asmMOVF20H WANDLW0FHMOVWF21HSWAPF20H WANDLW0FHMOVWF22H endasmwhile 1 說明 上例中 為了程式的可讀性好就要減少彙編指令的使用量 由於C語言中沒有SWAPF功能的語句 程式程式設計如下 includemain RAM20H 0 x35 RAM22H RAM20H RAM21H RAM20H 說明 程式中SWAPF0 x22 F中的F已經定義過了 可以直接使用F 例3 比較大小 判斷21h和20h中數值的大小 大的放入到22h中 includemain if RAM21H RAM20H RAM22H RAM21H elseRAM22H RAM20H while 1 例4 對RAM中從30h開始的50個單元清零 用彙編編制 COUNTEQU20H 指定20H寄存器為迴圈變數FSREQU04H 指定FSR為04HINDFEQU00H 指定INDF為00H MOVLWD 50 給迴圈變數賦初值MOVWFCOUNTMOVLW30H 將30H FSRMOVWFFSRNEXTCLRFINDF 間接定址INCFFSR 1 位址指標內容加1 指向下一單元DECFSZCOUNT 1 計數值減1 結果為0就 跳過下一條指令到STOP處GOTONEXT 跳轉回去並執行下一次迴圈STOPGOTOSTOP 停機 混合編制 includecharCOUNT 定義全域變數main COUNT 50 FSR 0 x30 asmINDFEQU00HNEXTCLRFINDFINCF FSR FDECFSZ COUNT FGOTONEXT endasmwhile 1 說明 只要是C語言中定義的變數 在彙編中對其定址時一定要用底線 實際上在標頭檔中INDF也有定義可以直接使用 那麼上面的程式可以修改如下 includecharCOUNT 定義全域變數main COUNT 50 FSR 0 x30 INDF 0 asmNEXTCLRF INDFINCF FSR FDECFSZ COUNT FGOTONEXT endasmwhile 1 用C編制 說明 假如程式師瞭解了FSR和INDF的工作原理後 上面的程式可以完全用C語言實現 includecharCOUNT 定義全域變數main COUNT 50 FSR 0 x30 INDF 0 NEXT INDF 0 FSR if COUNT 0 gotoNEXT while 1 說明 用C語言編寫可讀性強 但是佔用的資源會多 PICC的指向RAM的指針 例5 將30h 31h 32h單元中最大的數放入40h includestaticvolatileunsignedcharadd1 0 x30 staticvolatileunsignedcharadd2 0 x31 staticvolatileunsignedcharadd3 0 x32 staticvolatileunsignedcharadd 0 x40 main 絕對位址定位 add1 0 x51 add2 0 x5 add3 0 x60 if add1 add2 add add1 elseadd add2 if add3 add add add3 while 1 說明 本例中add1 add2 add3和add本質上都是位址 因此它們都是指向RAM的指針 在PICC中用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论