BÀI 12 : TIMER 0 PIC16F877A XC8

8:15:00 PM
Chào các bạn trong bài đăng này mình sẽ hướng dẫn về timer của PIC16F877A. Các bạn chú ý đây là 1 trong các modun của PIC16F877A và nó cũng rất quan trọng và được sử dụng rất nhiều nên các bạn phải chú  ý để nắm rõ về nó.
1 Giới thiệu về Timers
a. Timer được sử dụng cho nhiều chức năng như :
- Định thì để tạo sự kiện
- Đếm sự kiện
-Tạo dạng sóng….
b. PIC16F877A có 3 Timers
- timer 0
- timer 1
- timer 2
c. So sánh các timer
2. Đặc điểm timer 0
3. Sơ đồ khối timer 0
Các bạn tự lên mạng tìm cách tính thời gian để khởi tạo timer 0 nha ! Nếu không biết tính thì comment ở dưới mình chỉ cho !
- Đây là ảnh mô phỏng protues.
timer 0 pic16f877a xc8
- Đây là code chương trình.
#include <stdio.h>
#include <stdlib.h>
#define _XTAL_FREQ 4000000
#include <xc.h>
// 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;                               //RC0 pin as output
    //config timer0
    TMR0 = 55;
    OPTION_REGbits.PSA = 0;
    OPTION_REGbits.PS2 = 0;
    OPTION_REGbits.PS1 = 1;
    OPTION_REGbits.PS0 = 0;
    OPTION_REGbits.T0CS = 0;
    while (1)
    {
        if(INTCONbits.TMR0IF == 1)
        {
            INTCONbits.TMR0IF = 0;
            TMR0 = 55;
            Count++;
            if(Count == 125)
            {
                Count = 0;
                PORTCbits.RC0 ^= 1;                     //toggle the LED
            }
        }
    }
}
Các bạn sữa lại tần số thạch anh là 4Mhz nha mình bị nhầm !
- Link download project Click here

Share this

Related Posts

Previous
Next Post »

7 nhận xét

Write nhận xét
May 20, 2016 at 2:56 AM delete

Chúng ta có công thức tính như sau : Tdelay = (256 - TMR0).Tclko.Kprescaler
Tdelay là thời gian chúng ta cần delay ví dụ 200us, 256 là T0 có 8bit, Tclko là là nguồn clock tác động cái này xem datasheet thường thì nó = Fosc/4 Fosc là tần số thạch anh, Kprescaler xem ở hình trên như vậy sẽ tính ra được số cần cài cho TMR0 như vậy giờ có TMR0 rồi bạn tự suy ngược lại Tdelay. Còn Count = 125 là giống như 1 cái biến đếm thôi tại và TRM0 trên nhỏ nên thời gian delay nó nhanh nên ở đây mình dùng thêm biến đếm nữa !

Reply
avatar
June 30, 2016 at 10:34 AM delete

cách tính thời gian để khởi tạo timer 0 như thế nào vậy anh

Reply
avatar
June 30, 2016 at 5:08 PM delete

Tdelay = (256 - TMR0).Tclko.Kprescaler

Reply
avatar
October 30, 2016 at 6:08 AM delete

void delay_ms(unsigned int t)
{
while(t--)
{
TMR0=131;
INTCONbits.TMR0IF=0;
while(INTCONbits.TMR0IF==1);
}
};
Mình viết hàm delay này dùng timer 0, thạch anh 8 Mhz, chia tần 1: 16 sao chạy mô phỏng sai nhỉ

Reply
avatar
October 30, 2016 at 6:10 AM delete

Thời gian chạy rất nhanh khi mình sử dụng delay_ms(1000);

Reply
avatar
October 30, 2016 at 6:44 AM delete

mô phỏng của bạn chạy ko đúng, chạy delay 200us lặp 125 lần thì được khoảng 25ms thôi . sao chạy mô phỏng gì mà chậm thế

Reply
avatar
October 30, 2016 at 7:51 PM delete

Mình không nhớ là delay bao nhiêu MS nhưng bạn phải sữa lại thạch anh 4Mhz nha !

Reply
avatar