Mua bán máy hàn điện tử chất lượng tại Nha trang và sửa máy hàn điện tử ở Nha trang, sửa chữa máy hàn điên tử CO2 MIG MAG, TIG, Plasma tại khánh hòa, sửa chữa máy hàn điên tử CO2 MIG MAG, TIG, Plasma ở khánh hòa, mua máy hàn điên tử cũ CO2 MIG MAG, TIG, Plasma ở khánh hòa.Sửa đồ điện gia dụng tận nhà ở khánh hòa, | Kỹ thuật Khánh Hoà #congnghieptudong, #chiasehuuich, #chiasekinhnghiem, #dientu, #daihoc, #caodang, #trungcap, #hocnghedien, #meovathay, #meovat, #diencongnghiep, #tudonghoa,

Showing posts with label AT89C51. Show all posts
Showing posts with label AT89C51. Show all posts

Saturday, May 3, 2014

Những bài lập trình vi điều khiển 8051 - Kỹ thuật khánh hòa

Đây là 1 số bài lập trình vi điều khiển từ dễ đến khó.Mọi người có gắng.

DOWNLOAD:

Share:

Ứng dụng: Thiết kế quang báo cho các bóng đèn công suất lớn dùng 8951


Trong các công viên lớn hay trong các hội chợ triển lãm ngoài trời, hội hoa xuân, nhà hàng bên bờ sông hay bến tàu…Các nơi này không thể thiếu các dãy đèn màu nhấp nháy, làm tăng vẽ mỹ lệ hấp dẫn cho khách đến dạo chơi. Trước đây các dãy đèn này được điều khiển bởi các khóa điện lá kim, đặt nằm chung quanh các đĩa lồi lõm, nó được đóng mở theo các bánh cam kéo quay bởi một motor AC, chổ lồi sẽ có tác dụng đóng mạch làm sáng đèn và chổ lõm sẽ có tác dụng làm hở mạch để tắt đèn. Cách điều khiển cơ học này có nhiều khuyết điểm, do có ma sát nên độ bền kém, thay đổi chậm, ít kiểu nhấp nháy, phát ra tia lữa tạo xung nhiễu mạnh,…Ngày nay, người thợ điện tử nào cũng đều biết có thể dùng TRIAC làm khóa điện bán dẫn đóng mở các dãy đèn vài ngàn Watt một cách nhẹ nhàng, do không dùng nguyên lý cơ học nên độ bền cao, gọn nhẹ, không phát tia lữa điện nên ít gây nhiễu vô tuyến, và có thể tạo nhịp tắt mở nhanh hơn quán tính của đèn. Hiện nay trên thị trường cũng đã có bán hộp điều khiển 6 dãy đèn bóng 220V dùng 6 TRIAC với quy trình điều khiển tắt mở dùng một vài ic logic dời bit họ 74xx. Kiểu mạch này còn đơn điệu, có kiểu dáng nhấp nháy không đa dạng. Cách hay nhất là chúng ta dùng một ic lập trình như AT89C51, hay ít chân hơn với AT89C2051 đề lập trình, tạo ra nhiều nhiều kiểu dáng nhấp nháy lạ mắt, cấu trúc mạch không những còn gọn hơn, mà còn ít tốn kém hơn nữa, dễ thay đổi chương trình, dễ bảo trì. Ở đây, tôi ngồi nhớ lại các kinh nghiệm đã làm và sẽ viết lại các cách thức dùng ic lập trình AT89C51, cho kết hợp với nhiều TRIAC để làm các dãy đèn màu trang trí cho các hội hoa xuân, cho xe hoa, cho các công viên lớn và nhất là cho các cuộc triển lãm được tổ chức ở ngoài trời. Tôi nghĩ bài viết sẽ có ích với các Bạn thợ điện tử có làm thêm công việc trang trí đèn quảng cáo.
Trước hết hãy nói đến cách tạo ra các dãy đèn màu
1. Tìm hiểu tác dụng đóng mở của transistor và SCR
Hình vẽ cho thấy chúng ta dùng các transistor NPN và PNP làm các khóa điện đóng mở dòng cấp cho bóng đèn bằng mức volt cao thấp đặt trên chân B.
Trong mạch: Với transistor NPN, bóng đèn đặt trên chân C, transistor sẽ dẫn điện khi chân B được cấp mức volt cao, cao hơn chân B. Với transistor PNP thì transistor sẽ dẫn điện khi mức volt chân B xuống thấp, thấp hơn chân E. Transistor chỉ là loại khóa điện đơn hướng, dòng qua tải chỉ chảy theo một chiều, transistor là khóa điện không có tính tự giữ, sự tắt mở của bóng đèn trên chân C thay đổi theo mức volt thấp cao trên chân B.
Chúng ta xem các transistor loại hai mối nối BJT có cấu trúc tương đương với 2 diode, Bạn xem hình, do vậy đo kiểm tra các transistor là đo kiểm tra tính thuận nghịch của 2 diode. Nếu cả 2 diode đều tốt là transistor tốt.
SCR cũng là một khóa điện bán dẫn đóng mở theo mức áp trên cực cổng Gate, và SCR cũng là một khóa điện đơn hướng nhưng có tính tự giữ. Người ta có thể dùng 2 transistor hỗ bổ ráp đẳng hiệu như một SCR.
Hình vẽ cho thấy, cách dùng 2 transistor ráp thành một SCR, Bạn thấy dòng IB của Q2 sẽ là dòng IC của Q1 và dòng IB của Q1 là dòng IC của Q2. Nên khi Q2 ngưng dẫn, nó không cấp dòng IB cho Q1, và khi Q1 ngưng dẫn nói cũng sẽ không cấp dòng IB cho Q2. Điều này cho thấy khi Q2 tắt, Q1 cũng tắt và khi Q2 dẫn thì Q1 cũng dẫn, do vậy nó có thể dùng như một khóa điện đơn hướng có tính tự giữ như SCR.
Nguyên lý làm việc của SCR như sau:
Hình vẽ cho thấy, khi cực cổng (tức chân B của Q2) không được cấp mức volt mòi, áp dương, Q2 tắt thì Q1 cũng tắt và đèn LP1 không sáng. Nếu cực cổng được cấp mức áp dương, Q2 sẽ dẫn điện, dòng IC của Q2 lại chính là dòng IB của Q1, Q1 dẫn sẽ cấp lại dòng IB cho Q2 và giữ cho Q2 luôn ở trạng thái bão hòa dù cho lúc này không còn mức áp mòi trên chân B của Q2 nữa. Q3 cũng có cách làm việc tương tự.
Trong mạch, các điện trở R1, R2 (10K) duǹg để tăng độ ổn định nhiệt. Chúng at cũng có thể lấy chân B của transistor Q1 làm cực cổng, tuy nhiên cực cổng này ḱch chạy với mức volt thấp. Tóm lại khi đèn đã sáng thì nó sẽ luôn sáng do tính tự giữ. Muốn tắt đèn chúng ta phải làm tắt SCR, như cho ngắt nguồn hay cho nốt tắt ngang SCR.
Cách đo kiểm tra các SCR: Bạn dùng một Ohm kế, lấy thang đo Rx1 để có dòng chảy trên dây đo lớn. Khi đặt dây đỏ trên chân K (cho bơm dòng vào chân K) và dây đen trên chân Anode (cho hút dòng ra trên chân A), kim sẽ không lên vì không có dòng chảy qua SCR. Bây giờ “tìm cách” cho chân cổng G chạm nhẹ vào chân Anode, kim sẽ lên, SCR đã vào trạng thái dẫn điện, và lúc này cho bỏ chân cổng ra khỏi chân Anode, kim vẫn tiếp tục lên, do khi SCR đã dẫn điện nó có tính tự giữ nên tiếp tục dẫn điện.
Tôi dùng 4 hình ghép lại tạo hình động trên, dùng hình này để Bạn thấy hoạt động của các SCR khác với các transistor. Hình động này có 4 trình tự:
Trình tự 1: Khi S1 đóng kín, và S2 ở mức áp thấp 0V, lúc này transistor Q1 tắt và SCR Q2 cũng tắt nên các đèn LP1, LP2 đều không sáng.
Trình tự 2: Khi S1 đóng kín, S2 chuyển lên mức áp cao, lúc này chân B của transistor Q1 có phân cực, Q1 dẫn đèn LP1 sáng, lúc này cực cổng của SCR Q2 được cấp mức áp mòi, Q2 dẫn và đèn LP2 sáng.
Trình tự 3: Khi S1 đóng kín, S2 trở lại mức áp thấp 0V, lúc này chân B của Q1 mất áp phân cực, Q1 tắt và đèn LP1 tắt. Chân cổng của SCR Q2 cũng mất mức áp mòi, nhưng do có tính tự giữ nên Q2 vẫn ở trạng thái dẫn điện, và đèn LP2 vẫn sáng.
Trình tự 4: Lúc này S1 cho hở mạch, S2 ở mức áp thấp, và khi S1 trở lại đóng kín mạch, lúc này cả Q1 và Q2 đều tắt nên cả LP1, LP2 đều không sáng.
2. Sự khác biệt giữa SCR và TRIAC
* Qua phần trên chúng ta thấy SCR là một khóa điện bán dẫn, mở bằng mức áp mòi trên cực cổng và nó có tính tự giữ. Nhưng SCR là một khóa điện đơn hướng.
* TRIAC có cấu trúc tương đương như hai SCR ghép như hình vẽ, nên TRIAC cũng là khóa điện bán dẫn, cũng có tính tự giữ, nhưng TRIAC là khóa điện song hướng, hai chiều, dòng điện có thể chảy qua TRIAC theo cả hai chiều.


