Cảm ơn bạn, mình đã giải quyết được vấn đề rồi.Nhưng vẫn còn một vài vấn đề nhỏ
Chương trình hoàn chỉnh như sau :
#include <16F877A.h>
#priority EXT,TIMER1,timer0
#fuses NOWDT,PUT,XT,NOPROTECT,NOLVP,HS
#device *=16
#use delay(clock=20000000)
#use fast_io(b)
#use fast_io(d)
#use fast_io(c)
#byte portb=0x06
#byte portd=0x08
#byte portc=0x07
#byte PORTB = 0x06
unsigned char led1,led2,led3;
int16 count=0 ;
int32 dem=0;
float vantoc;
int32 x=0;
void convert_bcd(int32 x);
void docxung();
#int_timer0
void interrupt_timer0()
{
set_timer0(6);
++dem;
if(dem ==18200)// 5s
{
dem=0;
x=count;
count=0;
}
}//ket thuc ngat timer
void convert_bcd(int32 x)
{
led1 = x / 100;
x = x %100;
led2 = x / 10;
led3 = x % 10;
{
char maled7[] = {0x7e,0x18,0xec,0xe6,0xd2,0xb6,0xbe,0x62,0xfe,0xf6 };
portb = (maled7[led3]); output_low(PIN_D5); delay_us(90); output_high(pin_D5);
portb = (maled7[led2]); output_low(PIN_D6); delay_us(90); output_high(pin_D6);
portb = (maled7[led1]); output_low(PIN_D7); delay_us(90); output_high(pin_D7);
}
}
void docxung()
{
if(input(pin_c5)==0)
{
count++;
while(input(pin_c5)==0)
convert_bcd(x);
}
}
void main(void)
{
set_tris_b(0);
set_tris_d(0x00);
set_tris_c(0xFf);// dau vao la C7,C6,C5,C4,xung vao chan c5
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
enable_interrupts(global);
set_timer0(6);// T_dinhthi =delay= 2*(256 - 6)*0.2us = 100us
count=0;
while(true)
{
docxung();
convert_bcd(x);
}}
Mình muốn hiển thị giá trị của vận tốc ra xung/s (hay vòng/s).Nhưng giá trị này tính ra theo thực tế phải là dạng số thực chứ không phải là số nguyên (3 led hiển thị giá trị số nguyên).MÌnh định chuyển giá trị đó sao cho nhìn trên led 7 đoạn có thể thấy được giá trị.Ví dụ 1.52 vòng/s thì hiển thị trên led là 152 chẳng hạn.Mình thêm đoạn như sau:
vantoc=(count/10);
x=vantoc*100;
Tuy nhiên mình thấy hiển thị trên led không đúng.Không biết phải sử dụng các biến như thế nào để có được kết quả chính xác.
Ngoài ra mình sử dụng công thức
T_dinhthi =delay= 2*(256 - 6)*0.2us = 100us
khi đó để có 10s thì giá trị của biến dem là 100000, nhưng mình thử lại thì không đúng, phải là 20000, vì mình dùng thạch anh 20mhz .Như vậy giá trị trên phải là 500us (T_dinhthi =delay= 2*(256 - 6)*1us = 500us) cho thạch anh 4mhz ?Thực tế là mình dùng đồng hồ bấm giờ tính ra như trên(viết 1 đoạn chương trình ngắn dịch led bằng timer thử nghiệm và dùng đồng hồ bấm giây kiểm tra.)
Ai có thể giải thích tại sao chỉ dùm mình với .
|