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)
{
}
}
6 nhận xét
Write nhận xétsao minh mo phong ma khong duoc
Reply:( ý là file mô phỏng k chạy hay là, nó chạy k đúng 1s ?
ReplyCho mình hỏi sao cái hàm interupt_timer1 bạn không có gọi nó lại trong hàm void main thì sao mình cần phải viết nó ra chi vậy, mình mới học qua timer chưa hiểu rõ lắm có gì bạn thông cảm
ReplyÝ nghĩa của hàn interupt là khi cờ ngắt của timer bị tràn là nó nhảy vào chương trình ngắt thực hiện cho nên bạn k để trong void main.
ReplyCờ ngát của timer1 bị tràn nó nằm ở dòng lệnh nào vậy bạn
ReplySET_TIMER1(15536);
ReplyEmoticonEmoticon