Cách đo kiểm tra TRIAC, cũng làm giống như cách đo của SCR, trong cách đo TRIAC, khi Bạn đảo chiều TRIAC, và cho kích cực cổng, nó cũng sẽ vào trạng thái dẫn điện, trong khi đó thì SCR lạ không dẫn điện.
Trong bước 1: Dây đen của Ohm kế trên chân MT2, dây đỏ trên chân MT1, kim không lên, cho chân Gate chạm nhẹ vào chân MT2, kim lên, lúc này để hở chân Gate kim vẫn lên vì có tính tự giữ.
Trong bước 2: Đảo ngược TRIAC, dây đỏ của Ohm kế trên chân MT2, dây đen trên chân MT1, cho chân Gate chạm nhẹ vào chân MT1, kim lên, lúc này để hở chân gate kim vẫn lên vì có tính tự giữ.
TRIAC có 4 cách dùng, Bạn xem hình sau:

3. Dùng PSpice tìm hiểu nguyên lý làm việc của TRIAC:
Trong hình này, chúng ta dùng TRIAC 2N6342, trên chân MT2 cho gắn các dãy dây đèn, các đèn thường là các bóng 5W cho mắc song song và nối thẳng vào đường nguồn 220V. Vậy khi TRIAC dẫn điện nó sẽ cấp dòng cho các dãy đèn sáng. Mạch dùng các điện trở tụ điện R4 – C2 và R5 - C1 để tạo điện áp mòi cực cổng Gate để kích mở TRIAC. Tùy theo góc mở lớn hay nhỏ mà lượng điện cấp cho các dãy đèn nhiều hay ít, chúng ta điều chỉnh các điện trở trong mạch có thể làm thay đổi mức sáng của các dãy đèn. Để hiểu rõ loại mạch này hơn, chúng ta sẽ dùng đến phần mềm PSpice để phân tích mạch.
Trước hết trong trang vẽ của Capture CIS của OrCAD, chúng ta vào các thư viện của PSpice để lấy ra linh kiện và vẽ sơ đồ mạch điện như hình vẽ.
Điều khiển các dãy đèn màu với ic AT89C51
TRIAC và bit đóng mở của ic AT89C51. Sơ đồ mạch điện dùng một cảng của ic lập trình AT89C51 để điều khiển 8 dãy đèn màu.
Sơ đồ mạch điện cho thấy, chúng ta thiết kế một bộ với 8 dãy đèn dùng cho một cảng của ic lập trình AT89C51. Để tạo tính cách ly giữa bo điều khiển và bo đèn chúng ta dùng cách truyền tín hiệu qua opto, trên mỗi đường dùng một Led chỉ thị để xác định trạng thái làm việc của dãy đèn. Toàn phần ráp trên một bo mạch, nó có thể kết nối với các cảng của các ic lập trình, như AT89C2051, AT89C51…
Phân tích mạch:
Mạch điện cho thấy: Trên bo đèn do chúng ta dùng mạch kích thích ráp với các transistor pnp và npn nên phải ráp thêm một mạch nguồn nuôi nhỏ để có áp DC cấp nguồn cho các mạch điện này. Nguồn gồm một biến áp T1, dùng để hạ áp AC và dùng 4 diode nắn dòng để đổi dòng điện xoay chiều ra dạng dòng điện dạng xung một chiều, cho dòng điện nạp vào một tụ hóa lớn C16=2200µF để có mức áp DC ổn định. Ở đây đặt một Led chỉ thị và một điện trở hạn dòng R47=1K.
Mạch thúc với quang transistor có trong các opto ISO4, khi quang transistor bị chiếu sáng, nó sẽ dẫn điện, dòng điện chảy ra trên chân C, kích dẫn 1 transistor pnp Q10, trong mạch chúng ta hạn dòng chân B với điện trở R20=10K, cũng dùng điện trở R19=10K để tăng độ ổn định nhiệt. Khi transistor pnp Q10 dẫn điện, nó kích dẫn transistor npn Q11, và khi transistor Q11 dẫn điện, dòng điện chảy ra trên chân C sẽ làm sáng Led chỉ thị và cấp dòng cho cực cổng và kích dẫn TRIAC Q12, điện trở R23=100 dùng để hạn dòng cực cổng. Ở đây cũng dùng điện trở hạn dòng chân B với R22=2.2K và dùng điện trở R21=5.6K để tăng hệ số ổn định nhiệt.
Tóm lại, mạch làm việc như sau: Khi chân ra của một cảng xuất bit 0, mức áp thấp sẽ làm sáng Led trong opto, quang transistor bị kích thích, nó dẫn điện và kích dẫn các transistor pnp, npn và kích dẫn TRIAC, TRIAC cấp dòng làm sáng dãy đèn màu gắn trên chân MT2. Nếu ic lập trình xuất bit 1 với mức volt cao, sẽ không có dòng cấp cho Led trong opto, Led tắt, TRIAC không được cấp dòng kích thích ở cực cổng nó sẽ làm tắt dãy đèn màu trên chân MT2.
Dùng hình động để cho thấy nguyên lý hoạt động của mạch.
* Khi ic lập trình xuất bit 0, Led trong opto sáng, các transistor Q4, Q5 dẫn điện, cực cổng của TRIAC được cấp dòng mòi, TRIAC dẫn điện vả cấp dòng làm sáng các dãy đèn trên chân MT2.
* Khi ic lập trình xuất bit 1, Led trong opto tắt, các transistor Q4, Q5 ngưng dẫn, cực cổng của TRIAC không được cấp dòng mòi, TRIAC không dẫn điện và làm tắt các dãy đèn trên chân MT2.
Mạch điện cơ bản chạy ic AT89C51.
Muốn dùng ic lập trình AT89C51 để điều khiển các dãy đèn, Bạn hãy ráp các phần mạch cơ bản như hình trên:
* Dùng đường nguồn 5V có độ ổn định tốt cấp cho ic. Chân 20 cho nối masse, chân 40 cho nối với nguồn 5V.
* Trên chân số 9 gắn tụ 10µF và điện trở 8.2K tạo chức năng reset mỗi khi bo được cấp điện.
* Trên chân 18, 19 gắn thạch anh định tần, ở đây dùng thạch anh 12MHz, vậy chu kỳ lệnh là 1µs, gắn 2 tụ nhỏ 33pF bù nhiệt ổn tần.
* Trên chân 31 cho lên mức áp 5V để khai báo là chỉ dùng bộ nhớ trong.
* Trên cảng p0 dùng thanh 8 điện trở 10Kx8 cho treo áp để ổn định mức bit 1 đối với cảng này.
Với các mạch điện như trên, ic lập trình AT89C51 sẽ sẳn sàng chạy các câu lệnh mà Bạn đã cho nạp vào bộ nhớ EEPROM của nó. Các bit cho xuất nhập trên 4 cảng, loại cảng 8 bit, đó là cảng p0, p1, p2, p3.
Bây giờ công việc còn lại của chúng ta là viết các chương trình nguồn dùng để điều khiển các dãy đèn màu làm việc thẳng với đường nguồn nhà đèn 220V.
Viết các chương trình nguồn.
Chúng ta biết để làm sáng một dãy đèn thì dùng bit 0 và để tắt một dãy đèn thì dùng bit 1. Do vậy chúng ta có thể chọn bit trên các đường ra bằng câu lệnh set bit (setb) hay clear bit (clr). Cũng có thể dùng lệnh move (mov) để mỗi câu lệnh cùng lúc tác động vào 8 bit.
Phần 1: hãy viết chương trình nguồn ở cấp độ đơn giản trực quan.

