mình đang học vđk 8051 và đang nghiên cứu đo tốc độ động cơ. mình đọc và biết cách sử dụng couter để đếm xung ngoài. vậy làm thế nào để hiển thị nó lên led 7 thanh được với hiện thị là vòng/giây. các bạn nào biết dạy bảo mình với nhé. càng chi tiết càng tốt ạ. mình xin cảm ơn
Thông báo
Collapse
No announcement yet.
bạn nào giúp mình đo tốc độ đọng cơ có encoder hiện thị lên led 7 thanh với
Collapse
X
-
Bạn Dùng thêm ngắt timer nữa. để chu kỳ ngắt khoảng vài chục ms. trong chương trình con phục vụ ngắt thì tính số sung đếm được. giả sử là chu kỳ ngắt là 20ms thì số sung đó sẽ nhân với 50 để ra số sung trong một giây. đồng thời xóa bộ đếm về o. ở đây mình nói với emcoder 1 xung.Nguyên văn bởi canhdt4 Xem bài viếtmình đang học vđk 8051 và đang nghiên cứu đo tốc độ động cơ. mình đọc và biết cách sử dụng couter để đếm xung ngoài. vậy làm thế nào để hiển thị nó lên led 7 thanh được với hiện thị là vòng/giây. các bạn nào biết dạy bảo mình với nhé. càng chi tiết càng tốt ạ. mình xin cảm ơn
-
mình chưa làm cái này bao giờ, bạn có thể hướng dẫn mình cụ thể hơn không. encoder của mình là 100xung/vong. mình trình bày ý hiểu thế này nhé: mình dùng counter đếm số xung trong 1s. được bao nhiêu xung thì chia cho số xung trên 1 vòng. số xung đếm dc trên 1s/100xung=số vòng/s) nhưng mình không hình dung ra là làm thế nào. thế đấyNguyên văn bởi caonhan_2004 Xem bài viếtBạn Dùng thêm ngắt timer nữa. để chu kỳ ngắt khoảng vài chục ms. trong chương trình con phục vụ ngắt thì tính số sung đếm được. giả sử là chu kỳ ngắt là 20ms thì số sung đó sẽ nhân với 50 để ra số sung trong một giây. đồng thời xóa bộ đếm về o. ở đây mình nói với emcoder 1 xung.Last edited by canhdt4; 18-11-2013, 09:48.
Comment
-
Bạn hiểu hoàn toàn đúng. Vấn đề là bạn phải tạo ra một khoảng thời gian chuẩn để lấy mẫu , như mình ví dụ là 200ms. chẳng hạn dùng count1 để đếm xung, còn timer0 để tạo khoảng thời gian chuẩn 200ms, . vậy cứ sau 200ms thì xảy ra ngắt tràn timer0 một lần. Trong chương trình phục vụ ngắt timer0 , phải gán gán trị bộ đếm mà counter1 đếm được cho một biến x. sau khi lưu giá trị đếm được vào x, ta lại reset Conter1 về 0, để để bộ đếm đếm lại từ đầu, vậy cứ 200ms, giá trị bộ đếm lại được cập nhật một lần vào biến x. như vậy ta đã có được số xung đếm được trong 20ms chính là x.Nguyên văn bởi canhdt4 Xem bài viếtmình chưa làm cái này bao giờ, bạn có thể hướng dẫn mình cụ thể hơn không. encoder của mình là 100xung/vong. mình trình bày ý hiểu thế này nhé: mình dùng counter đếm số xung trong 1s. được bao nhiêu xung thì chia cho số xung trên 1 vòng. số xung đếm dc trên 1s/100xung=số vòng/s) nhưng mình không hình dung ra là làm thế nào. thế đấy
số xung trong một giây sẽ là y=x*1000/2=x*500. Do encoder 100 xung , nên số vòng quay đông cơ trong 1s =y/100 .Lấy giá trị y này hiển thị ra led 7 thanh chính là số vòng của động cơ trên 1s.Last edited by caonhan_2004; 18-11-2013, 11:38.
Comment
-
bạn có thể hướng đẫn cho mình viết code được không. mình không hình dung ra được là phải làm thế nào để counter đếm trong 1 khoảng thời gian. bạn có thể viết cho mình đoạn code đó và chú thích vào đấy được không. mình cảm ơnNguyên văn bởi caonhan_2004 Xem bài viếtBạn hiểu hoàn toàn đúng. Vấn đề là bạn phải tạo ra một khoảng thời gian chuẩn để lấy mẫu , như mình ví dụ là 200ms. chẳng hạn dùng count1 để đếm xung, còn timer0 để tạo khoảng thời gian chuẩn 200ms, . vậy cứ sau 200ms thì xảy ra ngắt tràn timer0 một lần. Trong chương trình phục vụ ngắt timer0 , phải gán gán trị bộ đếm mà counter1 đếm được cho một biến x. sau khi lưu giá trị đếm được vào x, ta lại reset Conter1 về 0, để để bộ đếm đếm lại từ đầu, vậy cứ 200ms, giá trị bộ đếm lại được cập nhật một lần vào biến x. như vậy ta đã có được số xung đếm được trong 20ms chính là x.
số xung trong một giây sẽ là y=x*1000/2=x*500. Do encoder 100 xung , nên số vòng quay đông cơ trong 1s =y/100 .Lấy giá trị y này hiển thị ra led 7 thanh chính là số vòng của động cơ trên 1s.
Comment
-
mình loay hoay mãi mà chả biết viết thể nào. dùng timer để thiết lập thời gian đếm cho counter lưa giá trị đếm được và xuất ra ... mình cứ loang quanh ở đoạn đấy không biết viết như thế nào. mình mới học dùng timer và counter thôiNguyên văn bởi tjeunjnzah Xem bài viếtbạn ấy đã nói tới thê này thì gần như là viết code cho bạn rùi mà!
Comment
-
bạn cứ viết đi. Nếu mắc chỗ nào thì nhờ anh em trên diễn đàn giúp đỡ. Bạn đã biết dùng timer chưa, Nếu dùng được timer và Counter là làm lần lượt theo các bước mình nói ở trên là ra. ở đây giá trị của bộ đếm sẽ lưu ở thanh ghi TL và TH của bộ đếm . Việc còn lại chỉ là đọc giá trị đó .Trên diễn đàn này có rất nhiều code, nhưng chỉ nên tham khảo. Bạn tự mày mò tìm hiểu sẽ tốt hơn là xin code.Nguyên văn bởi canhdt4 Xem bài viếtbạn có thể hướng đẫn cho mình viết code được không. mình không hình dung ra được là phải làm thế nào để counter đếm trong 1 khoảng thời gian. bạn có thể viết cho mình đoạn code đó và chú thích vào đấy được không. mình cảm ơnLast edited by caonhan_2004; 19-11-2013, 00:06.
Comment
-
mình viết đoạn code đếm thế này:Nguyên văn bởi caonhan_2004 Xem bài viếtbạn cứ viết đi. Nếu mắc chỗ nào thì nhờ anh em trên diễn đàn giúp đỡ. Bạn đã biết dùng timer chưa, Nếu dùng được timer và Counter là làm lần lượt theo các bước mình nói ở trên là ra. ở đây giá trị của bộ đếm sẽ lưu ở thanh ghi TL và TH của bộ đếm . Việc còn lại chỉ là đọc giá trị đó .Trên diễn đàn này có rất nhiều code, nhưng chỉ nên tham khảo. Bạn tự mày mò tìm hiểu sẽ tốt hơn là xin code.gái trị trong TL1 tối đa là 255 vậy làm sao để mình đếm đến 999999 hoặc hơn nữa đực nhỉ. mình cho biếm đêm=TH1 thì cứ phải TL1 tràn thì TH1 nó mới tăng thêm 1 dơn vịvoid main()
{
TMOD=0x50; //0x50=0101 0000 : C/T=1, bo dem 16bit
TL1=0x00;
TH1=0x00; //xoa bo dem
P3_5=1; //set chân vào
TR1=1; //khoi dong bo dem
// P2=0;
not_enough=0;
full=1;
while(1)
{
ham();
}
}
void delay(unsigned short d)
{
while(d>0)d--;
}
void ham(void)
{
bien=TL1;
tg1=bien/100000;
tg2=bien%100000;
tg3=tg2/10000;
tg4=tg2%10000;
tg5=tg4/1000;
tg6=tg4%1000;
tg7=tg6/100;
tg8=tg6%100;
tg9=tg8/10;
tg10=tg8%10;
dk1=1;P2=M[tg10];delay(40);dk1=0; // hang don vi
dk2=1;P2=M[tg9];delay(40) ;dk2=0; // hang chuc
dk3=1;P2=M[tg7];delay(40) ;dk3=0; // hang tram
dk4=1;P2=M[tg5];delay(40) ;dk4=0; // hang nghin
dk5=1;P2=M[tg3];delay(40) ;dk5=0; // chuc nghin
dk6=1;P2=M[tg1];delay(40) ;dk6=0; // tram nghin
Last edited by canhdt4; 19-11-2013, 12:16.
Comment
-
gái trị trong TL1 tối đa là 255 vậy làm sao để mình đếm đến 999999 hoặc hơn nữa đực nhỉ. mình cho biếm đêm=TH1 thì cứ phải TL1 tràn thì TH1 nó mới tăng thêm 1 dơn vị[/QUOTE]Nguyên văn bởi canhdt4 Xem bài viếtmình viết đoạn code đếm thế này:
gái trị trong TL1 tối đa là 255 vậy làm sao để mình đếm đến 999999 hoặc hơn nữa đực nhỉ. mình cho biếm đêm=TH1 thì cứ phải TL1 tràn thì TH1 nó mới tăng thêm 1 dơn vị
Timer1 gồm 2 thanh ghi TH1,và TL1. gộp lại là 16bit. vậy giá trị của nó có thể đếm được là 2^16-1=65535. muốn đếm nhiều hơn thì bạn nên dùng ngắt ngoài (intx) , hoặc có thể dùng chế độ ngắt tràn của counter với giá trị nạp cho nó là lớn nhất (vớ timer0 nạp 0xff, với tỉmer1 nạp giá trị 0xffff, khi đó nếu giá trị trong bộ đếm vượt qua giá trị Max của bộ đếm thì xảy ra ngắt tràn bộ đếm, cũng giống như ngắt tràn timer. Điểm khác nhau là ngắt tràn timer là timer đếm xung hệ thóng, còn conter đếm xung bên ngoài. Nếu bạn muốn đếm giá trị lớn hơn 65535, phải dùng một biến có thể lưu được giá trị lớn hơn hoặc bằng số cần đếm. VD kiểu Long với giá trị có thể lưu là 32bit, ban đầu cho biến đó bằng 0, cứ mỗi khi xảy ra ngắt ngoài hoặc ngắt do tràn bộ đếm, thì tăng biến đó lên 1 đơn vị. Như vậy bạn sẽ dùng biến đó thay cho việc phải đọc giá trị của bộ đếm. Và việc còn lại tiếp tục như mình nói hôm trước.Last edited by caonhan_2004; 19-11-2013, 19:13.
Comment
-
Bạn hiểu hoàn toàn đúng. Vấn đề là bạn phải tạo ra một khoảng thời gian chuẩn để lấy mẫu , như mình ví dụ là 200ms. chẳng hạn dùng count1 để đếm xung, còn timer0 để tạo khoảng thời gian chuẩn 200ms, . vậy cứ sau 200ms thì xảy ra ngắt tràn timer0 một lần. Trong chương trình phục vụ ngắt timer0 , phải gán gán trị bộ đếm mà counter1 đếm được cho một biến x. sau khi lưu giá trị đếm được vào x, ta lại reset Conter1 về 0, để để bộ đếm đếm lại từ đầu, vậy cứ 200ms, giá trị bộ đếm lại được cập nhật một lần vào biến x. như vậy ta đã có được số xung đếm được trong 20ms chính là x.
số xung trong một giây sẽ là y=x*1000/2=x*500. Do encoder 100 xung , nên số vòng quay đông cơ trong 1s =y/100 .Lấy giá trị y này hiển thị ra led 7 thanh chính là số vòng của động cơ trên 1s.
#include <REGX51.H>
void delay(unsigned short );
sbit dk1=P0^5;
sbit dk2=P0^4;
sbit dk3=P0^3;
sbit dk4=P0^2;
sbit dk5=P0^1;
sbit dk6=P0^0;
unsigned char code M[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0};
unsigned long int tg1;
unsigned long int tg2;
unsigned long int tg3;
unsigned long int tg4;
unsigned long int tg5;
unsigned long int tg6;
unsigned long int tg7;
unsigned long int tg8;
unsigned long int tg9;
unsigned short tg10;
unsigned int i,dem=0, n=0, x=100;
void delay(unsigned short d)
{
while(d>0)d--;
}
void hienthi(){
tg1=n/100000;
tg2=n%100000;
tg3=tg2/10000;
tg4=tg2%10000;
tg5=tg4/1000;
tg6=tg4%1000;
tg7=tg6/100;
tg8=tg6%100;
tg9=tg8/10;
tg10=tg8%10;
dk1=1;P2=M[tg10];delay(40);dk1=0; // hang don vi
dk2=1;P2=M[tg9];delay(40) ;dk2=0; // hang chuc
dk3=1;P2=M[tg7];delay(40) ;dk3=0; // hang tram
dk4=1;P2=M[tg5];delay(40) ;dk4=0; // hang nghin
dk5=1;P2=M[tg3];delay(40) ;dk5=0; // chuc nghin
dk6=1;P2=M[tg1];delay(40) ;dk6=0; // tram nghin
}
void main() // chuong trinh chinh
{
while (1)
{
for(i=0;i<20;i++)
{
TMOD=0x61; //su dung conter 1 che do 8bit va timer0 che do 16bit
TH0=0xc3; //-50000 us
TL0=0x50; //
TH1=0x00; TL1=0x06; // xoa thanh ghi TH va TL
TR0=1; TR1=1; // cho phep timer0 va counter 1 chay
P3_5=1; // set chan T0 cho nhan xung ngoai
}
if(i==20)i=0; //cho timer0 tràn
{
TR0=0;TR1=0;
dem = TL1;
n = (dem/x)*(10^6/50000)*60;
hienthi();
TR0=1;TR1=1;
}
}
}
mình viết theo ý hiểu của mình với nhưng gì bạn nói, nó không chạy được. bạn xem giúp là chỗ nào chưa đúng cho mình với nhé!
Comment
-
bạn nào biết lập trình hiển thị tốc độ đông cơ cho mình hỏi code này viết chuẩn không ạ. mình test thử hình như sai ở đâu đó thì phải. mọi người xem giúp với ạ
#include <REGX51.H>
sbit A1 = P1^3;
sbit A2 = P1^4;
sbit A3 = P1^5;
sbit A4 = P1^6;
sbit TANG=P1^0;
sbit GIAM=P1^1;
unsigned char so[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0};
unsigned long xung,i;
unsigned int k;
unsigned char dem,tocdo;
///////////////////////////////////////
void delay(int time) // ham delay phuc vu quet led
{int n;
for(n=0;n<time;n++)
{
;
}
}
//////////////////////////////////////
void quetled7() // ham quet led 7
{ //////////////// hang nghin
A1 = 1;
P2 = so[i/1000];
delay(50);
A1 = 0;
P2=0xff;
////////////////////////// hang tram
A2=1;
P2=so[(i/100)%10];
delay(50);
A2=0;
P2=0xff;
///////////////////////////////// hang chuc
A3=1;
P2=so[(i/10)%10];
delay(50);
A3=0;
P2=0xff;
//////////////////////////////// hang don vi
A4=1;
P2=so[i%10];
delay(50);
A4=0;
P2=0xff;
}
/////////////////////////////////////
void khoitaotimer() // 0010 0001 timer2 che do 8bit. timer1 che do 16bit
{ TMOD = 0x21; // timer0 che do 1
IE = 0x8A;
TH0 = 0xC3; // tre 50us
TL0 = 0x50;
ET0 = 1;
TR0 = 1;
TH1 = -100;
TL1 = -100;
ET1 = 1;
TR1 = 1;
}
////////////////////////////
void khoitaongatngoai()
{ EA=0;
EX0=1;
IT0=1;
EA=1;
}
///////////////////////////////////////////
void isr_timer0() interrupt 1
{ TF0=0;
TR0=0;
quetled7();
k++;
TH0=0xC3; // gia tri nap lai
TL0=0x50;
if(k==20) // lay mau 1s
{
i
xung*60)/100); // vong/phut encoder dung loai 32x
k=0;
xung=0;
}
TR0=1;
}
/////////////////////////////////////////
void isr_timer1() interrupt 3
{ TF1=0;
TR1=0;
dem++;
if(dem>100)
dem=0;
if(dem<tocdo)
P1_6=1;
else
P1_6=0;
TR1=1;
}
/////////////////////// phim nhan
void phimnhan()
{
//////////////////////////
if((TANG==0)&&(GIAM==1))
{
while(!TANG);
tocdo=tocdo+10;
if(tocdo==110)tocdo=100;
}
////////////////////////////////
if((GIAM==0)&&(TANG==1))
{while(!GIAM);
tocdo=tocdo-10;
if(tocdo==-10)tocdo=0;
}
}
/////////////////////////////////// ham ngat ngoai
void isr_ex0() interrupt 0
{
xung++;
}
////////////////////////////////////// ham chinh
void main()
{P1_6=1;
khoitaotimer();
khoitaongatngoai();
while(1)
{phimnhan();
}
}
Comment
Bài viết mới nhất
Collapse
-
Trả lời cho Xin hỏi về mạch thu FM/AM trong catsettebởi nguyendinhvanTheo tôi, nó chỉ là cái Tuy- ê - nơ, hoặc là khối Trung Văn Tần, nó một phần trong cái Da đì ô thôi. Vì có thấy một chỗ có ba chân hàn, giiống như chân Cờ rít sờ tăng 455 ki nô hẹc. Còn khối Tuy ê nơ thì không nhìn thây cái Di ốt Va di cáp...
-
Channel: Điện thanh
Hôm qua, 19:59 -
-
Trả lời cho Đấu tắt điện cho máy tính bảngbởi afrendlyCó vẻ ngoài hiểu biết của mình rồi. Cuối cùng mình quyết định tìm mua 2 pin trên Shopee, giá 200K thay vào. Tuy nhận pin được 1%, sạc mãi không vào nhưng cũng mở được máy lên. Vậy cũng tạm. Cảm ơn bạn đã hỗ trợ nhé....
-
Channel: Thiết bị điện tử cá nhân
04-12-2025, 01:27 -
-
Trả lời cho Máy điện châm ?bởi nick22Đúng như bạn nói, máy điện châm hiện nay trên thị trường đã khá đa dạng về mẫu mã, chức năng và giá thành.
-
Channel: Điện tử y sinh
01-12-2025, 13:23 -
-
Trả lời cho Làm thế nào để check IC LM358bởi thetungĐể check IC sống hay chết thì đơn giản : bạn lắp cái mạch ( khuếch đại hoặc dao động ) chạy bằng con IC đó ,nhưng vị trí IC thì lắp cái đế .... thế là cứ cắm rút thì biết . Còn không thì kiếm cái này : https://shopee.vn/Xu-M%C3%A1y-ki%E1%...di-%C4%91%E1%B...
-
Channel: Hướng dẫn tìm thông tin linh kiện
28-11-2025, 14:34 -
-
bởi ngochung90Tình hình là em có mua mạch 3s về để hàn vào khối pin 12v, hàn xong em đo tại các chân từ B-, B1, B2, B+ thì điện áp pin vẫn đủ 12,6v, nhưng tại 2 chân ra P- P+ thì đo chỉ được 6,3v là bị sao các bác, và chân P- P + này đồng thời là chân sạc xả thì mình cắm sạc xả cùng lúc được ko ạ
...-
Channel: Điện tử dành cho người mới bắt đầu
28-11-2025, 10:32 -
-
Trả lời cho Làm thế nào để check IC LM358bởi nguyendinhvanViệc đó tùy thuộc trình độ khoa học kỹ thuật công nghệ ứng dụng hiện tại thôi.
Trong datasheet,họ đưa ra nhiều thông số. Tùy theo khả năng , và những thông số họ cần, họ sẽ kiểm tra casc số đo có khớp với số liệu trong datasheet...-
Channel: Hướng dẫn tìm thông tin linh kiện
27-11-2025, 18:00 -
-
bởi kqbn9091Em có mạch AT89s8253 đang cần sửa số serial no của CHIP mà giờ lâu quá rồi không dùng keil nên không biết phải làm sao, trong khi chỉ còn file hex. Mạch nạp thì progris khi viết không sửa được số serial của IC. Rất cần bác nào còn làm về 89...
-
Channel: Vi điều khiển họ 8051
27-11-2025, 11:13 -

Comment