Bài giảng Vi điều khiển - Lưu Thế Mạnh

Bài 1 : Giới thiệu về vi điều khiển 8051.

1.1. Mô tả chung

- Họ vi điều khiển 8051 có các đặc trưng được tóm tắt như sau:

+ Bộ nhớ có thể lập trình lại.

+ 4 KB ROM.

+ 128 byte RAM.

+ 4 cổng vào/ra (I/O port) 8-bit.

+ 2 bộ định thời 16-bit.

+ Cổng giao tiếp nối tiếp.

+ Không gian nhớ chương trình (mã) ngoài 64 Kb.

+ Không gian dữ liệu ngoài 64 Kb.

+ Bộ xử lý bit (thao tác trên các bit riêng rẽ).

+ 210 vị trí nhớ được định địa chỉ, mỗi vị trí 1 bit.

+ Nhân/chia trong 4 µs.

1.2. Sơ đồ khối họ vi điều khiển 8051

Hình sau đây cho thấy sơ đồ khối của vi điều khiển 8051

1.3. Sơ đồ chân và chức năng

1.3.1. Sơ đồ chân

Hình 2: Bố trí chân của họ 8051.

1.3.2. Mô tả chân

- Cổng P0: Bình thường đây là cổng ra. Để có thể vừa làm đầu ra, vừa làm

đầu vào thì mỗi chân của P0 phải được nối tới một điện trở treo 10 kΩ bên

ngoài. Sở dĩ như vậy là vì cổng P0 có dạng cực máng hở, đây là điểm khác với

các cổng P1, P2 và P3. Khi nối 8051 tới bộ nhớ ngoài, P0 trở thành bus địa chỉ

và bus dữ liệu dồn kênh để tiết kiệm số chân [byte thấp của bus địa chỉ nếu là

địa chỉ].- 5 -

- Cổng P1: P1 chỉ có một công dụng là vào/ra.

- Cổng P2: P2 có 2 công dụng, hoặc làm nhiệm vụ vào/ra hoặc là byte địa

chỉ cao của bus địa chỉ 16-bit cho các thiết kế có bộ nhớ chương trình ngoài

hoặc các thiết kế có nhiều hơn 256 byte bộ nhớ dữ liệu ngoài.

- Cổng P3: P3 có 2 công dụng. Khi không hoạt động vào/ra, các chân của

P3 có nhiều chức năng riêng (mỗi chân có chức năng riêng liên quan đến các đặc

trưng cụ thể của 8051).

pdf 122 trang yennguyen 2760
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Vi điều khiển - Lưu Thế Mạnh", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Vi điều khiển - Lưu Thế Mạnh

Bài giảng Vi điều khiển - Lưu Thế Mạnh
BỘ CÔNG THƯƠNG
TRƯỜNG CAO ĐẲNG CÔNG NGHIỆP VÀ XÂY DỰNG
BÀI GIẢNG MÔN HỌC
VI ĐIỀU KHIỂN
 (Lưu hành nội bộ)
