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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

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

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

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

1 基本原理






上圖中,如果RC0左邊外接了外部的晶振,那么T1OSCEN必須置一。這個外部的晶振頻率一般都比較低。因為晶振頻率越低,一般功耗越低。
為什么這里需要外接晶振呢?保證單片機在休眠模式下還可以計數,這一點是51單片機所不具備的。

2 實現代碼

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


/*----------------函數功能:中斷 定時器1 --------------------------*/#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初始化**********/// Timer1 can operate in one of two modes: (1)As a Timer ;(2)As a Counter// The operating mode is determined by the clock select bit, TMR1CS // In Timer mode, Timer1 increments every instruction cycle. // In Counter mode, it increments on every rising edge of the external clock input// Counter mode is selected by setting bit TMR1CS. 1 = External clock from pin RC0/T1OSO/T1CKI (on the rising edge)// Timer mode is selected by clearing the TMR1CS. 0 = Internal clock (FOSC/4) TMR1CS=0; // TMR1時鐘源選擇內部指令周期(fosc/4)// T1CKPS1:T1CKPS0: Timer1 Input Clock Prescale Select bits 預分頻器//預分頻 1:1,對應的編碼為00//T1CKPS0=0; // 00 = 1:1 prescale value//T1CKPS1=0;//預分頻 1:8,對應的編碼為11T1CKPS0=1; // 11 = 1:8 prescale valueT1CKPS1=1;// Timer1 External Clock Input Synchronization Control bit// When TMR1CS = 1. 1 = Do not synchronize external clock input. 0 = Synchronize external clock input // When TMR1CS = 0. This bit is ignored. Timer1 uses the internal clock when TMR1CS = 0.// The synchronize control bit, T1SYNC. has no effect since the internal clock is always in sync// T1SYNC=0; // 由于TMR1CS = 0,所以這一位被忽略了// Timer1 can be enabled/disabled by setting/clearing control bit, TMR1ON// TMR1ON: Timer1 On bit. 1 = Enables Timer1; 0 = Stops Timer1TMR1ON=1; //打開計數定時器TMR1,狀態為ON// The Timer1 module is a 16-bit timer/counter consisting of two 8-bit registers (TMR1H and TMR1L)// which are readable and writable. //16位計數寄存器給初值,在這里沒有考慮中斷所造成的時鐘延遲13個指令周期TMR1H=(65536-100)/256; //定時100us*8(八分頻),計數寄存器就會溢出TMR1L=(65536-100)%256; // The TMR1 interrupt, if enabled,is generated on overflow // which is latched in interrupt flag bit, TMR1IF TMR1IF=0; //溢出中斷標志位清零// This interrupt can be enabled/disabled by setting/clearing TMR1 interrupt enable bit, TMR1IE TMR1IE=1; //溢出中斷標志允許位 置一PEIE=1; //外設中斷允許位 置一//*********開全局中斷設置//定時器T0設置了中斷允許,此處要開全局中斷GIE=1; //總中斷允許while(1) // 死循環,單片機初始化后,就一直運行這個死循環{}}/*************中斷服務程序***************/ void interrupt ISR(void)//PIC單片機的所有中斷都是這樣一個入口 {// TMR1IF標志位為在計數寄存器由全1變為全0的時候,自動得到置一,即TMR1IF=1.if(TMR1IF==1) // 需要進一步判斷是否為定時器1的溢出中斷標志位 {//定時器中斷后,要重置初值,以備下次中斷TMR1H=(65536-100)/256; TMR1L=(65536-100)%256; //溢出中斷標志位清零 如果TMR1IF出現上升沿,則產生中斷,所以中斷發生之后要清零。TMR1IF=0; // 執行中斷處理程序,執行中斷產生時想要執行的功能if(++i>1250) //800us中斷一次,再計次1250次后就是1s{i=0;V0=!V0; // 取反 實現一秒的閃爍}} }

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

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

總結

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

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