1. Trang chủ
  2. » Giáo án - Bài giảng

Lập trình vi điều khiển 8051 cho người mới bắt đầu

14 182 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 14
Dung lượng 126,83 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Ngoài ra còn có một số những thanh ghi ñặc biệt khác như : TMOD/TCON : là những thanh ghi của bộ ñịnh thời.. bởi vì trong lập trình VðK dữ liệu nạp cho mỗi thanh ghi ñặc biệt là cố ñịnh

Trang 1

Bài mở ựầu

GIỚI THIỆU VỀ VI đIỀU KHIỂN 8051

A Một con chip AT89C51:

Như các bạn thấy trên hình:

- Các chân

P0.0 ựến P0.7,( 39-32 )

P1.0 ựến P1.7,( 1-8 )

P2.0 ựến P2.7,( 21-28 )

P3.0 ựến P3.7,( 10-17 )

Là các cổng xuất nhập đó là nơi ựưa tắn hiệu vào VđK và nơi VđK xuất tắn hiệu

ra

- Chân RST(9): là chân reset Khi chân này ựược ấn thì các thanh ghi hệ thống sẽ

ựược thiết lập lại trạng thái ban ựầu

- Các chân Vcc(40) và GND(20): là 2 chân cấp nguồn cho VđK Vcc ở mức cao 5V GND ở mức thấp 0V

- Hai chân XTAL1 và XTAL2 là hai chân cung cấp xung dao ựộng cho VđK Thường là nối với thạch anh có tần số 12 MHz

Trên ựây là một số ựặc ựiểm cần lưu ý về cấu trúc chân của con chip AT89C51 Các bạn nên nhớ kỹ ựể tiện cho việc lập trình sau này

Trang 2

* Nạp chương trình cho VðK

Trước tiên chúng ta viết trình chương trình chạy cho VðK Bạn có thể sử dụng Notepad của Windows hay phần nềm 8051-IDE (tải trên mạng - vô Google mà tìm)

Sau ñó chạy chương trình nạp (EZ31) và dùng bộ nạp nạp vào VðK

B Nó hoạt ñộng như thế nào?

Trước tiên chúng ta hãy ghi nhớ một số khái niệm

- Tín hiệu : trong VðK tín hiệu có nghĩa là một sự thay ñổi về ñiện thế hay mức trạng thái của một hay nhiều bit

Ví dụ: Có một mạch ñiện như hình vẽ

- Khi ta chưa ñóng khóa k1 thì chân P1.0 của VðK có ñiện thế 0V( mức thấp)

- Khi ta ñóng khóa k1 thì chân P1.0 của VðK có ñiện thế 5V( mức cao)

Sự thay ñổi ñiện thế ñó là một tín hiệu

Mỗi chân của VðK là một bit, gồm 2 mức trạng thái là “cao và thấp”

Tám chân cùng loại tạo nên 1 cổng (8 bit)

VD : cổng P1 bao gồm 8 chân từ P1.0 ñến P1.7

cổng P0 bao gồm 8 chân từ P0.0 ñến P0.7

- Thanh ghi: Mỗi thanh ghi là một ô nhớ 8 bit

VðK cung cấp cho chúng ta 8 thanh ghi mặc ñịnh là từ R0 ñến R7

Ngoài ra còn có một số những thanh ghi ñặc biệt khác như :

TMOD/TCON : là những thanh ghi của bộ ñịnh thời

Các cổng P0 ñến P3 cũng là những thanh ghi xuất nhập.v.v

Có những thanh ghi có ñịa chỉ bit cụ thể, có những thanh ghi thì không

- ðịa chỉ bit: mỗi thanh ghi ñược cấu thành từ 8 bit Có những thanh ghi có chức năng ñặc biệt và mỗi bit của nó ñảm nhận 1 chức năng khác nhau Chúng ta có thể thay ñổi mức trạng thái của từng bit thay vì phải tác ñộng lên cả thanh ghi ðiều

ñó sẽ giúp cho việc xử lý tín hiệu trở nên dễ dàng hơn Thao tác lập trình trở nên ñơn giản hơn.”

Trang 3