Người biên soạn: Lưu Thế Mạnh
Uông Bí, năm 2010
- 1 -
Bài 1 : Giới thiệu về vi điều khiển 8051...................................................- 3 -
1.1. Mô tả chung...................................................................................- 3 -
1.2. Sơ đồ khối họ vi điều khiển 8051 .................................................- 3 -
1.3. Sơ đồ chân và chức năng...............................................................- 4 -
1.4. Tổ chức bộ nhớ..............................................................................- 6 -
1.5. Tập lệnh.........................................................................................- 7 -
1.6. Bộ đếm/bộ định thời......................................................................- 8 -
1.7. Ngắt ...............................................................................................- 9 -
Bài 2 : Ngôn ngữ lập trình và phần mềm biên dịch, mô phỏng Keil C.- 11 -
Phần 1 – Ngôn ngữ C với lập trình vđk.................................................- 11 -
2.1.1. Cấu trúc một chương trình .......................................................- 11 -
2.1.2.Các loại biến trong C:................................................................- 12 -
2.1.3. Hàm trong C: ............................................................................- 13 -
2.1.4. Các toán tử cơ bản :..................................................................- 14 -
2.1.5. Các cấu trúc lệnh rẽ nhánh, kiểm tra thường dùng: .................- 15 -
2.1.6. Bộ tiền xử lí ..............................................................................- 15 -
Phần 2: Trình biên dịch cách sử dụng Keil C uVision 3.0 ....................- 17 -
2.2.1.Khởi tạo cho Project:.................................................................- 17 -
2.2.2 Soạn thảo chương trình: ............................................................- 37 -
2.2.3 Dịch chương trình: ....................................................................- 42 -
2.2.4. Chạy mô phỏng và sửa lỗi........................................................- 47 -
Bài toán 1: Bài toán ghép nối vi điều khiển với các led đơn .............- 55 -
Bài toán 2 : Phối hợp led-công tắc(1).................................................- 58 -
Bài Toán 3:Phối hợp led-công tắc(2) .................................................- 60 -
Bài toán 4:...........................................................................................- 63 -
Bài 4: Ghép nối và thao tác với màn hình LCD ...................................- 67 -
4.1. Lắp mạch theo sơ đồ sau: ............................................................- 67 -
4.2. Nguyên lí hoạt động của LCD: ...................................................- 68 -
4.3. Lập trình : ....................................................................................- 70 -
Bài 5: Ngắt của vi điều khiển, thao tác với ngắt ngoài của vi điều khiển- 75 -
5.1. Khái niệm:.......................................................................................- 75 -
5.2. Trình tự thực hiện ngắt của vi điều khiển.......................................- 75 -
5.2.1.Các ngắt của vi điều khiển 8051 ...............................................- 75 -
5.2.2. Ngắt ngoài và cách lập trình.....................................................- 76 -
5.3. Các bài toán ứng dụng ngắt ngoài của vđk .................................- 76 -
Bài 6 : Bộ định thời của VĐK và ngắt định thời ..................................- 81 -
6.1. Cơ sở lý thuyết ................................................................................- 81 -
6.1.1. Bộ định thời của vi điều khiển là gì. ........................................- 81 -
6.1.2. Thanh ghi chứa, thanh ghi thiết lập chế độ cho bộ định thời...- 81 -
6.1.3. Cơ chế tạo trễ của bộ định thời và cách tính toán giá trị nạp cho bộ
định thời..............................................................................................- 82 -
6.1.4. Ngắt của bộ định thời ...............................................................- 83 -
6.2.Các bài toán minh họa. ....................................................................- 84 -
6.3. Bàn phím ma trận 4x4.....................................................................- 91 -
- 2 -
6.3.1. Lắp mạch theo sơ đồ sau ..........................................................- 91 -
6.3.2: Nguyên lí quét phím:...............................................................- 91 -
6.3.3. Chúng ta có thể sử dụng theo sơ đồ thuật toán thứ 2 sau:........- 92 -
Bài7: BỘ ĐẾM CỦA VĐK 8051 (Counter) ..........................................- 97 -
7.1. Ý nghĩa thực tiễn của các bộ đếm (Counter). .................................- 97 -
7.2. Cơ sở lý thuyết và lập trình vi điều khiển 8051 thành một bộ đếm.- 98 -
7.3. Bài toán lập trình minh họa ..........................................................- 100 -
Bài8: ĐIỀU KHIỂN TỐC ĐỘ ĐỘNG CƠ ĐIỀU KHIỂN QUÁ TRÌNH
VỚI BĂNG TẢI.....................................................................................- 113 -
8.1.Điều khiển tốc độ động cơ một chiều............................................- 113 -
8.2. Điều khiển tốc độ động cơ theo quá trình.....................................- 114 -
- 3 -
Bài 1 : Giới thiệu về vi điều khiển 8051.
1.1. Mô tả chung
- Họ vi điều khiển 8051 có các đặc trưng được tóm tắt như sau:
+ Bộ nhớ có thể lập trình lại.
+ 4 KB ROM.
+ 128 byte RAM.
+ 4 cổng vào/ra (I/O port) 8-bit.
+ 2 bộ định thời 16-bit.
+ Cổng giao tiếp nối tiếp.
+ Không gian nhớ chương trình (mã) ngoài 64 Kb.
+ Không gian dữ liệu ngoài 64 Kb.
+ Bộ xử lý bit (thao tác trên các bit riêng rẽ).
+ 210 vị trí nhớ được định địa chỉ, mỗi vị trí 1 bit.
+ Nhân/chia trong 4 µs.
1.2. Sơ đồ khối họ vi điều khiển 8051
Hình sau đây cho thấy sơ đồ khối của vi điều khiển 8051
- 4 -
Hình 1. Sơ đồ khối họ vi điều khiển 8051
1.3. Sơ đồ chân và chức năng
1.3.1. Sơ đồ chân
Hình 2: Bố trí chân của họ 8051.
1.3.2. Mô tả chân
- Cổng P0: Bình thường đây là cổng ra. Để có thể vừa làm đầu ra, vừa làm
đầu vào thì mỗi chân của P0 phải được nối tới một điện trở treo 10 kΩ bên
ngoài. Sở dĩ như vậy là vì cổng P0 có dạng cực máng hở, đây là điểm khác với
các cổng P1, P2 và P3. Khi nối 8051 tới bộ nhớ ngoài, P0 trở thành bus địa chỉ
và bus dữ liệu dồn kênh để tiết kiệm số chân [byte thấp của bus địa chỉ nếu là
địa chỉ].
- 5 -
- Cổng P1: P1 chỉ có một công dụng là vào/ra.
- Cổng P2: P2 có 2 công dụng, hoặc làm nhiệm vụ vào/ra hoặc là byte địa
chỉ cao của bus địa chỉ 16-bit cho các thiết kế có bộ nhớ chương trình ngoài
hoặc các thiết kế có nhiều hơn 256 byte bộ nhớ dữ liệu ngoài.
- Cổng P3: P3 có 2 công dụng. Khi không hoạt động vào/ra, các chân của
P3 có nhiều chức năng riêng (mỗi chân có chức năng riêng liên quan đến các đặc
trưng cụ thể của 8051).
Bit Tên Địa chỉ
bit
Chức năng
P3.0 RxD B0H Nhận dữ liệu của cổng nối tiếp
P3.1 TxD B1H Phát dữ liệu của cổng nối tiếp
P3.2 INT0 B2H Ngắt ngoài 0
P3.3 INT1 B3H Ngắt ngoài 1
P3.4 T0 B4H Chân vào của bộ định thời/đếm 0
P3.5 T1 B5H Chân vào của bộ định thời/đếm 1
P3.6 WR B6H Điều khiển ghi bộ nhớ dữ liệu ngoài
P3.7 RD B7H Điều khiển đọc bộ nhớ dữ liệu ngoài
Bảng 1: Chức năng các chân của cổng P3.
- Chân cho phép bộ nhớ chương trình PSEN : 8051 cung cấp cho ta 4 tín
hiệu điều khiển bus. Tín hiệu cho phép bộ nhớ chương trình PSEN (Program
Store Enable) là tín hiệu xuất. Đây là tín hiệu cho phép ta truy xuất bộ nhớ
chương trình ngoài. Chân này thường nối với chân cho phép xuất OE (Output
Enable) của EPROM (hoặc ROM) để cho phép đọc các byte lệnh.
- Chân cho phép chốt địa chỉ ALE: Chân xuất tín hiệu cho phép chốt địa
chỉ ALE (Address Latch Enable) để phân kênh (demultiplexing) bus dữ liệu và
bus địa chỉ.
- Chân truy xuất ngoài EA (External Access): Chân vào này có thể được
nối với 5V (logic 1) hoặc với GND (logic 0).
+ Nếu chân này nối lên 5V, 8051 thực thi chương trình trong ROM
nội (chương trình nhỏ hơn 4K/8K).
+ Nếu chân này nối với GND (và chân PSEN cũng ở logic 0),
chương trình cần thực thi chứa ở bộ nhớ ngoài.
- Chân RESET (RST): Khởi động lại. Đây là chân vào, mức tích cực cao,
bình thường ở mức thấp. Khi có xung cao đặt tới chân này thì bộ vi điều khiển
sẽ kết thúc mọi hoạt động hiện tại và tiến hành khởi động lại. Khi reset, mọi giá
trị trên các thanh ghi sẽ bị xoá. Lưu ý, để reset có hiệu quả, chân RST cần duy
trì trạng thái tích cực mức cao tối thiểu 2 chu kỳ máy.
- Các chân XTAL1 và XTAL2: Mạch dao động bên trong chip 8051 được
ghép nối với thạch anh bên ngoài ở hai chân XTAL1 và XTAL2.
- 6 -
1.4. Tổ chức bộ nhớ
Lệnh Tên Địa chỉ
ACC* Thanh ghi tích luỹ (thanh ghi tổng ) A 0E0H
B* Thanh ghi B 0F0H
PSW* Từ trạng thái chương trình 0D0H
SP Con trỏ ngăn xếp 81H
DPTR Con trỏ dữ liệu hai byte
DPL Byte thấp của DPTR 82H
DPH Byte cao của DPTR 83H
P0* Cổng P0 80H
P1* Cổng P1 90H
P2* Cổng P2 0A0H
P3* Cổng P3 0B0H
IP* Điều khiển ưu tiên ngắt 0B8H
IE* Điều khiển cho phép ngắt A08H
TMOD Điều khiển chế độ bộ đếm/định thời 89H
TCON* Điều khiển bộ đếm/định thời 88H
T2CON* Điều khiển bộ đếm/định thời 2 0C8H
T2MOD Điều khiển chế độ bộ đếm/định thời 2 0C9H
TH0 Byte cao của bộ đếm/định thời 0 8CH
TL0 Byte thấp của bộ đếm/định thời 0 8AH
TH1 Byte cao của bộ đếm/định thời 1 8DH
TL1 Byte thấp của bộ đếm/định thời 1 8BH
TH2 Byte cao của bộ đếm/định thời 2 0CDH
TL2 Byte thấp của bộ đếm/định thời 2 0CCH
RCAP2H Byte cao của thanh ghi bộ đếm/định thời 2 0CBH
RCAP2L Byte thấp của thanh ghi bộ đếm/định thời 2 0CAH
SCON* Điều khiển nối tiếp 98H
SBUF Bộ đệm dữ liệu nối tiếp 99H
PCON Điều khiển công suất 87H
Bảng 2: Các thanh ghi chức năng đặc biệt của họ vi điều khiển 8051
(*các thanh ghi có thể định địa chỉ theo bit).
Họ vi điều khiển 8051 có không gian bộ nhớ riêng cho chương trình và dữ
liệu. Cả 2 bộ nhớ chương trình và dữ liệu đều đặt bên trong chip, tuy nhiên ta có
thể mở rộng bộ nhớ chương trình và bộ nhớ dữ liệu bằng cách sử dụng các chip
- 7 -
nhớ bên ngoài.
- Bộ nhớ nội trong chip bao gồm ROM và RAM. RAM trên chip bao gồm
vùng RAM đa chức năng (nhiều công dụng), vùng RAM với từng bit được định
địa chỉ (gọi tắt là vùng RAM định địa chỉ bit), các dãy (bank) thanh ghi và các
thanh ghi chức năng đặc biệt SFR (Special Function Register). Hai đặc tính đáng
lưu ý:
+ Các thanh ghi và các cổng vào/ra được định địa chỉ theo kiểu ánh
xạ bộ nhớ (memory mapped) và được truy xuất như một vị trí trong bộ nhớ.
+ Vùng stack thường trú trong RAM trên chip (RAM nội) thay vì ở
trong RAM ngoài như đối với các bộ vi xử lý.
- Vùng RAM đa mục đích: Bất kỳ một vị trí nhớ nào trong vùng RAM đa
mục đích đều có thể được truy xuất tự do bằng cách sử dụng các kiểu định địa
chỉ trực tiếp hoặc gián tiếp.
- Vùng RAM định địa chỉ bit: Ý tưởng truy xuất các bit riêng rẽ thông qua
phần mềm là một đặc trưng mạnh của hầu hết các bộ vi điều khiển. Các bit có
thể được set, xoá, AND, OR bằng một lệnh. Hầu hết các bộ vi xử lý yêu cầu
một chuỗi lệnh đọc-sửa-ghi để nhận được cùng một kết quả. Ngoài ra 8051 còn
có các cổng vào/ra có thể định địa chỉ từng bit, làm đơn giản việc giao tiếp bằng
phần mềm với các thiết bị vào/ra đơn bit.
- Các dãy thanh ghi: Dãy các thanh ghi đang được sử dụng được gọi là
dãy thanh ghi tích cực. Dãy thanh ghi tích cực có thể được thay đổi bằng cách
thay đổi các bit chọn trong từ trạng thái PSW.
- Các thanh ghi chức năng đặc biệt được trình bày trong bảng 2.
1.5. Tập lệnh
- Đặc điểm nổi bật của 8051 là có các lệnh tác động và thực hiện trên từng
bit được đánh địa chỉ. 8051 có thể xoá, lập, lấy phần bù, kiểm tra, di chuyển, và
thực hiện các phép toán logic trên từng bit.
- Tập lệnh của 8051 được thiết kế nhằm tối ưu cả độ dài của mã lệnh và
tốc độ thực hiện. Hầu hết các lệnh có độ dài 1 byte, một số 2 byte và 3 byte là rất
ít. Các lệnh thực hiện trong 1 hoặc 2 chu kỳ máy, chỉ có nhân và chia là thực
hiện trong 4 chu kỳ máy.
- Có 8 kiểu định địa chỉ:
+ Thanh ghi (register).
+ Trực tiếp (direct).
+ Gián tiếp (indirect).
+ Tức thời (immediate).
+ Tương đối (relative).
+ Tuyệt đối (absolute).
+ Dài (long).
+ Chỉ số (indexed).
- Tổng số lệnh là 111. 111 lệnh chia thành 5 nhóm :
+ Tính toán số học.
+ Tính toán logic (cho biến kiểu byte).
+ Chuyển dữ liệu.
- 8 -
+ Thực hiện trên bit.
+ Lệnh rẽ nhánh chương trình và điều khiển.
1.6. Bộ đếm/bộ định thời
8051 có hai bộ định thời là Timer 0 và Timer 1. Cả hai bộ định thời đều
có độ dài 16 bit. Do 8051 có cấu trúc 8 bit, nên mỗi bộ định thời được truy cập
dưới dạng hai thanh ghi độc lập là byte thấp và byte cao.
- Thanh ghi của bộ Timer 0: Thanh ghi 16 bit của bộ Timer 0 được truy
cập theo 2 byte là byte thấp và byte cao. Thanh ghi byte thấp được gọi là TL0
(Timer 0 Low byte) và thanh ghi byte cao là TH0 (Timer 0 High byte). Các
thanh ghi này có thể đọc và truy cập trực tiếp như mọi thanh ghi khác.
Hình 3: Thanh ghi của bộ định thời Timer 0.
- Thanh ghi của bộ Timer 1: Bộ định thời Timer 1 cũng dài 16 bit và
thanh ghi 16 bit cũng được chia ra thành hai byte là TL1 và TH1. Các thanh ghi
này được truy cập và được đọc giống như các thanh ghi của bộ Timer 0.
Hình 4: Thanh ghi của bộ định thời Timer 1.
- Thanh ghi chế độ của bộ định thời TMOD: Cả hai bộ định thời đều dùng
chung một thanh ghi được gọi là TMOD để thiết lập các chế độ làm việc khác
nhau của bộ định thời. Thanh ghi TMOD là thanh ghi 8 bit gồm có 4 bit thấp
dành cho bộ Timer 0 và 4 bit cao dành cho Timer 1. Trong đó hai bit thấp của
chúng dùng để thiết lập chế độ của bộ định thời, còn hai bit cao dùng để xác
định phép toán.
Hình 5: Thanh ghi TMOD.
+ Các bit M0, M1: Là các bit chế độ dùng để chọn chế độ 0, 1 và 2
của các bộ Timer 0 và Timer 1.
M1 M0 Chế
độ
Chế độ hoạt động
0 0 0 Chế độ bộ định thời 13 bit. Bộ định thời/bộ đếm 8 bit,
định tỷ lệ trước 5 bit.
0 1 1 Chế độ bộ định thời 16 bit, không định tỷ lệ trước.
1 0 2 Chế độ 8 bit tự nạp lại. THx lưu giá trị sẽ tự nạp vào
TLx mỗi khi tràn.
 D15 D14 D13 D12 D11 D10 D9 D8
