Chào các bạn trong bài đăng này mình sẽ hướng dẫn các bạn đếm từ 0 đến 9999 sử dụng Timer 0 để tạo thời gian delay để tăng biến đếm của chúng ta bằng cách sử dụng ngắt của Timer 0.
Và chúng ta sẽ làm như thế nào ? Mình sẽ hương dẫn các bạn cách cấu hình Timer và sử lý ngắt để tạo thời gian delay hợp lý. Thường thì khi chúng ta không dùng ngắt Timer để quét LED thì khi quét nhiều LED chúng ta sẽ thấy thời gian tăng biến đếm rất nhanh đôi khi chúng ta không thấy rõ được sự thay đổi của nó vì vậy trong bài đăng này mình sẽ hướng dẫn các bạn giải quyết vấn để đó bằng cách sử dụng Timer 0 để tạo thời gian delay hợp lý.
Trước tiên mình nhắc lại kiến thức các bài trước về các lệnh cấu hình Timer như sau :
Chương trình ngắt của chúng ta như sau :
- Đây là ảnh mô phỏng protues.
Và chúng ta sẽ làm như thế nào ? Mình sẽ hương dẫn các bạn cách cấu hình Timer và sử lý ngắt để tạo thời gian delay hợp lý. Thường thì khi chúng ta không dùng ngắt Timer để quét LED thì khi quét nhiều LED chúng ta sẽ thấy thời gian tăng biến đếm rất nhanh đôi khi chúng ta không thấy rõ được sự thay đổi của nó vì vậy trong bài đăng này mình sẽ hướng dẫn các bạn giải quyết vấn để đó bằng cách sử dụng Timer 0 để tạo thời gian delay hợp lý.
Trước tiên mình nhắc lại kiến thức các bài trước về các lệnh cấu hình Timer như sau :
setup_timer_0(RTCC_DIV_256|RTCC_INTERNAL);
set_timer0(22);
enable_interrupts(INT_TIMER0);
Ở trên mình đã cấu hình sẵn các thông số để sử dụng trong bài này bạn nào không hiểu thì xe lại các bài đăng trước.set_timer0(22);
enable_interrupts(INT_TIMER0);
Chương trình ngắt của chúng ta như sau :
#INT_TIMER0
void ngat_ISR()
{
i++;
set_timer0(22);
if(i==10)
{
giatri++;
}
Mình delay khoảng 300000us nên mình tính toán như sau:void ngat_ISR()
{
i++;
set_timer0(22);
if(i==10)
{
giatri++;
if(giatri==1010)
{
giatri = 0;
}
}}
256 - (300000/(256*5)) = 22;
Ai có thắc mắc gì về công thức và các số ở trên công thức thì xem lại bài đăng về Timer 0 nha !- Đây là ảnh mô phỏng protues.
- Đây là code chương trình.
#include <16f877a.h>
#include <def_877a.h>
#fuses NOLVP,NOWDT,PUT,HS
#use delay(clock=20000000)
int maled[10]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82,0xF8, 0x80, 0x90};
int16 giatri;
int16 nghin,chuc,tram,donvi,i;
#byte portc=0x07
#bit led1 =0x07.3
#bit led2 =0x07.2
#bit led3 =0x07.1
#bit led4 =0x07.0
#INT_TIMER0
void ngat_ISR()
{
i++;
set_timer0(22);
if(i==10)
{
i=0;
giatri++;
if(giatri==1010)
{
giatri = 0;
}
}
}
void hienthi(int16 giatri)
{
nghin = giatri/1000;
tram = (giatri - nghin*1000)/100;
chuc = (giatri - nghin*1000 - tram*100)/10;
donvi = giatri - nghin*1000 - tram*100 - chuc*10;
output_b(maled[nghin]);
led4=0;
delay_ms(5);
led4=1;
output_b(maled[tram]);
led3=0;
delay_ms(5);
led3=1;
output_b(maled[chuc]);
led2=0;
delay_ms(5);
led2=1;
output_b(maled[donvi]);
led1=0;
delay_ms(5);
led1=1;
}
void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
set_timer0(22);
enable_interrupts(INT_TIMER0);
enable_interrupts(GlOBAL);
set_tris_b(0x00);
set_tris_c(0x00);
set_tris_d(0);
output_c(0x00);
output_d(0);
while(true)
{
hienthi(giatri);
}
}
- Link download project Click here
EmoticonEmoticon