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ó.
Về phần lý thuyết các bạn đọc Datasheet hoặc lên mạng tìm hoặc qua bên TUT về PIC16F877A XC8 tìm đọc nha !
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 !
Chúng ta sẽ có công thức tính thời gian để cài đặt cho Timer 0 như sau : Ví dụ sử dụng thạch anh 4 MHz, timer 0 (8 bit), bộ chia tần 4, đếm 200us thì ta tính theo công thức sau :
256 - (200/4.1) = 206
Giải thích các số trên như sau :
- 256 vì đây là Timer 8 bit.
- 200 : đếm 200us
- 4 : bộ chia tần 4
- 1 : chu kỳ lệnh = 4*(1/OST)
Như vậy chúng ta phải cài đặt giá trị cho Timer 0 như sau :
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4);
set_timer0(206);
set_timer0(206);
- Đây là ảnh mô phỏng protues.
- Đây là code chương trình.
#include <16F877a.h>
#include <def_877a.h>
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use Delay(Clock=4000000)
#define led RC0
#int_TIMER0
void TIMER0_isr(void)
{
set_timer0(206);
led=!led;
}
void main()
{
set_tris_c(0x00);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4);//0-255 tran 51.2us
set_timer0(206);
enable_interrupts(INT_TIMER0);
enable_interrupts(GlOBAL);
while(true)
{
}
}
#include <def_877a.h>
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use Delay(Clock=4000000)
#define led RC0
#int_TIMER0
void TIMER0_isr(void)
{
set_timer0(206);
led=!led;
}
void main()
{
set_tris_c(0x00);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4);//0-255 tran 51.2us
set_timer0(206);
enable_interrupts(INT_TIMER0);
enable_interrupts(GlOBAL);
while(true)
{
}
}
4 nhận xét
Write nhận xétchỉ ch mình cách cách tính dc ko, tks
ReplyCách tính ở trên có mà không chịu đọc !
ReplyChỉ giúp cách tính thời gian với, nếu đếm 3s thì tính như thế nào
Replynếu tính 1s là ko đc rồi anh ơi ~!~
ReplyEmoticonEmoticon