<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 牛人業(yè)話 > 看完這篇文章,PIC單片機(jī)就能入門了(續(xù))

          看完這篇文章,PIC單片機(jī)就能入門了(續(xù))

          作者:areak 時(shí)間:2015-08-29 來源:電子產(chǎn)品世界 收藏

            下面貼出LED閃燈的源碼,并逐語句進(jìn)行講解。

          本文引用地址:http://www.ex-cimer.com/article/279441.htm

            #include "p30f6014A.h" //包含頭文件

            _FOSC(CSW_FSCM_OFF & XT_PLL16); //配置時(shí)鐘

            _FWDT(WDT_OFF); //關(guān)閉看門狗

            假設(shè)使用的外部晶振為5Mhz,系統(tǒng)指令周期的計(jì)算方法為:

            5M*16/4=20MIPS

            16為16倍頻,每執(zhí)行一條指令要4個(gè)時(shí)鐘周期,因此要除四,就得到了實(shí)際的系統(tǒng)時(shí)鐘。

            IO端口的配置

            IO端口使用很簡單,和51相比只是多了一個(gè)方向控制,在使用端口之前 ,先設(shè)置好方向。假設(shè)我們使用的端口A的第十位作為LED的控制位,首先設(shè)置該管腳的方向,

            TRISAbits.TRISA10 = 0;//該位置零為輸出,置1位輸入

            控制端口實(shí)際輸出高低電平的寄存器位LATAbits,將該寄存器的LATA10位進(jìn)行置1置0操作,即可輸出高、低電平。

            #define LED LATAbits.LATA10

            值得注意的是,當(dāng)進(jìn)行讀引腳操作時(shí),要讀PORTAbits寄存器,而不是LATAbits寄存器。

            我們是采用定時(shí)500ms中斷的方式來進(jìn)行LED的亮滅控制,因此需要進(jìn)行定時(shí)器的配置,這里使用的是16位定時(shí)器timer1。涉及到兩個(gè)函數(shù)。

            ConfigIntTimer1(5);//初始化定時(shí)器1,中斷優(yōu)先級(jí)為5

            OpenTimer1(39062);//進(jìn)行相關(guān)配置并打開定時(shí)器1

            void ConfigIntTimer1(unsigned char priority)

            {

            IFS0bits.T1IF = 0 //清除中斷標(biāo)志

            IPC0bits.T1IP = priority; //設(shè)置中斷優(yōu)先級(jí)

            IEC0bits.T1IE = 1; //使能中斷

            }

            void OpenTimer1(unsigned int period)

            {

            TMR1 = 0; /* Reset Timer1 to 0x0000 */

            PR1 = period; //中斷周期

            T1CONbits.TCS = 0; //選擇時(shí)鐘源

            T1CONbits.TSYNC =1;

            T1CONbits.TCKPS =3; //256分頻

            T1CONbits.TGATE =0;

            T1CONbits.TSIDL =0;

            T1CONbits.TON = 1; //啟動(dòng)定時(shí)器

            }

            選擇系統(tǒng)時(shí)鐘(20MIPS),并進(jìn)行256分頻,20M/256=78125,說明定時(shí)器計(jì)時(shí)到78125要用1秒鐘,定時(shí)到500ms需要39062個(gè)周期,因此需要設(shè)置計(jì)時(shí)周期為39062,而且由于定時(shí)器1為16位定時(shí)器,無法計(jì)時(shí)到一秒,如果需要計(jì)時(shí)1s可以使用32位定時(shí)器timer23和timer45。

            定時(shí)器1中斷函數(shù)

            void __attribute__((__interrupt__, no_auto_psv)) _T1Interrupt(void)

            {

            IFS0bits.T1IF = 0;//清零中斷標(biāo)志

            LED = !LED;//對(duì)LED循環(huán)取反,進(jìn)行亮滅控制

            }

            如此便可實(shí)現(xiàn)LED閃爍功能。

            附上完整的工程源碼,請(qǐng)下載查看:

            http://forum.eepw.com.cn/thread/276018/1

            在使用該款的時(shí)候還需要注意幾個(gè)問題:

            1、 由于的管腳有復(fù)用功能,在使用端口B的時(shí)候,如果想將端口B的第7位用作數(shù)字IO,需要這樣來設(shè)置,(其它端口無需這樣操作)

            ADCON1bits.ADON = 0;//關(guān)閉AD轉(zhuǎn)換器

            ADPCFGbits.PCFG7 = 1;//該位必須置位,否則PORTB_7無法用作數(shù)字IO管腳

            2、 在系統(tǒng)的安裝目錄下,自帶了各個(gè)資源的使用例程,使用者可以參考。我的目錄是:C:Program Files (x86)MicrochipMPLAB C30srcperipheral_30F_24H_33Fsrc pmc (供參考)

            3、 在使用串口資源時(shí),需要準(zhǔn)確設(shè)定串口波特率,以設(shè)置UART1, 9600波特率為例,波特率計(jì)算方法為:20MIPS/((9600+1)*16)=130。將130賦給U1BRG寄存器即可。

            4、 該單片機(jī)具有內(nèi)部EEPROM,如果需要存儲(chǔ)的數(shù)據(jù)量不大的話,一些需要掉電存儲(chǔ)的參數(shù)可以存儲(chǔ)在單片機(jī)內(nèi)部,可簡化外部電路設(shè)計(jì)。

            有了以上的基礎(chǔ),相信學(xué)習(xí)這款單片機(jī)就輕松多了,可以使初學(xué)者少走彎路,集中精力解決實(shí)質(zhì)性問題,以上是本人個(gè)人的一點(diǎn)經(jīng)驗(yàn),如有疏漏之處,歡迎指正。

          單片機(jī)相關(guān)文章:單片機(jī)教程


          單片機(jī)相關(guān)文章:單片機(jī)視頻教程


          單片機(jī)相關(guān)文章:單片機(jī)工作原理


          晶振相關(guān)文章:晶振原理


          關(guān)鍵詞: PIC 單片機(jī)

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();