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.
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 !
Chúng ta sẽ tính toán các thông số để cài đặt cho Timer 1 theo công thức sau : Ví dụ muốn định thời 50ms = 50000us sử dụng prescaler 1:8, Fosc = 4 Mhz thì ta có công thức tính như sau :
GT = 65536 - Tdelay.Fosc/(4.Kprescaler)
Từ công thức trên thay số vào ta được như sau :
GT = 65536 - ((50.10^-3.4.10^6/(4*8)) = 59286
- Đâ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_TIMER1
void TIMER1_isr(void)
{
set_timer1(59286);
led=!led;
}
void main()
{
set_tris_c(0x00);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
set_timer1(59286);
enable_interrupts(INT_TIMER1);
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_TIMER1
void TIMER1_isr(void)
{
set_timer1(59286);
led=!led;
}
void main()
{
set_tris_c(0x00);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
set_timer1(59286);
enable_interrupts(INT_TIMER1);
enable_interrupts(GlOBAL);
while(true)
{
}
}
3 nhận xét
Write nhận xétToàn dùng ngắt ko v? Làm cái ví dụ ko dùng ngắt được ko cậu ơi?
ReplyTimer dùng để định thời với đếm sự kiện giờ kêu làm ví dụ khác sao làm !
Replya có thể giải thích thêm về các hàm ngắt cuối chương trình... mới học tới timer nên e chưa hiểu đoạn đó
ReplyEmoticonEmoticon