TH0
 D7 D6 D5 D4 D3 D2 D1 D0
TL0
 D15 D14 D13 D12 D11 D10 D9 D8
TH1
 D7 D6 D5 D4 D3 D2 D1 D0
TL1
(MSB)
 GATE C/T M1 M0
Timer1
 GATE C/T M1 M0
Timer0
(MSB)
- 9 -
1 1 3 Chế độ bộ định thời chia tách
Bảng 3: Các chế độ hoạt động của bộ định thời.
1.7. Ngắt
- 8051 có 5 ngắt dành cho người dùng:
+ Hai ngắt dành cho bộ định thời Timer 0 và Timer 1.
+ Hai ngắt phần cứng dành cho các thiết bị bên ngoài nối tới chân
INT0 và INT1 của cổng P3.
+ Truyền thông nối tiếp có một ngắt dành cho cả thu lẫn phát.
Ngắt Địa chỉ ROM Chân
Bật lại nguồn (RESET) 0000 9
Ngắt phần cứng ngoài (INT0) 0003 12 (P3.2)
Ngắt bộ Timer0 (TF0) 000B
Ngắt phần cứng ngoài 1 (INT1) 0013 13 (P3.3)
Ngắt bộ Timer1 (TF1) 001B
Ngắt COM nối tiếp (RI và TI) 0023
Bảng 4: Bảng vector ngắt của 8051.
- Cho phép và cấm ngắt: Các ngắt phải được cho phép bằng phần mềm để
bộ vi điều khiển có thể đáp ứng được. Thanh ghi cho phép ngắt IE (Interrupt
Enable) chịu trách nhiệm về việc cho phép (không che) và cấm (che) các ngắt.
Hình 6: Thanh ghi cho phép ngắt IE.
+ EA: Nếu EA  ... ¸nh gi¸ kÕt qu¶ vµ hiÖu chØnh thªm.
==> Ta xÐt bµi to¸n 2: thiÕt lËp bé ®Õm sö dông T0 vµ hiÓn thÞ 7 thanh lµ bé
®Õm tõ 0000 - 9999 - 0000 :
Bµi to¸n nµy sÏ n©ng ®é phøc t¹p lªn so víi bµi1.
Trong bµi to¸n nµy cÇn ph¶i sö dông ph­¬ng ph¸p quÐt led 7 thanh.
Code for test 2:
..
// Chuong trinh lap trinh voi bo dem T1 cua vdk voi hien thi 7 thanh bo dem
0000-9999-0000
#include 
long code1, dem;
- 104 -
#define on 1 // muc logic 1 (+5v)
#define off 0 // muc logic 0 (0v)
// ----- khai bao cac bien cuc bo...
 long y1,y2,y3,y4,x,n;