- Dữ liệu trong mỗi thanh ghi là một con số từ 00H~FFH (theo hệ hexa) hay từ 00000000B ñến 11111111B( theo hệ nhị phân) Như các bạn thấy các số trong hệ nhị phân có 8 chữ số tượng trưng cho 8 bit của mỗi thanh ghi Mỗi bit có 2 trạng thái ứng với 2 số là 0-mức thấp và 1-mức cao Giá trị hexa chẳng qua chỉ là một cách viết gọn của những người ñã quen với công việc lập trình Chúng ta có thể chuyển từ nhị phân sang hexa một cách dễ dàng nhờ máy tính

Vì sao viết hexa lại dễ hơn viết nhị phân bởi vì trong lập trình VðK dữ liệu nạp cho mỗi thanh ghi ñặc biệt là cố ñịnh ứng với mỗi chức năng khác nhau.Vì vậy khi quen rồi bạn viết bằng hexa sẽ nhanh gọn hơn Chúng ta cũng có thể sử dụng

số thập phân

VðK hoạt ñộng như thế nào???

Khi nhận ñược một tín hiệu từ bên ngoài Tín hiệu ñó có thể từ công tắc hoặc cảm biến Lúc ñó VðK sẽ xử lí theo các chương trình mà ta ñã lập sẵn ứng với tín hiệu

ñó Và kết quả là ta sẽ quy ñịnh cho VðK ñưa ra những tín hiệu tương ứng nhằm

giải quyết tình huống Một ñiều hiển nhiên là những tình huống ấy ta ñã dự tính trước và lập sẵn chương trình ñể giải quyết Nếu không VðK không thể tự xử lý

ñược Nó chỉ biết chạy theo ñúng những gì chúng ta ñã lập trình cho nó

Trang 4

Bài 2

RAM VÀ CÁC THANH GHI ðẶC BIỆT

ðây là vùng RAM ña mục ñích ðây là các thanh ghi có chức năng ñặc biệt

Như ñã ñề cập ở bài mở ñầu, các thanh ghi ñặc biệt mang chức năng khác nhau, chúng ñược cấu tạo từ 8 bit, và như ở trên chúng ta có thể lấy dữ liệu trực tiếp từ

ñịa chỉ bit hoặc thông qua tên gọi của của chúng Các thanh ghi ñặc biệt nằm ở vị

trí từ 80H ñến FFH

Trong các thanh ghi ñó chúng ta hãy quan tâm tới các thanh ghi của bộ ñịnh thời:

TMOD là thanh ghi chọn chế ñộ ñịnh thời

TCON (ñịnh ñịa chỉ từng bit) là thanh ghi ñiều khiển chế ñộ ñịnh thời

TL0 - TH0 là 2 thanh ghi quy ước byte thấp và byte cao của bộ ñịnh thời 0 TL1 - TH1 là 2 thanh ghi quy ước byte thấp và byte cao của bộ ñịnh thời 1

Trang 5

Bài 3

CÁC LỆNH THƯỜNG GẶP đỂ LẬP TRÌNH ROBOT

đối với hoạt ựộng robocon, lập trình VđK gần như bó gọn trong một số câu lệnh

thường gặp sau ựây:

1 Lệnh MOV

- Cấu trúc: MOV ựắch,nguồn

- Chức năng: Chuyển dữ liệu từ nguồn vào ựắch và thoát khỏi câu lệnh

- Lưu ý: đắch là các thanh ghi, nguồn có thể là thanh ghi cũng có thể là giá trị trực tiếp hoặc gián tiếp Nếu nguồn là dữ liệu trực tiếp thì phải ghi theo cấu trúc:

MOV ựắch,#dữ liệu trực tiếp

Nếu là số hexa thì phải viết #0(dữ liệu dạng hexa) Vd #0FFH

Nêu là số nhị phân phải viết #(dữ liệu dạng bit)B Vd #11111111B

Nếu là số thập phân phải viết #(dữ liệu dạng thập phân Vd #255

2 Lệnh JB

- Cấu trúc: JB bit,nhãn