DOWNLOAD:




Ghi nhận:


Trong chương trình nguồn này, chúng ta chủ yếu dùng câu lệnh mov để đặt 8 bit cho xuất ra trên cảng p1. Ứng với bit 0 là dãy đèn sáng và bit 1 là dãy đèn sẽ tắt. Dùng đoạn chương trình làm trể để có nhịp nhấp nháy rõ nét. Các kiểu nhấp nháy viết thành các chương trình con cho đặt tên nhãn là kiểu 1, kiểu 2, kiểu 3, kiểu 4…, và khi muốn dùng kiểu nhấp nháy nào thì dùng câu lệnh call để gọi ra. Qua các câu lệnh trên Bạn thấy dùng ic lập trình để định kiểu nhấp nháy của các dãy đèn cực kỳ đơn giản. Phải không?
Đoạn chương trình này Bạn có thể viết trong trang văn bản của trình MIDE-51, viết xong, Bạn đặt cho nó một cái tên với họ là .asm, rồi gõ phím F9 để cho dịch các câu lệnh ra dạng mã viết ở dạng hệ thập lục phân, các mã lệnh này đặt trong file có họ là .hex. Bây giờ Bạn dùng hộp nạp ROM, cho nạp các câu mã lệnh này vào nằm trong bộ nhớ EEPROM của ic AT89C51, thế là xong chuyện, bây giờ cho gắn ic AT89C51 vào bo thực hành, Bạn sẽ thấy các Led chỉ thị trên bo nhấp nháy theo đúng các câu lệnh mà Bạn đã soạn. Và nếu gắn các dãy đèn vào bo Bạn sẽ thấy cả một trời sao nhấp nháy đúng theo ý muốn của Bạn. Thích không?
Hình này cho thấy chương trình nguồn đã được viết trong trang văn bản của M-IDE for MSC51 và sau đó cho dịch ra file .hex để cho nạp các câu mã lệnh vào bộ nhớ trong của ic AT89C51.
Phần 2: Dùng bảng để tạo ra các dạng nhấp nháy cho các dãy đèn.
Trong đoạn chương trình nguồn này chúng ta tạo dạng nhấp nháy của các dãy đèn bằng cách đặt các bit 0 vào các đoạn mã tạo ra trong bảng, và dùng câu lệnh movc a, @a+dptr để lấy các đoạn mã này xuất ra trên các cảng tùy chọn để tắt mở đèn theo thiết kế của Bạn.

