Chủ Nhật, 12 tháng 8, 2012

[dientu686.com]Dientu686.com nhận đặt mua linh kiện nước ngoài


Dientu686.com nhận đặt mua linh kiện nước ngoài

Linh kiện điện- điện tử bao gồm:
- Linh kiện trong nước không có sẵn hàng.
- Linh kiện hiếm gặp, ít sử dụng.
- Linh kiện cần số lượng lớn, giá tốt hơn giá thị trường.

Điều kiện đặt mua :
- Số lượng tốt thiểu đặt mua là 10 đơn vị, hoặc giá trị đơn hàng lớn hơn 300.000 vnd.

- Thông tin linh kiện bao gồm tên đầy đủ của linh kiện, kiểu chân, Datasheet kèm theo (nếu có). 

- Giá linh kiện phụ thuộc và số lượng đặt hàng.
- Báo giá linh kiện sau 1 ngày.
- Thanh toán 100% trước khi nhận hàng. 

Phương thức đặt mua:
- Gửi email gồm danh sách linh kiện, số lượng cần đặt mua, thông tin liên hệ theo mẫu sau đến e-mail dientu686@gmail.com (ưu tiên e-mail có đầy đủ thông tin liên hệ).
- Gọi điện, nhắn tin số điện thoại 0985 946 944
- Liên hệ trực tiếp tại Nguyên Xá  - Minh Khai - Từ Liêm - Hà Nội

Thời gian đặt mua :
- 2-14 ngày có hàng kể từ ngày đặt mua, Số ngày cụ thể tuỳ vào thời điểm và được thông báo khi đặt mua.

Xin chân thành cám ơn!
http://dientu686.com/

Thứ Sáu, 10 tháng 8, 2012

[dientu686.com]Tối ưu hóa nguyên của 8051 bằng con trỏ


Tối ưu hóa nguyên của 8051 bằng con trỏ

về nguyên tắc khi lập trình, tất cả các hoạt dộng xử lý thì trình dịch đã xử lý trên C, đến khi nạp vào chip thì đó chỉ là những giá trị nhị phân 8 bit hoặc 16 bit....
nếu tất cả những gì trên C làn được thì mình cũng có thể tích hợp vào trong chương trình chạy của mình.
hôm nay mình xin trình bày về các cách lập trình để tối ưu tài nguyên của 8051:
1, sử dụng con trỏ thay vì dùng các mảng cố định.
mình xin đưa ra 2 cách để các bạn so sánh: (mình chỉ đưa ra phần chính)
cách 1:
char *chuoi ="EITVIET.COM"; // đây là khai báo kiểu chuỗi kí tự
char *chuoi2="tiennam191";
...............................................
void hienthi1()
{
......xử lý để hiển thị chuỗi "EITVIET.COM" lên LCD, Matrix,...
}
void hienthi2()
{
xử lý để hiển thị chuỗi "tiennam191" lên LCD, Matrix,,....
}
-> về cơ bản thì chúng ta viết ra 2 hàm này ko sai, nhưng vẫn tiêu phí của vđk kha khá bộ nhớ. mình nói như vậy vì các nguyên nhân sau. thứ nhất đây đều là định dạng kiểu chuỗi, chúng đều có thuộc tính về độ dài, mã của các kí tự và dùng chung file "string.h". thứ 2 chúng ta có thể dùng con trỏ để xử lý 2 chuỗi này trong 1 hàm chung.
mình xin đưa ra cách của mình :
#include <stdio.h>
#include <string.h>
unsigned int dodai,i;
void hienthi(char *chuoi) // chuoi sẽ trỏ đến chuỗi mình nhập vào.
{
dodai=strlen(chuoi); // hàm strlen(); sẽ đo độ dài 1 chuỗi, để sử dụng hàm này cần có thư viện string.h
for(i=0;i<dodai;i++) // độ dài chuỗi đã được đo bằng hàm strlen().
{
hienthi_kt(chuoi[i]); // trường hợp này mình dùng trong hiện thị lcd các bạn có thể thay bằng các cách hiện thị khác....
........................... // xử lý thêm các việc khác
}
}

khi sử dụng thì chúng ta nhập luôn chuỗi để ghi vào hàm.
ví dụ : hienthi("EITVIET.COM"); hienthi("tiennam191"); tóm lại các bạn có thể ghi bất kì chuỗi nào vào trong hàm để hiển thị.
qua kinh nghiệm của mình thì mình thấy mảng 1 chiều, 2 chiều,... cũng có thể áp dụng con trỏ, để xử lý.
Mình xin đưa ra ví dụ
Unsigned char sangdan[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
Unsigned char sangmot[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
Unsigned char I;
Void delay(unsigned int tre)
{
While(tre--);
}
Void hienthi(unsigned char *mang)
{
For(i=0;i<8;i++)
{
P0=P3=mang[i];
P1=P2=0x00;
Delay(1000);// trễ 1000*8 uS
}
}
Khi sử dụng chỉ cần gọi : hienthi(sangmot); hienthi(sangdan);
Đây là những kinh nghiệm khi lập trình của mình, hi vọng sẽ có ích cho các bạn.
phần 2: 1 chương trình led trái tim dùng con trỏ.bạn hãy mổ xẻ nó nhé. hi vọng các bạn sẽ phát triển code để có những hiệu ứng đẹp và thuật toán tối ưu hơn. 
#include <regx52.h>
#define tien 1
#define lui 0
unsigned char i,j,k,a,b,c,d,e,f;
unsigned char sm[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0xff};
unsigned char sd[]={0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00};
unsigned char td[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
unsigned char pr[]={0x0F,0x87,0xC3,0xE1,0xF0,0xF8,0xFC,0xFE,0xFF};
unsigned char nn[]={0xFE,0xFD,0xFA,0xF5,0xEA,0xD5,0xAA,0x55,0xAA};
unsigned char dn[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,
0x7E,0x7D,0x7B,0x77,0x6F,0x5F,0x3F,0x3E,
0x3D,0x3B,0x37,0x2F,0x1F,0x1E,0x1D,0x1B,
0x17,0x0F,0x0E,0x0D,0x0B,0x07,0x06,0x05,
0x03,0x02,0x01,0x00};
void delay(unsigned int time) { while(time--); }
unsigned char lb(unsigned char bi)
{
unsigned char j,r;
unsigned int tg;
for(j=0;j<8;j++) { r=(bi&0x01)?1:0;tg|=r;tg<<=1;bi>>=1; }
tg=tg/2;
return tg;
}

void hu1(unsigned char *ma,unsigned char l,unsigned char model,unsigned char ma1,unsigned char ma2,unsigned int tre)
{
for(i=0;i<l;i++) 
{
if(model==tien) { a=ma[i]; b=ma1; c=ma[i]; d=ma1; }
if(model==lui) { a=ma1; b=lb(ma[i]); c=ma1; d=ma[i]; }
delay(tre);
}
for(i=0;i<l;i++) 
{
if(model==tien) { a=ma2 ; b=ma[i]; c=ma2; d=lb(ma[i]); }
if(model==lui) { a=lb(ma[i]); b=ma2; c=lb(ma[i]); d=ma2; }
delay(tre);
}
}
void hu2(unsigned char *ma,unsigned char bd,unsigned char kt,unsigned char chieu,unsigned char dao,unsigned int tre)
{
for(i=bd;i<kt;i++) 
{
if(dao==lui) j=(kt-i-1);
if(dao==tien) j=i;
if(chieu==tien) {a=b=c= ma[j]; d=lb(ma[j]); }
if(chieu==lui ) {a=b=c= lb(ma[j]); d=ma[j]; }
delay(tre);

}
void hu3(unsigned char *ma,unsigned char l,unsigned char gt1,unsigned char chieu,unsigned char dao,unsigned int tre)
{
for(i=0;i<8;i++) 

if(dao==lui) j=(l-i-1);
if(dao==tien) j=i;
if(chieu==tien){a=ma[j];b=c=d=~gt1;}
if(chieu==lui ){d=ma[j];a=c=b=~gt1;}
delay(tre);
}
for(i=0;i<8;i++) 

if(dao==lui) j=(l-i-1);
if(dao==tien) j=i;
if(chieu==tien){a=gt1;b=ma[j];c=d=~gt1;}
if(chieu==lui ){d=gt1;c=lb(ma[j]);a=b=~gt1;}
delay(tre);
}
for(i=0;i<8;i++) 

if(dao==lui) j=(l-i-1);
if(dao==tien) j=i;
if(chieu==tien){a=b=gt1;c=ma[j];d=~gt1;}
if(chieu==lui ){d=c=gt1;b=lb(ma[j]);a=~gt1;}
delay(tre);
}
for(i=0;i<8;i++) 

if(dao==lui) j=(l-i-1);
if(dao==tien) j=i;
if(chieu==tien){a=b=c=gt1;d=lb(ma[j]);}
if(chieu==lui ){d=c=b=gt1;a=lb(ma[j]);}
delay(tre);
}
}
void do_nuoc(unsigned char model, unsigned int tre)
{
unsigned char bd=0,kt=0;
for(j=8;j>0;j--)
{
bd=kt;kt=kt+j;
for(i=0;i<9;i++) 

if(model==tien) { a=sm[i]; c=sm[i];} 
if(model==lui ) { b=lb(sm[i]); d=sm[i];} 
delay(tre);
}
for(i=bd;i<kt;i++) 

if(model==tien) {b=dn[i]; d=lb(dn[i]); }
if(model==lui ) {a=lb(dn[i]); c=lb(dn[i]); }
delay(tre);
}

for(i=0;i<36;i++) 

if(model==tien) {b=0x00;d=0x00;a=dn[i];c=dn[i];}
if(model==lui ) {a=0x00;c=0x00;b=lb(dn[i]);d=dn[i];}
delay(tre);
}
}
void nhapnhay(unsigned int tre)
{
for(i=0;i<3;i++) 
{
a=b=c=d=0x00;delay(tre);
a=b=c=d=0xff;delay(tre);
}
}
void main()
{
while(1) 
{
nhapnhay(30000);
hu1(sm,8,tien,0xff,0xff,20000);
hu1(sm,8,lui ,0xff,0xff,20000);
hu2(sm,0,8,tien,tien,20000);
hu2(sm,0,8,lui ,tien,20000);
hu2(sd,0,8,tien,tien,20000);
hu2(sd,0,8,tien,lui ,20000);
hu2(dn,0,36,lui ,tien,20000);
hu1(sd,8,tien,0xff,0x00,20000);
hu1(td,8,tien,0x00,0xff,20000);
hu1(sd,8,lui ,0xff,0x00,20000);
hu1(td,8,lui ,0x00,0xff,20000);
hu3(sd,8,0x00,tien,tien,20000);
hu3(td,8,0xff,lui ,tien,20000);
hu3(sd,8,0x00,lui ,tien,20000);
hu3(td,8,0xff,tien,tien,20000);
do_nuoc(lui ,20000);
nhapnhay(30000);
hu2(dn,0,36,tien,tien,20000);
hu2(sd,0,8,tien,lui ,20000);
hu2(sd,0,8,tien,tien,20000);
hu3(td,8,0xff,tien,tien,20000);
do_nuoc(tien,20000);
hu2(dn,0,26,tien,tien,20000);
hu2(pr,0,7,tien,tien,35000);
hu2(dn,14,26,lui,tien,20000);
hu2(pr,0,7,lui,tien,30000);
hu2(dn,14,36,tien,tien,20000);
hu2(sm,0,8,tien,tien,20000);
hu2(sm,0,8,lui ,tien,20000);
hu2(sd,0,8,tien,tien,20000);
hu2(sd,0,8,tien,lui ,20000);
hu2(dn,0,26,tien,tien,20000);
hu2(pr,0,7,tien,tien,35000);
hu2(dn,0,36,lui ,tien,20000);
hu2(pr,0,7,lui,tien,30000);
hu2(dn,14,36,tien,tien,20000);
nhapnhay(30000);
do_nuoc(tien,20000); 
hu1(sm,8,tien,0xff,0xff,20000);
hu1(sm,8,lui ,0xff,0xff,20000);
hu3(sd,8,0x00,tien,tien,20000);
hu3(td,8,0xff,lui ,tien,20000);
hu3(sd,8,0x00,lui ,tien,20000);
hu3(td,8,0xff,tien,tien,20000);
hu1(sd,8,tien,0xff,0x00,20000);
hu1(td,8,tien,0x00,0xff,20000);
hu1(sd,8,lui ,0xff,0x00,20000);
hu1(td,8,lui ,0x00,0xff,20000);
hu3(sd,8,0x00,tien,tien,20000);
hu3(td,8,0xff,lui ,tien,20000);
hu3(sd,8,0x00,lui ,tien,20000);
hu3(td,8,0xff,tien,tien,20000);
do_nuoc(lui ,20000);
hu2(dn,0,26,tien,tien,20000);
hu2(pr,0,7,tien,tien,35000);
hu2(dn,14,26,lui,tien,20000);
hu2(pr,0,7,lui,tien,30000);
}

}

