Professional Documents
Culture Documents
------------o0o-----------
NGUYỄN QUỐC UY
Hôm nay chúng ta sẽ đến với những kiến thức cơ bản về vi điều khiển 8051
Bước 3: Chọn đường dẫn lưu thư mục cài đặt, sau đó chọn Next.
Bước 4: Điền thông tin cá nhân và chọn Next.
Bước 5: Chờ cho máy tiến hành cài đặt.
Sau đây là hướng dẫn để crack dùng đầy đủ các chức năng của phần mềm
Bước 1: Chạy chương trình KeilC vừa cài đặt với quyền Admin (Click
chuột phải chọnRun as administrator), phần mền hiện thị chọn File -
> License Management.
Bước 2: Hộp thoại License Management xuất hiện, trong tab Single-User
License các bạn copy mã CID.
Bước 3: Chạy file “Keygen.exe”, paste mã vừa copy vào ô CID, kiểm
tra Taget đã chọn là C51 chưa, chọn Generate.
Bước 6: Close.
https://www.fshare.vn/file/7D1RGOQFNRLE
Bước 9: Click Close.// Dành cho máy chưa crack lần nào.B4-B9
Bước 2: Hộp thoại hiển thị, các bạn tùy chọn vị trí lưu project và tên
project của mình, click Save.
Bước 3: Cửa sổ “Select Device for …” xuất hiện, phần Data base các bạn
chọn Atmel->AT89C52
Bước 8: Click chuột phải vào Source Group 1, chọn Add Files to Group
‘Source Group 1’…
Bước 9: Cửa số hiển thị, các bạn click vào file main.c vừa tạo, click Add và
tắt cửa sổ.
File main.c đã được add vào project như sau:
Bước 10: Bước này thiết lập cho project xuất ra file .hex sau khi build.
Click vào biểu tượng Target Options…
Trong tab Output, tick vào Create HEX File. Sau đó bấm OK.
Bước 11: Viết 1 đoạn code cơ bản.
Bước 12: Build project bằng cách bấm vào biểu tượng ( vòng tròn đỏ như
hình) hoặc bấm phím F7. Sau đó xem kết quả.
Sau khi build, chúng ta sẽ thấy file .hex trong thư mục chứa project, file này sẽ
được nạp vào chip thông qua chương trình Proteus.
Bài 2:: Hướng dẫn tạo project với phần mềm Protus
8.1 SP1 và nạp code mô phỏng .
Bước 1: Chạy phần mềm Proteus, chọn File -> New Project (hoặc bấm
Ctrl+N)
Bước 2: Đổi tên Project và thay đường dẫn chứa project theo ý các bạn.
Click Next.
Bước 3: Mình đang cần vẽ mạch nguyên lý nên mình chọn “Create a
schematic …”, chọn “DEFAULT”, click Next.
Bước 4: Do bài viết lần này mình không vẽ mạch in nên mình chọn “Do not
create a PCB layout.” Sau đó các bạn bấm Next.
Bước 5: Chọn “No Firmware Project”. Click Next.
Bước 6: Click Finish.
Vậy chúng ta đã tạo xong project trong Proteus. Bước tiếp theo các bạn vẽ mạch
nguyên lý và chạy mô phỏng code cho họ 8051.
Bước 7: Các bạn click vào biểu tượng chữ P màu đỏ như hình dưới để lấy
các linh kiện vẽ mạch.
Bước 8: Trong bài này mình sẽ vẽ demo cho họ 8051, ở đây là chip 89c52.
Phần “Keywords” các bạn điền “89c52”, chọn linh kiện trong ô “Results”,
sau đó bấm OK.
Để lấy nhiều thiết bị thì không cần bấm OK (vì ô cửa sổ sẽ mất đi), bạn chỉ việc
nhân Enter sau khi chọn xong một thiết bị là được. Chọn tiếp 6 devices sau:
Bước 10: Lặp lại bước 9 với các linh kiện còn lại như hình:
Chú ý: GND (Đất) và VCC (Nguồn) các bạn lấy ở “Terminals Mode” khoanh
màu đỏ như hình dưới.
Chọn linh kiện để vẽ:Chuột trái lên tên linh kiện trong cửa sổ “Object
selector”.
Đặt linh kiện:Chuột trái lên cửa sổ mạch điện Right click lên linh kiện trong
cửa số mạch điện sẽ làm cho linh kiện đó được bao bởi màu “đỏ”, tức bạn
đang chọn linh kiện đó.
Bỏ chọn linh kiện:thực hiện bằng cách chuột phải lên một vị trí trống trên
cửa sổ mạch điện.
Delete linh kiện:Chuột phải 2 lần lên 1 linh kiện là delete linh kiện đó khỏi
cửa sổ mạch điện, hoặc chuột phải 1 lần lên 1 linh kiện đã được chọn trước
đó (có màu đỏ) cũng sẽ xóa linh kiện này.
Di chuyển linh kiện:chọn linh kiện trước (chuột phải) và drag để di chuyển
linh kiện bằng chuột trái.
Zoom To – Zoom Nhỏ mạch:Sử dụng con lăn chuột giữa để zoom mạch.
Xoay và lật linh kiện:chọn linh kiện cần xoay hay lật, dùng các nút công cụ
để xoay hoặc lật linh kiện. Để tiết kiệm thời gian thì xoay lật linh kiện trước
khi đặt nó vào trong bản mạch.
Bước 11: Nối dây, không cần công cụ, để nối dây bạn chỉ cần rê mouse đến
điểm cần nối của linh kiện, bạn sẽ thấy xuất hiện 1 dấu chéo “x”, lúc đó hãy
click chuột và di chuyển (không cần giữ chuột) đến vị trí tiếp theo và click
lần nữa.
Như vậy là các bạn đã vẽ xong 1 mạch cơ bản sử dụng chip 89C52. Để mạch
hoạt động được, các bạn điền các thông số cho các linh kiện bằng các bước sau:
Bước 12: Nháy đúp chuột trái vào tụ C1 như hình,Cửa sổ hiển thị các bạn
Vậy là chúng ta đã vẽ xong mạch nguyên lý bằng Proteus với đầy đủ các thông
số của mạch.
Để chạy mô phỏng, bạn dùng đoạn code sau cho file KeilC và buil ra file .HEX,
sau đó nạp vào vi điều khiển bằng Proteus.
#include <REGX52.H>
while(var--);
}
void main (void)
while(1)
P1 = 0x00;
Delay(1000);
P1 = 0xff;
Delay(1000);
Sau khi build các bạn được file .hex, add file .hex vào chip 89c52 trong proteus
như sau:
Bước 13: Nháy đúp chuột vào chip AT89C52 trong mạch, cửa sổ hiển thị,
các bạn chọn đường dẫn tới file .hex, sau đó bấm OK.
Bước 14: Để chạy mô phỏng các bạn chọn Debug -> Run Simulation hoặc
bấm phím F12
Bước 15: Để tắt mô phỏng các bạn bấm Debug -> Stop VSM Debugging.
(Tab Message xuất hiện, các bạn tắt đi)
Vậy là chúng ta đã hoàn thành tạo project với phần mềm Proteus 8.1 SP1
+ nạp code mô phỏng. Tận hưởng thành quả đầu tiên đi nào!
Khi sử dụng ngôn ngữ C người lập trình không cần hiểu chi tiết về cấu trúc của
bộ vi điều khiển. Điều này sẽ giúp tiết kiệm rất nhiều thời gian khi chúng ta tiếp
cận một vi điều khiển mới.
Sau đây là một số kiến thức liên quan đến cách khai báo biến, hằng, các kiểu dữ
liệu cũng như các toán tử phổ biến hay sử dụng khi lập trình vi điều khiển bằng
ngôn ngữ C.
Khai báo dữ liệu tổng quát trong C sử dụng với KeilC có dạng như sau:
Hai thông tin [Vùng_Nhớ] và [Địa_chỉ] có thể thêm hoặc không lúc đó trình
biên dịch sẽ biên dịch tự động. Các vùng nhớ trong vi điều khiển 8051 được liệt
kê trong bảng sau:
Để gán giá trị cho biến ta chỉ việc dùng cú pháp Tên biến = x:
int x;
hoặc gán ngay trong quá trình khai báo:
int x = 5;
Sau khi khai báo biến đó các bạn có thể sử dụng biến đó trong chương trình của
mình cho các nhu cầu sử dụng trong chương trình của các bạn.
Tùy với mục đích sử dụng và dữ liệu tối đa mà các bạn nghĩ biến có thể đạt đến
các bạn nên chọn kiểu dữ liệu vừa đủ nhất để tránh lãng phí tài nguyên vì với
điều khiển 8051 thì số lượng Ram khá là hạn chế (128 Byte với dòng cũ và
thêm 128 Byte Ram với một dòng sau này được cấp phát ở vùng idata).
Ngoài ra, với riêng KeilC còn có thêm một số kiểu dữ liệu được sử dụng riêng
cho dòng vi điều khiển 8051. Bảng dữ liệu đó như sau:
– bit : Dùng để khai báo các biến có giá trị 0 hoặc một hay các biến logic trên
vùng RAM của vi điều khiển. Khi khai báo biến kiểu bit trình dịc Keil C sẽ mặc
định vùng nhớ sử dụng là BDATA.
– sbit, sfr, sfr16: Dùng để định nghĩa các cho các thanh ghi chức năng hoặc các
cổng trên vi điều khiển dùng để truy nhập các đoạn dữ liệu 1 bit, 8 bit, 16 bit.
SBIT có thể dùng khai bảo một chân của một cổng.
Trên đây là các thông tin cơ bản liên quan đến khai báo dữ liệu và hằng được sử
dụng trong suốt quá trình lập trình của chúng ta. Các bạn cần nắm chắc kiến
thức này để có thể tiếp cận sâu hơn về lập trình nói chung và lập trình vi điều
khiển nói riêng.
Bài 4: Lập trình nháy LED với 8051.
Ở bài này sẽ hướng dẫn các bạn lập trình điều khiển Output cơ bản thực hành
với LED đơn. Các bạn thực hiện vẽ mạch sau trong Proteus.
Các bạn chú ý: do là mô phỏng thử nghiệm chương trình nên mình vẽ mạch ở
mức độ cơ bản tuy nhiên ở mạch thật các bạn cần bổ sung nguồn, thạch anh và
mạch reset cho mạch để chương trình có thể chạy được. Với mạch như trên
chúng ta đã có thể thực hiện mô phỏng chương trình cơ bản với LED đơn.
Sau khi khai báo sbit như trên chúng ta có thể sử dụng Tên chân mà chúng ta
mới định nghĩa để có thể điều khiển độc lập từng chân. Khi các bạn gán chân đó
bằng giá trị 0 thì đầu ra sẽ ở mức 0V còn khi các bạn gán cho chân đó ở mức 1
thì sẽ có mức điện áp ra là 5V.
Ví dụ ở chương trình sau chúng ta sẽ sử dụng định nghĩa sbit để điều khiển chân
P1.0 của 8051 thực hiện chức năng nhấp nháy một con LED. Các bạn xem code
theo mẫu sau.
Với việc lập trình như trên các bạn sẽ LED nối với chân P1.0 sẽ được thay đổi
giữa sáng và tắt. Ở đây có hàm Fn_Delay() có chức năng thay đổi tốc độ nhấp
nháy của con LED. Khi tham số truyền vào hàm này càng lớn thì độ trễ càng lâu
của nó cũng chỉ có 8 pin. Vì thế bạn có thể xuất data cho 8 pin một lúc với 1
dòng lệnh tức tần số nháy nháy các chậm. Các bạn có thể thay đổi thông số cho
hàm này để thấy rõ hơn.
Sau khi lập xong Project theo các bước đã hướng dẫn ở các bài trước các bạn gõ
các dòng code trên vào và thực hiện Build để tạo ra file hex sau đó các bạn
chuyển file hex đó vào IC 89C52 trên Proteus và chạy chế độ mô phỏng. Các
bạn sẽ thấy kết quả. Như vậy là các bạn đã có thể điều khiển được một chân của
8051 ở chế độ Output.
Sau khi thực hiện cho chân P1.0 các bạn có thể thực hiện trên các chân khác
hoặc thực hiện nhiều hơn một chân nếu các bạn muốn.
b.Lập trình điều khiển theo Port của vi điều khiển.
Ngoài điều khiển theo từng chân chúng ta có thể xuất dữ liệu ouput theo cả Port
trên 8051. 8051 là một vi điều khiển 8 bit và một Port với điều kiện các Pin đó
chung một Port. Để can thiệp đến một Port các bạn chỉ cần gán dữ liệu các bạn
mong muốn cho tên Port đó. Ví dụ như sau:
1 P2 = 0x55;
Với câu lệnh trên các bạn đã xuất dữ liệu trên Port 2 như sau: 0-1-0-1-0-1-0-1
tương ứng với chiều từ P2.7 tới P2.0.
Toán tử | là toán tử OR bit còn toán tử & là toán tử AND bit. Các toán tử trên
thực hiện theo công thức sau:
0 | 0 = 0
0 | 1 = 1
1 | 1 = 1
0 & 0 = 0
0 & 1 = 0
1&1=1
Đây là 2 toán tử rất hay được sử dụng trong việc khi bạn muốn tác động đến
một vài bit trong một Port mà các bạn muốn xuất dữ liệu. Toán tử | thường được
dùng để đưa một Pin lên mức 1 còn toán tử & thường được sử dụng để đưa một
Pin về mức 0.
Ví dụ như sau:
Ngoài ra mình giới thiệu với các bạn 2 toán tử << và >>. Đây là 2 toán tử dùng
để dịch bít. Các bạn quan sát các ví dụ sau để hiểu rõ về 2 toán tử này:
Sau đây là một ví dụ mình sử dụng việc xuất dữ liệu trên một Port tạo hiệu ứng
LED chạy từ trên xuống và lặp lại. Các bạn có thể tham khảo.
Các bạn thực hiện Build chương trình trên và đưa vào mạch trên Proteus để thử
nghiệm chương trình. Chương trình có hiệu ứng có một LED sẽ chạy từ trên
xuống dưới sau khi đến vị trí cuối cùng nó lại xuất phát từ vị trí đầu tiên.
Câu hỏi:
Muốn thay đổi thời gian sáng, tắt thì làm thế nào?
Muốn 1 đèn ở một vị trí bất kì (trong Port 1) sáng tắt thì sao?
Muốn 4 đèn bất kì sáng tắt luân phiên thì làm thế nào?
Muốn đảo ngược chiều đèn sáng thì làm thế nào?
3.Bài tập:
Bài 1.4: Lập trình điều khiển 2 chân LED luôn phiên sáng (Tức là khi 1
chân sáng thì chân còn lại sẽ tắt và 2 chân thực hiện liên tiếp xen kẽ nhau).
CODE:
#include<REGX52.H>
void delay(unsigned int t)
{
while(t--);
}
void main(void)
{
while(1)
{
unsigned int i;
unsigned char L[]={0x05,0x0A,0x14,0x28,0x50,0xA0};
for(i=0;i<=5;i++) {
P1=L[i];
delay(50000); }
}
}
Bài 2.4: Lập trình trên một Port của 8051 thực hiện chức năng theo trò
chơi xếp hình.
Cụ thể như sau:
– Đầu tiên trên cùng có 1 LED sáng sau đó LED rơi dần xuống dưới và sẽ
dừng lại ở vị trí cuối cùng.
– Khi LED số 1 chạm đến vị trí dưới cùng thì xuất hiện 1 LED sáng ở vị trí ở
trên cùng và lặp lại việc rơi xuống dưới và dừng lại khi đến vị trí ngay trên
con LED cũ.
– Lặp lại như vậy cho đến khi số LED đầy trên cột và sẽ bắt đầu lại từ đầu.
Đây là một hình ảnh về kết quả của bài tập để các bạn hiểu rõ về yêu cầu.
#include<REGX52.H>
void delay(unsigned int t)
{ while(t--);}
void main(void)
{
while(1)
{
unsigned int i;
unsigned char
L[]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x81,0x82,0x84,0x88,0
x90,0xA0,0xC0,0xC1,0xC2,0xC4,0xC8,0xD0,0xE0,0xE1
,0xE2,0xE4,0xE8,0xF0,0xF1,0xF2,0xF4,0xF8,0xF9,0xFA,0xFD,0xFE,0xFF};
for(i=0;i<=36;i++)
{
P1=L[i];
delay(50000);
}
}
}
THỬ TÌM CÁCH KHÁC THAY VÌ DÙNG MẢNG ĐỂ ĐẠT YÊU CẦU NHƯ
TRÊN. (1 ĐIỂM CỘNG CHO CẢ NHÓM)
TỰ TÌM MỘT ĐOẠN CODE HOẶC CODE MỘT ĐOẠN CODE ĐỂ ĐIỀU
KHIỂN 8-16 LED (PORT 1,2) THEO Ý MÌNH.