DOWNLOAD:

Trong cách viết này, Bạn dễ dàng định hình cho các kiểu nhấp nháy của các dãy đèn, trước hết hãy tạo bảng mã, mỗi mã 8 bit, sau đó định kiểu nhấp nháy, muốn dãy đèn nào sáng thì đặt bit 0, muốn tắt thì đặt bit 1. Sau cùng đếm xem trong bảng có bao nhiêu mẫu mã để khai báo số lần lấy mã cho xuất ra trên các cảng.
Sau khi đã có chương trình nguồn, cho dịch ra các dòng mã hệ thập lục phân, nạp các dòng mã này vào nằm trong bộ nhớ ROM của các ic lập trình là xong chuyện. Đơn giản quá phải không?

Share:

Hiểu về REMODE SONY và CODE đọc mã hồng ngoại bằng ASM

Thu phát tín hiệu
-Phát tín hiệu:
Dùng remote của TV sony hoặc bộ phát hồng ngoại.
Tín hiệu từ remote Sony có dạng:
-Phần đầu tiên của tín hiệu có độ dài 3T bằng 1800µs gọi là header hay satart bit. Các bit còn lại được mã hóa như sau:
500µs im lặng +  700µs hồng ngoại   =  bit 0
500µs im lặng +1300µs hồng ngoại   =  bit 1
          