long k1,k1_tg,k2,k3,k4,code_led1;
 int j=1,i=1;
 long n_tg1, n_tg2,bien=0;
/* --- dinh nghia cac bit dung------*/
 sbit led1 = P0^3;
 sbit led2 = P0^2;
 sbit led3 = P0^1;
 sbit led4 = P0^0;
//=------------Chuong trinh con chuyen so thap phan sang ma led 7 thanh-------//
void decode_led7seg1(unsigned char number1)
// chuyen sang ma led ko co dau cham dp.
{
 switch (number1)
 {
 case 0: {code1=0xc0;break;}
 case 1: {code1=0xf9;break;}
 case 2: {code1=0xa4;break;}
 case 3: {code1=0xb0;break;}
 case 4: {code1=0x99;break;}
 case 5: {code1=0x92;break;}
 case 6: {code1=0x82;break;}
 case 7: {code1=0xf8;break;}
 case 8: {code1=0x80;break;}
 case 9: {code1=0x90;break;}
 }
}
 //---------------Chuong trinh tao tre-------------------//
 void delay(long tg) // chuong trinh tre thoi gian.
 {
 long n1; // khai bao bien cuc bo.
 for (n1=0;n1<tg;n1++)// vong lap time lan.
 {
 ; // khong thuc hien gi ca !!!
 }
 }
 //---------------------//
 void nhap(void)
 {
 TH0=0xf0;
- 105 -
 TL0=0x20;
 }