http://dientu686.com/ 

[dientu686.com]Tìm hiểu các thông số của động cơ bước trước khi tính toán


Tìm hiểu các thông số của động cơ bước trước khi tính toán

Mình xin khai bút trong diễn đàn.

Moment xoắn , sự chính xác và độ phân giải là những thông số kỹ thuật quan trọng của một động cơ bước.
Động cơ bước cung cấp các thỏa thuận để có thế kiểm tra khi mà các kỹ sư đang đau đầu để xác định lý do tại sao một động cơ cụ thể lại gặp vấn đề trong một ứng dụng đặc biệt. Động cơ bước nổi bật trong việc cung cấp khả năng điều khiển chính xác vị trí và vận tốc góc với đáp ứng xung điện áp từ một mạch điều khiển vòng hở, nhưng với điều kiện người thiết kế hệ thống phải tính toán được ảnh hưởng của những thông số liên quan đến động cơ .
Trong một động cơ bước thực tế , một rotor bằng sắt có nhiều răng đáp ứng với từ trường thay đổi trong nam châm điện của stator được sinh ra bởi một mạch điều khiển . Những mạch này phải cung cấp các xung tuần tự đúng lúc cho những pha cần thiết để lái rotor đến một vị trí góc nhất định trong một thời gian xác định với sai số chấp nhận được và giữ nó tại vị trí đó cho tới khi mạch điều khiển chỉ định một vị trí mới . Dưới đây là một số các thông số có liên quan đến động cơ mà chúng ta sẽ thảo luận trong các yêu cầu hoạt động cụ thể :
- dynamic torque : moment được hình thanhg bởi động cơ khi chuyển động ,nó phụ thuộc vào dòng điện trong nam châm điện của stator.
- Phase inductance: một tham số điện , nó giới hạn thời gian lên của dòng điện pha và do đó ảnh hưởng tới dynamic torque.
- Holding torque : moment của động cơ sinh ra để ngăn cản một tải tĩnh nào đó có ý định kéo hệ thống ra khỏi vị trí hiện tại.
- Torque stiffness : một khả năng của động cơ chống lại sự chuyển vị góc trong một bước.
- Rotor inertia : một thông số cơ khí ,nó giới hạn khả năng tăng tốc và giảm tốc của động cơ.
Những vấn đề của động cơ bước bắt đầu khi khách hàng tiếp cận với nhà cung cấp động cơ bước với những tài liệu không đầy đủ hoặc không chính xác. Thí dụ ,nhà thiết kế của một công ty yêu cầu một động cơ có moment giữ (holding torque) nhất định trong khi cái mà họ thực sự cần là moment động (dynamic torque) . Và khi không có lựa chọn phù hợp có lẽ họ tìm đến động cơ có moment giữ lớn hơn.
Một động cơ không nhất thiết phải thỏa mãn tất cả các yêu cầu,bởi vì một moment giữ lớn hơn không nhất thiết phải chuyển thành một moment động lớn hơn .Ngoài ra, moment giữ lớn hơn luôn đi đôi với một quán tính cũng lớn hơn , làm cản trở khả năng tăng tốc và có thể làm chậm sự hoạt động của hệ thống tới mức không thể chấp nhận được. Mặc dù có nhiều thông số nhưng bạn có thể theo một số các hướng dẫn nhanh để xem xét xem liệu động cơ chạy không đúng có phải là do một phần không tốt nào đó hay cơ bản là nó không phù hợp với ứng dụng mà mình chuẩn bị làm .
Độ chính xác của một bước phụ thuộc vào cấu trúc của động cơ và nó tỉ lệ với moment cứng (torque stiffness) của động cơ . Mối quan hệ giữa moment giữ (holding torque) , T , góc chuyển vị , q , xấp xỉ :
T = T0 • sin(Nq)
Trong đó , N là số răng của rotor , T¬0 là moment tĩnh cực đại của động cơ . Moment cứng của động cơ ( torque stiffness) được cho bởi :
dT/dq=N•T0•cos(Nq)
Trong đó dT là sự biến thiên moment , dq là sự thay đổi về góc . Phương trình trên chỉ ra , có thể tăng N hoặc T0 để cải thiện moment cứng . Tạo ra những bước phụ (microstepping ) giữa những bước cơ khí nguyên thủy ( tương ứng với số răng của rotor ) ,hoặc tăng số pha ( thí dụ như sử dụng điều khiển 3 pha , 5 pha ) không cải thiện được moment cứng của động cơ (fig 1) .

Những thông số thiết kế cơ khí , phương pháp sản xuất , và dung sai ảnh hưởng tới độ chính xác tuyệt đối của động cơ bước . Độ chính xác của bước , thí dụ phụ thuôc vào vị trí chính xác các răng của stator , phân bố đồng đều các răng của rotor , và sự đồng bộ của khe hở không khí . Nhà sản xuất có thể đạt được đến 5% một bước chính xác cơ bản : 5% sai số của 1.8° trên một động cơ bước là một cung 65.4’ (I don’t know how to calculate ^^).
Sai số tuyệt đối này thì không đổi cho dù có bao nhiêu bước phụ (microsteps) được thêm vào đi nữa . Các bước phụ làm tăng độ phân giải bước nhưng nó lại làm cho bước không chính xác . Đối với các bước phụ , sai số tuyệt
Fig 1
đối a ±5% sẽ trở thành a ±10% đối với ½ bước và sẽ là a ±160% đối với 1/32 bước . Ở những trường hợp sai số tuyệt đối trên 100% thì bạn sẽ không đảm bảo được rằng động cơ sẽ bước khi nhận được xung .
Đối với trình độ công nghệ ngày nay , số bước phụ vượt qua 32 bước nếu có bất kì cải tiến nào . Nếu bạn thấy một động cơ bước không thỏa mãn về độ chính xác khi có nhiều bước phụ thì hẳn là bạn cũng nhận ra rằng đó là một thiết kế thiếu sót – không phải là một động cơ hay một bộ điều khiển tệ .
Thời gian quá độ của dòng và moment
Nguyên nhân lớn nhất của sự suy giảm moment khi động cơ chạy ở tốc độ cao hơn chính là do thời gian quá độ của xung đưa vào ngắn hơn so với thời gian quá độ của dòng trên pha của động cơ . Điều này có nghĩa là xung kết thúc trước khi dòng pha đạt đến mức có thể cung cấp đủ moment . Một phương trình mắt lưới RL nối tiếp đơn giản minh họa mối quan hệ , trong đó t là
thời gian quá độ của dòng pha .



Để giảm t thì điện áp nguồn cung cấp , V , phải đủ lớn nếu có thể , và điện cảm L , điện trở R trên pha của motor phải nhỏ đến mức có thể . Figure 3a, trong đó t = L/R , chỉ ra dòng điện và thời gian trong mạch RL nối tiếp . Chú ý rằng tại thời điểm t , dòng tăng lên một lượng bằng 1-e–1 ¬¬mức cuối cùng của nó I0 hay 0.63IO , nhưng chỉ còn là 1-e–0.5 IO hay 0.39 IO tại thời điểm t/2.
Moment xuất hiện tại vận tốc 1/t1(Fig. 3b), khi t1 = t ,hay 62% (hay 100% x 0.63IO/0.39IO) thì lớn hơn moment tại vận tốc lớn hơn 1/t2 (Fig. 3c) khi t2 = t/2 . Moment được tối ưu hóa nếu dòng điện pha có thể đạt được mức giống như khi tăng đến thời điểm 2.3t , trong khoảng thời gian này thì dòng điện tăng lên tới 90%I0 .
Moment giữ và moment động
Giả sử dòng tăng lên đủ trong suốt quá trình chuyển pha .Bạn có thể tính toán moment động lớn nhất của động cơ lưỡng cực 2 pha như sau :

Trong đó , T0 là moment giữ cực đại (Fig. 4a).

Figure 3. (a) Motor phase inductance, L, and resistance, R, limit phase-current risetime. For example, application of phase voltage for t/2, t, and 2.3t, respectively, results in peak currents reaching 39%, 63%, and 90% of final value Io. Because torque is approximately proportional to current, motors that operate at (b) lower speeds, which permit longer applications of phase voltage, deliver more torque than those (c) operating at higher speeds.
Nếu bạn cần tiến tới sự lý tưởng , nó đòi hỏi thời gian chuyển mạch hoàn hảo liên quan tới vị trí của động cơ , bạn nên sử dụng một bộ điều khiển vòng kín . Một bộ điều khiển vòng hở sẽ cho bạn moment động thấp nhất là :

Hoặc 63.7% của I¬¬¬¬¬1 (Fig. 4b).
Moment động thực tế là (90% + 63.7%)/2 or 76.8%.




Figure 4. The shaded portions of these curves represent (a) the maximum and (b) the minimum available dynamic torque, averaged between points a and b.
Với một đầu vào nhất định , bạn không thể thay đổi nguồn ngõ ra cụ thể , T(w)dw ( trong đó T(w) là moment tại vận tôc góc w ) . Nếu hướng dẫn của bạn yêu cầu nhiều hơn moment động tại vận tốc góc w , có lẽ bạn lại gặp phải một thiết kế thiếu xót , một thiết bị không tốt . Nếu bạn biết rõ về vận tốc , sự chính xác , độ phân giải , moment cần thiết cho ứng dụng của bạn thì bạn có thể làm việc với nhà thiết kế công ty của bạn để xác định xem liệu một động cơ bước cụ thể có thể cung cấp đủ moment tại vận tốc hoạt động trong những ràng buộc cơ khí của bạn hay không .

http://dientu686.com/ 

[dientu686.com]Sơ đồ nguyên lí robo tự hành


Sơ đồ nguyên lí robo tự hành

Đây là sơ đồ nguyên lý ROBOT tự hành sử dùng VĐK 89S52.
Gồm 6 phần:
1. Bản vẽ mạch in
2. Khối cảm biến
3. Khối gắn 8 cảm biến
4. Khối nguồn và nút bấm chương trình
5. Khối xử lý 89S52
6. Khối PWM và đảo chiều
http://www.mediafire.com/?blpk80u1wo5cc9d

http://dientu686.com/ 

[dientu686.com]Từng bước học VDK


Từng bước học VDK

Nắm vững cấu trúc và nguyên lý lập trình VDK sẽ giúp ích rất nhiều trong những năm chuyên ngành điện tử. Khi học VDK và làm được 1 mạch để cho nó chạy sẽ tăng thêm hứng thú khi học tập. Tuy những năm cuối mói được học VDK nhưng các em năm 2,3 có thể bắt đâu tìm hiều. Mình sẽ viêt loạt bài để giới thiệu về VDK và từng bước học lập trình VDK.
VDK thì có rất nhiều loại, nhiều hãng khác nhau, ở DN thì có 1 số loại phổ biến như sau:
- Họ VDK 8051: 89Cxx, 89Sxx, VDK 8051 của Philip (89V51RB1,89V51RD2,....)
- PIC (Microchip): 16F, 18F, dSPIC,.....
- PSOC: CY27443, CY29466,...
- AVR
- Các VDK họ ARM: như LPC2000 của NXP,....
- ......
Hiện tại VDK 89 vẫn đang được dùng phổ biến. Tuy nhiên các họ VDK khác cũng đang được dùng ngày càng phổ biến hơn nhờ nhiều tính năng vượt trội.
Mình sẽ bắt đầu với VDK 8051
Trước tiên là các kiến thức cần thiết để có thể học VDK:
- Điện tử cơ bản.
- Vi xử lý
- Mạch sô
- ....
Các sách tham khảo:
- Họ VDK 8051 của Tống Văn On
- Cấu trúc và lập trình họ VDK 8051 của thầy Nguyễn Tăng Cường.
- Sách hướng dẫn lập trình VDK của Lê Duy Phi.

