View Single Post
Old 18-05-2009, 02:19 PM   #14
lequocbao
Đệ tử 6 túi
 
lequocbao's Avatar
 
Tham gia ngày: Oct 2008
Nơi Cư Ngụ: HCM
Bài gửi: 137
:
Trích:
Nguyên văn bởi numb2008 View Post
chương trình hiện tại mình kết hợp như sau

#include <16F877A.h>
#priority EXT,TIMER1,timer0
#fuses NOWDT,PUT,XT,NOPROTECT,NOLVP,HS
#device *=16
#use delay(clock=4000000)
#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;
int16 xung=0;
int32 vantoc=0;
int32 x=0;
int32 timer=0;
void convert_bcd(int32 x);
void display();
void docxung();

#int_timer0
void interrupt_timer0()
{
set_timer0(6);
++dem;
if(dem = 2000)// 2000*500us = 1s
{
dem=0;
x=count;
count=0;
}
}//kết thúc hàm ngắt timer0

void convert_bcd(int32 x)
{
led1 = x / 100;
x = x %100;
led2 = x / 10;
led3 = x % 10;
}
void display()
{
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);
display();
}
}
}

//Chuong trinh chinh
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)*1us = 500us//thạch anh 20M thì ckm=0.2us thôi nha bạn,bạn tính lại chổ này nha!
count=0;
while(true)
{
docxung();
convert_bcd(x);
display();
}




chương trình như trên ý định của mình là xuất ra 3 led 7 đoạn giá trị xung đếm được sau 10s(dùng timer0 delay 10s , trong thời gian đó đếm số xung).Tuy nhiên khi nạp vào chip thì chạy không đúng, mỗi khi có xung thì nó tăng 1 giá trị, trên bảng led (3 led 7 đoạn) giá trị tăng dần chứ không đúng ý đồ.MÌnh đã thử đặt đoạn chương trình đoc xung vào nhiều chỗ nhưng chưa đúng.Mong các bạn giúp đỡ vì thời gian với mình cũng không còn nhiều.
Bạn nên lập trình theo hướng như thế này nè:
+chương trình chính:
-đọc liên tục chân rc5 nếu có sự thay đổi mức logic từ 1 sang 0 thì biến count tăng 1.
- quét 3 led 7 đoạn với tham số truyền là x.
- sau 1s thì xảy ra ngắt timer.(theo mình bạn nên kiểm tra tốc độ sau 1s or 0.5s là hợp lý hơn, do trục quay tương đối chậm nên hiển thị led 7 đoạn là vòng/s nha).
+chương trình phục vụ ngắt timervd sau 1s)
- lấy biến x=count;
- xóa biến count;
-trở về chương trình chính.

bạn tham khảo thử đoạn code trên mình đã sữa lại,còn nữa bạn chú ý các dấu {} nha,mình thấy bạn bỏ tứ tung hết.Còn nữa nếu không có gì đặt biệt thì bạn nên gom 2 hàm convert_bcd(x) và display() lại 1 lun cho gọn khi lập trình.khi đó bạn chỉ cần gọi hàm convert_bcd_display(x); là ok rùi.
__________________
A&A

thay đổi nội dung bởi: lequocbao, 18-05-2009 lúc 02:25 PM.
lequocbao vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn