CHI TIẾT CHỦ ĐỀ
Viết cho các Bạn mới làm quen với ic vi điều khiển, họ AT89C51, ic làm việc theo câu lệnh.

 


Chào Bạn,


Tôi chơi điện tử từ năm 12 tuổi, lúc trong nhà mới có cái radio đèn 5 bóng với dây Anten căn ngoài trời dài hai ba chục mét, rồi khi lớn lên làm thợ điện tử thì lúc đó là thời kỳ sửa chữa TV đèn, Radio 6 transistor, rồi TV transistor đen trắng, rồi màu, rồi TV IC, rồi đầu máy, rồi ống ghi hình, rồi điện thoại di động, rồi computer Desktop, rồi Laptop.... Cứ theo sự tiến triển phi mã của môn điện tử mà bay cho đến tận bây giờ.


Bây giờ nhìn lại ngành điện tử đã khác rất xa quá xa so với bốn năm chục năm trước. Thợ điện tử bây giờ phải làm quen với nhiều thiết bị cao siêu hơn, phức tạp hơn, nhu cầu dùng máy móc điện tử bây giờ nhiều hơn thuở trước rất nhiều. Một số thợ điện tử "tự phát " gặp tôi cho biết họ hiểu rất mù mờ về loại ic lập trình, một ứng dụng đối với họ là rất hay, rất hấp dẫn mà sao khó hiểu quá, họ nói với tôi thấy người ta làm mà phát ham. Nhiều bằng hữu hỏi tôi có cách nào "cắt nghĩa" đề tài này cho dễ hiểu hơn không? Đã nhiều lần tôi hứa với lòng là sẽ tìm ra phương cách trình bày loại ic vi điều khiển làm việc với câu lệnh sao cho thật bình dân dễ hiểu và mong nó sẽ phổ cập đến nhiều Bạn thợ điện tử vốn thành nghề ít qua trường lớp. Hôm nay tôi sẽ lại thử nói nữa về đề tài này xem có dễ hiểu hơn không? Mong bài viết sẽ làm Bạn hài lòng.

 

 

IC vi điều khiển là gì?

 

Trước hết hãy làm quen với khái niệm điều khiển trong ngành điện tử. Điều khiển là dùng mức áp cao  hay thấp để đóng mở một thiết bị. Bạn xem thí dụ sau:

 

Trong hình này, Bạn thấy khi chân B của transistor Q1 cho đặt ở mức volt thấp, thì transistor ở trạng thái ngưng dẫn và không có dòng cấp cho Led. Led sẽ tắt.

 

 

 

Trong hình này, Bạn thấy khi chân B của transistor Q1 cho đặt ở mức volt cao thì transistor ở trạng thái bão hòa và có dòng cấp cho Led. Led sẽ sáng.

 

 

Với hình động chúng ta thấy rõ hơn tác nhân điều khiển, tức bit 0 hay bit 1 trên chân B, làm Led lúc tắt lúc sáng. Bạn xem hình.

 

 

 

Qua hai hình này có thể thấy, chúng ta có thể dùng mức volt cao thấp để tắt mở một thiết bị, ở đây là tắt mở Led. Chúng ta tạm chấp nhận định nghĩa sau:

 

* Mức volt thấp là bit 0.

* Mức volt cao là bit 1.

 

 

Vậy có thể nói để cho Led sáng, chúng ta dùng bit 1 và làm cho Led tắt chúng ta dùng bit 0. Trong tác động điều khiển đóng mở, chúng ta có thể đóng mở một Relay, đóng mở điện cho một motor DC. Bạn xem hình:

 

 

 

Trong hình này, trên chân C của transistor Q1, chúng ta thấy có:

 

* Led chiếu sáng.

* Relay 12V với tiếp điểm lá kim K1.

* Motor DC 12V

 

Vậy nếu đặt bit 1 trên chân B các thiết bị trên chân C của Q1 sẽ được cấp dòng và nếu dùng bit 0 trên chân B thì các thiết bị trên chân C sẽ bị cắt dòng. Qua các thí dụ trên, chúng ta thấy nếu có một linh kiện điện tử có thể xuất ra mức volt cao hay mức volt thấp theo câu lệnh do chúng ta soạn ra thì lúc đó chúng ta đã có thể điều khiển các thiết bị bằng câu lệnh. IC vi điều khiển có các cảng (port), ở các chân của cảng có thể xuất nhập mức áp cao hay thấp tùy theo các câu lệnh do chúng ta soạn ra, do đó nếu dùng ic vi điều khiển chúng ta sẽ có thể điều khiển nhiều thiết bị theo câu lệnh.

 

Hình vẽ sau đây cho thấy 4 cảng của ic vi điều khiển AT89C51.

 

 

Bạn biết mức volt trên các chân của mỗi cảng Bạn đều có thể chọn định ở mức volt cao hay mức volt thấp bằng câu lệnh. 

 

Lệnh đặt chân lên mức volt cao là setb (set bit). Lệnh đặt chân xuống mức volt thấp là clr (Clear bit).

 

Thí dụ: Bạn muốn chân p1.0 (chân số 1) lên mức volt cao, Bạn gõ câu lệnh như sau:

 

setb p1.0

 

Bạn muốn chân p1.1 (chân số 2) xuống mức volt thấp. Bạn gõ câu lệnh như sau:

 

clr p1.1

 

Qua phần trình bày trên, tôi nghĩ Bạn đã hiểu điều khiển các thiết bị bằng câu lệnh là gì? và nó làm việc ra sao?

 

Hãy xem hình sau:

 

Trong mạch, R1 (4.7K) là điện trở hạn dòng chân B và diode D2 dùng dập điện áp nghịch, xuất hiện mỗi khi relay bị cắt dòng. Hình vẽ cho Bạn thấy chúng ta đã dùng câu lệnh để tắt mở Q1 và dùng relay 12V với tiếp điểm lá kim K1 để đóng mở các thiết bị volt cao khác (như motor công nghiệp, máy bơm...) theo câu lệnh.

 

Một lệnh khác, lệnh mov (move) có thể cùng một lúc xác định trạng thái bit cho 8 chân của một cảng. Thí dụ: Cách dùng lệnh move qua các hình vẽ như sau:

Muốn có dòng cấp cho Led Bạn phải cho chân nối với Led xuống mức volt thấp với bit 0. Và muốn tắt Led Bạn dùng bit 1. Vậy với câu lệnh:

 

mov p3, #01010011b

 

Bạn nhìn vào hình sẽ thấy các Led ứng với chân có mức volt thấp phát sáng.

 

Để tắt hết 8 Led trên p3. Bạn dùng câu lệnh:

 

mov p3, #11111111b


 

Để 8 Led trên p3 sáng hết. Bạn dùng câu lệnh:

 

mov p3, #00000000b

  

 

Có thể dùng nhiều cảng để điều khiển các Led trên bảng Led ma trận. Bạn xem hình:

 

 

Hình cho thấy muốn Led D1 sáng, Bạn phải dùng câu lệnh:

 

clr p3.1 ;

 