http://dientu686.com/ 

[dientu686.com]Hướng dẫn Keil C


Hướng dẫn Keil C

Hướng dẫn Keil C
Các bước thực hiện:





















http://dientu686.com/ 

[dientu686.com]KIT 89s52


KIT 89s52

Mạch kit này bao gồm 3 khối chính:
+Khối nguồn:Bạn cò thể sài cả nguồn USB hoặc nguồn ngoài.
+Khối điều khiển:Bao gồm 1 chú At89C51và cả khối giao tiếp với cổng com dùng Max232.
+Khối ngoại vi bao gồm:khối hiển thị LCD, 8 Led đơn, 4 Led 7 thanh, và cả khối nhập phím nữa. Trong mạch này mình không sử dụng phương pháp quét phím nên có thể dễ dàng hơn cho lập trình.



Toàn bộ sơ đồ nguyên lí của mạch kit

Download

Pass: eitviet.com

http://dientu686.com/

[dientu686.com]Thiết kế và mô phỏng hệ thống điều khiển đèn giao thông cho ngã tư


Thiết kế và mô phỏng hệ thống điều khiển đèn giao thông cho ngã tư

Mục lục
Lời nói đầu 4
Chương 1 . Phân tích hệ thống. 5
1.1 Tổng quan về hệ thống đèn giao thông. 5
1.1.1. Mạch dùng IC số. 5
1.1.2. Vi mạch dùng kỹ thuật vi xử lí. 6
1.1.3.Điều khiển bằng vi điều khiển. 6
1.1.4. Điều khiển bằng PLC 6
1.2 Xác định bài toán: 8
1.2.1 Xác định bài toán. 8
1.2.2 Yêu cầu của bài toán thiết kế hệ thống điều khiển đèn giao thông. 8
1.2.3 Giải pháp công nghệ. 10
1.2.4 Giải pháp thiết kế. 11
1.2.5 Yêu cầu và giới hạn của hệ thống điều khiền đèn giao thông dùng vi điều khiển. 11
Chương 2. THIẾT KẾ HỆ THỐNG 12
2.1 Sơ đồ khối tổng quan của hệ thống 12
2.2 Giản đồ thời gian. 13
2.3 Sơ đồ nguyên lý. 14
2.3.1 Giải thích các khối. 14
2.3.1.1. Bàn phím 14
2.3.1.2. Khối hiển thị 15
2.3.1.3 Khối điều khiển trung tâm 16
2.3.1.3.1 Khối reset 16
2.3.1.3.2 Khối tạo xung giao động 17
2.3.1.3.3 Khối vi điều khiển 17
2.3.1.4 Khối nguồn 18
2.3.2 Nguyên lý hoạt động. 18
2.4 Sơ đồ thuật toán điều khiển hệ thống đèn giao thông. 19
2.4.1. Chương trình chính. 19
2.4.2.Chương trình ngắt 21
2.4.3. Chương trình led7 22
2.4.4 Chương trình hiển thị 23
2.4.5 Chương trình set (hiển thị thời gian cài đặt cho hệ thống) 23
2.5 Lựa chọn linh kiện. 24
2.5.1 Bộ điều khiển 8 bit Pic 16F877A. 24
2.5.1.1.Tổng quan về pic 24
2.5.1.2 Giới thiệu về PIC 16F877A 25
2.5.1.2.1.Sơ đồ chân 25
2.5.1.2.2. Các thông số của PIC 16F877A 25
2.5.1.2.3. Cổng xuất nhập (I/O port) 26
2.5.1.2.4. Timer. 29
2.5.2 LED 7 đoạn 33
2.5.3 Diot phát quang (LED) 34
2.5.5 Điện trở. 35
2.5.6 Tụ điện 35
2.5.7 Thạch anh 35
2.5.8 Nút bấm (Button): 35
2.5.9 IC ổn áp 7805 35
Chương 3. xây dựng hệ thống. 36
3.1 Chương trình điều khiển 36
3.2. Sơ đồ mạch in (layout) 38
3.2.1. Mạch điều khiển trung tâm 39
3.2.2. Mạch bàn phím 39
Chương 4 Mạch chạy mô phỏng 40
Kết luận 41
Tài liệu tham khảo 42

Lời nói đầu
Ngày nay cùng với sự phát triển đi lên của xã hội, các phương tiện tham gia giao thông cũng gia tăng không ngừngvà hệ thống giao thông ngày càng phức tạp .Vì vậy để đảm bảo giao thông được an toàn và thông suốt thì việc sử dụng các hệ thống tín hiệu để điều khiển và phân luồng tại các nút giao thông là rất cần thiết.
Nhận thấy đây là vấn đề rất sát thực, với những kiến thức đã được trang bị trong quá trình học tập và nghiên cứu tại trường Đại học Kỹ Thuật Công Nghiệp chúng em đã lựa chọn đề tài:”Thiết kế và mô phỏng hệ thống điều khiển đèn giao thông cho ngã tư ”.
Trong quá trình thực hiện đồ án chúng em đã nhận được sự chỉ bảo, hướng dẫn tận tình của các thầy cô trong khoa đặc biệt đó là sự chỉ bảo của thầy ThS.Nguyễn Văn Huy. Chúng em xin trân thành cảm ơn sự chỉ bảo của các thầy cô!
Trong khi thực hiện đồ án do kiến thức còn hạn chế cũng như chúng em chưa có nhiều điều kiện để đi khảo sát thực tế, với một khoảng thời gian ngắn thực hiện, do vậy mà đồ án của chúng em còn nhiều thiếu sót mong các thầy cô đóng góp và bổ xung ý kiến đề đồ án của chúng em đươc hoàn thiện hơn

Download
http://dientu686.com/ 

[dientu686.com]Bảng quang báo sử dụng LED ma trận 8x32


Bảng quang báo sử dụng LED ma trận 8x32

MỤC LỤC

LỜI NÓI ĐẦU 3
CHƯƠNG 1. PHÂN TÍCH HỆ THỐNG 4
1.1 ĐẶT VẤN ĐỀ 4
1.2 GIỚI THIỆU VỀ HỆ THỐNG QUANG BÁO 4
1.2.1 Hệ thống quang báo dùng LED 7 đoạn 4
1.2.2 Hệ thống quang báo dùng LED đơn 5
1.2.3 Hệ thống quang báo dùng LCD 6
1.2.4 Hệ thống quang báo dùng LED ma trận 6
1.3 CÁC GIẢI PHÁP VÀ CÁCH XÁC ĐỊNH BÀI TOÁN 6
1.3.1 Phân tích và lựa chọn phương án 6
1.3.2 Xác định bài toán và giới hạn của đề tài 6
CHƯƠNG 2. THIẾT KẾ HỆ THỐNG 8
2.1 SƠ ĐỒ KHỐI TỔNG THỂ CỦA HỆ THỐNG 8
2.2 SƠ ĐỒ CALL GRAPH 9
2.3 SƠ ĐỒ ĐẶC TẢ CỦA HỆ THỐNG 9
2.4 CÁC MODULE TRONG HỆ THỐNG 9
2.4.1 Module điều khiển trung tâm 10
2.4.2 Module hiển thị 10
2.4.3 Module điều khiển LED ma trận 11
2.4.4 Module nguồn 12
2.5 LỰA CHỌN LINH KIỆN 13
2.5.1 Khối điều khiển 13
2.5.2 Khối nguồn 20
2.5.3 IC dịch 74HC595 21
2.5.4 IC đệm dòng ULN2803 23
2.5.5 Khối hiển thị (LED ma trận) 24
2.6 SƠ ĐỒ MÔ PHỎNG 26
2.7 SƠ ĐỒ THUẬT TOÁN 27
CHƯƠNG 3: XÂY DỰNG HỆ THỐNG 29
3.1 XÂY DỰNG PHẦN MỀM 29
3.1.1 Sơ đồ thuật toán cho hệ thống 29
3.1.2 Chương trình nạp vào vi điều khiển 16F877A 29
3.2 KẾT QUẢ MÔ PHỎNG 32
ĐÁNH GIÁ VÀ KẾT LUẬN 33
TÀI LIỆU THAM KHẢO 33

Download
http://dientu686.com/ 

[dientu686.com]Giao tiếp LCD 4 bit chỉ mất 3 dây bằng 74595


Giao tiếp LCD 4 bit chỉ mất 3 dây bằng 74595

http://www.mediafire.com/i/?u3l67vcd6czhk8z


file nguyên lý và code : http://www.mediafire.com/?9ap38n8hmaqln9g
thuật toán mình dùng là : ghép các tín hiệu từ các chân (E,RS,RW,D4,D5,D6,D7) vào 1 biến "Data" rồi truyền vào 595.
3 hàm quan trọng :
void mahoa(unsigned char d1,bit d2,bit d3,bit d4)
{
Data=0x00;
Data=Data|(d1>>4);
// ghi EN
Data<<=1;
Data|=d2;
// ghi RW
Data<<=1;
Data|=d3;
Data<<=1;
Data|=d4;
ghi(Data);
}
//_________________________Ham ghi lenh ra LCD:______________________________________________

void ghilenh(unsigned char lenh)
{ unsigned char tg;
// ghi 4 bit cao
RS = 0;
tg=lenh & 0xF0;
EN=0;
mahoa(tg,EN,RW,RS);
delayLCD();
EN=1;
mahoa(tg,EN,RW,RS);
//ghi 4 bit thap
tg=(lenh<<4)&0xf0;
EN=0;
mahoa(tg,EN,RW,RS);
delayLCD();
EN=1;
mahoa(tg,EN,RW,RS);
}
//__________________________ham ghi ki tu ra LCD:_____________________________________________

void ghikt(unsigned char kt)
{ unsigned char tg;
RS = 1;
if(kt=='\n'){ghilenh(0xC0);return;}
tg=kt & 0xF0;
EN=0;
mahoa(tg,EN,RW,RS);
delayLCD();
EN=1;
mahoa(tg,EN,RW,RS);
//ghi 4 bit thap
tg=(kt<<4)&0xf0;
EN=0;
mahoa(tg,EN,RW,RS);
delayLCD();
EN=1;
mahoa(tg,EN,RW,RS);
}
http://dientu686.com/

[dientu686.com]Tìm hiểu + tài liệu về động cơ servo


Tìm hiểu + tài liệu về động cơ servo

RC servo
RC servo là một loại động cơ điện đặc biệt có khả năng quay cơ cấu chấp hành tới một vị trí chính xác và giữ cứng tại vị trí đó ngay cả khi cơ cấu chấp hành bị đẩy trở lại. Dải góc quay chuẩn của đầu trục ra thường là là 90 và 180 độ. Trên thị trường thế giới có rất nhiều loại servo khác nhau do nhiều nước sản xuất.
Có nhiều cách phân loại servo:
Phân loại về nguồn cấp: có servo 1 chiều, servo xoay chiều 1 pha, servo xoay chiều 3 pha.
Phân loại về vật liệu làm hộp giảm tốc có: bằng composit, kim loại, hợp kim.
Về phương pháp điều khiển, servo có hai loại cơ bản: analog và digital. Bề ngoài thì không có gì khác nhau và về cơ bản, các phần bên trong cũng không phân biệt nhiều ngoại trừ một vài phần điện tử, digital servo có một bộ vi xử lý.
Giới hạn trong bài viết này là đề cập đến servo 1 chiều công suất nhỏ dùng để làm đồ chơi: hobby fly hay humanoid robot, animal robot… Trên thế giới, dòng sản phẩm này có 2 hãng sản xuất lớn, chất lượng cao là: Hitec (Mỹ) và Futaba (Nhật).