//-----------Chuong trinh phuc vu ngat timer0-------------//
 void timer0(void) interrupt 1 //Ngat timer 0
 { //---------vong quet 1 cho led1.
 switch (j)
{
 case 1:
 {
 j++;
 P1=y1; // dua du lieu ra led1
led1=on;
 led2=off;
 led3=off;
 led4=off;
 nhap();
 break;
 }
//---------Vong quet 2 cho led2.-------//
case 2:
 {
 j++;
 P1=y2; // dua du lieu ra led2
led2=on;
 led1=off;
 led3=off;
 led4=off;
 nhap();
 break;
 }
//--------Vong quet 3 cho led3--------//
case 3:
 {
 j++;
 P1=y3; // dua du lieu ra led3
led3=on;
 led2=off;
 led1=off;
 led4=off;
 nhap();
 break;
 }
//--------Vong quet 4 cho led4---------//
- 106 -
case 4:
 {
 P1=y4; // dua du lieu ra led4
led4=on;
 led2=off;
 led3=off;
 led1=off;
 nhap();
 j=1;
 break;
 }
 } // end of switch
 }
/*
--- Voi kit thi ma led la: tuong ung voi cac so tu 0-->9
 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h,080h,090h
*/
//---------------------------------------------------------------------------//
void main ( void) // chuong trinh chinh
 { // begin of main
 EA= 1; // cho phep ngat toan cuc.
 TMOD=0x51; // Timer 0 che do 16 bit not auto reload
ET0=1; // Cho phep ngat timer 0
TH0=0;
 TL0=0;
 nhap();
 TR0=1;
 // ------
 TL1=0;
 TH1=0;
 TR1=1; // start counter
 for(;;)
 {
 if ( TF1==0)
 {
 n=TH1*255+TL1;
 //-------phan tach n ra thanh k1,k2,k3,k4.
 k1=n/1000;
 decode_led7seg1(k1);
 y1=code1;
 k2=(n-k1*1000)/100;
 decode_led7seg1(k2);
 y2=code1;
 k3=(n-k1*1000-k2*100)/10;
- 107 -
 decode_led7seg1(k3);
y3=code1;
 k4=(n-k1*1000-k2*100-k3*10);
decode_led7seg1(k4);
 y4=code1;
}
else {TF1=0;TH1=0;TL1=0;}
 } // end of while
 } // end of main
==> Ta xÐt bµi to¸n 3: thiÕt lËp bé ®Õm sö dông T0, hiÓn thÞ 7 thanh sử dụng
ngắt timer1 và hiển thị đồng thời trên LCD bé ®Õm sản phẩm trên băng tải tõ
0000 - 9999 - 0000 :
Bài toán này ta xây dựng kế thừa của bài toán 2 ở trên. Các bạn phân tích bài
toán đặt ra cần phải hiển thị cả sản phẩm đếm được từ bộ counter0 trên LCD,
thông qua đây các bạn luyện được nhiều kĩ năng, đặc biệt là phối hợp các công
cụ đã được học từ các bài trên trong một ví dụ nhỏ nhưng tổng hợp.
Các bạn tự xây dựng software. Dưới đây là ví dụ về software cho bài toán.
Cũng như trong tinh thần của giáo trình là các bạn hãy tự xây dựng
cách giải quyết bài toán sau sử dụng các công cụ mô phỏng KIT để kiểm tra
kết quả. Không nên sử dụng ngay code minh hoạ của giáo trình !!!
Code for test 3:
#include 
#include 
#define on 1 // muc logic 1 (+5v)
#define off 0 // muc logic 0 (0v)
// ----- khai bao cac bien cuc bo...
 long code1,code2, dem;
 long y1,y2,y3,y4,x,n;