- Chức năng: Kiểm tra mức trạng thái của bit Nếu là mức thấp thì thoát khỏi câu lệnh Nếu là mức cao thì nhảy ựến vị trắ của nhãn

- Lưu ý: Nhãn là tên gọi ựánh dấu một vị trắ nào ựó trong chương trình lập trình

mà chúng ta quy ựịnh cho nó

3 Lệnh JNB

- Cấu trúc: JNB bit,nhãn

- Chức năng: Kiểm tra mức trạng thái của bit Nếu là mức cao thì thoát khỏi câu lệnh Nếu là mức thấp thì nhảy ựến vị trắ của nhãn

4 Lệnh CJNE

- Cấu trúc: CJNE ựắch,nguồn,nhãn

- Chức năng: So sánh dữ liệu của nguồn với ựắch Nếu không bằng nhau thì nhảy

ựến vị trắ của nhãn Nếu bằng thì thoát khỏi câu lệnh

5 Lệnh DJNZ

- Cấu trúc: DJNZ thanh ghi,nhãn

- Chức năng: So sánh giá trị thanh ghi với 0 Nếu không bằng thì giảm giá trị thanh ghi ựi 1 và nhảy tới vị trắ của nhãn Nếu bằng 0 thì thoát ra khỏi câu lệnh

- Lưu ý: Khi lập trình chúng ta nên ựể cho thanh ghi có gia trị dương

6 Lệnh SETB

- Cấu trúc: SETB bit

- Chức năng: Thiết lập mức trạng thái cao cho bit và thoát khỏi câu lệnh

- Lưu ý: Khi bit ựang ở mức 0 (thấp) thì ựưa lên mức 1(cao) Còn ựang ở mức 1 thì giữ nguyên

Trang 6

7 Lệnh CLR

- Cấu trúc: CLR bit

- Chức năng: Thiết lập mức trạng thái 0 cho bit và thoát khỏi câu lệnh

- Lưu ý: Khi bit ñang ở mức 1thì ñưa xuống mức 0 Còn ñang ở mức 0 thì giữ nguyên Có thể thay bit bằng thanh ghi và khi ñó tất cả các bit của thanh ghi ñều

ñược ñưa xuống mức 0

8 Lệnh INC

- Cấu trúc: INC thanh ghi

- Chức năng: Tăng giá trị thanh ghi lên 1 và thoát khỏi câu lệnh

- Lưu ý: Khi lập trình chúng ta nên ñể cho thanh ghi có gia trị dương

9 Lệnh LJMP

- Cấu trúc: LJMP nhãn

- Chức năng: Nhảy tới vị trí của nhãn

- Lưu ý: Có thể nhảy trong toàn chương trình

10 Lệnh SJMP

- Cấu trúc: SJMP nhãn

- Chức năng: Nhảy tới vị trí của nhãn

- Lưu ý: Có thể nhảy trong phạm vi 128 byte trước câu lệnh và 127 byte sau lệnh

11 Lệnh RET

- Cấu trúc: RET

- Chức năng: Kết thúc một chương trình con và ñưa con trỏ trở về vị trí lúc gọi chương trình con

12 Lệnh LCALL

- Cấu trúc: LCALL nhãn

- Chức năng: Gọi một chương trình con bắt ñầu từ vị trí nhãn

- Lưu ý: Có thể gọi trong toàn chương trình

Các bạn nên ñọc thêm trong sách tham khảo ñể biết thêm về số byte và số chu kỳ máy của mỗi câu lệnh

Trang 7

Bài 4

TRẠNG THÁI KHI RESET

1 VðK sẽ bắt ñầu hoạt ñộng khi chúng ta cấp nguồn cho nó bằng cách ñóng khóa K1 Khi ñó tất cả các thanh ghi sẽ ñược khởi tạo trạng thái.(Xem trong phần reset) con trỏ của chương trình sẽ ñược ñặt ở vị trí thấp nhất của RAM - 00H

2 VðK sẽ reset lại hệ thống, nghĩa là thiết lập lại trạng thái ban ñầu lúc khởi

ñộng cho tất cả các thanh ghi và ñưa con trỏ trở lại vị trí 00H Muốn reset ñúng ta

