Thứ Sáu, 20 tháng 11, 2015

BÀI 13 : TIMER 1 PIC16F877A XC8

Chào các bạn trong bài đăng trước mình đã hướng dẫn các bạn về timer0 và trong bài đăng này mình sẽ tiếp tục hướng dẫn các ban về timer1 của PIC16F877A. Timer 1 và 0 là 2 loại timer mà chúng ta rất hay sử dụng vì vậy các bạn phải nắm chất về 2 bộ timer này nha. Ok bây giờ mình sẽ đi vào vấn đề chính ngay.
1. Đặc điểm của timer 1.
- Là timer/counter 16bit gồm 2 thanh ghi TMR1H và TMR1L  có thể đọc và ghi.
- Timer 1 có thể hoạt động ở chế độ định thời hay đếm được lựa chọn bởi bit TMR1CS.
- Trong chế độ định thời T1 tăng giá trị ở mỗi chu kỳ lệnh, chế độ đếm bộ đếm tăng mỗi khi có cạch clock ngõ vào prescale bên ngoài.
- Có bộ prescale chia tần.
- Xảy ra hiện tượng ngắt khi tràn từ FFFFh -> 0000h.
2. Sơ đồ khối timer 1.
sơ đồ khối timer 1 pic16f877a
Mình chỉ giới thiệu sơ lược thôi nha ai muốn tìm hiểu sâu hơn về timer 1 thì lên mạng tìm hiểu thêm nha !
- Đây là ảnh mô phỏng protues.
timer 1 pic16f877a xc8
- Đây là code chương trình.
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#define _XTAL_FREQ 4000000
// CONFIG
#pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF      // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)
unsigned int Count = 0;
void main(void) {
    TRISCbits.TRISC0 = 0;
    TMR1 = 15535;
    T1CONbits.TMR1CS = 0;
    T1CONbits.T1CKPS1 = 1;
    T1CONbits.T1CKPS0 = 0;
    T1CONbits.T1SYNC = 1;
    T1CONbits.TMR1ON = 1;
    while (1)
    {
        if(PIR1bits.TMR1IF == 1)
        {
            PIR1bits.TMR1IF = 0;
            TMR1 = 15535;
            Count++;
            if(Count==5)
            {
                Count =0;
                PORTCbits.RC0 ^= 1;   //toggle the LED
            }
          }
        }
    }
- Link download project Click here


EmoticonEmoticon