intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Tìm hiểu vi điều khiển

Chia sẻ: VŨ QUANG MINH | Ngày: | Loại File: DOCX | Số trang:62

90
lượt xem
14
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

IC vi điều khiển là gì, vi điều khiển họ AT89C51, IC làm việc theo câu lệnh là những nội dung chính trong tài liệu "Tìm hiểu vi điều khiển". Mời các bạn cùng tham khảo, với các bạn đang học chuyên ngành Điện - Điện tử thì đây là tài liệu tham khảo hữu ích.

Chủ đề:
Lưu

Nội dung Text: Tìm hiểu vi điều khiển

  1. 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.   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:  
  2. 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.  
  3.   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:    
  4.  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.  
  5.   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:
  6.   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:
  7. 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.   Để 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:  
  9.   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 
  10. 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:  
  11.   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 
  12. 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.      
  13. Để 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).  
  14.       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.  
  15.   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
  16.       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.
  17.      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.
  18.    
  19.  
  20.     NHóm 2: Các câu lệnh liên quan đến logic:  
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2