phải ñóng khóa K2 lâu hơn 2 chu kỳ máy

Bảng trạng thái khi reset:

3 Như chúng ta thấy ở bảng Reset, trạng thái của các cổng xuất nhập ( cổng P0~P3 ) ñều là FFH, nghĩa là tất cả các chân trong cổng ñều ở trạng thái mức 1 Tuy nhiên nếu bất kỳ chân nào trong các cổng nối với một mạch ngoài hở - nghĩa

là phụ thuộc vào các ñiều kiện bên ngoài, thì trạng thái của chân ñó sẽ là trạng thái của tín hiệu mà mạch ngoài ñưa vào Nếu mạch ngoài phụ thuộc vào tín hiệu của VðK thì trạng thái của chân ra sẽ là trạng thái mà VðK xuất ra

Trong hình miêu tả ở trên chân P0.1 sẽ có trạng thái là mức 0, vì K3 hở Còn chân P2.0 thì có trạng thái phụ thuộc vào VðK

Trang 8

Bài 5

CÁC THÀNH PHẦN CỦA MỘT CHƯƠNG TRÌNH LẬP TRÌNH

1 Cấu trúc một chương trình lập trình

ORG (Vị trắ bắt ựầu của con trỏ chương trình)

(đoạn chương trình chắnh)

(Các chương trình con)

END (kết thúc chương trình)

2 Con trỏ chương trình

đó là vị trắ mà VđK ựang thực thi tại ựó

Thông thường khi bắt ựầu một chương trình thì con trỏ luôn ở vị trắ thấp nhất 00H tuy nhiên chúng ta có thể quy ựịnh cho nó bắt ựầu làm việc tại một vị trắ khác.Chúng ta căn cứ vào ựịa chỉ trên RAM ựể chọn vùng làm việc

Vd:

ORG 00H -(bắt ựầu từ vị trắ 00H)

ORG 0030H -(bắt ựầu từ vị trắ 30H) v.v

3 Nhãn

Nhãn là tên gọi ựánh dấu một vị trắ nào ựó trong chương trình lập trình mà chúng

ta quy ựịnh cho nó

VD:

ORG 00H -(con trỏ chương trình bắt ựầu ở vị trắ 00H)

LJMP MAIN -(nhảy tới vị trắ có nhãn là MAIN)

ORG 0030H -(vị trắ bắt ựầu chương trình chắnh MAIN)

MAIN:

MOV R1,#10 -(nạp cho R1 giá trị là 10.)

LAP1:

DJNZ R1,LAP1

END -(Kết thúc chương trình.)

Trong chương trình trên nhãn là MAIN và LAP1 Khi nhãn ựược gọi thì con trỏ chương trình sẽ nhảy tới vị trắ của nhãn ựể thực thi câu lệnh tại vị trắ ựó

4 Chương trình con

Cấu trúc chương trình con

Nhãn:

Các câu lệnh

RET

Trang 9

VD:

ORG 00H

LJMP MAIN

ORG 0030H

MAIN:

MOV R1,#10

LCALL LAP1 -gọi chương trình con

LAP1:

DJNZ R1,LAP1

RET -kết thúc chương trình con

END

Chương trình con có thể ñặt bên ngoài chương trình chính, trước hoặc sau

Trang 10

Bài 6

HOẠT đỘNG đỊNH THỜI

1 Hoạt ựộng ựịnh thời:

Là sự kiểm soát thời gian ựể thực thi các câu lệnh trong quá trình xử lý của VđK

* Một số khái niệm:

- Tần số dao ựộng: tần số của VđK luôn bằng 1/12 tần số của thạch anh gắn trong mạch (thường là loại 12MHz)

- Chu kỳ máy: T=1/f Là thời gian làm việc của 1 dao ựộng máy

Giả sử tần số thạch anh là 12 MHz ta có tần số VđK f = 12 MHz/12 = 1 MHz

=1000000 Hz và khi ựó chu kỳ máy T = 1/1000000 = 0.000001 s = 1 micro giây