Lệnh này đặt chân p3.1 xuống mức volt thấp và làm transistor Q1 bão hòa, cùng lúc Bạn dùng câu lệnh:

 

setb p1.1 ;

 

Lệnh này đặt chân p1.1 lên mức volt cao và làm transistor Q3 bão hòa, như vậy sẽ có dòng cấp cho Led D1. Led D1 sẽ phát sáng, trong khi đó các Led còn lại không đủ điều kiện để sáng. Bằng cách dùng các câu lệnh thích hợp, Bạn có thể tạo ra các con chữ và cả hình ảnh hiện trên bảng đèn ma trận Led 8x8, như hình sau:

 

 

Hình trên cho thấy bảng đèn Led ma trận 8x8 dùng làm bảng quang báo, với ic vi điều khiển AT89C51 dó có 4 cảng nên Bạn có thể dùng nó để điều khiển trực tiếp 3 ma trận 8x8 và làm được bảng đèn quang báo đơn giản. Chúng ta sẽ có một bài khác chuyên nói về vấn đề này.

 

 

Ngoài ra Bạn có thể dùng lệnh nhẩy (có điêu kiện hay không điều kiện) để theo dõi các trạng thái bit trên các chân của các cảng. Như thí dụ sau:

 

 

Trong hình, dùng nút nhấn BP, chúng ta sẽ dùng câu lệnh nhảy để nhẩy theo điều kiện bit 1 hay bit 0 trên chân p0.0. Bạn thấy bình thường với điện trở treo áp R1 (10K) và nút nhấn ở trạng thái hở (chưa nhấn xuống), chân p0.0 sẽ ở mức áp cao, vậy với câu lệnh (jump no bit):

 

jnb p0.0, $  ;

 

Câu lệnh này có nghĩa là nếu chân p0.0 ở mức áp thấp thì dừng lại ở đây và chờ đến khi nó chuyển qua bit 1. Nếu chân p0.0 ở mức áp cao tức bit 1 thì câu lệnh này không có tác dụng. Nhưng nếu Bạn nhấn nút BP xuống thì sao? Lúc đó chân p0.0 sẽ ở mức áp thấp (tức bit 0), lúc đó với câu lệnh nhẩy: (jnb p0.0, $) chương trình sẽ dừng lại chờ cho đến lúc Bạn bỏ phím, khi Bạn bỏ phím nó sẽ xuống chấp hành câu lệnh tiếp theo, đó là:

 

jmp chtrinh_1  ;

 

Đây là lệnh nhẩy không điều kiện, nó sẽ nhẩy ngay đến chương trình con có tên nhãn là chtr_1 (viết tắt của chương trình_1) và chấp hành chương trình con này.

 

Bạn cũng có thể dùng ic vi điều khiển kết hợp với đủ loại cảm biến (sensor,  như cảm biết quang, cảm biến nhiệt, cảm biến mức ẩm...) để tạo ra các thiết bị điều khiển tự động theo các tác nhân không thuộc điện. Một thí dụ, Bạn xem hình trên:

 

Chúng ta dùng một quang trở (SCd) để dò sáng. Bạn biết, khi trời tối, nội trở của quang trở rất lớn, vậy transistor Q1 sẽ ở trạng thái bão hòa, nó đặt chân p0.7 ở mức volt thấp (tức ở bit 0), với câu lệnh nhẩy theo điều kiện bit viết như sau:

 

jnb p0.7, $  ;

 

thì chương trình sẽ dừng lại ở câu lệnh này. Vì sao? Vì lúc này chân p0.7 đang ở trạng thái bit 0. Nếu trời sáng, nội trở của quang trở sẽ nhỏ và nó sẽ làm ngưng dẫn transistor Q1, vậy lúc này chân p0.7 sẽ lên mức volt cao (bit 1), chương trình sẽ thoát ra câu lệnh jnb p0.7, $ và xuống thực hiện câu lệnh kế bên dưới. Do câu lệnh tiếp theo của Bạn viết là:

 

jmp b_sáng  ;

 

Nên chương trình sẽ nhẩy không điều kiện đến chương trình con có tên nhãn là b_sang (viết tắt của chữ báo sáng).

 

Bạn cũng có thể dùng lệnh nhẩy theo phép so sánh trạng thái của 8 bit  trên cảng để tạo ra các chương trình điều khiển hấp dẫn hơn. Bạn xem hình minh họa sau:

 

 

Trong hình này, chúng ta dùng lệnh nhẩy có điều kiện và dùng phép so sánh để xác định nơi đến. Bạn thấy với câu lệnh:

 

cjne p2, #01011011b, chtr_1

jmp t_tuc

 

Trạng thái 8 bit này không giống với trạng thái 8 bit hiện đang có trên cảng 2 (8 bit hiện có trên cảng 2 là 11011010b), vậy nó sẽ nhẩy đến chấp hành chương trình con có tên nhãn là chtr_1 (viết tắt của chữ chương trình_1). Nếu 8 bit dùng trong phép so sánh giống nhau thì sao? Chương trình sẽ xuống dòng lệnh bên dưới và sẽ nhẩy đến chấp hành chương trình con có tên nhãn là  t_tuc (viết tắt của chữ tiếp_tục)

 

 

 

Qua phần trình bày trên, Bạn thấy ic AT89C51 có 4 cảng 4x8 (32 chân), trạng thái mức volt cao hay thấp trên các chân này có thể điều khiển theo các câu lệnh. Vậy vấn đề của chúng ta là phải hiểu rõ các câu lệnh dùng để xác định trạng thái trên các chân của 4 cảng sao cho phù hợp với ý muốn của mình. Và ic AT89C51 là một trong các ic vi điều khiển rất đơn giản, hiện nay rất phổ dụng.

 

 

 

Thế nào là ic làm việc theo các câu lệnh?

 

  

Qua phần trình bày trên, Bạn thấy với ic AT89C51, trạng thái mức volt cao hay thấp trên các chân của 4 cảng hoàn toàn chấp hành theo các câu lệnh do Bạn đã viết ra. Hiện nay có rất nhiều ic thuộc loại này, người ta nói đó là các ic lập trình, hay là loại ic vi điều khiển hay cao hơn là các ic vi xử lý. Với các ic logic  TTL họ 74xxx hay họ CMOS 40xx thì các công năng đã cố định, các ic này không làm việc theo các câu lệnh nên tính linh động không cao và thường có cấu trúc phần cứng rất phức tạp, hiện nay nó thường chỉ dùng  làm các linh kiện phụ trợ cho các ic vi điều khiển.

 

Có thể nói, khi có một ic vi điều khiển, Bạn cần xác định các chân cố hữu của nó, các chân này dùng vận hành ic và các chân của các cảng dùng chấp hành các câu lệnh. Tất cả các mạch điện chịu điều khiển đều thông qua các chân của các cảng. Theo trục phát triển, trước hết chúng ta có nhóm ic vi điều khiển họ MSC-51 như nhóm AT89C51, phát triển hơn là nhóm PIC, rồi AVR và rồi ARM..., nhưng với các Bạn mới làm quen với loại ic lập trình, Bạn nên khởi đầu từ các ic vi điều khiển thuộc nhóm MSC-51, như AT89C51...Vì các ic này rất trực quan, dễ học dễ dùng, dĩ nhiên dễ kiếm được tiền hơn. 

 