Để có thể hoạt động được thì servo cần 3 dây: một dây nguồn, một dây nối đất và một dây tín hiệu.
Thứ tự của các dây là như nhau nhưng màu sắc có thể khác nhau. Dây đỏ thường là dây cấp nguồn (thường là 5V), dây nối đất là dây màu đen và dây tín hiệu vào thường là màu vàng (kiểu S) hoặc màu trắng (kiểu J). Với các loại servo khác, màu sắc có thể thay đổi.
Các phần của một servo
Các thành phần chính:
- Động cơ 1 chiều (motor)
- Biến trở ( potentiometer)
- Hộp giảm tốc (gear box)
- Mạch điều khiển ( Electronic board)
- Vỏ (cover)
- Dây tín hiệu ( signal wire)

Tài liệu về đông cơ servo:
Download
Pass:eitviet.com

http://dientu686.com/ 

[dientu686.com]Tìm hiểu về encoder


Tìm hiểu về encoder

Chắc hẳn các bạn là dân điện tử nên cũng đã từng nghe nói đến thuật ngữ "encoder". Vậy encoder là gì? Ứng dụng của nó ra sao? Có những loại encoder nào? Ngày hôm nay chúng ta sẽ cùng tìm hiểu về nó nhé.
Encoder được dùng để quản lý vị trí góc của một đĩa quay, đĩa quay có thể là bánh xe, trục động cơ, hoặc bất kỳ thiết bị quay nào cần xác định vị trí góc. Ví dụ như bạn muốn biết động cơ chạy tốc độ bao nhiêu hay robot chạy được quãng đường dài hay ngắn. Bài toán đó sẽ được lí giải chính xác bằng việc bạn sử dụng một encoder.

Encoder được chia làm 2 loại, absolute encoder và incremental encoder. Tạm dịch là encoder tuyệt đối và encoder tương đối. Chữ encoder tuyệt đối dịch theo nguyên văn, nhưng vì tiếng Việt mình cái gì có 2 loại, thì loại còn lại được dịch ngược lại với loại kia. Cho nen dịch là encoder tương đối cho incremental encoder.

Nếu dịch sát nghĩa, khi ta đọc absolute encoder, có nghĩa là encoder tuyệt đối, tức là tín hiệu ta nhận được, chỉ rõ ràng vị trí của encoder, chúng ta không cần xử lý gì thêm, cũng biết chính xác vị trí của encoder.

Còn incremental encoder, là loại encoder chỉ có 1, 2, hoặc tối đa là 3 vòng lỗ. Các bạn hình dung thế này, nếu bây giờ các bạn đục một lỗ trên một cái đĩa quay, thì cứ mỗi lần đĩa quay 1 vòng, các bạn sẽ nhận được tín hiệu, và các bạn đã biết đĩa quay một vòng. Nếu bây giờ các bạn có nhiều lỗ hơn, các bạn sẽ có được thông tin chi tiết hơn, có nghĩa là đĩa quay 1/4 vong, 1/8 vòng, hoặc 1/n vòng, tùy theo số lỗ nằm trên incremental encoder.

Cứ mỗi lần đi qua một lỗ, chúng ta phải lập trình để thiết bị đo đếm lên 1. Do vậy, encoder loại này có tên incremental encoder (encoder tăng lên 1 đơn vị).



Nguyên lý hoạt động cơ bản của encoder, LED và lỗ

Nguyên lý cơ bản của encoder, đó là một đĩa tròn xoay, quay quanh trục. Trên đĩa có các lỗ (rãnh). Người ta dùng một đèn led để chiếu lên mặt đĩa. Khi đĩa quay, chỗ không có lỗ (rãnh), đèn led không chiếu xuyên qua được, chỗ có lỗ (rãnh), đèn led sẽ chiếu xuyên qua. Khi đó, phía mặt bên kia của đĩa, người ta đặt một con mắt thu. Với các tín hiệu có, hoặc không có ánh sáng chiếu qua, người ta ghi nhận được đèn led có chiếu qua lỗ hay không.

Khi trục quay, giả sử trên đĩa chỉ có một lỗ duy nhất, cứ mỗi lần con mắt thu nhận được tín hiệu đèn led, thì có nghĩa là đĩa đã quay được một vòng.

Đây là nguyên lý rất cơ bản của encoder.

Tuy nhiên, những vấn đề được đặt ra là, làm sao để xác định chính xác hơn vị trí của đĩa quay (mịn hơn) và làm thế nào để xác định được đĩa đang quay theo chiều nào? Đó chính là vấn đề để chúng ta tìm hiểu về encoder.

Hình sau sẽ minh họa nguyên lý cơ bản của hoạt động encoder.



Các bạn thấy trong hình, có một đĩa mask, không quay, đó là đĩa cố định, thực ra là để che khe hẹp ánh sáng đi qua, giúp cho việc đọc encoder được chính xác hơn mà thôi. Chúng tôi không để cập đến đĩa mặt nạ này ở đây.


Hoạt động của hai loại encoder này như thế nào?

1) Absolute encoder

Vấn đề chúng ta sẽ quan tâm ở đây, chính là vấn đề về độ mịn của encoder, có nghĩa là làm thế nào biết đĩa đã quay 1/2 vòng, 1/4 vòng, 1/8 vòng hay 1/n vòng, chứ không phải chỉ biết đĩa đã quay được một vòng.

Quay lại bài toán cơ bản về bit và số bit, chúng ta xem xét vấn đề theo một cách hoàn toàn toán học nhé:

Với một số nhị phân có 2 chữ số, chúng ta sẽ có 00, 01, 10, 11, tức là 4 trạng thái. Điều đó có nghĩa là với 2 chữ số, chúng ta có thể chia đĩa encoder thành 4 phần bằng nhau. Và khi quay, chúng ta sẽ xác định được độ chính xác đến 1/4 vòng.

Tương tự như vậy, nếu với một số có n chữ số, chúng ta sẽ xác định được độ chính xác đến 1/(2^n) vòng.

Thế làm sao để xác định 2^n trạng thái này của đĩa encoder?

Các bạn xem hình sau:



Ở đây, tôi đưa ra ví dụ với đĩa encoder có 2 vòng đĩa. Các bạn sẽ thấy rằng, ở vòng trong cùng, có một rãnh rộng bằng 1/2 đĩa. Vòng phía ngoài, sẽ có 2 rãnh nằm đối diện nhau.

Như vậy, chúng ta cần 2 đèn led để phát xuyên qua 2 vòng lỗ, và 2 đèn thu.

Giả sử ở vòng lỗ thứ nhất (trong cùng), đèn đọc đang nằm ở vị trí có lỗ hở, thì tín hiệu nhận được từ con mắt thu sẽ là 1. Và ở vòng lỗ thứ hai, thì chúng ta đang ở vị trí không có lỗ, như vậy con mắt thu vòng 2 sẽ đọc được giá trị 0.

Và như vậy, với số 10, chúng ta xác định được encoder đang nằm ở góc phần tư nào, cũng có nghĩa là chúng ta quản lý được độ chính xác của đĩa quay đến 1/4 vòng. Trong ví dụ trên, nếu đèn LED đọc được 10, thì vị trí của LED phải nằm trong góc phần tư thứ hai, phía trên, bên trái.

Kết quả, nếu đĩa encoder có đến 10 vòng lỗ, thì chúng ta sẽ quản lý được đến 1/(2^10) tức là đến 1/1024 vòng. Hay người ta nói là độ phân giải của encoder là 1024 xung trên vòng (pulse per revolution - ppr).

Sau đây là ví dụ abosulte encoder 8 vòng lỗ:





Vậy cách thiết kế absolute encoder như thế nào?

Các bạn luôn chú ý rằng, để thiết kế encoder tuyệt đối, người ta luôn vẽ sao cho bit thứ N (đối với encoder có N vòng lỗ) nằm ở trong cùng, có nghĩa là lỗ lớn nhất có góc rộng 180 độ, nằm trong cùng. Bởi vì chúng ta thấy rằng, bit0 (nếu xem là số nhị phân) sẽ thay đổi liên tục mỗi 1/2^N vòng quay, vì thế, chúng ta cần rất nhiều lỗ. Nếu đặt ở trong thì không thể nào vẽ được, vì ở trong bán kính nhỏ hơn. Ngoài ra, nếu đặt ở trong, thì về kết cấu cơ khí, nó quá gần trục, và quá nhiều lỗ, sẽ rất yếu. Vì hai điểm này, nên bit0 luôn đặt ở ngoài cùng, và bitN-1 luôn đặt trong cùng như hình trên.

Rất nhiều người thắc mắc về cách thực tế để vẽ encoder như thế nào. Tuy nhiên, kể từ khi có chương trình thiết kế encoder này, tôi cho rằng chúng ta không nên quan tâm đến vấn đề đó nữa. Chỉ cần hiểu nó hoạt động ra sao, rồi sau đó chúng ta dùng chương trình này để vẽ.
2) Incremental encoder

Nhận thấy một điều rằng, encoder tuyệt đối rất có lợi cho những trường hợp khi góc quay là nhỏ, và động cơ không quay nhiều vòng. Khi đó, việc xử lý encoder tuyệt đối trở nên dễ dàng cho người dùng hơn, vì chỉ cần đọc giá trị là chúng ta biết ngay được vị trí góc của trục quay.

Tuy nhiên, nếu động cơ quay nhiều vòng, điều này không có lợi, bởi vì khi đó, chúng ta phải xử lý để đếm số vòng quay của trục.

Ngoài ra, như các bạn thấy đó, nếu thiết kế encoder tuyệt đối, chúng ta cần quá nhiều vòng lỗ, và dẫn tới giới hạn về kích thước của encoder, bởi vì việc gia công chính xác các lỗ quá nhỏ là không thể thực hiện được. Chưa kể rằng việc thiết kế một dãy đèn led và con mắt thu cũng ảnh hưởng rất lớn đến kích thước giới hạn này.

Theo kinh nghiệm của cá nhân tôi, tôi thấy encoder 8 bit là đã rất chi tiết rồi, và ở trường DHBKHCM có loại encoder 12bit đã là loại tốt nhất mà tôi biết. Tôi chưa thấy loại encoder tuyệt đối nào 16 bit cả, và cũng không có ý định tìm nó trên internet.

Độ chính xác của encoder 12 bit đã là 1/4096 rồi.

Tuy nhiên, điều này được khắc phục bằng incremental encoder một cách khá đơn giản. Chính vì vậy, ngày nay, đa số người ta sử dụng incremental encoder trong những ứng dụng hiện đại. Hoạt động của incremental encoder

Thật đơn giản, incremental encoder, sẽ tăng 1 đơn vị khi một lần lên xuống của cạnh xung.

Các bạn xem hình encoder sau:



Các bạn thấy rằng, cứ mỗi lần quay qua một lỗ, thì encoder sẽ tăng một đơn vị trong biến đếm.

Tuy nhiên, một vấn đề là làm sao để biết được encoder quay hết một vòng? Nếu cứ đếm vô hạn như thế này, thì chúng ta không thể biết được khi nào nó quay hết một vòng. Nếu bây giờ các bạn đếm số lỗ encoder để biết nó đã quay một vòng, thì nếu với encoder 1000 lỗ chắc các bạn sẽ đếm đến sáng luôn.

Chưa kể, mỗi lần có những rung động nào đó mà ta không quản lý được, encoder sẽ bị sai một xung. Khi đó, nếu hoạt động lâu dài, sai số này sẽ tích lũy, ngày hôm nay sai một xung, ngày hôm sau sai một xung. Đến cuối cùng, có thể động cơ quay 2 vòng rồi các bạn mới đếm được 1 vòng.

Để tránh điều tai hại này xảy ra, người ta đưa vào thêm một lỗ định vị để đếm số vòng đã quay của encoder.

Như vậy, cho dù có lệch xung, mà chúng ta thấy rằng encoder đi ngang qua lỗ định vị này, thì chúng ta sẽ biết là encoder đã bị đếm sai ở đâu đó. Nếu vì một rung động nào đó, mà chúng ta không thấy encoder đi qua lỗ định vị, vậy thì từ số xung, và việc đi qua lỗ định vị, chúng ta sẽ biết rõ hiện tượng sai của encoder.

Đây là hình encoder có lỗ định vị:



