日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PIC16F877A单片机 (中断与定时器Timer2)

發布時間:2024/1/8 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PIC16F877A单片机 (中断与定时器Timer2) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

PIC16F877A單片機 (中斷與定時器Timer2)

  • 1 基本原理
  • 2 實現代碼

1 基本原理


2 實現代碼

主要根據定時器2的邏輯框圖和中斷的邏輯框圖來編寫代碼,這樣代碼的可讀性強,也便于理解。但有些寄存器在框圖中可能沒有說明,所以也需要仔細閱讀定時器0的官方文檔,即基本原理部分。

/*----------------函數功能:中斷 定時器2 --------------------------*/#include<pic.h>// 調用PIC16f87XA單片機的頭文件 //#include"delay.h"//調用延時子函數__CONFIG(0xFF32);//芯片配置字,看門狗關,上電延時開,掉電檢測關,低壓編程關 //__CONFIG(HS&WDTDIS&LVPDIS);/*-----------宏定義--------------*/ #define uint unsigned int #define uchar unsigned char #define V0 RD0uint i;/*-----------子函數聲明--------------*//*-----------主函數--------------*/ void main() {// The corresponding data direction register is TRISA. // Setting a TRISA bit (= 1) will make the corresponding PORTA pi an input. // Clearing a TRISA bit (= 0) will make the corresponding PORTA pin an output.TRISD=0xfe; // 設置數據方向 RD7-RD1為輸入,RD0為輸出// 1 = Port pin is > VIH,即高電平 ; 0 = Port pin is < VIL,即低電平PORTD=0x00; // 端口賦初值/********定時器TMR1初始化**********/// 只有一個時鐘,所以不用時鐘選擇//TMR2CS=0; // TMR1時鐘源選擇內部指令周期(fosc/4)// Timer2 is an 8-bit timer with a prescaler and a postscaler//預分頻器 The input clock (FOSC/4) has a prescale option of 1:1, 1:4 or 1:16T2CKPS1=1;T2CKPS0=1;//預分頻 1:16,對應的編碼為1X 1x = Prescaler is 16// The match output of TMR2 goes through a 4-bit postscaler // (which gives a 1:1 to 1:16 scaling inclusive)to generate a TMR2 interrupt//后分頻器 Timer2 Output Postscale Select bitsTOUTPS3=0;TOUTPS2=0;TOUTPS1=0;TOUTPS0=0;//后分頻 1:1,對應的編碼為0000// Timer2 can be shut-off by clearing control bit, TMR2ON// TMR2ON: Timer2 On bit. 1 = Timer2 is on. 0 = Timer2 is offTMR2ON=1; // 打開計數定時器TMR2,狀態為ON// Timer2 is an 8-bit timer//8位計數寄存器給初值,在這里沒有考慮中斷所造成的時鐘延遲13個指令周期TMR2=256-250+13; // 定時250us*16(預分頻,1:16)*1(后分頻,1:1)=4000us. 13怎么來的,見Timer0// The Timer2 module has an 8-bit period register, PR2.// Timer2 increments from 00h until it matches PR2 and then resets to 00h on the next increment cycle.// PR2 is a readable and writable register. The PR2 register is initialized to FFh upon ResetPR2=0xff; // 比較器的初值// The TMR2 interrupt, if enabled,is generated on overflow // which is latched in interrupt flag bit, TMR2IF TMR2IF=0; // 溢出中斷標志位清零// This interrupt can be enabled/disabled by setting/clearing TMR2 interrupt enable bit, TMR2IE TMR2IE=1; //溢出中斷標志允許位置一PEIE=1; //外設中斷允許位置一//*********開全局中斷設置//定時器T0設置了中斷允許,此處要開全局中斷GIE=1; // 總中斷允許while(1) // 死循環,單片機初始化后,就一直運行這個死循環{}}/*************中斷服務程序***************/ void interrupt ISR(void) // PIC單片機的所有中斷都是這樣一個入口 {// TMR2IF標志位為在計數寄存器由全1變為全0的時候,自動得到TMR2IF=1.if(TMR2IF==1) // 需要進一步判斷是否為定時器1的溢出中斷標志位 {//定時器中斷后,要重置初值,以備下次中斷TMR2=256-250+13; //溢出中斷標志位清零 如果TMR2IF出現上升沿,則產生中斷,所以中斷發生之后要清零。TMR2IF=0; // 執行中斷處理程序,執行中斷產生時想要執行的功能if(++i>125) //4ms中斷1次,125次中斷就是5000ms{ i=0;V0=!V0; // 取反 實現一秒的閃爍}} }

為什么有下面兩行語句,這是由中斷決定的,如下圖所示。

PEIE=1; //外設中斷允許位置一GIE=1; //總中斷允許

總結

以上是生活随笔為你收集整理的PIC16F877A单片机 (中断与定时器Timer2)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。