long k1,k1_tg,k2,k3,k4,code_led1;
 long lc1,lc2,lc3,lc4;
 int j=1;
/* --- dinh nghia cac bit dung------*/
 sbit led1 = P0^3;
 sbit led2 = P0^2;
 sbit led3 = P0^1;
 sbit led4 = P0^0;
sfr LCDdata = 0xA0;// Cong 2 , 8 bit du lieu P0 co dia chi 0x80, P1 0x90 , P2
0xA0
sbit BF = 0xA7; // Co ban bit 7 cua p2
 sbit RS = P3^7;
 sbit RW = P3^6;
- 108 -
 sbit EN = P3^5;
//=------------Chuong trinh con chuyen so thap phan sang ma led 7 thanh-------//
void decode_led7seg1(unsigned char number1)
// chuyen sang ma led ko co dau cham dp.
{
 switch (number1)
 {
 case 0: {code1=0xc0;break;}
 case 1: {code1=0xf9;break;}
 case 2: {code1=0xa4;break;}
 case 3: {code1=0xb0;break;}
 case 4: {code1=0x99;break;}
 case 5: {code1=0x92;break;}
 case 6: {code1=0x82;break;}
 case 7: {code1=0xf8;break;}
 case 8: {code1=0x80;break;}
 case 9: {code1=0x90;break;}
 }
}
/*------chuyen sang ma ASCII cho LCD--------*/
void decode_LCD(unsigned char number2)
{
 switch (number2)
 {
 case 0: {code2='0';break;}
 case 1: {code2='1';break;}
 case 2: {code2='2';break;}
 case 3: {code2='3';break;}
 case 4: {code2='4';break;}
 case 5: {code2='5';break;}
 case 6: {code2='6';break;}
 case 7: {code2='7';break;}
 case 8: {code2='8';break;}
 case 9: {code2='9';break;}
 }
}
/*---------Cac chuong trinh con cua lcd ------*/
//---------------Chuong trinh con kiem tra su san sang cua lcd----------------;
void wait(void)
{
long n = 0;
EN=1;// Dua chan cho fep len cao
RS=0;// Chon thanh ghi lenh
- 109 -
RW=1;// Doc tu LCD
LCDdata=0xff;// Gia tri 0xFF
while(BF){n++; if(n>110) break;}// Kiem tra co ban
// Neu ban dem n den 100 roi thoat khoi while
EN=0;// Dua xung cao xuong thap de chot
RW=0;// Doc tu LCD
}
//------------------Chuong trinh con thiet lap lenh cho LCD----------------------;
void LCDcontrol(unsigned char x)
{
EN=1;// Dua chan cho fep len cao
RS=0;// Chon thanh ghi lenh
RW=0;// Ghi len LCD
LCDdata=x;// Gia tri x
EN=0;// Xung cao xuong thap
wait();// Doi LCD san sang
}
//---------------chuong trinh con thiet lap mot so thong so cua lcd---------------;
void LCDinit(void)
{
LCDcontrol(0x38);// 2 dong va ma tran 5x7
LCDcontrol(0xc0);
LCDcontrol(0x0e);// Bat con tro
LCDcontrol(0x01);// Xoa man hinh
}
//------------------Chuong trinh con thiet lap dulieu cho LCD----------------------;
void LCDwrite(unsigned char c)
{
EN=1;// Cho fep muc cao
RS=1;// Ghi du lieu
RW=0;// Ghi len LCD
LCDdata=c;// Gia tri C
EN=0;// Xung cao xuong thap
wait();// Cho
}
/*--------------------------------------------*/
 void nhap(void)
 {
 TH1=0xf0;
 TL1=0x20;
 }
//-----------Chuong trinh phuc vu ngat timer0-------------//
 void timer1(void) interrupt 3 //Ngat timer 0
 { //---------vong quet 1 cho led1.
- 110 -
 switch (j)
{
 case 1:
 {
 j++;
 P1=y1; // dua du lieu ra led1
led1=on;
 led2=off;
 led3=off;
 led4=off;
 nhap();
 break;
 }
//---------Vong quet 2 cho led2.-------//
case 2:
 {
 j++;
 P1=y2; // dua du lieu ra led2
led2=on;
 led1=off;
 led3=off;
 led4=off;
 nhap();
 break;
 }
//--------Vong quet 3 cho led3--------//
case 3:
 {
 j++;
 P1=y3; // dua du lieu ra led3
led3=on;
 led2=off;
 led1=off;
 led4=off;
 nhap();
 break;
 }
//--------Vong quet 4 cho led4---------//
case 4:
 {
 P1=y4; // dua du lieu ra led4
led4=on;
 led2=off;
 led3=off;
- 111 -
 led1=off;
 nhap();
 j=1;
 break;
 }
 } // end of switch
 }