Để dùng ic AT89C51 (40 chân) cho công việc điều khiển của Bạn, Bạn chỉ cần ráp một mạch điện cơ bản như hình vẽ sau:

 

 

Giải thích mạch điện: Hình vẽ cho thấy, với ic vi điều khiển lập trình, làm việc theo câu lệnh, nó dùng số linh kiện ngoại vi rất ít. Ở đây trên chân 18, 19 gắn thạch anh định tần, nếu dùng thạch anh có tần số 12MHz thì chu kỳ thực hiện 1 lệnh sẽ là 1us. Chân số 9 cho nối với mạch reset, nó xác lập trạng thái khởi đầu khi chân 9 ở mức áp cao. Cấp nguồn với chân 20 cho nối masse và chân 40 cho nối với mức nguồn +5V.

 

Ở đây có 2 chú ý:

 

* Trên cảng p0 Bạn nhớ dùng 8 điện trở treo áp.

* Trên chân 31 cho nối vào mức áp 5V để xác nhận là chỉ chạy chương trình của bộ nhớ tron.

 

 

 

Để dùng ic AT89C2051 (20 chân) cho công việc điều khiển của Bạn, Bạn chỉ cần ráp một mạch điện cơ bản như hình vẽ sau:

 

 

Giải thích mạch điện: Hình vẽ cho thấy, với ic vi điều khiển lập trình, làm việc theo câu lệnh, nó dùng số linh kiện ngoại vi rất ít. Ở đây trên chân 4, 5 gắn thạch anh định tần, nếu dùng thạch anh có tần số 12MHz thì chu kỳ thực hiện 1 lệnh sẽ là 1us. Chân số 1 cho nối với mạch reset, nó xác lập trạng thái khởi đầu khi chân 1 ở mức áp cao. Cấp nguồn với chân 10 cho nối masse và chân 20 cho nối với mức nguồn +5V.

 

Ở đây có 1 chú ý:

 

* Trên cảng p3 thiếu chân p3.6.

 

Điều Bạn cần nhớ là mọi thiết bị điều khiển đều sẽ được cho kết nối với các chân của các cảng của ic vi điều khiển và Bạn điều khiển các thiết bị này bằng các câu lệnh do Bạn viết ra. Mọi việc chỉ có thể.

 

Chú ý: Nếu như mạch điện AT89C51 mà Bạn ráp không hoạt động như ý, Bạn hãy đo thử tín hiệu xung nhịp. Cách đo: lấy máy đo volt AC, nhớ cắm lổ OUT, trên lổ cắm này có tụ cách ly DC, rồi đo volt AC trên chân 18, nếu kim không lên là ic có vấn đề (thay thạch anh hay thay thử ic khác). Kim lên là có xung nhịp ( Bạn xem hình).

 

 

 

 

Câu lệnh được viết như thế nào?

 

Câu lệnh là các câu chữ dễ hiểu dễ nhớ, nhưng phải viết đúng cú pháp. Một file .asm thường có dạng thức như sau:

 

org 0000h

     (gõ các câu lệnh, mỗi dòng chỉ gõ một câu lệnh...)

end

 

 

Trên mỗi dòng Bạn chỉ gõ có một câu lệnh duy nhất mà thôi. Khi chương trình chạy xong một câu lệnh sẽ xuống dòng thực hiện câu lệnh kế tiếp và cứ như vậy cho đến hết... Nếu nó gặp lệnh nhẩy thì sẽ nhẩy đến tên nhãn để chạy các chương trình con.

 

Một thí dụ: Bạn gõ các câu lệnh để 8 Led trên cảng p2 sáng lan lên rồi tắt dần xuống và qui trình trên được cho lập lại.

 

 

Chương trình nguồn sẽ gõ như sau:

 

org 0000h

start:

     mov p2, #11111111b

     call delay

     mov p2, #11111110b

     call delay

     mov p2, #11111100b

     call delay

     mov p2, #11111000b

     call delay

     mov p2, #11110000b

     call delay

     mov p2, #11100000b

     call delay

     mov p2, #11000000b

     call delay

     mov p2, #10000000b

     call delay

     mov p2, #00000000b

     call delay

     mov p2, #10000000b

     call delay

      mov p2, #11000000b

     call delay

      mov p2, #11100000b

     call delay

      mov p2, #11110000b

     call delay

      mov p2, #11111000b

     call delay

      mov p2, #11111100b

     call delay

      mov p2, #11111110b

     call delay

       jmp start

delay:    

      mov r7, #20

v6: mov r6, #50

v5: mov r5, #200

      djnz r5, $

      djnz r6, v5

      djnz r7, v6

      ret

end

 

Sau khi dịch ra mã 16, chúng ta có file .hex với nội dung như sau:

 

:1000000075A0FF12006275A0FE12006275A0FC12BE
:10001000006275A0F812006275A0F012006275A06F
:10002000E012006275A0C012006275A0801200622A
:1000300075A00012006275A08012006275A0C01247
:10004000006275A0E012006275A0F012006275A057
:10005000F812006275A0FC12006275A0FE12006228
:0F006000809E7F147E327DC8DDFEDEFADFF62241
:00000001FF

 

 

Bạn cho nạp các mã lệnh dạng 16 này vào bộ nhớ EEP-ROM của ic vi điều khiển AT89C51, và cấp điện cho mạch, Bạn thấy gì? 8 Led trên cảng p2 sẽ có biến đổi như hình sau:

 

 

 

Giải thích từng câu lệnh trong file nguồn trên:

 

org 0000h    ; Khởi đầu từ thanh ghi reset.