Tuy nhiên, một vấn đề lớn nữa là, làm sao chúng ta biết encoder đang xoay theo chiều nào? Bởi vì cho dù xoay theo chiều nào, thì tín hiệu encoder cũng chỉ là các xung đơn lẻ và xoay theo hai chiều đều giống nhau.

Chính vì vậy, người ta đặt thêm một vòng lỗ ở giữa vòng lỗ thứ 1 và lỗ định vị như hình sau:



Chú ý rằng, vị trí góc của các lỗ vòng 1 và các lỗ vòng 2 lệch nhau. Các cạnh của lỗ vòng 2 nằm ngay giữa các lỗ vòng 1 và ngược lại.

Chúng ta sẽ khảo sát tiếp vấn đề encoder trong phần tín hiệu xung để hiểu rõ hơn về encoder. Tuy nhiên, các bạn sẽ thấy một điều rằng, thay vì làm 2 vòng encoder, và dùng 2 đèn LED đặt thẳng hàng, thì người ta chỉ cần làm 1 vòng lỗ, và đặt hai đèn LED lệch nhau.

Kết quả, các bạn sẽ thường thấy các encoder có dạng như hình 2:



Đây là dạng encoder phổ biến nhất hiện nay.

Như vậy các bạn đã hiểu về encoder rồi phải không nào? Chúc các bạn có thật nhiều thánh công!!!

http://dientu686.com/ 

[dientu686.com]21 bài tập vi điều khiển + bài hưỡng dẫn


21 bài tập vi điều khiển + bài hưỡng dẫn

Bài tập vi điều khiển (21 bài full)

Viết chương trình tạo xung PWM có tần số 2KHz trong đó 70% xung mang giá trị bằng 1, 30% xung mang giá trị bằng 0. (Sử dụng osillocope để quan sát)
Viết chương trình tạo xung PWM có tần số 5KHz trong đó 60% xung mang giá trị bằng 1, 40% xung mang giá trị bằng 0(Sử dụng osillocope để quan sát).
Thiết kế mạch và viết chương trình đếm số lần nhấn công tắc trên chân P1.0 hiển thị trên 1 LED 7 thanh.
Thiết kế mạch và viết chương trình đếm số lần nhấn công tắc trên chân P3.2 hiển thị trên 1 LED 7 thanh.
Thiết kế mạch và viết chương trình hiển thị các LED sáng liên tiếp trong mạch có 8 LED được nối vào port P2 của vi điều khiển.( LED1 sáng, các LED còn lại tắt…., LED 2 sáng, các LED còn lại tắt…)
Sử dụng Timer 0 hoặc/ và Timer 1 viết chương trình tạo 2 xung trên 2 chân P1.0 và P1.1 với tần số lần lượt là 2KHz và 4KHz (Sử dụng osillocope để quan sát).
Sử dụng Timer 0 hoặc/ và Timer 1 viết chương trình tạo 2 xung trên 2 chân P1.0 và P1.1 với tần số lần lượt là 2KHz và 500Hz (Sử dụng osillocope để quan sát).
Sử dụng Timer 0 hoặc/ và Timer 1 viết chương trình tạo 2 xung trên 2 chân P1.0 và P1.1 với tần số lần lượt là 10KHz và 1KHz (Sử dụng osillocope để quan sát).
Thiết kế mạch điều khiển và viết chương trình hiển thị Led 7 thanh sáng các cố từ 00 đến 99
Viết chương trình điều khiển gửi liên tiếp dòng chữ “HELLO! I AM LEARNING MICROCONTROLLER!” lên cổng nối tiếp của máy tính (dùng VITUAL TERMINAL để hiển thị)
Viết chương trình gửi 10 byte ký tự từ 0 đến 9 lên cổng nối tiếp của máy tính (dùng VITUAL TERMINAL để hiển thị)
Thiết kế mạch và viết chương trình đếm số lần nhấn công tắc trên chân P1.0 gửi lên cổng nối tiếp của máy tính dùng (VITUAL TERMINAL để hiển thị).
Thiết kế mạch và viết chương trình điều khiển động cơ quay thuận trong 3 giây, dừng trong 5 giây và quay ngược trong 4 giây.
Sử dụng timer 0 và timer 1 để tạo 2 xung đồng thời có chu kỳ 500 µs và 2000 µs trên P1.0 và P1.2, dùng oscillocope để quan sát. Tần số thạch anh là 12 Mhz.
Thiết kế mạch sử dụng ngắt ngoài để đếm số lần nhấn contact và hiển thị số hàng đơn vị của số lần nhấn trên led 7 đoạn.
Thiết kế mạch sử dụng ngắt ngoài để đếm số lần nhấn contact và hiển thị số hàng đơn vị của số lần nhấn. Gửi lên cổng nối tiếp của máy tính ( Dùng VITUAL TERMLNAL để hiển thị).
Viết chương trình truyền thông nối tiếp giữa hai bộ vi điều khiển để tạo thành một hệ thống sao cho khi nhấn contact tại vi điều khiển chủ, led trên VĐK tớ sáng, và ngược lại.
Viết chương trình truyền thông nối tiếp giữa hai bộ vi điều khiển để tạo thành một hệ thống sao cho khi nhấn contact tại vi điều khiển chủ, led 7 thanh trên VĐK tớ hiển thị số 0, khi không nhấn contact tại vi điều khiển chủ LED 7 thanh trên VĐK tớ hiển thị số 1.
Thiết kế mạch và viết chương trình đếm số lần nhấn contact và hiển thị số hàng đơn vị của số lần nhấn lên ma trận LED (8*8).
Thiết kế mạch và viết chương trình giao tiếp giữa vi điều khiển và ma trận gồm 9 phím nhấn. Kiểm tra trạng thái phím nhấn và hiển thị số được nhấn trên LED 7 thanh..
Thiết kế mạch và viết chương trình điều khiển tốc độ động cơ 1 chiều dùng PWM ( sử dụng 2 công tắc để điều khiển tăng hoặc giảm tốc độ động cơ).

Bài làm hướng dẫn

Download

http://dientu686.com/ 

[dientu686.com]Điều khiển chuyển động rôbôt bằng động cơ bước


Điều khiển chuyển động rôbôt bằng động cơ bước

Chương I:
Mở đầu
I. Đặt vấn đề
II. Mục đích thiết kế
-Phát huy thành quả ứng dụng của vi điều khiển tạo ra những sản phẩm tiên tiến có độ tích hợp cao về công nghệ.
-Việc thực hiện đề tài này giúp em tiếp cận với thực tế, phát huy nhung kiến thức đã học trong môn vi xử lý.
- Qua đây có thêm nhiều kinh nghiệm giúp ích sau khi ra trường có thể hòa nhập với công nghệ tiên tiến trên xa hội.
III. Nội dung đề tài
1. Đề tài
Điều khiển chuyển động của rôbồt bằng động cơ bước.
2.Chức năng của hệ thống
- Chuyển động động cơ bước theo ý muốn của người lập trình .
+ Chuyển động thẳng: tiến, lùi.
+ Chuyển động quay trái, phải.
+ Điều khiển được tốc độ chuyển động của động cơ.
+ Điều khiển động cơ bước theo đường đi bất kì ( bằng cảm ứng quang).

CHƯƠNG II
THIẾT KẾ
I.Nhiệm vụ thiết kế
- Thiết kế điều khiển chuyển động rôbôt bằng động cơ bước. Vậy ta làm các bước sau:
+Mạch điều khiển động cơ
+Thiết kế mô hình động cơ
+Viết chương trình điều khiển

Download
Pass(nếu có):eitviet.com

 http://dientu686.com/

[dientu686.com]Tài liệu Hướng dẫn ráp các mạch vi điều khiển của anh DuyPhi


Tài liệu Hướng dẫn ráp các mạch vi điều khiển của anh DuyPhi

Lang thang trên mạng mình tìm được kho tài liệu rất hay, hôm nay mình gửi lên chia sẻ với anh em.
Tài liệu Hướng dẫn ráp các mạch vi điều khiển của anh DuyPhi
Nội dung bao gồm
Phần 1 : Hướng dẫn lắp ráp các loại mạch nạp vi xử lý
Phần 2 : Hướng dẫn làm bo mạch in chất lượng cao
Phần 3 : Hướng dẫn sử dụng các phần mềm vi xử lý
Phần 4 : Các mạch điện vi xử lý – Lý thú – đơn giản – cho người mới bắt đầu học lập trình VXL

http://www.mediafire.com/?3anuy6ng6h5rjro

Pass giải nén file: www.4tech.com.vn
http://dientu686.com/ 

[dientu686.com]Thiết kế khóa cửa điện tử


Thiết kế khóa cửa điện tử

# Nội dung:
# Phần I GIỚI THIỆU CHỨC NĂNG HỆ THỐNG
# Phần II SƠ ĐỒ KHỐI VÀ VẬN HÀNH HỆ THỐNG
# 1. Sơ đồ khối
# 2. Vận hành hệ thống
# Phần III CHỨC NĂNG VÀ NGUYÊN LÝ CÁC KHỐI
# 1. Hệ thống phím và tạo mã
# 2. Giải mã
# 3. Phân kênh
# 4. Chốt
# 5. Hiển thị
# 6. Thiết lập Password
# 7. So sánh
# 8. Báo động
# 9. Khoá
# Phần IV KẾT LUẬN
# Phần V SƠ ĐỒ MẠCH CỦA TOÀN HỆ THỐNG

Download

http://dientu686.com/ 

[dientu686.com]Lập trình C cho vi điều khiển


Lập trình C cho vi điều khiển

Lập trình C cho vi điều khiển

Mình tham gia các diễn đàn từ lâu lắm rồi và cũng giải đáp nhiều thắc mắc về lập trình C cho các vi điều khiển thông dụng như 8051, PIC. Mình viết bài này để giải đáp thắc mắc cho các bạn mới bước vào học lập trình cho vi điều khiển dùng ngôn ngữ C.

Mình xin nói theo ý hiểu của mình về lập trình C cho vi điều khiển.

Để có thể lập trình C cho vi điều khiển, cần học những gì ở ngôn ngữ C:

Cách khai báo biến, các hàm
Cách phân biệt các kiểu dữ liệu, và dùng trong trường hợp nào: các kiểu cơ bản có dấu, không có dấu, khoảng dữ liệu, kiểu cấu trúc, kiểu con trỏ, struct ..
Cách viết một hàm và gọi 1 hàm
Cách qui hoạch hàm: phân chương trình thành các hàm nhỏ và cho vào thư viện (thực ra là file .h, .c để sau này gọi )
Các lệnh gán, so sánh <=, >=, ==
Các vòng lặp if .. then , if .. then ... else, while
Ngôn ngữ C cho vi điều khiển tuân theo chuẩn C, ngoài ra bổ sung thêm các kiểu dữ liệu khác phụ thuộc riêng vào từng loại vi điều khiển. Nên khi nói đến khái niệm "tệp lệnh" trong khi lập trình C thì nó bao hàm tất cả các lệnh cơ bản của C và các kiểu dữ liệu này mà thôi, nên đừng đi hỏi là tệp lệnh là gì ? mà hãy xem trong manual của trình biên dịch đó xem.

Nói đến trình biên dịch mới nhớ là: các định nghĩa, kiểu dữ liệu, ... nó phụ thuộc thêm vào các trình biên dịch C riêng biệt. Ví dụ với PIC16 thì khi viết bằng HTPIC thì khai báo configuration khác với khi viết bằng CCS, cái này được nói trong mỗi manual của trình biên dịch.

Các bạn có thể xem bài viết Thư viện giao tiếp RS232 cho PIC18 bằng HTPIC18 thì những kiến thức để viết được nó rất đơn giản, chẳng có gì cả. Cái quan trọng là viết cái gì ở trong đó. Câu trả lời nằm ở datasheet của từng module của vi điều khiển. Các tên đặc biệt trong đó là nằm trong thư viện của trình biên dịch đó thôi. Bao giờ mỗi trình biên dịch cũng có các file header định nghĩa các thanh ghi của vi điều khiển, thường là giống với tên trong datasheet, nhưng có thể là không giống nên chỉ cần mở cái đó ra là được.

Thông thường, các vi điều khiển hiện nay khi giao tiếp với một cái gì đó thì nó có riêng một module và có riêng một chương trong mỗi datasheet của vi điều khiển hướng dẫn đầy đủ, cách active module thế nào, cách giao tiếp như thế nào.