Bit start đặt là bit B0, bit cuối là B11. Với 7 bit đầu là bit lệnh, 5 bit cuối là bit địa chỉ. Vì các tín hiệu đều lấy từ cùng renote nên ta chỉ cần giải mã 7 bit lệnh đầu tiên. 
-Thu tín hiệu
 Dùng led thu hồng ngoại để thu tín hiệu. Tín hiệu qua led thu sẽ bị đảo như sau:


bit 0=500µs mức cao+700µs mức thấp
bit 1=500µs mức cao+1300µs mức thấp
-Giải mã tín hiệu:
Để thu được 7 bit lệnh ta cần nạp cho thanh ghi A giá trị 01000000B để sau 7 lần quay trái có cờ nhớ C thì giá trị thanh ghi A chính là mã lệnh điều khiển của phím bấm remote.
Thuật toán giải mã:
          1.Nạp thanh ghi A giá trị 04H
          2.Chờ tín hiệu đi xuống( bit start)
          3.Chờ tín hiệu đi lên(khởi đầu của 1 bit)
          4.Chờ tín hiệu đi xuống
          5.Chờ khoảng 700µs<t<1300µs, chon t=1000µs=1ms
          6.Đo tín hiệu:
 + Nếu ở mức cao bit nhận được là bit 0, đặt C=0 quay phải A có cờ C, quay lại bước 4.