- để thực hiện mỗi câu lệnh VđK ựều phải tốn một thời gian nhất ựịnh ứng với mỗi câu lệnh ựó đó là số chu kỳ máy của mỗi câu lệnh

- Giữa thuật toán lập trình và thực tế có một sự khác biệt rất lớn đó chắnh là thời gian VđK chạy với tốc ựộ micro giây, trong khi thực tế cùng lắm là chúng ta xử

lý công việc trong khoảng 0.1 giây là nhanh nhất có thể Chắnh vì thế chúng ta khi lập trình phải có công ựoạn xử lý thời gian bằng cách tạo trễ cho VđK ựể kéo dài thời gian cho khớp với những thao tác trên thực tế

2 Tạo trễ:

Chẳng hạn yêu cầu chúng ta cần một khoảng thời gian trễ là 200 micro giây Vậy với câu lệnh MOV (1 chu kỳ máy) chúng ta phải viết 200 câu lệnh liên tiếp Một công việc gần như không thể

Vấn ựề ựặt ra là chúng ta phải xây dựng một thuật toán tạo trễ sao cho dễ dàng cho người lập trình nhất.Và sau ựây là 1 thuật toán:

VD:

ORG 00H

LJMP MAIN

ORG 0030H

MAIN:

MOV R1,#100 -Gán cho thanh ghi R1 giá trị là 100

LAP1:

DJNZ R1,LAP1 -(So sánh giá trị thanh ghi R1 với 0,

Nếu không bằng thì giảm R1 ựi 1, rồi nhảy tới nhãn LAP1Công việc lại ựược tiếp tục cho tới khi R1=0)

END

Trang 11

Như vậy với câu lệnh DJNZ (2 chu kỳ máy) VđK ựã lặp lại công việc kiểm tra R1=0 tới 100 lần tổng cộng số chu kỳ máy mà VđK ựã thực hiện là T = 2x100 =

200 chu kỳ = 200 micro giây đó là thuật toán tạo trễ đối với những khoảng thời gian trễ quá lớn chúng ta phải sử dụng nhiều vòng lặp lồng nhau Bởi vì giá trị thanh ghi chỉ ựược phép ựạt tới 255

VD:

ORG 00H

LJMP MAIN

ORG 0030H

MAIN:

MOV R1,#100

LAP1:

MOV R2,#100

LAP2:

DJNZ R2,LAP2

DJNZ R1,LAP1

END

Ta nhận thấy:

Tại LAP2 VđK ựã thực hiện 100 chu kỳ máy Và cứ mỗi lần R2=0 thì kiểm tra R1, cho ựến khi R1=0

Như vậy câu lệnh DJNZ R2,LAP2 ựã ựược lặp 100x100=10000 lần => 20000 chu

kỳ máy = 0.02s

Tất nhiên tổng số chu kỳ máy của cả thuật toán 1 + 300 + 20000=200301 chu kỳ tuy nhiên chúng ta có thể bỏ qua 301 chu kỳ vì nó quá nhỏ so với 20000

Trang 12

Bài 7

BỘ ðỊNH THỜI

Khái niệm bộ ñịnh thời: Nói một cách nôm na thì bộ ñịnh thời là mạch chia tần

số của VðK cho 2n lần Với n là số bit của bộ ñịnh thời Vậy thời gian của một chu kỳ ñịnh thời lúc này là:

T = 1/(12MHz/(12*2^n ))

VðK AT89C51 xử dụng 2 bộ ñịnh thời

Cấu tạo: VðK AT89C51 cung cấp cho chúng ta 2 bộ ñịnh thời 0 và 1

Bộ ñịnh thời ñược truy xuất bằng cách sử dụng 6 thanh ghi ñặc biệt là:

- TMOD là thanh ghi chọn chế ñộ ñịnh thời

- TCON (ñịnh ñịa chỉ từng bit) là thanh ghi ñiều khiển chế ñộ ñịnh thời

- TL0 - TH0 là 2 thanh ghi quy ước byte thấp và byte cao của bộ ñịnh thời 0

- TL1 - TH1 là 2 thanh ghi quy ước byte thấp và byte cao của bộ ñịnh thời 1