start:             ; tên nhãn được dùng cho lệnh nhảy.

     mov p2, #11111111b    ; đặt 8 bit của p2 đều ở mức volt cao, nên 8 Led đều tắt.

     call delay                         ; cho gọi chương trình con dùng làm trễ, có tên nhãn là delay.

     mov p2, #11111110b    ; cho Led trên chân p2.0 sáng, (nó sáng với bit 0, tức mức volt thấp)

     call delay                         ; cho gọi chương trình con dùng làm trễ, có tên nhãn là delay.

     mov p2, #11111100b    ; cho Led trên chân p2.0, p2.1 sáng

     call delay                         ; cho gọi chương trình con dùng làm trễ, có tên nhãn là delay.

     mov p2, #11111000b    ; cho Led trên chân p2.0, p2.1, p2.2 sáng

     call delay                         ; cho gọi chương trình con dùng làm trễ, có tên nhãn là delay.

     mov p2, #11110000b   ; cho Led trên chân p2.0, p2.1, p2.2, p2.3 sáng

     call delay                         ; cho gọi chương trình con dùng làm trễ, có tên nhãn là delay.

     mov p2, #11100000b    ; cho Led trên chân p2.0, p2.1, p2.2 , p2.3, p2.4 sáng

     call delay                         ; cho gọi chương trình con dùng làm trễ, có tên nhãn là delay.

     mov p2, #11000000b    ; cho Led trên chân p2.0, p2.1, p2.2 , p2.3, p2.4, p2.5 sáng

     call delay                         ; cho gọi chương trình con dùng làm trễ, có tên nhãn là delay.

     mov p2, #10000000b    ; cho Led trên chân p2.0, p2.1, p2.2 , p2.3, p2.4, p2.5, p2.6 sáng

     call delay                         ; cho gọi chương trình con dùng làm trễ, có tên nhãn là delay.

     mov p2, #00000000b    ; cho 8 Led sáng hết.

     call delay                         ; cho gọi chương trình con dùng làm trễ, có tên nhãn là delay.

     mov p2, #10000000b    ; cho Led p2.7 tắt (tắt với bit 1, tức mức volt cao)

     call delay                         ; cho gọi chương trình con dùng làm trễ, có tên nhãn là delay.

      mov p2, #11000000b    ; cho Led p2.7, p2,6  tắt

     call delay                         ; cho gọi chương trình con dùng làm trễ, có tên nhãn là delay.

      mov p2, #11100000b    ; cho Led p2.7, p2,6, p2.5  tắt

     call delay                         ; cho gọi chương trình con dùng làm trễ, có tên nhãn là delay.

      mov p2, #11110000b     ; cho Led p2.7, p2,6, p2.5, p2.4  tắt

     call delay                         ; cho gọi chương trình con dùng làm trễ, có tên nhãn là delay.

      mov p2, #11111000b     ; cho Led p2.7, p2,6, p2.5, p2.4, p2.3  tắt

     call delay                         ; cho gọi chương trình con dùng làm trễ, có tên nhãn là delay.

      mov p2, #11111100b     ; cho Led p2.7, p2,6, p2.5, p2.4, p2.3, p2.2  tắt

     call delay                         ; cho gọi chương trình con dùng làm trễ, có tên nhãn là delay.

      mov p2, #11111110b     cho Led p2.7, p2,6, p2.5, p2.4, p2.3, p2.2, p2.1  tắt

     call delay                         ; cho gọi chương trình con dùng làm trễ, có tên nhãn là delay.

       jmp start                          ; nhẩy không điều kiện về tên nhãn start, tức cho bắt đầu lại.

delay:       ; tên nhãn dùng cho lệnh nhẩy, ở đây chúng ta dùng lệnh call.

      mov r7, #20       ; nạp trị thập phân 20 cho thanh ghi r7.

v6: mov r6, #50       ; nạp trị thập phân 50 cho thanh ghi r6.

v5: mov r5, #200     ; nạp trị thập phân 200 cho thanh ghi r5.

      djnz r5, $            ; cho trị có trong r5, giảm theo bước -1, chờ cho đến khi bằng 0.

      djnz r6, v5          ; cho trị trong r6 giảm theo bước -1, nếu chưa bằng 0, nhẩy đến v5.

      djnz r7, v6          ; cho trị trong r7 giảm theo bước -1, nếu chưa bằng 0, nhẩy đến v6.

      ret                       ; quay lại thực hiện dòng lệnh sau lệnh gọi call.

end                           ; dừng chương trình biên dịch tại đây.

 

 

Tôi nghĩ nếu chịu khó đọc đến đây chắc Bạn cũng hiểu được phần nào cách dùng ic vi điều khiển AT89C51 và Bạn sẽ hỏi với AT89C51, chúng ta có các câu lệnh nào? Ý nghĩ của các câu lệnh ra sao? và cách dùng của từng câu lệnh?

 

 

Sau đây chúng ta sẽ lần lượt tìm hiểu các câu lệnh thường dùng trong nhóm 254 câu lệnh của AT89C51. Các câu lệnh chia ra làm 5 nhóm.

 

 

Nhóm 1: Các câu lệnh liên quan đến số học:

 

 

 

NHóm 2: Các câu lệnh liên quan đến logic:

 

 

 

 

Nhóm 3: Các câu lệnh liên quan đến chuyển dữ liệu:

 

 

 

 

Nhóm 4: Các câu lệnh liên quan đến biến Bun (Boolean):

 

 

 

Nhóm 5: Các câu lệnh liên quan đến nhẩy:

 

 

  

Trên đây là các câu lệnh được dùng để viết các chương trình nguồn cho ic vi điều khiển AT89C51. Mỗi câu lệnh tương ứng với mã Code 16  ghi ở đầu dòng (khi nạp vào ic luôn sẽ dùng mã nhị phân). Bạn hãy dùng các câu lệnh này để viết chương trình theo ý tưởng riêng của Bạn, cho đổi ra mã nhị phân và dùng hộp nạp, nạp các dòng mã này vào nằm trong bộ nhớ EEP-ROM của ic vi điều khiển AT89C51 là xong.

 

Giải thích bằng một thí dụ:

 

org 0000h

     mov p1, #11110000b

     mov r7, #100

     mov a, #0ffh

     mov a, r7

end

 

Sau khi cho dịch đoạn chương trình trên ra mã Code 16, Bạn có kết quả như sau:

 

:080000007590F07F6474FFEFBE
:00000001FF

 

Nhìn vào các đoạn mã (viết theo hệ 16) này Bạn sẽ thấy:

 

:08000000---7590F0---7F64---74FF---EFBE
:00000001FF


:08000000 (mã địa chỉ)

 

7590F0  được hiểu như sau:

