thanhlv207
Các bạn thân mến!
Vào các diễn đàn tui thấy số người hỏi về 8051 khá nhiều, đa số họ toàn là những người lần đầu tiên tiếp xúc với 8051.Vì vậy tui mạo muội mở topic này để giúp đỡ những người mới tiếp xúc với 8051.Thực ra tui cũng mới làm wen với 8051 thôi, nhưng thiết nghĩ ít ra thì cũng giúp chút gì nho nhỏ cho người mới học 8051.
Đối với những người mới học, theo tôi đây là những vd cụ thể, rõ ràng giúp bạn nắm bắt nhanh nhất về phần cứng, các tính năng của 8051,lập trình, còn những đã học qua 8051 rất mong dc sự góp ý của các bạn, để tui, bạn, tất cả chúng ta cùng tiến bộ.
Lý do tại sao tôi lại chọn 8051 để bắt đầu??
theo tui nó vừa rẻ, dễ mua, tài liệu lại nhiều.
Đố bạn nào trong quá trình làm việc lần đầu với các họ vdk mà ko có chú nào ra đi đấy.Tui sơ sơ cũng cho die hàng chục con rùi.
Tất nhiên các bạn cũng có thể bắt đầu với PIC, AVR,....điều đó là tùy vào sở thích của mỗi người, và túi tiền nữa.
Lúc nãy đến giờ tui nói hơi nhiều phải không??Nói nhiều là tật xấu, nhưng như thế chúng ta sẽ hiểu nhau hơn.
Rồi bây giờ vào chuyên môn.
Tài liệu bạn có thể dùng quyển "Họ vdk 8051" của thầy Tông Văn On, hay của tác giả Nguyễn Tăng Cường bên ktqs.Thực ra 2 quyển này đều cùng 1 nơi mà ra.Trên diễn đàn này có bạn đã đưa lên quyển này rồi đó, tui ko nhớ link, các bạn chịu khó tìm nhé.Nếu ko tìm dc liên hệ với tui, tui send cho.
Về ngôn ngữ lập trình cho nó, bạn có thể dùng C,asm.Tui ko muốn so sánh 2 ngôn ngữ này, cái này tùy thuộc vào thói quen, sở thích của mỗi ngừơi.Còn tui, tui dùng Kiel C.Phần mền này trên mạng nhiều rùi, ao thích tui send cho.Nếu viết bằng C bạn có thể coi lại các tài liệu về lập trình C, các câu lệnh hoàn toàn như nhau, chỉ khác 1 chút về lấy dl vào và ra..
Còn nữa, bạn phải có 1 hoặc nhiều chú 89c51-52-55;mạch nạp:có thể bạn tự làm hoặc đi mua(Bạn có thể tham khảo tại:http://dientuvietnam.net/board/showthread.php?t=672).
Đó là sự chuẩn bị về công cụ làm việc.
Bây giờ chúng ta sẽ viết chương trình đầu tiên.
Tôi sẽ đi từ dễ đến khó.
-điều khiển led
-led 7 thanh, quét led 7 thanh
-giao tiếp phím,ma trận phím
-ma trận led
-LCD
-...
Các bạn lưu ý rằng tui đang dùng máy ngoài cửa hàng, nên những bài tập đơn giản sẽ có thể ko có mạch kèm theo, nhưng tôi sẽ mô tả trong chương trình, mong mọi nười thông cảm.
Ví dụ đầu tiên:Nối A của led với P1.0 ,K nối với GND, và cho nó nhấp nháy nhanh hay chậm, tùy bạn.
___________________
Code:
#include<regx51.h>//khai báo cho chương trình mình dùng thư viện của 8051
#define led P1_0//Led được nối với P1_0,chú ý viết hoa chữ "P"nhé
void delay(unsigned int ms)//hàm này tạo độ trễ thời gian, dơn vị là ms
{
unsigned int i;
unsigned char j;//khai báo kiểu "char"mỗi biến chỉ chiếm 1 byte
for(i=0;i<ms;i++)
for(j=0;j<120;j++)
{}//không làm gì cả
}
main()//Chương trình chính
{
While(1)//tạo vòng lặp vô hạn
{
led=0;//tắt led
delay(1000);//tạo độ trễ 1000ms=1s
led=1;//bật led
delay(1000);
}
}Thế là xong ct đầu tiên, bạn chỉ việc copy,paste, và dịch nó thành file hex ,nạp vào chip,cắm vào mạch và thấy thành quả của mình.
Bây giờ bạn lại muốn 8 con led cùng nhấp nháy thì làm sao?cực kỳ đơn giản.
Nối các led như vd trên vào P1(từ P1.0->P1.7)
và chương trình sẽ là:
________________
Code:
#include<regx51.h>
void delay(unsigned int ms)//hàm này tạo độ trễ thời gian, dơn vị là ms
{
unsigned int i;
unsigned char j;//khai báo kiểu "char"mỗi biến chỉ chiếm 1 byte
for(i=0;i<ms;i++)
for(j=0;j<120;j++)
{}//không làm gì cả
}
main()//Chương trình chính
{
While(1)//tạo vòng lặp vô hạn
{
P1=0x00;//"0x00"là giá trị viết trong hệ hex, cái này=00000000
delay(1000);//tạo độ trễ 1000ms=1s
P1=0xff;//"0xff"là giá trị viết trong hệ hex, cái này=11111111
delay(1000);
}
}
}
--------------------------------------------------------------------------------
Last edited by VNarmy; 10-10-07 at 08:59 AM..
Bây giờ tui fair về đi học rùi.
Hôm sau ta tiếp tục nhé.
Chúc các bạn học tốt
Ví dụ 3:Bây gờ bạn cũng nối 8 led như trên vd2 vào P1.(Ta ký hiệu led nối vào P1.0 là led0,vào P1.1 là led1,...)
Bài toán đặt ra là:Đầu tiên led0 sáng(các led còn lại tắt), tiếp theo led1 sáng(tất nhiên các led còn lại tắt),...cho đến led7 và lặp lại như ban đầu.
Các bạn lưu ý 1 điều này:bạn có thể nối trực tiếp A của led vào P1,K xuống GND ko cần treo trở.Nếu thích bạn treo cho nó con trở 1k,hay bao nhiêu đấy tùy các bạn(nhưng dừng lớn lắm).Tuy nhiên dù ko treo trở hay có trở thì bạn cũng thấy led sáng yếu.Nếu ban làm ngược lại,A led->P1,K led->5v thì bạn sẽ led sáng hơn nhiều, điều này được giải thích là do dòng hút bởi 8051 lớn hơn dòng do nó đẩy ra.
Và chương trình của nó như sau:
_____________________________________
Code:
#include<regx51.h>
//8 dòng "define" dưới đây bạn có thể bỏ qua,nhưng tui làm như thế
//bạn sẽ dễ theo dõi hơn(Nếu thế trong ct bạn ko dc dùng các từ như led0,..
//vì nó chưa đựoc định nghĩa
#define led0 P1_0
#define led1 P1_1
#define led2 P1_2
#define led3 P1_3
#define led4 P1_4
#define led5 P1_5
#define led6 P1_6
#define led7 P1_7
#define sang 1
#define tat 0
void delay(usnigned int ms)//hàm này tạo độ trễ thời gian, dơn vị là ms
{
usigned char i,j;//khai báo kiểu "char"mỗi biến chỉ chiếm 1 byte
for(i=0;i<ms;i++)
for(j=0;j<120;j++)
{}//không làm gì cả
}
main()//chương trình chính
{
while(1)//tạo vòng lặp vô hạn
{
//đầu tiên là ledo sáng,các led khác đều tắt
led0=sang;led1=led2=led3=led4=led5=led6=led7=tat;
delay(1000);/thời gian trễ là 1s
//tiếp theo là led1 sáng,các led khác đều tắt
led1=sang;led0=led2=led3=led4=led5=led6=led7=tat;
delay(1000);/thời gian trễ là 1s
//tiếp theo là led2 sáng,các led khác đều tắt
led2=sang;led1=led0=led3=led4=led5=led6=led7=tat;
delay(1000);/thời gian trễ là 1s
//tiếp theo là led3 sáng,các led khác đều tắt
led3=sang;led0=led2=led1=led4=led5=led6=led7=tat;
delay(1000);/thời gian trễ là 1s
//tiếp theo là led4 sáng,các led khác đều tắt
led4=sang;led0=led2=led3=led1=led5=led6=led7=tat;
delay(1000);/thời gian trễ là 1s
//tiếp theo là led5 sáng,các led khác đều tắt
led5=sang;led0=led2=led3=led4=led1=led6=led7=tat;
delay(1000);/thời gian trễ là 1s
//tiếp theo là led6 sáng,các led khác đều tắt
led6=sang;led0=led2=led3=led4=led5=led1=led7=tat;
delay(1000);/thời gian trễ là 1s
//tiếp theo là led7 sáng,các led khác đều tắt
led7=sang;led0=led2=led3=led4=led5=led6=led1=tat;
delay(1000);/thời gian trễ là 1s
}
}
Chương trình trên có thể viết ngắn gọn lại như sau:
__________________
Code:
#include<regx51.h>
void delay(usnigned int ms)//hàm này tạo độ trễ thời gian, dơn vị là ms
{
usigned char i,j;//khai báo kiểu "char"mỗi biến chỉ chiếm 1 byte
for(i=0;i<ms;i++)
for(j=0;j<120;j++)
{}//không làm gì cả
main()
{
while(1)
{
P1=0x01;delay(1000);//led0 sang
P1=0x02;delay(1000);//led1 sang
P1=0x04;delay(1000);//led2 sang
P1=0x08;delay(1000);//led3 sang
P1=0x10;delay(1000);//led4 sang
P1=0x20;delay(1000);//led5 sang
P1=0x40;delay(1000);//led6 sang
P1=0x80;delay(1000);//led7 sang
}
}
Sao không có ai thảo luận cùng bạn Quynh vậy? Tui khoái nó lắm nhưng chẳng có một tý kinh nghiệm nào cả. Nhưng tui sẽ có gắng. Cảm ơn bạn đã tạo ra topic này.
Bạn cho mình địa chỉ email nhé. Mình cần tài liệu "họ vđk 8051" của thầy Tống Văn Ôn lắm đó
__________________
Những gi mà chúng ta học được chỉ là một phần rất nhỏ trong đại dương kiến thức loài người!!
CHO THAM GIA VỚI NHE CÔ BẠN
Khi báo phần mở đầu để bộ dịch biết là chúng ta đang sử dụng loại VDK nào
Phần 1: HEADER
#include<regx51.h>
Phan 2: Khai bao các hàm
Đây là delay- ước lượng 1 vòng for 1 lần lặp<=> mất 8us
Như vậy ta có: ms*(125*8)=1000*1000 ~= 1s
Code:
void delay(usnigned int ms)//hàm này tạo độ trễ thời gian, dơn vị là ms
{
usigned char i,j;//khai báo kiểu "char"mỗi biến chỉ chiếm 1 byte
for(i=0;i<ms;i++)
{
for(j=0;j<120;j++);
} }
Phan 3: PHAN CHINH CUA CHUONG TRINH- LUON LUON MO DAU BANG TU KHÓA main()
main()
{
unsigned char m,tem;
tem=0x01;
while(1)
{ P1=tem;delay(1000);
tem<<=1;if(tem==0x00)then tem=0x01; //dich sang trai 1 bit
}
} // DAY LA DAU KET THUC CHUONG TRINH : THE END---------------- Chuong tinh duoc viet lai la-------------------
Code:
#include<regx51.h>
void delay(usnigned int ms)//hàm này tạo độ trễ thời gian, dơn vị là ms
{
usigned char i,j;//khai báo kiểu "char"mỗi biến chỉ chiếm 1 byte
for(i=0;i<ms;i++)
{
for(j=0;j<120;j++);
}
}
main()
{
unsigned char m,tem;
tem=0x01;
while(1)
{ P1=tem;delay(1000);
tem<<=1;if(tem==0x00)then tem=0x01; //dich sang trai 1 bit
}__________________
TẬP SÁCH LẬP TRÌNH VI ĐIỀU KHIỂN PIC16F84 - Tiếng Việt ĐẦU TIÊN TẠI VIỆT NAM
http://sites.google.com/site/sachpic
Bạn đang đọc truyện trên: Truyen4U.Com