A Thanh ghi TMOD.(Time Mode register): Cấu tạo bởi hai nhóm 4 bit

0

1

2

3

4

5

6

7

M0

M1

C/T

GATE

M0

M1

C/T

GATE

0

0

0

0

1

1

1

1

Bit chọn chế ñộ thứ 2 Bit chọn chế ñộ thứ 1 Bit chọn chức năng ñếm hoặc ñịnh thời cho bộ ñịnh thời 0 Bit ñiều khiển cổng cho bộ ñịnh thời 0

Bit chọn chế ñộ thứ 2 Bit chọn chế ñộ thứ 1 Bit chọn chức năng ñếm hoặc ñịnh thời cho bộ ñịnh thời 1 Bit ñiều khiển cổng cho bộ ñịnh thời 1

Bảng mô tả chế ñộ:

0

0

1

1

0

1

0

1

0

1

2

3

Chế ñộ ñịnh thời 13 bit Chế ñộ ñịnh thời 16 bit Chế ñộ tự ñộng nạp lại 8 bit Chế ñộ ñịnh thời chia sẻ

Ở ñây chúng ta chỉ nghiên cứu chế ñộ ñịnh thời 16 bit.(Các chế ñộ khác mong các

ban xem tài liệu)

Thanh ghi 16 bit của nó ñược cấu tạo bởi 2 thanh ghi 8 bit là TLx/THx ghép lại với nhau x là tên của bộ ñịnh thời (1 hoặc 0) Giá trị thanh ghi TLx ñược lấy làm byte thấp và giá trị thanh ghi THx lấy làm byte cao

VD : TL1 / TH1

00H / FFH => giá trị thanh ghi 16 bit = FF00H

Trang 13

Hoạt ñộng: Bộ ñịnh thời 16 bit hoạt ñộng giống như một bộ ñếm Tức là khi chạy

bộ ñịnh thời VðK sẽ bắt ñầu ñếm từ giá trị mà chúng ta nạp vào thanh ghi 16 bit của nó cho ñến giá trị FFFFH = 65536 Và khi ñó VðK sẽ bật một bit (gọi là cờ tràn) từ 0 lên 1 báo hiệu ñã ñếm xong hay nói cách khác là tràn bộ ñịnh thời

B Thanh ghi TCON : Ở ñây chúng ta chỉ quan tâm ñến 4 bit cao của thanh hi

TCON Còn 4 bit thấp chúng quy uớc là = 0

7

6

5

4

TF1 TF1 TF0 TF0

Cờ tràn của bộ ñịnh thời 1 Bit ñiều khiển bộ ñịnh thời 1 Mức 1 là bật Mức 0 là dừng

Cờ tràn của bộ ñịnh thời 0 Bit ñiều khiển bộ ñịnh thời 0 Mức 1 là bật Mức 0 là dừng Như vậy giả sử muốn khởi ñộng bộ ñịnh thời 1 chúng ta viết lệnh SETB TR1

C Cấu trúc thuật toán viết cho bộ ñịnh thời:

MOV TMOD,#01H

LAP: MOV TH0,#dữ liệu

MOV TL0,#dữ liệu

SETB TR0

DEM: JNB TF0,DEM

CLR TR0

CLR TF0

END

Chúng ta có thể lấy dữ liệu byte cao và thấp ñể nạp cho TL0 và TH0 như sau

- Xác ñịnh chúng ta cần trễ là bao nhiêu chu kỳ máy VD 10000 Chu kỳ

- Lấy 65536 - 10000 = 55536 => D8F0H

- Vậy TH0 = D8, TL0 = F0

Ngoài ra chúng ta còn có một thuật toán nữa ñể viết cho bộ ñịnh thời

MOV TMOD,#01H

MOV R1,#số lần lặp lại

LAP: MOV TH0,#HIGH(-số chu kỳ máy cần thiết)

MOV TL0,#LOW(-số chu kỳ máy cần thiết)

SETB TR0

DEM: JNB TF0,DEM

CLR TR0

CLR TF0

DJNZ R1,LAP

END

Ngày đăng: 10/04/2020, 14:14

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w