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 1 để tạo thời gian delay để tăng biến đếm. Và như chúng ta đã biết thì khi giá trị đếm của Timer bị tràn thì sẽ xảy ra ngắt và thanh ghi TMR1IF sẽ được set lên 1 và ngắt xảy ra vì vậy chúng ta sẽ ứng dụng ngắt vào trong việc đếm từ 0 đến 9999 trong bài này của chúng ta.
- Trước tiên chúng ta sẽ đi cấu hình Timer 1 như sau :
- Đây là ảnh mô phỏng protues.
- Đây là code chương trình.
- Trước tiên chúng ta sẽ đi cấu hình Timer 1 như sau :
TMR1IF=0;
setup_timer_1(T1_INTERNAL | T1_DIV_BY_2);
set_timer1(24280);
- Và tiếp theo là chương trình ngắt và đếm của chúng ta :setup_timer_1(T1_INTERNAL | T1_DIV_BY_2);
set_timer1(24280);
while(TMR1IF==0)
{
hienthi(giatri);
}
i++;
TMR1IF=0;
set_timer1(24280);
if(i==5)
{
i=0;
giatri++;
if(giatri==500)
{
giatri=0;
}
}
}
}
Đây là 2 phần các bạn cần chú ý để làm được bài này các bạn tham khảo thêm các bài đăng trước để xem việc tính toán thông số cho Timer 1 nha !{
hienthi(giatri);
}
i++;
TMR1IF=0;
set_timer1(24280);
if(i==5)
{
i=0;
giatri++;
if(giatri==500)
{
giatri=0;
}
}
}
}
- Đâ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,XT
#use delay(clock=4000000)
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
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()
{
i = 0;
TMR1IF=0;
setup_timer_1(T1_INTERNAL | T1_DIV_BY_2);
set_timer1(24280);
output_c(0x00);
set_tris_b(0x00);
output_c(0xff);
while(true)
{
while(TMR1IF==0)
{
hienthi(giatri);
}
i++;
TMR1IF=0;
set_timer1(24280);
if(i==5) // chinh thoi gian o day i con nho thi gia tri dem cang nhanh va nguoc lai i lon -> dem lau
{
i=0;
giatri++;
if(giatri==500)
{
giatri=0;
}
}
}
}
- Link download project Click here#include <def_877a.h>
#fuses NOLVP,NOWDT,PUT,XT
#use delay(clock=4000000)
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
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()
{
i = 0;
TMR1IF=0;
setup_timer_1(T1_INTERNAL | T1_DIV_BY_2);
set_timer1(24280);
output_c(0x00);
set_tris_b(0x00);
output_c(0xff);
while(true)
{
while(TMR1IF==0)
{
hienthi(giatri);
}
i++;
TMR1IF=0;
set_timer1(24280);
if(i==5) // chinh thoi gian o day i con nho thi gia tri dem cang nhanh va nguoc lai i lon -> dem lau
{
i=0;
giatri++;
if(giatri==500)
{
giatri=0;
}
}
}
}
EmoticonEmoticon