http://dientu686.com/ 

[dientu686.com]Ứng dụng Vi xử lí trong điều khiển từ xa


Ứng dụng Vi xử lí trong điều khiển từ xa

Trong cuộc sống hàng ngày của chúng ta hiện nay , vi xử lí được ứng dụng rất rộng rãi , nó càng trở nên cần thiết và không thể thiếu trong mỗi gia đình . Đó chính là ứng dụng về Điều Khiển Từ Xa , một ứng dụng rất thú vị và tiện ích trong cuộc sống hàng ngày . Thay vì phải đứng dậy để bật hay tắt những dụng cụ như : quạt , tivi , bóng đèn , …. chúng ta chỉ việc ngồi tại chỗ với chiếc điều khiển từ xa trong tay , ta có thể tắt mở những cụ theo ý muốn . Hệ thống điều khiển từ xa gồm có : 1 con mắt hồng ngoại , 1 điều khiển TV Sony trong đó mỗi nút bấm là một mã riêng để điều khiển mỗi thiết bị , việc giãi mã được lập trình trên vi xử lí 8051 .

I) GIẢI QUYẾT VẤN ĐỀ :
1) Giải Mã REMOTE :
Trước tiên ta tìm hiểu về mã của Remote TV , ta xem hình vẽ




Trên hình vẽ cho ta thấy : bit đầu tiên là bit LSB ta đặt tên cho nó là bit B0 , bít cuối cùng sẽ là bit B11 . Trong đó từ :
B0 – B6 : là 7 bit mã lệnh 
B7 _ B11: là 5 bit địa chỉ 
Trong đó , mã lệnh là 16H, mã địa chỉ là 08H . Khi sử dụng mắt hồng ngoại thì tất cả các dạng sóng trên sẽ bị đảo lại như sau :




Để thu và giải mã tín hiệu từ Remote TV ta chỉ cần thu 7 bit command (7 bit mã lệnh ) và có thể bỏ qua 5 bit address ( 5 bit dữ liệu ) bởi vì các nút bấm đều phát ra các mã địa chỉ là như nhau chỉ khác nhau về mã lệnh .
Để thu được 7 bit mã lệnh ta làm như sau :
a) thiết lập thanh ghi A = 01000000 B
b) khởi đầu bằng cách chờ tín hiệu xuống 
c) chờ cho tín hiệu lên 
d) chờ cho tín hiệu xuống 
e) tạo trễ khoảng 900us
f) đo mức tín hiệu :
+ nếu mức tín hiệu là mức cao thì bit nhận được là bit 0 :
thiết lập cờ C = 0 , quay phải có cờ nhớ A , như vậy C sẽ được gởi vào MSB của A , LSB của A sẽ được gởi vào C . Như vậy sau 7 lần quay thì C = 1 và 7 bit trái của A sẽ chứa mã lệnh . khi C = 0 quay lại bước d .
+ nếu mức tín hiệu là mức thấp thì bit nhận được là bit 1 :
thiết lập cờ C = 1, quay phải có cờ nhớ A . Khi C = 0 quay lại bước c . 

Nếu C = 1, giá trị trong thanh ghi A = D6D5D4D3D2D1D00 , sau khi quay phải A thu được A = 0D6D5D4D3D2D1D0 . 
Xuất nội dung thanh ghi A ra port 1 hiển thị bằng các led( đây chính là mã lệnh từ remote mà 8051 giải mã được).

2 ) Lưu Đồ Giải Thuật :





II) SƠ ĐỒ NGUYÊN LÍ:



1) Cấu Tạo :
+ Thiết bị phát là Remote TV , với mỗi nút bấm phát ra một mã hồng ngoại khác nhau .
+ Thiết bị thu sử dụng mắt hồng ngoại 3 chân , được dùng rộng rãi trong TV 



+ Mắt nhận hồng ngoại nhận tín hiệu từ điều khiển từ xa phát ra từ giải điều chế và đua tín hiệu đảo ra chân OUT . Tín hiệu từ chân OUT được đưa đến chân P3.3 của vi xử lí để giải mã , mã lệnh 7 bit được hiển thị trên cổng P1.Tín hiệu điều khiển được đưa ra cổng P2 . Khi bấm phím 1 đưa tín hiệu điều khiển ra chân P2.0, bấm phím 2 ra chân
P2.1…..bấm phím 8 ra chân P2.7.


2) Nguyên Lí Hoạt Động :
Dòng DC khoảng 5v-7v đưa qua 7805 để ổn định áp 5v cung cấp cho vxli 8051 . chân OUT của mắt nhận hồng ngoại đưa vào chân P3.3, tín hiệu tới chân P3.3 được lập trình và giải mã . Mã lệnh hiện thị trên cổng P1 , tín hiệu điều khiển đưa ra chân P2.
Trong mạch chỉ sử dụng 3 chân P2.0 , P2.1 , P2.2 để điều khiển 3 thiết bị thông qua 3 rơle (5v) có tác dụng đóng mở cho dòng điện xoay chiều 220v đi qua các thiết bị điện .Khi P2.0 , P2.1 , P2.2 ở mức cao (+5v) thì không có dòng qua Rơle , Rơle đóng . Khi P2.0 , P2.1 , P2.2 ở mức thấp (0v) thì có dòng qua Rơle , Rơle mở nên có dòng 220v qua các thiết bị điện , các thiết bị hoạt động . Đối với gia đình có nhiều thiết bị điện thí ta tiếp tục nối các chân còn lại của port 2 qua Rơle , như vậy ta có thể dùng cho thiết bị tuỳ thích

III)CODE CHƯƠNG TRÌNH :

ORG 00
MOV P1,#0
MOV P2,#00000111B
LCALL LONG_DELAY ; cho tín hiệu đầu tiên nhận được nhận được ko bị sai
MAIN:
SETB P3.3 ; P3.3 làm đầu vào nhận tín hiệu
MOV A,#01000000B ; sau 7 lần quay phải A thì C=1 để kiểm tra
RP1: JB P3.3, RP1 ; chờ cho tín hiệu đi xuống
RP2: JNB P3.3, RP2 ; chờ cho tín hiệu đi lên
RP3: JB P3.3, RP3 ; chờ cho tín hiệu đi xuống
LCALL DELAY ; tạo trễ 900 us
MOV C,P3.3 ; Ghi tín hiệu thu được vào C để đo
JC BIT0 ; nếu tín hiệu là bit cao thì bit nhận được là bit 0
SETB C ; tín hiệu mức thấp , bit nhận dược là bit 1
RRC A ; ghi từng bit mã lệnh vào trong A
JC END_SIGNAL ; nếu C =1 thì nhận đủ 7 bit mã lệnh , kết thúc
; nhận
; kết thúc quá trình nhận tín hiệu
SJMP RP2 ; nếu C=0 thì quay lại nhãn RP2
BIT0:
CLR C ; tín hiệu mức cao bit nhận được là bit 0
RRC A
JC END_SIGNAL ; nếu C =1 thì nhận đủ 7 bit mã lệnh , kết thúc

; kết thúc quá trình nhận tín hiệu
SJMP RP3 ; nếu C=0 thì quay lại nhãn RP3
BIT0:
END_SIGNAL: ; kết thúc quá trình nhận tín hiệu
LCALL LONG_DELAY ; tạo trễ để chống nhiễu
; 7 bit trái của A đang chứa mã lệnh , bit LSB = 0
RR A ; 7 bit phải của A đang chứa mã lệnh, bit MSB = 0
MOV P1, A ; hiển thị mã lệnh ra cổng P1

KEY_1:
CJNE A,#00000000B,KEY_2 ; bấm phím 1
;---KEY = 1---
CPL P2.0 ; đảo bit sau đó
SJMP MAIN ; quay lại từ đầu
;-------------
KEY_2: CJNE A,#1,KEY_3 ; bấm phím 2
;-------------
;---KEY = 2---
CPL P2.1
SJMP MAIN
;-------------
KEY_3:
CJNE A,#2,KEY_4 ; bấm phím 3
;-------------
;---KEY = 3---
CPL P2.2
SJMP MAIN
;-------------
KEY_4:
CJNE A,#3,KEY_5 ; bấm phím 4
;-------------
;---KEY = 4---
CPL P2.3
SJMP MAIN
;-------------
KEY_5:
CJNE A,#4,KEY_6 ; bấm phím 5
;-------------
;---KEY = 2---
CPL P2.4
LJMP MAIN
;-------------
KEY_6:
CJNE A,#5,KEY_7 ; bấm phím 6
;-------------
;---KEY = 6---
CPL P2.5
LJMP MAIN
;-------------
KEY_7:
CJNE A,#6,KEY_8 ; bấm phím 7
;-------------
;---KEY = 7---
CPL P2.6
LJMP MAIN
;-------------
KEY_8:
CJNE A,#7,OTHER_KEY ; bấm phím 8
;-------------
;---KEY = 8---
CPL P2.7
LJMP MAIN
;-----------------------------------
OTHER_KEY: ; bấm các phím khác thì không làm gì
LJMP MAIN
;-----------------------------------
; tạo trễ
;-----------------------------------
DELAY: ; tạo trễ 900 ms
MOV R5,#165 ; Thời gian tạo trễ 165 x 5 x 1.085 ms = 900 ms
AGAIN: NOP
NOP
NOP
DJNZ R5,AGAIN
RET
;-----------------------------------
LONG_DELAY: ; tạo trễ dài để chống nhiễu
MOV R5,#50
REPEAT:
MOV R6,#255
HERE:
DJNZ R6,HERE
DJNZ R5,REPEAT
RET
END

http://dientu686.com/ 

[dientu686.com]Các phím nhấn dùng với ic lập trình AT89C51


Các phím nhấn dùng với ic lập trình AT89C51

Chúng ta biết ic lập trình AT89C51 có 4 cảng 8 bit nên tổng cộng có 32 
chân có thể xuất nhập dữ liệu dạng bit. Cách nhập dữ liệu đơn
giản nhất là dùng các phím nhấn. Phím nhấn chỉ làm việc 
theo logic nhị giá, nghĩa là đóng hoặc hở. Với các phím nhấn,
người ta có thể dùng đơn lẻ hay tổ hợp theo dạng matrix. Hình 
vẽ dưới đây cho thấy:

Các phím gắn trên ma trận 4x4, người ta nói matrix 4x4 có 4 hàng và 4
cột. Trên ma trận 4x4 chúng ta chỉ dùng có 8 dây mà có thể 
gắn được đấn 16 phím, đó là một ưu điểm của loại bàn phím 
matrix, dùng số chân ít mà gắn được nhiều phím. Với các phím 
đơn lập thì mỗi phím thường gắn trên một chân của IC, vậy trên 
một cảng 8 chân chúng ta chỉ có thể gắn được 8 phím.

Các phím nhấn phân ra làm 2 kiểu: Kiểu phím nhấn
thường hở
và kiểu phím nhấn
thường đóng
. Khi sử dụng các phím nhấn, chúng ta thường gặp vấn đề sau: Sự rung phím.

Vậy sự
rung phím
là gì?



cho thấy: Khi phím hở thì nó cho mức áp cao, ngay khi phím 
được nhấn xuống, nó sẽ kéo mức áp xuống mức thấp, nhưng do 
hiện tượng rung phím, lúc này có sự rung động ở tiếp xúc 
điểm, khiến cho tiếp điểm lúc dính lúc hở và mức áp sẽ dao 
động lúc lên lúc xuống và phải sau một lúc mới ổn định 
được ở mức thấp. Khi bỏ phím nhấn ra, chúng ta cũng gặp hiện 
tượng tương tự nhưng ít tác hại hơn. Khi dùng phím nhấn với 
các ic lập trình có phản ứng cực nhanh hiện tượng rung phím 
sẽ gây ra các điều khiển sai. Khi viết chương trình cho các phím
nhấn, chúng ta phải chú ý đến ảnh hưởng của hiện tượng rung 
phím, nhất là mỗi khi phím được đóng lại.

