Chào các bạn trong bài đăng về TIMER 1 thì mình đã hướng dẫn các bạn cánh tính toán để cài đăt cho TIMER 1 rồi nên ai chưa đọc thì quay lại bài trước đọc nha ! Còn trong bài đăng này mình sẽ hướng dẫn các bạn dùng TIMER 1 để tạo trễ 1s để chớp tăt LED.
Để delay 1s thì chương trình con ngắt 100ms phải thực hiện 10 lần, mỗi lần ngắt 100ms thì tăng biến đếm ngắt BDN lên 1 đơn vị, kiểm tra nếu bằng 10 thì cho bằng 0 và đảo trạng thái của led, nếu chưa bằng 10 thì thoát và thực hiện tiếp chương trình chính. Ý nghĩa của việc dùng TIMER 1 để delay 1s chính xác hơn khi chúng ta sử dụng lệnh delay_ms().
- Đây là ảnh mô phỏng protues.
- Đây là code chương trình.
Để delay 1s thì chương trình con ngắt 100ms phải thực hiện 10 lần, mỗi lần ngắt 100ms thì tăng biến đếm ngắt BDN lên 1 đơn vị, kiểm tra nếu bằng 10 thì cho bằng 0 và đảo trạng thái của led, nếu chưa bằng 10 thì thoát và thực hiện tiếp chương trình chính. Ý nghĩa của việc dùng TIMER 1 để delay 1s chính xác hơn khi chúng ta sử dụng lệnh delay_ms().
- Đây là ảnh mô phỏng protues.
- Đây là code chương trình.
#INCLUDE <16F877a.H>
#FUSES NOWDT, PUT, HS, NOPROTECT, NOLVP
#USE DELAY(CLOCK=16M)
INT8 DEM, BDN;
#int_timer1
void INTERRUPT_TIMER1()
{
BDN++;
SET_TIMER1(15536);
IF (BDN == 10)
{
BDN = 0; OUTPUT_B(DEM);
DEM = ~ DEM;
}
}
VOID MAIN()
{
SET_TRIS_B(0x00);
DEM = 0X00 ;
OUTPUT_B(DEM);
BDN= 0X00 ;
SETUP_TIMER_1(T1_INTERNAL | T1_DIV_BY_8);
SET_TIMER1(15536);
ENABLE_INTERRUPTS(GLOBAL);
ENABLE_INTERRUPTS(INT_TIMER1);
WHILE(true)
{
}
}
#FUSES NOWDT, PUT, HS, NOPROTECT, NOLVP
#USE DELAY(CLOCK=16M)
INT8 DEM, BDN;
#int_timer1
void INTERRUPT_TIMER1()
{
BDN++;
SET_TIMER1(15536);
IF (BDN == 10)
{
BDN = 0; OUTPUT_B(DEM);
DEM = ~ DEM;
}
}
VOID MAIN()
{
SET_TRIS_B(0x00);
DEM = 0X00 ;
OUTPUT_B(DEM);
BDN= 0X00 ;
SETUP_TIMER_1(T1_INTERNAL | T1_DIV_BY_8);
SET_TIMER1(15536);
ENABLE_INTERRUPTS(GLOBAL);
ENABLE_INTERRUPTS(INT_TIMER1);
WHILE(true)
{
}
}
EmoticonEmoticon