(mov data addr, #data, cần 3 byte),

Con số 75 là lệnh mov (trị địa chỉ), số 90h là trị địa chỉ của cảng p1 và số F0 là trị của 11110000b 

 

7F64 được hiểu như sau:

(mov r7, #data, cần 2 byte)

Con số 7F là lệnh mov r7, #data, con số 64h là trị hệ 16 của con số 100 (trị thập phân).

 

74FF được hiểu như sau:

(mov a, #data, cần 2 byte)

Con số 74 là lệnh mov a, #data, con số FFh là trị hằng.

 

EFBE được hiểu như sau:

(mov a, r7, chỉ cần 1 byte)

Con số EFBE là mã của lệnh: mov a, r7.


:00000001FF Đoạn kết thúc.

 

 

Qua thí dụ trên Bạn thấy mỗi câu lệnh nó có mã Code riêng của nó, trình biên dịch sẽ dịch các câu lệnh này ra dạng mã tương ứng. Nói chung Bạn cũng không cần để ý đến các mã Code của câu lệnh làm gì, Bạn hãy học cách dùng các câu lệnh trên để viết ra các chương trình nguồn cho đúng với ý tưởng của Bạn là được. Cách viết các câu lệnh rất đơn giản, cứ theo đúng cú pháp mà gõ, mỗi lệnh trên một dòng, các chú thích nếu có phải đặt sau dấu ";". Với trị có thể dùng số hệ thập lục phân (hệ đếm 16), hay hệ thập phân, hay hệ nhị phân đều được.

 

Ghi nhận của chúng tôi: Bạn không cần biết hết 254 lệnh, nhưng với các lệnh thường dùng thì phải hiểu cho thật rõ, cố gắng viết các chương trình nguồn ít tốn hao bộ nhớ, trình tự chương trình nên phân minh, dễ đọc, dễ thêm bớt, dễ sửa. Viết trước các đoạn chương trình con thường dùng để khi cần thì chỉ việc chọn và cắt dán vào chương trình đang soạn, làm vậy sẽ ít tốn thời gian và tránh được lỗi. Viết các chương trình nguồn, công việc nhìn giống như chơi cờ tướng, ai cũng chỉ có bấy nhiêu lệnh mà thôi, nhưng có người cao cờ giải quyết vấn đề theo cách khác, người thấp cờ thì giải quyết theo cách khác. Thời gian chơi nhiều, làm nhiều Bạn cũng sẽ trở thành cao thủ lập trình thôi.

 

 
 

Muốn làm thực hành với các ic vi điều khiển, cần gì?

 

 

Đó là câu hỏi nhiều Bạn thường hỏi tôi. Theo tôi, Bạn cần có các thứ sau đây:

 

(1) Một hộp nạp file mã lệnh (file có họ .hex) vào bộ nhớ của các ic vi điều khiển.

 

(2) Cần biết dùng một máy tính và nên tìm một phần mềm soạn thảo để gõ chương trình nguồn và nó làm được công việc biên dịch ra file mã (file có họ .hex).

 

(3) Một bo thực hành cơ bản với ic vi điều khiển AT89C51 và nhiều mạch điện ứng dụng ngoại vi.

 

 

 

Chúng ta sẽ thử nói đến các vấn đề này 

 

  

 Làm thực hành với bộ Kit lập trình đa năng

 

Giới thiệu bộ Kit thực hành với IC AT89C51. Hình chụp toàn phần cho thấy: Muốn tự học lập trình cho IC vi điều khiển AT89C51, tốt nhất Bạn vừa tìm hiểu câu lệnh vừa làm thực hành. Như vậy, Bạn hãy có trong tay bo thực hành đa năng này và một hộp nạp chương trình, dùng nạp file .hex vào bộ nhớ EEP-ROM trong ic vi điều khiển AT89C51. Trình tự làm thực hành thường như sau:

 

(1) Bạn tạo các kết nối giữa ic AT89C51 và các mạch điện chung quanh.

(2) Phát triển các ý tường và cụ thể hóa bằng cách viết ra file chương trình nguồn, với họ .asm.

(3) Dịch file nguồn có họ .asm ra file mã Code có họ là .hex

(4) Gắn ic AT89C51 vào bo thực hành, mở nguồn cấp điện để kiểm tra.

 

Bạn xem hình một bo thực hành ic AT89C51 hiện có bán ở cửa hàng Phúc Lan Shop.

 

 

 

Hình chụp và sơ đồ mạch điện cho thấy:

 

IC vi điều khiển AT89C51 cho gắn trên một chân cấm 40 pin. Chung quanh IC trên 4 cảng là các port 0, port 1, port 2, port 3, mỗi port đều có dùng thêm một IC logic 74245 dùng làm tầng khuếch đại tín hiệu trên các đường xuất nhập của các cảng.

 

Một khóa điện tắt mở nguồn dùng để cấp điện cho mạch, mạch chạy với đường nguồn 5V.

 

Một khóa SW (DIP 4: 1, 2, 3, 4) dùng định hướng cho tín hiệu đi vào hoặc đi ra qua các IC 74245. Bo có 3 nút nhấn, một nút Reset (Key 3), 2 nút nhấn đặt trên chân 15 (Key 1, P3.2/T1) và chân 14 (Key 2, P3.3/T0). Trên mạch còn dùng một tụ điện 0.047uF và điện trở 100K và nút nhấn Reset dùng để xác lập lại trạng thái khởi đầu cho IC vi điều khiển AT89C51.

 

Sơ đồ mạch điện bộ phận vi điều khiển trung ương với IC AT89C51 như hình sau:


Mạch dùng một thạch anh 12MHz (gắn trên chân 18, chân 19) để định tần cho mạch dao động tạo xung nhịp, do trong ic AT89C51 có mạch chia tần 1/12, vậy trong ic AT89C51 có xung nhịp chính có tần số 1MHz (hay có chu kỳ lệnh là 1us). Trong mạch dùng 2 tụ điện nhỏ 33pF để bù nhiệt ổn tần.


Trong mạch còn dùng 3 thanh điện trở RN6, RN5, RN4 để treo (Pull up) cho các cảng p3, p2, p0 lên mức áp cao. Trị số các điện trở trong thanh đều lấy 10K.

 

Ngoài ra trên mạch còn cho gắn nhiều chân cấm dạng 8 bit dùng để tạo kết nối giữa bộ phận điều khiển trung ương với các mạch điện ngoại vi khác.

 

Nguyên lý vận hành của mạch điện như sau: Ngay khi Bạn nhấn nút mở điện, Led chỉ thị trong mạch sẽ phát sáng, lúc này mạch đã được cấp điện và bắt đầu cho chạy các chương trình đã có trong bộ nhớ EEP-ROM. Bạn có thể kiểm tra tác động của các chương trình thông qua các kết nối với các dạng mạch Test (cùng có trên bo thực hành) thông qua các cảng, p0, p1, p2, p3 của IC vi điều khiển AT89C51. 

 

Ở bộ phận này, Bạn làm các phép đo kiểm tra như sau:

 

* Dùng Volt kế DC đo kiểm tra mức áp +5V trên các chân 40 của U8 (AT89C51), trên chân 20 của các IC00 (74245), IC11 (74245), IC33 (74245), IC22 (74245).

 

* Dùng Volt kế AC (đủ nhậy) để kiểm tra tín hiệu dạng Sin trên chân 18, 19 của U8 (AT89C51), nếu thấy kim lên là mạch dao động có chạy.

 

* Set các khóa điện S4 để chọn hướng đi của các tín hiệu qua các IC logic chọn đường 74245. Nếu cho chân 1 của các IC 74245 nối masse thì tín hiệu sẽ đi ra (từ IC AT89C51 đến các mạch bên ngoài) và nếu cho chân 1 lên mức áp cao thì hướng đi của tín hiệu sẽ đi từ ngoài vào IC AT8951.

 

 

 

Các mạch điện thực hành:

 


(1) Thực hành với 32 Led:

 

 

 

Hình chụp cho thấy: Trên Kit thực hành IC vi điều khiển AT89C51 có một dãy 32 Led, chia ra làm 4 nhóm, mỗi nhóm 8 Led. Tất cả các Led đều có chân cathode cho nối masse và ở mỗi Led đều có dùng điện trở hạn dòng 100 ohm.  Vậy các Led này sáng với mức áp cao.



Sơ đồ mạch điện cho thấy, Bạn có thể dùng bó dây 8 đường để kết nối các dãy Led với các cảng xuất nhập trên IC vi điều khiển AT89C51. Việc dùng Led để theo dõi trạng thái mức áp cao  (úng với bit 1)  và mức volt thấp (ứng với bit 0) trên các port của IC AT89C51 sẽ giúp cho chúng ta nhanh chóng biết được hoạt động của các chương trình đã nạp vào EEP-ROM  của AT89C51. Tên đặt cho các nhóm 8 Led là JP4, JP7, JP2 và JP3. Bạn hãy dùng bó dây cho nối các nhóm Led này vào các port của  AT89C51 và cho chạy thử các chương trình đã viết và đã nạp vào IC AT89C51. Hãy kiểm tra hoạt động của chương trình thông qua sự sáng tắt của các Led.

 

(2) Thực hành với các đèn số dùng Led 7 đoạn.

 

 

 

Bạn xem hình và sơ đồ mạch điện:

  

Hình chụp cho thấy trên bo Kit thực hành có gắn 8 bộ Led dùng làm các đèn hiện số theo dạng mã 7 đoạn (các đoạn đánh dấu a, b, c, d, e, f, g và dot). 

 

Ở đây đèn số 7 đoạn dùng loại Led có cực anode chung. Để làm hiện các con số trong dãy 8 đèn số này,  mạch dùng tính tắt mở của các transistor pnp (2SA564). Các chân a, b, c, d, e, f, dot, là các chân cathode của các Led trong đèn số 7 đoạn, các chân này cho nối vào một trạm nối 8 bit với các điện trở hạn dòng. Ở đây có 2 bộ kết nối JP5 (dùng lấy tín hiệu giải mã con số) và bộ kết nối JP16 (dùng cấp mã quét cấp cho chân B của 8 transistor 2SA1015).

 

Trong mạch, chân chung anode ( chân Common) của các đèn số 7 đoạn được cho nối vào chân C của các transistor pnp 2SA564, trên chân B của các transistor này có điện trở hạn dòng 10K cho nối vào bộ chân cấm JP16. Từ bộ chân cấm 8 dây này Bạn sẽ cho kết nối với một cảng của IC vi điều khiển AT89C51 để nhận xung quét (để mỗi lần chỉ cho hiện một con số).

 

Các chân cấp dòng cho các cathode (a, b, c, d, e, f, dot) cho nối với bộ chân cấm JP5 qua các điện trở hạn dòng 220 ohm. Bộ chân cấm này cũng sẽ cho nối với một cảng (tùy chọn) trên IC vi điều khiển AT89C51 để cấp dòng cho các Led trong các đèn số để phát sáng.

 

 

(3) Thực hành với Led ma trận 8x8.

 

 

 

Bạn xem hình và sơ đồ mạch điện:

 

Ở đây dùng bảng ma trận Led 8x8 (trên bảng Led có 64 Led đỏ và 64 Led xanh) dùng để cho hiện ra các hình ảnh và con chữ và số. Vậy trên bảng ma trận này Bạn có thể tạo ra các hình ảnh tùy ý bằng các điểm sáng tắt của các Led (Led đỏ cho hình màu đỏ, Led xanh cho hình màu xanh và phối hợp Led đỏ, Led xanh sẽ có hình màu vàng).

 

Để tăng độ ổn định và độ sáng, trên mạch dùng thêm các ic khuếch đại ULN2803A. Trong ic ULN2803 là 8 mạch khuếch đại với các cặp transistor ráp theo kiểu darlington, nên ngả vào có trở kháng rất lớn và không gây nặng tải lên các đường ra trên các chân của các cảng, mạch khuếch đại còn dùng các diode hạn biên và diode ghim áp để tăng độ an toàn.


 

Nguyên lý làm việc của bảng đèn ma trận 8x8 như sau:

 

Khi chân số 24 cho xuống mức áp thấp thì lúc này cathode của 8 Led đỏ ở cột 1 sẽ cho nối masse, lúc này 8 bit cho ra trên 8 chân 22, 19, 16, 13, 3, 6, 9, 12 sẽ xác định trạng thái sáng tắt của 8 Led đỏ ở cột 1.

 

Khi chân số 23 cho xuống mức áp thấp thì lúc này cathode của 8 Led xanh ở cột 1 sẽ cho nối masse, lúc này 8 bit cho ra trên 8 chân 22, 19, 16, 13, 3, 6, 9, 12 sẽ xác định trạng thái sáng tắt của 8 Led xanh ở cột 1. 

 

Khi chân số 22 cho xuống mức áp thấp thì lúc này cathode của 8 Led đỏ ở cột 2 sẽ cho nối masse, lúc này 8 bit cho ra trên 8 chân 22, 19, 16, 13, 3, 6, 9, 12 sẽ xác định trạng thái sáng tắt của 8 Led đỏ ở cột 2.

 

Khi chân số 20 cho xuống mức áp thấp thì lúc này cathode của 8 Led xanh ở cột 2 sẽ cho nối masse, lúc này 8 bit cho ra trên 8 chân 22, 19, 16, 13, 3, 6, 9, 12 sẽ xác định trạng thái sáng tắt của 8 Led xanh ở cột 2. 

 

Khi chân số 18 cho xuống mức áp thấp thì lúc này cathode của 8 Led đỏ ở cột 3 sẽ cho nối masse, lúc này 8 bit cho ra trên 8 chân 22, 19, 16, 13, 3, 6, 9, 12 sẽ xác định trạng thái sáng tắt của 8 Led đỏ ở cột 3.


Khi chân số 17 cho xuống mức áp thấp thì lúc này cathode của 8 Led xanh ở cột 3 sẽ cho nối masse, lúc này 8 bit cho ra trên 8 chân 22, 19, 16, 13, 3, 6, 9, 12 sẽ xác định trạng thái sáng tắt của 8 Led xanh ở cột 3. 

 

Khi chân số 16 cho xuống mức áp thấp thì lúc này cathode của 8 Led đỏ ở cột 4 sẽ cho nối masse, lúc này 8 bit cho ra trên 8 chân 22, 19, 16, 13, 3, 6, 9, 12 sẽ xác đinh trạng thái sáng tắt của 8 Led đỏ ở cột 4.

 

Khi chân số 15 cho xuống mức áp thấp thì lúc này cathode của 8 Led xanh ở cột 4 sẽ cho nối masse, lúc này 8 bit cho ra trên 8 chân 22, 19, 16, 13, 3, 6, 9, 12 sẽ xác định trạng thái sáng tắt của 8 Led xanh ở cột 4. 

 

Khi chân số 1 cho xuống mức áp thấp thì lúc này cathode của 8 Led đỏ ở cột 5 sẽ cho nối masse, lúc này 8 bit cho ra trên 8 chân 22, 19, 16, 13, 3, 6, 9, 12 sẽ xác định trạng thái sáng tắt của 8 Led đỏ ở cột 5.

 

Khi chân số 2 cho xuống mức áp thấp thì lúc này cathode của 8 Led xanh ở cột 5 sẽ cho nối masse, lúc này 8 bit cho ra trên 8 chân 22, 19, 16, 13, 3, 6, 9, 12 sẽ xác định trạng thái sáng tắt của 8 Led xanh ở cột 5.

 

Khi chân số 4 cho xuống mức áp thấp thì lúc này cathode của 8 Led đỏ ở cột 6 sẽ cho nối masse, lúc này 8 bit cho ra trên 8 chân 22, 19, 16, 13, 3, 6, 9, 12 sẽ xác định trạng thái sáng tắt của 8 Led đỏ ở cột 6.
 

Khi chân số 5 cho xuống mức áp thấp thì lúc này cathode của 8 Led xanh ở cột 6 sẽ cho nối masse, lúc này 8 bit cho ra trên 8 chân 22, 19, 16, 13, 3, 6, 9, 12 sẽ xác định trạng thái sáng tắt của 8 Led xanh ở cột 6.

Khi chân số 7 cho xuống mức áp thấp thì lúc này cathode của 8 Led đỏ ở cột 7 sẽ cho nối masse, lúc này 8 bit cho ra trên 8 chân 22, 19, 16, 13, 3, 6, 9, 12 sẽ xác định trạng thái sáng tắt của 8 Led đỏ ở cột 7.

 
Khi chân số 8 cho xuống mức áp thấp thì lúc này cathode của 8 Led xanh ở cột 7 sẽ cho nối masse, lúc này 8 bit cho ra trên 8 chân 22, 19, 16, 13, 3, 6, 9, 12 sẽ xác định trạng thái sáng tắt của 8 Led xanh ở cột 7.


Khi chân số 9 cho xuống mức áp thấp thì lúc này cathode của 8 Led đỏ ở cột 8 sẽ cho nối masse, lúc này 8 bit cho ra trên 8 chân 22, 19, 16, 13, 3, 6, 9, 12 sẽ xác định trạng thái sáng tắt của 8 Led đỏ ở cột 8.

 

Khi chân số 10 cho xuống mức áp thấp thì lúc này cathode của 8 Led xanh ở cột 8 sẽ cho nối masse, lúc này 8 bit cho ra trên 8 chân 22, 19, 16, 13, 3, 6, 9, 12 sẽ xác định trạng thái sáng tắt của 8 Led xanh ở cột 8.

 

 

  (4) Thực hành với bàn phím ma trận 4x4.

 

 

 

Trên bo test đặt 16 phím nhấn dùng ma trận 4x4, như vậy mạch dùng 8 dây. trong đó có 4 dây cho treo lên mức áp cao với một thanh điện trở. Sơ đồ mạch điện như hình vẽ:

 

mạch điện cho thấy, trên ma trận 4x4 có 16 phím nhấn. Ở đây Bạn có thể cho bộ kết nối J27 nối vào port 1. Bạn sẽ viết một chương trình để vận hành 16 phím này, Bạn có thể qui định một phím sẽ cho chạy một chương trình đã chọn định trước.

 

Bạn xem sơ đồ mạch điện:

 

Bạn dùng các đường trên các chân p1.0, p1.1, p1.2, p1.3 làm các hàng (row). Trong lập trình bàn phím, các hàng cho là ngả vào, vậy bình thường cho ở mức “0”. Dùng các chân p1.4, p1.5, p1.6 và p1.7 làm các cột (column). Trong lập trình bàn phím, các cột cho là ngả ra, vậy bình thường cho ở mức “1”.

 

Mã quét bàn phím sẽ cho tìm bit “0” trên các cột, chúng ta biết, khi có một phím nhấn xuống thì lúc này sẽ xuất hiện bit “0” trên các cột. Chương trình sẽ chuyển qua cho quét tìm phím nhấn, sau đó nhẩy đến chương trình con của phím và cho chạy chương trình này.

 

 

(5) Thực hành với khối biến đổi A/D.

 

 

Chúng ta biết, tín hiệu trong thế giới tự nhiên thường ở dạng analog (tín hiệu analog lấy mức volt để chỉ trạng thái khác nhau của tín hiệu), như nhiệt độ, sức gió, âm thanh…Trong khi đó, các ic vi điều khiển (cũng như các ic vi xử lý) chỉ làm việc với tín hiệu dạng số (digital, tín hiệu digital còn gọi là tín hiệu bit, nó lấy mức áp cao thấp để chỉ trạng thái khác nhau của tín hiệu). Bài thực hành này dùng chuyển đổi tín hiệu dạng analog (có trong thế giới tự nhiên) ra dạng digital (được dùng trong các mạch điện máy tính). Mạch  ADC dùng ic ADC0809.

 

Bạn xem sơ đồ mạch điện:



IC ADC0809 có 8 ngả vào trên các chân in0, in1, in2, in3, in4, in5, in6, in7. Việc xác định chân vào sẽ tùy theo cách đặt bit trên các chân a0, a1, a2.  Thí dụ: với a0=0, a1=0 và a2=0, Bạn đã chọn ngả vào là chân in0 (chân 26). Việc lấy mẫu chuyển mức áp dạng analog ở ngả vào ra dạng bit cho ra trên các chân d0, d1, d2, d3, d4, d5, d6, d7 (8 bit). Xung lấy mẫu đưa vào trên chân 10, nó được tạo ra với mạch dao động 7414 (IC05F), tần số xung lấy theo trị số R70 (1K) và tụ C4 (102), IC05E làm chức năng khuếch đại trigger. mức áp chuẩn dùng xác định độ phân giải sẽ tùy theo điện áp DC đưa vào trên chân 12 (+Reference) và trên chân 16 (-Reference).

 

Chân 22 (ALE, address latch enable) dùng chốt dữ liệu trong thanh ghi.

Chân 6 (Start) cho bắt đầu lấy mẫu.

Chân 7 (EOC, end of conversion), tín hiệu báo kết thúc qui trình chuyển đổi.

Chân 9 (OE, output enable), cho xuất dữ liệu 8 bit ra.

 

(6) Thực hành với khối biến đổi D/A.

 

 

Chúng ta biết các tín hiệu làm việc trong các ic vi điều khiển, vi xử lý đều để ở dạng bit, nghĩa là tín hiệu chỉ xác lập theo mức áp cao hay thấp, tín hiệu này được gọi là tín hiệu dạng digital. Trong khi đó, trong thế giới thật, chúng ta thường làm việc với các tín hiệu dạng analog. Do vậy, muốn sử dụng được các tín hiệu có trong các máy tính, chúng ta phải dùng mạch biến đổi tín hiệu, đổi dạng digital ra dạng analog. Ở đây, mạch thực hành gọi là mạch Analog output. Bạn xem sơ đồ mạch điện:



Mạch dùng ic DAC0808. Tín hiệu vào dạng digital trên các chân a1, a2, a3, a4, a5, a6, a7, a8. Tín hiệu này sau khi chuyển xong sẽ cho ra trên hai đường. Đường 4 (IOUT) và đường 2 (IOUT đảo). Tín hiệu ra trên chân 4 cho qua một tầng khuếch đại op-amp với ic LM741, sau cùng tín hiệu dạng analog sẽ cho ra trên chân 6 của LM741.

 

Mức áp chuẩn (Voltage reference) đưa vào trên chân 14 (Vr+) và chân 15 (Vr-). Chân số 16 mắc tụ bù 0.1uf. Loại mạch này cần nguồn nuôi hai dấu. V+ trên chân 13 và V- trên chân 3, Bạn cho cấp điện "5V trên chân cắm J32 và J31. Với ic LM741, Bạn cấp nguồn "5V trên chân JP29.

 

(7) Thực hành với khối khuếch đại đệm với ULN2803A.

 

 

 

Trên bo thực hành có trang bị mạch khuếch đại đệm dùng tăng công suất tín hiệu kết nối. Sơ đồ mạch điện như hình vẽ (Bạn xem hình chụp mạch khuếch đại đệm trên bo thực hành). 

 

 

IC ULN2803A dùng khuếch đại tín hiệu ra cho các port của ic vi điều khiển AT89c51. 

 

Sơ đồ đẳng hiệu của một tầng khuếch đại trong ic ULN2803Acho thấy: mạch dùng 2 transistor npn, ghép dạng phức hợp (còn gọi là ghép darlington). Tín hiệu lấy ra trên chân C của Q2, và chân C để hở nên ngả ra của tầng khuếch đại này có thể cho kết hợp với các loại tải Volt cao, như  relay 12V, motor  DC12V…người ta dùng các diode zener để ghim mức áp ngả vào, ngả ra. Các điện trở trên chân B-E có công dụng làm tăng độ ổn định nhiệt. Điện trở 2.7K dùng hạn dòng cho chân B, diode nối vào đường nguồn Vcc có tác dụng hạn biên, giữ cho mức áp trên chân C không lên cao hơn mức áp của nguồn.

 

 

Giới thiệu một phần mềm soạn thảo để gõ chương trình nguồn

và biên dịch file .asm ra file mã (file có họ .hex).

 

Sau khi đã có bo thực hành (Xem phần trình bày trên), bây giờ Bạn phải làm quen với một phần mềm dùng soạn các chương trình nguồn, các file này lấy họ là .asm. Ở đây, chúng tôi giới thiệu Bạn dùng phần mềm miễm phí MIDE-51. Tiêu hình của MIDE-51 như hình sau.

 

 

 

Khi kích chuột trên tiêu hình này, nó mở ra một giao diện như hình sau:

 

 

 

Bây giờ Bạn sẽ gõ hay dán các câu lệnh vào vùng soạn thảo của nó. Tôi làm một thí dụ: Tôi sẽ cắt một chương trình đã có và cho dán vào MIDE-51 rồi cho chép lại với một tên file lấy họ là .asm và sau đó cho dịch file nguồn ra file mã 16 với họ là .hex.

 

Chúng ta thử soạn một chương trình nguồn đơn giản, làm công việc tắt mở 8 Led trên cảng p1. Chương trình nguồn sẽ được viết như sau:

 


org 0000h

start:

      mov p1, #00000000b

      call delay

      mov p1, #11111111b

      call delay

      jmp start

delay:    

      mov r7, #20

v6: mov r6, #50

v5: mov r5, #200

      djnz r5, $

      djnz r6, v5

      djnz r7, v6

      ret

end

 

 

 

Đoạn chương trình nguồn trên đã được gõ trong vùng soạn thảo của MIDE-51 và nó được chép lại với tên file là thi-du-1.asm

 

 

 

 

Khi gõ xong, Bạn mở cửa sổ Build và chọn mục Build (hay lúc nào cần biên dịch thì gõ phím nóng F9) chương trình nguồn thi-du-1.asm sẽ được biên dịch ra file mã Code.

 

 

 

 

MIDE-51 dịch xong và báo không thầy lỗi. Bạn xem câu báo ở phần dưới "no errors". Lúc này trên thư mục của file thi-du-1.asm đã có file thi-du-1.hex. Đó chính là file mã Code của chương trình nguồn trên.

 

 

 

File thi-du-1.hex có nội dung như sau:

 

:1000000075900012000E7590FF12000E80F27F14A2
:0B0010007E327DC8DDFEDEFADFF62246
:00000001FF

 

 

Phân tích file mã Code thi-du-1.hex, Bạn sẽ thấy:

 

:10000000---759000---12000E---7590FF---12000E---80F2 ---7F14---A2
:0B001000---7E32---
7DC8---DDFE---DEFA---DFF6---22---46
:00000001FF

 

 

org 0000h

start:

      mov p1, #00000000b         Có mã Colde là: 759000

      call delay                              Có mã Colde là: 12000E

      mov p1, #11111111b         Có mã Colde là:  7590FF

      call delay                               Có mã Colde là: 12000E

      jmp start                                Có mã Colde là:  80F2

delay:     

      mov r7, #20                          Có mã Colde là:  7F14

v6: mov r6, #50                          Có mã Colde là:  7E32

v5: mov r5, #200                        Có mã Colde là:  7DC8

      djnz r5, $                               Có mã Colde là:  DDFE

      djnz r6, v5                             Có mã Colde là:  DEFA

      djnz r7, v6                             Có mã Colde là:  DFF6

      ret                                          Có mã Colde là:  22

end

 

Nếu Bạn xem các câu lệnh ở phần phụ lục, Bạn sẽ thấy phần số ghi đậm trên chính là mã Code của các câu lệnh mà Bạn đã gõ trong chương trình nguồn. Các mã Code (dạng mã 16) này sẽ được cho đổi ra dạng nhị phân và rồi sẽ cho nạp vào bộ nhớ EEP-ROM của ic vi điều khiển AT89C51. Làm đến đây xem như công việc đã hoàn tất, Bạn gắn ic AT89C51 vào bo thực hành để thử, Bạn sẽ thấy 8 Led trên cảng p1 sẽ nhấp nháy (như hình).

 

 

 

 

Dùng lệnh mov p1, #data, Bạn có thể điều khiển 8 Led trên port 1 sáng theo ý của Bạn. Bạn xem tác dụng của lệnh move trên cảng p1 như hình sau:

 

 

 

Dùng lệnh quay trái: rl a (Rotate Left a), kết quả cho chuyển ra cảng p1.

 

 

 

 Đến đây, chúng ta đã có thể viết các chương trình nguồn phức tạp hơn...Phải không?

 

 

Vấn đề hộp nạp các mã Code vào bộ nhớ EEP-ROM của các ic vi điều khiển Bạn vào đọc bài:

 

Giới thiệu cách dùng hộp nạp ic vi điều khiển TOP853

 

 

 

Bạn muốn dùng các câu lệnh để điều khiển các thiết bị tự động, các bảng đèn quảng cáo, hay các robot...Trước hết Bạn hãy viết ra các câu lệnh rồi cho chuyển đổi ra dạng mã và bây giờ dùng hộp nạp TOP853 để nạp các câu lệnh này vào bộ nhớ EEPROM. Sau khi đã làm xong các công việc trên, xem như Bạn đã có một ic luôn trung thành với các sai bảo của Bạn. Thích không? Hãy vào đọc bài này để biết cách làm nhé....(Click vào đây để xem)

 

 

 

(Bạn đón đọc trong các bài tiếp theo, chúng tôi sẽ trình bày các ứng dụng thực tế hơn với ic vi điều kiển AT89C51)

 

 

 

Chuyện còn dàiBạn nhớ vào xem...

 

 

 

   

Phụ lục:

 

 

Cú pháp để viết 254 câu lệnh được liệt kê ra trong các bảng sau


(theo trình tự mã Code):

 

 

 

 

 

 

 

 

 

 

 

 

Chủ đề liên quan
  1 2 3 4 5 6 7 8 9 10  ...