Trong 
thực hành, người ta thường dùng một đoạn chương trình làm chậm
khoảng 3ms đến 10ms và cho dò lại lần nữa trạng thái của 
phím để tránh sự sai lầm có thể xẩy ra do hiện tượng rung 
phím.


* Mạch AT89C51 dùng 8 phím nhấn đơn lập



Khi dùng
sơ đồ mạch điện này, trạng thái bit 1 trên các chân của cảng
p1 được xem như không có nhấn phím, khi có nhấn phím thì chân
có phím được nhấn sẽ xuất hiện bit 0. Khi một trong 8 chân của
cảng p1 có chân ở bit 0, chúng ta biết là có nhấn phím, như
vậy chúng ta sẽ viết câu lệnh tìm xem trên cảng p1 có xuất
hiện bit 0 hay không? Nếu không có bit 0 trên p1 thì tiếp tục
dò tìm, khi có chân có bit 0 thì hiểu là đã có phím bị nhấn
xuống, lúc đó chuyển qua tìm xem phím nào đã được nhấn và
rồi tiếp theo là cho chạy chương trình tương ứng với phím đã
được nhấn.

Sau đây là một đoạn chương trình dùng dò xem có phím nhấn không?

loop: ; đặt tên nhãn cho lệnh nhẩy
call do_key ; cho gọi chương trình dò phím, tên nhãn do_key
jnb f0, ttuc ; nhẩy theo bit của f0, f0=0, tiếp tục dò phím
call tim_phim ; cho gọi trình xác định phím nào được nhấn

ttuc: ; tên nhãn cho lệnh nhẩy
jmp loop ; nhẩy về tên nhãn loop, bắt đầu lại công việc dò phím
....
do_key: ; tên nhãn dùng cho lệnh nhẩy
clr f0 ; cho xóa bit f0, bit kiểm tra có phím nhấn hay không?
mov a, p1 ; chuyển trạng thái bit trên p1 vào thanh ghi a
orl a, #00000000b ; lấy logic OR trị trong a với 00000000b, để tìm bit 0 trên p1
cpl a ; đảo trị trong thanh ghi a
jz key_ret ; nếu trị trong a là 0, nhẩy đến key_ret, không có phím nhấn
call del ; gọi chương trình trể
mov a, p1 ; lại chuyển trạng thái của p1 vào a, kiểm tra lần nữa
orl a, #00000000b ; lại cho lấy logic OR trị trong a với 00000000b
cpl a ; đảo trị trong a để dò xem có phím nhấn không
jz key_ret ; nhẩy đến tên nhãn key_ret nếu không có phím nào được nhấn
setb f0 ; nếu có phím nhấn, cho set bit kiểm tra f0
mov b,a ; cho chuyển trị trong a cho cất vào b để dùng xác định phím nào được nhấn

key_ret: ; tên nhãn dùng cho lệnh nhẩy
mov a, p1 ; cho chuyển trạng thái cảng p1 vào a 
orl a, #00000000b ; lấy logic OR trị trong a với 00000000b
cpl a ; đảo trị trong thanh ghi a
jz key_ret1 ; nhẩy đến tên nhãn key_ret1, nếu thanh a bằng 0
jmp key_ret ; nhẩy đến tên nhãn key_ret, tiếp tục kiểm tra p1
key_ret1: ret ; quay lại sau lệnh: call do_key

tim_phim: ; chương trình xác định phím nào đã được nhấn
.....




Hình động trên đây cho thấy cách viết các câu lệnh dùng dò xem có phím nhấn hay không?



* Mạch AT89C51 dùng 16 phím gắn trên ma trận 4x4



Hình vẽ
cho thấy, 16 phím nhấn gắn trên ma trận 4x4. Ở đây 4 hàng cho
nối vào p2.0, p2.1, p2.2, p2.3, chúng ta gọi 4 hàng này là ngả
ra OUTPUT và 4 cột cho nối vào p2.4, p2.5, p2.6, p2.7 và gọi 4
cột là ngả vào INPUT. Có thể thấy:
Trên các
cảng p1 cho gắn 8 Led và trên cảng p3 chúng ta cũng cho gắn 8
Led. Từ sơ đồ mạch điện này, chúng ta sẽ lập trình để dùng
các phím trên bảng ma trận điều khiển các Led.



Cách viết chương trình vận hành các phím ráp theo kiểu ma trận 4x4:
Trước hết người ta đặt các hàng làm ngả ra OUTPUT và đặt các cột làm ngả vào INPUT.
Khởi
đầu cho các ngả vào ở bit 1 và cho các ngả ra ở bit 0, và
chạy trình dò phím, để xem có phím nào đã được nhấn xuống
không?

* Khi đã
xác nhận là đã có nhấn phím rồi thì cho chạy chương trình
tìm phím nhấn. Lúc này mỗi lần chỉ cho một chân INPUT ở bit 0,
khởi đầu cho cột 1 ở bit 0 rồi tìm xem trong 4 hàng, xem trên
ngả ra OUTPUT nào đang ở bit 0, làm vậy sẽ xác định được một
trong 4 phím của cột 1.

* Khi
chỉ cho cột 2 ở bit 0, rồi tìm xem ở hàng nào đang ở bit 0,
làm vậy sẽ xác định được một trong 4 phím của cột 2.

* Khi
chỉ cho cột 3 ở bit 0, rồi tìm xem ở hàng nào đang ở bit 0,
làm vậy sẽ xác định được một trong 4 phím của cột 3.

* Khi
chỉ cho cột 4 ở bit 0, rồi tìm xem ở hàng nào đang ở bit 0,
làm vậy sẽ xác định được một trong 4 phím của cột 4.





Sau đây là một chương trình mẫu:

org 0000b

start: ; đặt tên nhãn dùng cho lệnh nhẩy
clr p2.0 ; cho Led chỉ thị trên chân p2.0 sáng
; vào chương trình dò phím
do_phim: ; đoạn chương trình dùng để dò phím
mov p1, #00001111b ; đặt 4 chân Input lên 1 và 4 chân Output xuống 0
mov a, p1 ; cho chuyển hiện trạng của cảng p1 vào a
orl a, #11110000b ; lấy logic OR a với trị 11110000b
cpl a ; đảo các trị trong thanh ghi a
jz do_phim ; nếu a bằng 0 thì tiếp tục dò phím, nếu a khác 0 thì tìm phím nhấn
jmp tim_phim ; nhẩy đến chương trình tìm phím nhấn
; vào chương trình tìm phín nhấn
tim_phim: ; đoạn chương trình tìm phín nhấn
mov a, p1 ; chuyển hiện trạng của cảng p1 vào thanh ghi a
cjne a, #11101110b, tt1 ; chỉ cho chân p1.0 là 0, tìm phím trên p1.4
jmp chtrinh1 ; nếu đúng phím cho chạy chương trình 1
tt1: ; đặt tên nhãn dùng cho lệnh nhẩy
cjne a, #11011110b, tt2 ; chỉ cho chân p1.0 là 0, tìm phím trên p1.5
jmp chtrinh2

tt2: ; đặt tên nhãn dùng cho lệnh nhẩy
cjne a, #10111110b, tt3 ; chỉ cho chân p1.0 là 0, tìm phím trên p1.6
jmp chtrinh3

tt3: ; đặt tên nhãn dùng cho lệnh nhẩy
cjne a, #01111110b, tt4 ; chỉ cho chân p1.0 là 0, tìm phím trên p1.7
jmp chtrinh4

;

tt4: ; đặt tên nhãn dùng cho lệnh nhẩy
cjne a, #11101101b, tt5 ; chỉ cho chân p1.1 là 0, tìm phím trên p1.4
jmp chtrinh5

tt5: ; đặt tên nhãn dùng cho lệnh nhẩy
cjne a, #11011101b, tt6 ; chỉ cho chân p1.1 là 0, tìm phím trên p1.5
jmp chtrinh6

tt6: ; đặt tên nhãn dùng cho lệnh nhẩy
cjne a, #10111101b, tt7 ; chỉ cho chân p1.1 là 0, tìm phím trên p1.6
jmp chtrinh7

tt7: ; đặt tên nhãn dùng cho lệnh nhẩy
cjne a, #01111101b, tt8 ; chỉ cho chân p1.1 là 0, tìm phím trên p1.7
jmp chtrinh8

;

tt8: ; đặt tên nhãn dùng cho lệnh nhẩy
cjne a, #11101011b, tt9 ; chỉ cho chân p1.2 là 0, tìm phím trên p1.4
jmp chtrinh9

tt9: ; đặt tên nhãn dùng cho lệnh nhẩy
cjne a, #11011011b, tt10 ; chỉ cho chân p1.2 là 0, tìm phím trên p1.5
jmp chtrinh10

tt10: ; đặt tên nhãn dùng cho lệnh nhẩy
cjne a, #10111011b, tt11 ; chỉ cho chân p1.2 là 0, tìm phím trên p1.6
jmp chtrinh11

tt11: ; đặt tên nhãn dùng cho lệnh nhẩy
cjne a, #01111011b, tt12 ; chỉ cho chân p1.2 là 0, tìm phím trên p1.7
jmp chtrinh12

;

tt12: ; đặt tên nhãn dùng cho lệnh nhẩy
cjne a, #11100111b, tt13 ; chỉ cho chân p1.3 là 0, tìm phím trên p1.4
jmp chtrinh13

tt13: ; đặt tên nhãn dùng cho lệnh nhẩy
cjne a, #11010111b, tt14 ; chỉ cho chân p1.3 là 0, tìm phím trên p1.5
jmp chtrinh14

tt14: ; đặt tên nhãn dùng cho lệnh nhẩy
cjne a, #10110111b, tt15 ; chỉ cho chân p1.3 là 0, tìm phím trên p1.6
jmp chtrinh15

tt15: ; đặt tên nhãn dùng cho lệnh nhẩy
cjne a, #01110111b, start ; chỉ cho chân p1.3 là 0, tìm phím trên p1.7
jmp chtrinh16

; Các chương trình ứng với các phím nhấn
chtrinh1:

chtrinh2:

chtrinh3:

chtrinh4:

chtrinh5:

chtrinh6:

chtrinh7:

chtrinh8:

chtrinh9:

chtrinh10:

chtrinh11:

chtrinh12:

chtrinh13:

chtrinh14:

chtrinh15:

chtrinh16:

end
Các thí dụ cho thấy cách dùng bàn phím trong điều khiển
1. Cách dùng phím kiểu đơn lập
Một thí dụ về cách dùng các phím nhấn đơn lập



Phân tích mạch:

Sơ đồ
cho thấy, chúng ta cấp điện cho ic lập trình AT89C51 với chân 20
cho nối masse và chân 40 cho nối vào đường nguồn 5V. Trên chân 9
gắn tụ C1 (10uF) và điện trở R1 (10K) dùng tạo tính năng reset
mỗi khi mạch được cấp nguồn. Trên chân 18, 19 gắn thạch anh định
tần, chúng ta dùng thạch anh 12MHz. Để mạch chỉ làm việc với
bộ nhớ trong chúng ta cho chân 31 nối vào đường nguồn 5V.
Đề làm
thực hành với các phím nhấn đơn lập, chúng ta dùng 4 phím
nhấn, gắn trên các chân p1.2, p1.3, p1.4, p1.5 của cảng p1 và gắn
8 Led trên cảng p3 để hiển thị tác dụng của các phím nhấn.
Ở đây
chúng ta sẽ tạo tính năng cho 4 phím nhấn như sau: phím S1 cho
mở phím, phím S4 cho tắt phím, phím S2 cho 8 Led trên p3 tuần tự
dời qua phải và phím S3 cho 8 Led trên p3 dời qua trái.
Tóm lại công dụng của các phím như sau:
* Nhấn nút S1 vào mode khởi động, cho mở phím.
* Nhấn nút S2, 8 Led trên cảng p3 dời bit qua phải
* Nhất nút S3, 8 Led trên cảng p3 dời bit qua trái
* Nhấn nút S4 vào mode tắt phím
Chương trình nguồn:
UpDown EQU 00H ; đặt tên bit 00h là updown
StartEnd EQU 01H ; đặt tên bit 01h là startend
LAMPCODE EQU 21H ; đặt tên thanh ghi 21h là lampcode
ORG 0000H ; địa chỉ thanh ghi khởi đầu
JMP MAIN ; nhẩy đến tên nhãn
ORG 30H ; vùng địa chỉ bên ngoài chức năng ngắt
MAIN: ; đặt tên nhãn dùng cho lệnh nhẩy
MOV SP,#5FH ; chọn địa chỉ làm ngăn xếp
MOV P3,#0FFH ; đặt trị 11111111b vào cảng p3 để tắt 8 led
; điều kiện khởi đầu
CLR UpDown ; đặt bit 0 vào bit updown
CLR StartEnd ; đặt bit 0 vào bit startend
MOV LAMPCODE,#0FEH ; chuyển trị 11111110b vào lampcode
LOOP: ; đặt tên nhãn dùng cho lệnh nhẩy
CALL KEY ; gọi chương trình dò phím, tên nhãn key
JNB F0,LNEXT ; cho nhẩy theo bit f0
CALL KEYPROC ; gọi chương trình xử lý phím