/*
--- Voi kit thi ma led la: tuong ung voi cac so tu 0-->9
 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h,080h,090h
*/
//---------------------------------------------------------------------------//
void main ( void) // chuong trinh chinh
 { // begin of main
 EA= 1; // cho phep ngat toan cuc.
 TMOD=0x15; // Timer 1 che do 16 bit, t0 counter 16 bit
ET1=1; // Cho phep ngat timer 0
nhap();
 TR1=1;
 // ------
 TL0=0;
 TH0=0;
 TR0=1; // start counter
 /*---------------Doan chuong trinh cho LCD----*/
LCDinit();
LCDwrite('S');
LCDwrite('o');
LCDwrite(' ');
LCDwrite('s');
LCDwrite('a');
LCDwrite('n');
LCDwrite(' ');
LCDwrite('p');
LCDwrite('h');
LCDwrite('a');
LCDwrite('m');
LCDwrite(':');
/*--------------------------------------------*/
 while(1)
 {
if ( TF0==0)
 {
- 112 -
 n=TH0*256+TL0;
 //-------phan tach n ra thanh k1,k2,k3,k4.
 k1=n/1000;
 decode_led7seg1(k1);
y1=code1;
 decode_LCD(k1);
lc1=code2;
 k2=(n-k1*1000)/100;
 decode_led7seg1(k2);
y2=code1;
 decode_LCD(k2);
 lc2=code2;
 k3=(n-k1*1000-k2*100)/10;
 decode_led7seg1(k3);
 y3=code1;
 decode_LCD(k3);
 lc3=code2;
k4=(n-k1*1000-k2*100-k3*10);
 decode_led7seg1(k4);
y4=code1;
 decode_LCD(k4);
lc4=code2;
 LCDcontrol(0x8c);
 LCDwrite(lc1); // hien thi len LCD so hang nghin.
 LCDwrite(lc2); // hien thi len LCD so hang tram.
 LCDwrite(lc3); // hien thi len LCD so hang chuc.
 LCDwrite(lc4); // hien thi len LCD so hang dvi.
}
else {TF0=0;TH0=0;TL0=0;}
 } // end of while
 } // end of main
- 113 -
Bài 8: Điều khiển tốc độ động cơ, điều khiển quá trình với băng tải.
8.1.Điều khiển tốc độ động cơ một chiều
Sö dông bé ®Þnh thêi cïng ng¾t cña nã linh ho¹t c¸c b¹n sÏ cã rÊt nhiÒu
øng dông thùc tÕ cã ý nghÜa nh­ viÖc lËp tr×nh cho hÖ thèng m¹ch cña m¹ch ch÷
ch¹y qu¶ng c¸o sö dông led ma trËn. Hay ®iÒu khiÓn tèc ®é cña ®éng c¬ mét
chiÒu.
Vµ ®©y chÝnh lµ ph­¬ng ph¸p x©y dùng viÖc ®iÒu chÕ ®é réng xung
(PWM) b»ng phÇn mÒm.
Ta cã s¬ ®å m¹ch ®iÒu khiÓn ®éng c¬ nh­ sau:
Trong s¬ ®å trªn xung vu«ng do vi ®iÒu khiÓn t¹o ra sÏ ®i ®iÒu khiÓn ®Ó
më van ( tran) vµ viÖc ®ãng më tran ( b¨m xung) sÏ t¹o ra mét ®iÖn ¸p Utb ®Æt
lªn ®éng c¬. Gi¸ trÞ ®iÖn ¸p nµy sÏ ¶nh h­ëng tíi tèc ®é quay.
Ta cã c«ng thøc gÇn ®óng nh­ sau:
 Utb = Umax( T1/T)
Trong c«ng thøc nµy Umax lµ gi¸ trÞ ®iÖn ¸p ®Æt trªn van, cßn T1 lµ thêi
gian tån t¹i møc 1 cña xung, T lµ chu kú cña xung víi hÇu hÕt c¸c van lµ 1000us
( f=1khz ).
T vµ Umax lµ cè ®Þnh do ®ã khi thay ®æi T1 trong kho¶ng tõ 0 T th× sÏ
lµm cho Utb thay ®æi gi¸ trÞ tõ 0 – Umax vµ Utb cµng lín ®éng c¬ quay cµng
nhanh, ®éng c¬ quay lín nhÊt khi T1 = T vµ khi ®ã Utb = Umax.
chÝnh viÖc thay ®æi T1 sÏ lµm thay ®æi tèc ®é ®éng c¬, vµ ta thay ®æi T1 vµ t¹o ra
xung th«ng qua viÖc sö dông bé ®Þnh thêi vµ ng¾t cña nã.
 §©y lµ ph­¬ng ph¸p ®iÒu chÕ ®é réng xung (PWM)
- 114 -
Tạo xung tần số 1Khz Chu kì = 1/103 = 0,001 giây= 1 mili giây=1000
uS= 1000 chu kì máy. Với 10 cấp tốc độ, tức là bạn phải tạo ra được xung 10%,
20%, 30%, 40%, , 90%, 100%. 1 xung như sau:
5V
0V
T : Chu kì
 1000 miro giây.
Khoảng thời gian xung kéo dài 5V là T1. Xung 10% tức là T1/ T= 10%=1/10.
Xung 20% T2/T=2/10PWM(Thay đổi độ rộng xung)
8.2. Điều khiển tốc độ động cơ theo quá trình.
// Bai toan 2------------------------------------
// bai toan dieu khien dong co theo qua trinh dinh truoc.
S¬ ®å m¹ch ®iÒu khiÓn tèc ®é ®éng c¬ mét chiÒu cã ®¶o chiÒu:
Ta cã b¶ng ch©n lý cña m¹ch ®iÒu khiÓn ®éng c¬
Bit1(Fet) Bit2(r¬le) KÕt qu¶
0 0 Quay ng­îc
- 115 -
0 1 Quay thuËn
1 0 Dõng
1 1 Dõng
Trong bµi to¸n nµy ta xÐt tèc ®é V1= 50% Vmax ( tèc ®é cùc ®¹i ) cßn
V2= 70% Vmax.
XuÊt ph¸t tõ c«ng thøc gÇn ®óng : Utb= Umax(T1/T) Víi T= 1000us ( chän f =1
khz).
Dã ®ã víi V1 = 0.5Umax = Umax(T1_1/T) T1_1= T/2 = 500us.
Víi V2= 0.7Umax = Umax(T1_2/T) T1_2 = 0.7T = 700us.
Tõ ®©y ta sÏ sö dông timer 1 cho viÖc ®iÒu chÕ ®é réng xung.
Nªn ta cã 4 ch­¬ng tr×nh con nhËp gi¸ trÞ cho timer1 nh­ sau:
/*--------------------------------Nhap gia tri voi V1--------*/
void nhapV1-muc1 (void)
 {
 TH1 = 0xfe ;
 TL1 = 0x0c ;
 }
