View Full Version : Dùng ngắt ngoài để đếm xung!!!
huydungsh
20-12-2012, 04:54 AM
các anh cho em hỏi chương trình sau bị lỗi gì mà sao em dùng ngắt ngoài để đếm xung mà chỉ hiện lên số 0 ak??? thanks all!!!
#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=20000000)
#use fast_io(b)
#use fast_io(d)
#priority ext,timer1
int16 dem,j,x,count,nghin,tram,chuc,dv;
unsigned char MA7DOAN[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,
0x7D,0x07,0x7F,0x6F};
#int_ext
void ngat_RB0()
{
++count;
x=count;
}
void main()
{
set_tris_b(0b00000001);
set_tris_d(0);
set_tris_c(0);
enable_interrupts(global);
enable_interrupts(int_ext);
ext_int_edge(H_to_L);
//count=0;
while(1)
{
nghin=x/1000;
x=x%1000;
tram=x/100;
dem=x%100;
chuc=x/10;
dv=x%10;
for(j=0;j<=100;j++)
{ output_d(0xbf);
output_c(MA7DOAN[dv]);
delay_us(1000);
output_d(0xdf);
output_c(MA7DOAN[chuc]);
delay_us(1000);
output_d(0xef);
output_c(MA7DOAN[tram]);
delay_us(1000);
output_d(0Xf7);
output_c(MA7DOAN[nghin]);
delay_us(1000); }
}
}
hatuan296
20-12-2012, 08:40 AM
Bạn thay XT = HS trong dòng này , thạch anh hơn 10Mhz thì phải set là HS bạn ơi . #fuses NOWDT,PUT,XT,NOPROTECT
Sau đó từ từ tính tiếp .
huydungsh
21-12-2012, 10:28 AM
anh ơi em sửa như anh nói ma sao không được!! vẫn cứ hiện lên số 0, mong anh giúp cho ak!! em cảm ơn nhiều lắm!! mà anh có code mẫu về phần này cho em xin với??
nhanh0112
21-12-2012, 12:31 PM
Bạn bỏ tiếp mấy dòng này đi.
#use fast_io(b)
#use fast_io(d)
#priority ext,timer1
Và nữa là: biến x của bạn sẽ bị chia liên tục trong khi chờ đợi xung tiếp theo đến (việc chia liên tục sẽ làm cho x=0)
Ý tưởng sửa như thế này. Bỏ biến X đi, dùng trực tiếp biến count:
nghin=count/1000;
tram=(count%1000)/100;
chuc=(count%100)/10;
dv=count%10;
Phải ko nhỉ, bạn thử lại xem?!
pstin
21-12-2012, 07:47 PM
Chương trình chạy ngon lành nè!!!!,...
Hiển thị led chậm lại, lặp lại ít lần để dễ quan sát trên Protues!!!.
Seg a,b,c,d,e,f,g....lần lượt nối với C0, C1,....C6
#include <16F877A.h>
#include <DEFS_16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=20000000)
#use fast_io(b)
#use fast_io(d)
#priority ext,timer1
int16 dem,j,x,count=0,nghin,tram,chuc,dv,y;
unsigned char MA7DOAN[] = {0x40,0x79,0xa4,0x30,0x19,0x12,
0x02,0x78,0x00,0x10};
#int_ext
void ngat_RB0()
{
char c;
c=input_b();
++count;
x=count;
}
void main()
{
set_tris_b(0b00000001);
set_tris_d(0);
set_tris_c(0);
enable_interrupts(global);
enable_interrupts(int_ext);
ext_int_edge(H_to_L);
//count=0;
while(TRUE)
{
nghin=x/1000;
y=x%1000;
tram=y/100;
dem=y%100;
chuc=dem/10;
dv=dem%10;
for(j=0;j<=10;j++)
{
output_d(0xbf);
output_c(MA7DOAN[dv]);
delay_ms(10);
output_d(0xdf);
output_c(MA7DOAN[chuc]);
delay_ms(10);
output_d(0xef);
output_c(MA7DOAN[tram]);
delay_ms(10);
output_d(0Xf7);
output_c(MA7DOAN[nghin]);
delay_ms(10);
}
}
}
pstin
21-12-2012, 07:53 PM
Chịu khó luyện tay nghề mới "lên" được!!!..
caothanhtiger
12-01-2013, 07:36 PM
output_d(0xbf);
output_c(MA7DOAN[dv]);
delay_ms(10);
output_d(0xdf);
output_c(MA7DOAN[chuc]);
delay_ms(10);
output_d(0xef);
output_c(MA7DOAN[tram]);
delay_ms(10);
output_d(0Xf7);
output_c(MA7DOAN[nghin]);
delay_ms(10);
led 7SEG này anot chung sao set muc "0" nhỉ output_d(0xbf)=10111111
nêu mình nghĩ đúng thì phải set mức "1" thì led mới sáng được chứ nhỉ output_d(0x40) = 01000000 tương ứng hàng đơn vị.
mong bạn giải thích dùm . mới tìm hiểu về lĩnh vực về pic
caothanhtiger
12-01-2013, 09:17 PM
output_d(0xbf);
output_c(MA7DOAN[dv]);
delay_ms(10);
output_d(0xdf);
output_c(MA7DOAN[chuc]);
delay_ms(10);
output_d(0xef);
output_c(MA7DOAN[tram]);
delay_ms(10);
output_d(0Xf7);
output_c(MA7DOAN[nghin]);
delay_ms(10);
led 7SEG này anot chung sao set muc "0" nhỉ output_d(0xbf)=10111111
nêu mình nghĩ đúng thì phải set mức "1" thì led mới sáng được chứ nhỉ output_d(0x40) = 01000000 tương ứng hàng đơn vị.
mong bạn giải thích dùm . mới tìm hiểu về lĩnh vực về pic
pstin
13-01-2013, 09:26 AM
output_d(0xbf);
output_c(MA7DOAN[dv]);
delay_ms(10);
output_d(0xdf);
output_c(MA7DOAN[chuc]);
delay_ms(10);
output_d(0xef);
output_c(MA7DOAN[tram]);
delay_ms(10);
output_d(0Xf7);
output_c(MA7DOAN[nghin]);
delay_ms(10);
led 7SEG này anot chung sao set muc "0" nhỉ output_d(0xbf)=10111111
nêu mình nghĩ đúng thì phải set mức "1" thì led mới sáng được chứ nhỉ output_d(0x40) = 01000000 tương ứng hàng đơn vị.
mong bạn giải thích dùm . mới tìm hiểu về lĩnh vực về pic
Cũng tùy theo người dùng khoái chiêu nào thôi!!!,..
Mạch sử dụng transistor PNP, loại này phải kích mức thấp mới dẫn, dòng kích sẽ chạy từ cực E ---> B.
Kích trasistor NPN thì kích mức 1, dòng kích sẽ chạy từ cực B ---> E, kích kiểu này có nhiều "hạn chế", chủ yếu dùng kể "kích dẫn nối mass",...nếu dùng kích ở phía Vcc thay cho transistor như sơ đồ ở trên...thì áp ra bị sụt áp phía đầu Anot của led 7 đoạn,...áp sẽ < 4.3V.
(Cái sơ đồ ở trên đáng lẽ phải có các điện trở hạn dòng vô port_C,..tại làm biếng vẽ nên nó vậy).
vBulletin® v3.8.11, Copyright ©2000-2025, vBulletin Solutions Inc.