LNEXT: ;đặt tên nhãn dùng cho lệnh nhẩy
CALL LAMP ; gọi chương trình điều khiển 8 Led trên cảng p3
JMP LOOP ; quay lại tên nhãn loop
DELAY: chương trình tạo trể
MOV R7,#100 ; đặt trị 100 vào thanh ghi r7
D1: ;đặt tên nhãn dùng cho lệnh nhẩy
MOV R6,#100 ; đặt trị 100 vào thanh ghi r6
DJNZ R6,$ ; nhẩy tại chổ, chờ trị trong r6 bằng 0
DJNZ R7,D1 ; giảm trị trong r7 theo bước -1, r7=0?, định hướng nhẩy
RET ; qua lại sau lệnh call delay

;----------------------------------------
KEYPROC: ; chương trình xử lý phím
MOV A,B ; chuyển trị trong b vào thanh ghi a
JB ACC.2,KeyStart ; xét bit acc.2 để định hướng nhẩy 
JB ACC.3,KeyOver ; xét bit acc.3 để định hướng nhẩy
JB ACC.4,KeyUp ; xét bit acc.4 để định hướng nhẩy
JB ACC.5,KeyDown ; xét bit acc.5 để định hướng nhẩy
JMP KEY_RET ; nhẩy về tên nhãn key_ret
KeyStart: ; trình vào mode khởi động
SETB StartEnd ; đặt bit startend lên 1, cho khởi động
JMP KEY_RET ; nhẩy đến tên nhãn key_ret
KeyOver: ; trình cho tắt, kết thúc
CLR StartEnd ; đặt bit startend xuống 0, kết thúc
JMP KEY_RET ; nhẩy đến tên nhãn key_ret
KeyUp: ; trình cho 8 Led dời qua phải
SETB UpDown ; đặt bit updown lên 1, dời qua phải
JMP KEY_RET ; nhẩy đến tên nhãn key_ret
KeyDown: ; trình cho 8 Led dời qua trái
CLR UpDown ; đặt bit updown xuống 0, dời qua trái
KEY_RET: ; đặt tên nhãn dùng cho lệnh nhẩy
RET ; quay lại sau lệnh call keyproc
KEY: ; đặt tên nhãn dùng cho lệnh nhẩy, trình dùng dò phím
CLR F0 ; xóa bit f0
ORL P1,#00111100B ; lấy logic OR trị 00111100b và cảng p1
MOV A,P1 ; chuyển trị hiện có của p1 vào thanh ghi a
ORL A,#11000011B ; lấy logic OR a và 11000011b, xét trạng thái 4 phím
CPL A ; lấy bù a, đảo 8 bit trong thanh ghi a
JZ K_RET ; xét trị trong thanh a, có bằng 0 không? để nhẩy
CALL DELAY ; cho gọi chương trình trể
OR P1,#00111100B ; lại lấy logia OR trị 00111100b cho cảng p1 
MOV A,P1 ; lại chuyển trị hiện có của cảng p1 vào thanh ghi a
ORL A,#11000011B ; cho lấy logic OR trị trong a và trị 11000011b
CPL A ; lại cho bù a, đảo 8 bit trong thanh ghi a
JZ K_RET ; lại xét trị trong thanh a, có bằng 0? để nhẩy
MOV B,A ; chuyển trị trong a vào thanh b
SETB F0 ; đặt bit kiểm tra f0 lên 1, báo đã có phím nhấn

K_RET: ; đặt tên nhãn dùng cho lệnh nhẩy
ORL P1,#00111100B ; Lấy logic OR trị hiện có trong p1 và 00111100b
MOV A,P1 ; chuyển trị hiện có trên cảng p1 vào thanh ghi a
ORL A,#11000011B ; lấy logic OR trị trong a và 11000011b
CPL A ; lấy bù a, đảo 8 bit trong thanh ghi a
JZ K_RET1 ; xét trị trong a có bằng 0 không? để nhẩy
JMP K_RET ; nhẩy đến tên nhãn k_ret

K_RET1: ; đặt tên nhãn dùng cho lệnh nhẩy
RET ; quay lại sau lệnh call key

D500MS: ; chương trình làm trể
PUSH PSW ; tạm cho cất trị trong thanh ghi psw vào ngăn xếp
SETB RS0 ; đặt trị rs0 trong thanh ghi trạng thái psw lên 1
MOV R7,#200 ; chuyển trị 200 vào thanh ghi r7

D51: ; đặt tên nhãn dùng cho lệnh nhẩy
MOV R6,#250 ; đặt trị 250 vào thanh ghi r6

D52: ; đặt tên nhãn dùng cho lệnh nhẩy
NOP ; dòng không tác vụ
NOP ; dòng không tác vụ
NOP ; dòng không tác vụ
NOP ; dòng không tác vụ
DJNZ R6,D52 ; giảm trị trong r6 theo bước -1, r6=0?, chọn hướng nhẩy
DJNZ R7,D51 ; giảm trị trong r7 theo bước -1, r7=0?, chọn hướng nhẩy
POP PSW ; lấy lại trị trước đó cho thanh ghi psw
RET ; quay lại sau lệnh gọi call d500ms

LAMP: ; chương trình điều khiển 8 Led trên cảng p3
JB StartEnd,LampStart ; chọn hướng nhẩy theo bit startend
MOV P3,#0FFH ; đặt trị 11111111b vào cảng p3, tắt hết 8 Led
JMP LAMPRET ; nhẩy về tên nhãn lampret
LampStart: ; đặt tên nhãn cho lệnh nhẩy, trình dời 8 bit trong a qua trái
JB UpDown,LAMPUP ; nhẩy theo bit updown
MOV A,LAMPCODE ; chuyển trị trong lampcode cho thanh ghi
RL A ; cho quay vòng 8 bit trong thanh ghi aqua hướng trái
MOV LAMPCODE,A ; chuyển trị trong a vào lampcode
MOV P3,A ; cho xuất trị trong a ra cảng p3
CALL D500MS ; gọi chương trình làm chậm d500ms
JMP LAMPRET ; nhẩy về tên nhãn lampret

LAMPUP: ; đặt tên nhãn cho lệnh nhẩy, trình cho dời 8 bit qua phải
MOV A,LAMPCODE ; chuyển trị trong lampcode vào thanh ghi a
RR A ; cho quay vòng 8 bit trong a qua hướng phải
MOV LAMPCODE,A ; chuyển trị trong a vào lampcode
MOV P3,A ; xuất trị trong a ra cảng p3
CALL D500MS ; cho gọi chương trình trể d500ms

LAMPRET: ; đặt tên nhãn cho lệnh nhẩy
RET ; quay lại sau lệnh call
END ; dừng biên dịch tại dòng này


Phân tích cách viết các câu lệnh chương trình nguồn trên:





Tìm hiểu thêm một cách viết khác. Bạn xem thí dụ sau:

Trong
thí dụ này, chúng ta gắn 4 phím trên cảng p3 và dùng các phím
này điều khiển trạng thái nhấp nháy của 8 Led đặt trên cảng
p1.





Chương trình nguồn viết như sau:


ORG 0000H ; Khởi đầu từ thanh ghi 0000h
LJMP START ; nhẩy đến tên nhãn start
; các thanh ghi chuyên dùng cho chức năng ngắt
ORG 0003H ; vị trí chạy ngắt INT0
RETI

ORG 000BH ; vị trí chạy ngắt TF0
RETI

ORG 0013H ; vị trí chạy ngắt INT1
RETI

ORG 001BH ; vị trí chạy ngắt TF1
RETI

ORG 0023H ; vị trí chạy ngắt RI var TI
RETI

;

CLEAR: ; đặt tên nhãn cho lệnh nhẩy
RET

;

START: ; đặn tên nhãn cho khời đầu
CALL CLEAR ; gọi chương trình clear
; trình dò phím
STAR1: ; đặt tên nhãn dùng cho lệnh nhẩy
MOV P3,#0FFH ; đặt trị 11111111b vào p3, định trạng thái đầu
JNB P3.4,FUN0 ; dò bit 0 trên chân p3.4, để nhẩy
JNB P3.5,FUN1 ; dò bit 0 trên chân p3.5 để nhẩy
JNB P3.2,FUN2 ; dò bit 0 trên chân p3.2 để nhẩy
JNB P3.3,FUN3 ; dò bit 0 trên chân p3.3 để nhẩy
JNB F0,STAR1 ; nhẩy theo bit f0, f0=1, có nhấn phím
RET ; quay lại sau lệnh call start
;

FUN0: ; tên nhãn dùng cho phím p3.4
CALL DL10MS ; gọi chương trình trể 10ms, tránh rung phím
JB P3.4,STAR1 ; kiểm tra lại phím nhấn trên p3.4
WAITL0: ; trình chờ bỏ phím
JNB P3.4,WAITL0 ; chờ bỏ phím
SETB F0 ; đặt bit kiểm tra f0 lên 1
FUN01: ; đặt tên nhãn dùng cho lệnh nhẩy
CALL FUN00 ; cho gọi chương trình fun00
CALL STAR1 ; quay lại tên nhãn star1
JMP FUN01 ; nhẩy về tên nhãn fun01
; Viết tương dạng như trên
FUN1:

CALL DL10MS ;

JB P3.5,STAR1

WAITL1:

JNB P3.5,WAITL1 ;

SETB F0

FUN10:

CALL FUN11

CALL STAR1

JMP FUN10

; Viết tương dạng như trên
FUN2:

CALL DL10MS ;

JB P3.2,STAR1

WAITL2:

JNB P3.2,WAITL2 ;

SETB F0

FUN20:

CALL FUN22

CALL STAR1

JMP FUN20

; viết tương dạng như trên
FUN3:

CALL DL10MS ; gọi trể 10ms tránh ảnh hưởng của rung phím
JB P3.3,STAR1 ; kiểm tra lần nữa phím trên p3.3
WAITL3: ; tên nhãn
JNB P3.3,WAITL3 ; chờ bỏ phím ra
CLR F0 ; xóa bit f0, về trạng thái chờ nhấn phím
MOV P1,#0FFH ; đặt trị 11111111b để tắt 8 Led trên p1
JMP STAR1 ; quay lại tên nhãn star1
; trình cho Led sáng lan lên
FUN00:

MOV A,#0FEH

FUN000:

MOV P1,A

CALL DL05S

JNB ACC.7,OUT

RL A

JMP FUN000

OUT: RET


; trình cho các Led sáng nhẩy
FUN11:

MOV A,#0FEH

FUN111:

MOV P1,A

CALL DL05S

JZ OUT

RL A

ANL A,P1

JMP FUN111


; trình cho các 4 Led nhấp nháy xen kẻ
FUN22:

MOV A,#0AAH

MOV P1,A

CALL DL30S

CPL A

MOV P1,A

CALL DL30S

RET
; chương trình làm trể
DL512:

MOV R2,#0FFH

LOOP1:

DJNZ R2,LOOP1

RET

DL10MS:

MOV R3,#14H

LOOP2:

CALL DL512

DJNZ R3,LOOP2

RET

DL05S:

MOV R4,#0AH

LOOP3:

CALL DL10MS

DJNZ R4,LOOP3

RET

DL30S:

MOV R5,#03H

LOOP4:

CALL DL05S

DJNZ R5,LOOP4

RET
end

http://dientu686.com/