![]() |
|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
|
Ðiều Chỉnh | Xếp Bài |
![]() |
#15 |
Nhập môn đệ tử
Tham gia ngày: Aug 2008
Bài gửi: 10
: |
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 . |
![]() |
![]() |
|
|