//-----------------------//
void nhapV1-muc0 (void)
 {
TH1 = 0xfe ;
 TL1 = 0x0c ;
 }
//-----------------------//
/*--------------------------------Nhap gia tri voi V2--------*/
void nhapV2_muc1(void)
 {
 TH1 = 0xfd ;
 TL1 = 0x44 ;
 }
//-----------------------//
void nhapV2_muc0(void)
 {
 TH1 = 0xfe ;
 TL1 = 0xd4 ;
 }
//-----------------------//
Code for ex2:
/*----------------
Bai toan dieu khien toc do dong co theo qua trinh
-----------------*/
#include 
#define on 1;
#define off 0;
- 116 -
sbit bit1 =P1^0;
sbit bit2 =P1^1;
sbit sensor1 = P3^0;
sbit sensor3 = P3^1;
sbit sensor_dem = P3^4;
sbit start = P3^5; // ctac start
int check1, y1=0,y2=0;
/*-------------cac chuong trinh tao toc do ----------*/
/*----------------------Nhap gia tri voi V1--------*/
void nhap11 (void) // tao muc logic 1 cho v1
 {
 TH1 = 0xfe ;
 TL1 = 0x0c ;
 }
//-----------------------//
void nhap10 (void) // tao muc logic 0 cho v1
 {
 TH1 = 0xfe ;
 TL1 = 0x0c ;
 }
//-----------------------//
/*----------------------Nhap gia tri voi V2--------*/
void nhap21(void) // tao muc logic 1 cho v2
 {
 TH1 = 0xfd ;
 TL1 = 0x44 ;
 }
//-----------------------//
void nhap20(void) // tao muc logic 0 cho v2
 {
 TH1 = 0xfe ;
 TL1 = 0xd4 ;
 }
void stop (void)
{
TR1=0; // cam t1
 ET1=0;
 bit1= 1 ;
bit2= 1 ;
 }
/*---------------Chuong trinh stop gap--------------------*/
void EX0_int (void) interrupt 0
{
 while (1)
- 117 -
 {
 stop();
 }
}
/*******------ chuong trinh pvu ngat T1-----******/
void timer1 (void) interrupt 3
{ TF1=0; // xoa co tran
 switch(check1)
 {
case 1: // quay thuan... trai -->phai
 {
 /*-----tao muc 1----*/
 if (y1==0)
 {
 y1++;
 bit1=0 ; // dk FET
 bit2=1 ; // dk Role
 nhap11(); // tao tre muc 1voi V1
 break;
 }
 /*-----tao muc 0----*/
 if (y1==1)
 {
 y1=0;
 bit1= 1 ;
 bit2= 1 ;
 nhap10(); // tao tre muc 0 voi V1
 break;
 }
 break;
 }
case 2: // quay nguoc... phai -->trai
 {
 /*-----tao muc 1----*/
 if (y2==0)
 {
 y2++;
 bit1= 0 ;
 bit2= 0 ;
 nhap21(); // tao tre muc 1 voi V2
 break;
 }
 /*-----tao muc 0----*/
 if (y2==1)
- 118 -
 {
 y2=0;
 bit1= 1 ;
 bit2= 0 ;
 nhap20(); // tao tre muc 0 voi V2
 break;
 }
 break;
 }
}// end of switch
} // end of main
/*------------Chuong trinh chinh --------------*/
void main(void)
{
EA=1;
 ET1=1;
 EX0=1 ; // cho phep ngat ngoai 0 dung lam Stop.
 TMOD =0x10; // timer 1 voi ngat 16 bit
 y1=y2=0; // khoi dong cac bien trang thai
// bat dau quay dong co
 if ( start==0)
 { // bat dau dong co quay thuan voi V1
 check1=1; // dong co quay thuan
 TR1= 1;
 while(1)
 {
 if(sensor3==0)
 {
 stop(); // dung dong co lai
 check1=2; // de dong co quay nguoc
 ET1=1;
TR1=1; // dong co bat dau quay nguoc
 }
 if(sensor1==0)
 {
 stop(); // dung dong co lai
 check1=1; // de dong co quay nguoc
 ET1=1;
 TR1=1; // dong co bat dau quay nguoc
 }
}
 }
}
- 119 -
S¬ ®å thuËt to¸n:
Trong bµi to¸n nµy ta sö dông hai sensor1(p3.0) vµ sensor3 (p3.1)
Mét c«ng t¾c start (P3.5) vµ c«ng t¾c stop víi ng¾t ngoµi 0.
Yªu cÇu cña bµi to¸n lµ ®k ®éng c¬ víi hai cÊp tèc ®é trªn theo qu¸ tr×nh trong
h×nh vÏ.
Sau ®©y lµ gi¶i thuËt cña bµi to¸n:
- 120 -
- 121 -
 Hoµn toµn c¸c b¹n cã thÓ ph¸t triÓn bµi to¸n nµy :
§ã lµ thªm c¶ phÇn ®Õm s¶n phÈm ch¹y trªn b¨ng t¶i vµ thÓ hiÖn kÕt qu¶ ®Õm
trªn led 7 thanh hay trªn LCD.

File đính kèm:

  • pdfbai_giang_vi_dieu_khien_luu_the_manh.pdf