可能很多網友奇怪,在數字芯片高速發展的今天,32位單片機價格低廉,功能強大,芯片成本已經不是產品開發的主要問題,那為什么還要普及PIC單片機,這樣一款中低端的單片機呢?原因很簡單,既然現在還沒有被淘汰的,總有它存在的理由,PIC單片機號稱穩定性極好,可以在十分惡劣的環境下穩定工作,因此在工業領域受到工程師們的偏愛,而且目前來看,任何一個系列的單片機都在不斷的推陳出新,產品性能也在不斷的提升,PIC單片機也一樣,高端的PIC單片機也有32位的,主頻高達上百兆,詳細介紹大家可以去官網查看。
促使我寫這樣一片文章的另外一個原因是,網上關于PIC單片機的入門或者學習資料相對較少,不像STM32或者51單片機那樣豐富,如果是有一定單片機基礎的,想學習PIC單片機,看完這篇文章,應該就可以入門了。
來介紹一下我所使用的平臺信息、調試工具。
開發環境:MPLAB X IDE v3.05
下載工具:PIC Kit 3.5
PIC Kit 3.5下載器
一、 安裝開發環境
我是直接在官網(www.microchip.com)上下載的MPLAB X IDE v3.05版本,400多兆,應該是最新版本了,安裝過程中使用推薦選項就可以,還安裝了一個C30編譯器(MPLAB_C30_V3.0)。
二、 新建項目
我安裝開發環境的時候,選擇了中文版本,進入開發環境后,點擊:文件à新建項目,彈出如下界面:選擇獨立項目,然后點下一步。
步驟一
點擊下一步后彈出如下界面:選擇你使用的單片機型號,這里我使用的是dsPIC30F6014A 16位單片機。
步驟二
繼續點下一步,這里選擇調試/下載工具,我使用的是PICkit3。
步驟三
下一步,這一步選擇的是編譯器,選擇C30編譯器。
步驟四
最后一步,選擇項目的保存目錄,編碼這里選擇的是GB2312,這樣做的目的是使項目中的中文字符能夠被識別,否則,添加中文注釋時會出現亂碼。
步驟五
至此,項目新建完畢,界面如下,項目目錄里面,我們目前只需要關注頭文件和源文件即可,在頭文件上右鍵可以選擇添加現有的頭文件,源文件同理。
文件添加完成后,點擊編譯按鈕進行編譯,編譯通過后會在環境下方提示編譯信息,
編譯成功后,可以進行下載和在線調試,下載按鈕用于將程序下載到單片機內部,調試按鈕 用于在線調試程序,注意,點擊調試按鈕程序不會下載到單片機內。
接下來以閃燈測試程序來講解這款單片機的使用,在此之前先來了解一下《配置位》,在開發環境中,點擊運行àSet Configuration Bits,即可在環境下方調出配置窗口,Option下面的定義可以修改,
這里說一下時鐘配置和看門狗配置,FOSC用于配置系統時鐘,FWDT用于看門狗的配置,如果你想使用外部晶振、內部進行16倍頻,就選擇 XT_PLL16即可,如果是內部時鐘、4倍頻,就在選項中選擇FRC_PLL4,同理,看門狗的開啟和關閉,以及開啟后的設置也可以通過FWDT來配置,這里我們選擇關閉看門狗,只需將WDT選項選擇為WDT_OFF即可,注意,這里選擇好之后,必須點擊輸出生成源代碼,會自動生成源碼,生成的源碼拷貝到你的項目文件中才有效。
至于一些詳細的配置請自行參見手冊。
生成代碼
下面貼出LED閃燈的源碼,并逐語句進行講解。
本文引用地址:http://www.eepw.com.cn/article/279441.htm
#include “p30f6014A.h” //包含頭文件
_FOSC(CSW_FSCM_OFF & XT_PLL16); //配置時鐘
_FWDT(WDT_OFF); //關閉看門狗
假設使用的外部晶振為5Mhz,系統指令周期的計算方法為:
5M*16/4=20MIPS
16為16倍頻,每執行一條指令要4個時鐘周期,因此要除四,就得到了實際的系統時鐘。
IO端口的配置
IO端口使用很簡單,和51相比只是多了一個方向控制,在使用端口之前 ,先設置好方向。假設我們使用的端口A的第十位作為LED的控制位,首先設置該管腳的方向,
TRISAbits.TRISA10 = 0;//該位置零為輸出,置1位輸入
控制端口實際輸出高低電平的寄存器位LATAbits,將該寄存器的LATA10位進行置1置0操作,即可輸出高、低電平。
#define LED LATAbits.LATA10
值得注意的是,當進行讀引腳操作時,要讀PORTAbits寄存器,而不是LATAbits寄存器。
我們是采用定時500ms中斷的方式來進行LED的亮滅控制,因此需要進行定時器的配置,這里使用的是16位定時器timer1。涉及到兩個函數。
ConfigIntTimer1(5);//初始化定時器1,中斷優先級為5
OpenTimer1(39062);//進行相關配置并打開定時器1
void ConfigIntTimer1(unsigned char priority)
{
IFS0bits.T1IF = 0 //清除中斷標志
IPC0bits.T1IP = priority; //設置中斷優先級
IEC0bits.T1IE = 1; //使能中斷
}
void OpenTimer1(unsigned int period)
{
TMR1 = 0; /* Reset Timer1 to 0x0000 */
PR1 = period; //中斷周期
T1CONbits.TCS = 0; //選擇時鐘源
T1CONbits.TSYNC =1;
T1CONbits.TCKPS =3; //256分頻
T1CONbits.TGATE =0;
T1CONbits.TSIDL =0;
T1CONbits.TON = 1; //啟動定時器
}
選擇系統時鐘(20MIPS),并進行256分頻,20M/256=78125,說明定時器計時到78125要用1秒鐘,定時到500ms需要 39062個周期,因此需要設置計時周期為39062,而且由于定時器1為16位定時器,無法計時到一秒,如果需要計時1s可以使用32位定時器 timer23和timer45。
定時器1中斷函數
void __attribute__((__interrupt__, no_auto_psv)) _T1Interrupt(void)
{
IFS0bits.T1IF = 0;//清零中斷標志
LED = !LED;//對LED循環取反,進行亮滅控制
}
如此便可實現LED閃爍功能。
附上完整的工程源碼,請下載查看:
http://forum.eepw.com.cn/thread/276018/1
在使用該款單片機的時候還需要注意幾個問題:
1、 由于單片機的管腳有復用功能,在使用端口B的時候,如果想將端口B的第7位用作數字IO,需要這樣來設置,(其它端口無需這樣操作)
ADPCFGbits.PCFG7 = 1;//該位必須置位,否則PORTB_7無法用作數字IO管腳
2、 在系統的安裝目錄下,自帶了單片機各個資源的使用例程,使用者可以參考。我的目錄是:C:Program Files (x86)MicrochipMPLAB C30srcperipheral_30F_24H_33Fsrc pmc (供參考)
3、 在使用串口資源時,需要準確設定串口波特率,以設置UART1, 9600波特率為例,波特率計算方法為:20MIPS/((9600+1)*16)=130。將130賦給U1BRG寄存器即可。
4、 該單片機具有內部EEPROM,如果需要存儲的數據量不大的話,一些需要掉電存儲的參數可以存儲在單片機內部,可簡化外部電路設計。
有了以上的基礎,相信學習這款單片機就輕松多了,可以使初學者少走彎路,集中精力解決實質性問題
評論
查看更多