+ Nếu ở mức thấp bit nhận được là bit 1, đặt C=1 quay phải A có cờ C, quay lại bước 3.
        7.Nếu C=1, giá trị trong thanh ghi A= D6D5D4D3D2D1D00, quay phải A thu được A=0 D6D5D4D3D2D1D0 ­    
-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à VDK giải mã được).
<------------------------------------------------------------------------------------------------->
Mã lệnh điều khiển TV SONY
Phím                     Mã lệnh                                   
1             0H
2             1H
3             2H
4             3H
5             4H
6             5H
7             6H
8             7H
9             8H
10           9H
PROGRAM +  10H
PROGRAM -   11H
VOLUME  +    12H
VOLUME  -    13H
MUTING          14H
POWER            15H
DISPLAY         3AH
Ở đây chỉ dùng 8 mã lệnh để đóng mở 8 relay ( phím 1-8). Khi bấm các phím trên remote TV thì led thu IR sẽ thu tín hiệu qua VDK 89c51 sẽ giải mã đưa vào thanh ghi A và xuất hiển thị mã này ra port 1, đồng thời mã này sẽ so sánh với các mã lệnh của các phím xuất ra port 0 để đóng mở các relay tương ứng.

<------------------------------------------------------------------------------------------------->
V.         LÖU ÑOÀ GIAÛI THUAÄT
1. Giải mã tín hiệu







2. Điều khiển tín hiệu:

3. Lưu đồ của chương trình:

DOWLOAD:















Share:

Hướng dẫn làm quen với vi điều khiển AT89C51

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 8×8, như hình sau:

Hình trên cho thấy bảng đèn Led ma trận 8×8 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 8×8 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 4×8 (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.



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 8×8.











Bạn xem hình và sơ đồ mạch điện:
Ở đây dùng bảng ma trận Led 8×8 (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 8×8 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 4×4.


Trên bo test đặt 16 phím nhấn dùng ma trận 4×4, 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 4×4 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.










Share:

Bài viết

Lưu trữ Blog