You are on page 1of 118

TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT VĨNH LONG

KHOA ĐIỆN - ĐIỆN TỬ

THỰC HÀNH LẬP TRÌNH C CHO


VI ĐIỀU KHIỂN MCS51 VÀ ARDUINO

Biên soạn: Đặng Thành Tựu


Vĩnh Long, tháng 10 năm 2019
Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Mục lục
Phần 1: LẬP TRÌNH VI ĐIỀU KHIỂN MCS51 ...............................................................................................5
Bài thực hành số 1: LẬP TRÌNH ĐIỀU KHIỂN LED ĐƠN .......................................................................6
1. MỤC ĐÍCH – YÊU CẦU: ...................................................................................................................6
2. CƠ SỞ LÝ THUYẾT: .........................................................................................................................6
3. TRÌNH TỰ THỰC HIỆN: ..................................................................................................................7
Bài thực hành số 2: GIAO TIẾP NÚT NHẤN VÀ RELAY .......................................................................10
1. MỤC ĐÍCH – YÊU CẦU: .................................................................................................................10
2. CƠ SỞ LÝ THUYẾT : .......................................................................................................................10
3. TRÌNH TỰ THỰC HIỆN: ................................................................................................................10
Bài thực hành số 3: LẬP TRÌNH ĐIỀU KHIỂN LED 7 ĐOẠN ...............................................................14
1. MỤC ĐÍCH – YÊU CẦU...................................................................................................................14
2. CƠ SỞ LÝ THUYẾT .........................................................................................................................14
3. TRÌNH TỰ THỰC HIỆN: ................................................................................................................14
Bài thực hành số 4: LẬP TRÌNH ĐIỀU KHIỂN LED MA TRẬN ..........................................................19
1. Muc đích – yêu cầu: ...............................................................................................................................19
2. CƠ SỞ LÝ THUYẾT:............................................................................................................................19
3. TRÌNH TỰ THỰC HIỆN......................................................................................................................20
Bài thực hành số 5: LẬP TRÌNH ĐIỀU KHIỂN ĐÓNG/CẮT ĐỘNG CƠ DC .......................................24
1. MỤC ĐÍCH – YÊU CẦU: .................................................................................................................24
2. CƠ SỞ LÝ THUYẾT: .......................................................................................................................24
3. TRÌNH TỰ THỰC HIỆN: ................................................................................................................24
Bài thực hành số 6: LẬP TRÌNH ĐIỀU KHIỂN TỐC ĐỘ ĐỘNG CƠ DC .............................................27
1. MỤC ĐÍCH – YÊU CẦU: .....................................................................................................................27
2. CƠ SỞ LÝ THUYẾT:............................................................................................................................27
3. TRÌNH TỰ THỰC HIỆN: ....................................................................................................................27
Bài thực hành số 7: LẬP TRÌNH HIỂN THỊ LCD.....................................................................................32
1. MỤC ĐÍCH – YÊU CẦU: .....................................................................................................................32
2. CƠ SỞ LÝ THUYẾT:............................................................................................................................32
3. TRÌNH TỰ THỰC HIỆN: ....................................................................................................................33
4. BÀI TẬP: ................................................................................................................................................38
Bài thực hành số 9: LẬP TRÌNH ĐẾM SẢN PHẨM .................................................................................39
1. MỤC ĐÍCH – YÊU CẦU: .....................................................................................................................39
2. CƠ SỞ LÝ THUYẾT:............................................................................................................................39
3. TRÌNH TỰ THỰC HIỆN: ....................................................................................................................39

Khoa Điện – Điện tử 2


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bài thực hành số 10: LẬP TRÌNH ĐỒNG HỒ SỐ HIỂN THỊ LED 7 ĐOẠN .........................................44
1. MỤC ĐÍCH – YÊU CẦU: .....................................................................................................................44
2. CƠ SỞ LÝ THUYẾT:............................................................................................................................44
3. TRÌNH TỰ THỰC HIỆN: ....................................................................................................................44
Bài thực hành số 11: LẬP TRÌNH ĐO LƯỜNG VÀ HIỂN THỊ NHIỆT ĐỘ LÊN LCD .......................52
1. MỤC ĐÍCH – YÊU CẦU: .....................................................................................................................52
2. CƠ SỞ LÝ THUYẾT:............................................................................................................................52
3. TRÌNH TỰ THỰC HIỆN......................................................................................................................56
Phần 2: Lập trình Arduino ...............................................................................................................................63
Bài thực hành số 1: LẬP TRÌNH ĐIỀU KHIỂN LED ĐƠN .....................................................................64
1. Mục đích: ............................................................................................................................................64
2. Yêu cầu: ..............................................................................................................................................64
3. Kết nối phần cứng: .............................................................................................................................67
4. Lưu đồ giải thuật và chương trình: ..................................................................................................68
5. Bài tập: ................................................................................................................................................70
Bài thực hành số 2: LẬP TRÌNH GIAO TIẾP LED ĐƠN VÀ NÚT NHẤN ............................................72
1. Mục đích: ............................................................................................................................................72
2. Yêu cầu: ..............................................................................................................................................72
3. Kết nối phần cứng:.............................................................................................................................74
4. Lưu đồ giải thuật và chương trình: ..................................................................................................75
5. Bài tập: ................................................................................................................................................75
Bài thực hành số 3: LẬP TRÌNH ARDUINO ĐIỀU KHIỂN 8 LED ĐƠN ..............................................77
1. Mục đích: ............................................................................................................................................77
2. Yêu cầu: ..............................................................................................................................................77
3. Kết nối phần cứng:.............................................................................................................................78
4. Lưu đồ giải thuật và chương trình: ..................................................................................................79
5. Bài tập: ................................................................................................................................................80
Bài thực hành số 4: LẬP TRÌNH ARDUINO ĐIỀU KHIỂN LED 7 ĐOẠN ...........................................81
1. Mục đích: ............................................................................................................................................81
2. Yêu cầu: ..............................................................................................................................................81
3. Kết nối phần cứng:.............................................................................................................................81
4. Lưu đồ giải thuật và chương trình: ..................................................................................................82
5. Bài tập: ................................................................................................................................................85
Bài thực hành số 5: LẬP TRÌNH ARDUINO ĐỌC GIÁ TRỊ ANALOG ................................................86
1. Mục đích: ............................................................................................................................................86

Khoa Điện – Điện tử 3


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

2. Yêu cầu: ..............................................................................................................................................86


3. Kết nối phần cứng:.............................................................................................................................86
4. Lưu đồ giải thuật và chương trình: ..................................................................................................87
5. Bài tập: ................................................................................................................................................88
Bài thực hành số 6: LẬP TRÌNH ĐIỀU KHIỂN LED MA TRẬN ...........................................................89
1. Mục đích: ............................................................................................................................................89
2. Yêu cầu: ..............................................................................................................................................89
3. Kết nối phần cứng:.............................................................................................................................89
4. BÀI TẬP .............................................................................................................................................91
Bài thực hành số 7: LẬP TRÌNH ĐIỀU KHIỂN ĐỘNG CƠ DC..............................................................92
1. Mục đích: ............................................................................................................................................92
2. Yêu cầu: ..............................................................................................................................................92
3. Kết nối phần cứng:.............................................................................................................................92
4. Lưu đồ giải thuật và chương trình: ..................................................................................................93
5. Bài tập: ................................................................................................................................................94
Bài thực hành số 8: LẬP TRÌNH GIAO TIẾP ARDUINO VỚI LCD......................................................95
1. Mục đích: ............................................................................................................................................95
2. Yêu cầu: ..............................................................................................................................................95
3. Kết nối phần cứng:.............................................................................................................................95
4. Lưu đồ giải thuật và chương trình: ..................................................................................................96
5. Bài tập: ................................................................................................................................................97
Bài thực hành số 9: LẬP TRÌNH ĐO NHIỆT ĐỘ MÔI TRƯỜNG DÙNG LM35 HIỂN THỊ LÊN LCD
VÀ SERIAL MONITOR. ..............................................................................................................................98
1. Mục đích: ............................................................................................................................................98
2. Yêu cầu: ..............................................................................................................................................98
3. Kết nối phần cứng:.............................................................................................................................98
4. Lưu đồ giải thuật và chương trình: ..................................................................................................98
5. Bài tập: ..............................................................................................................................................100
Phụ lục 1 : HƯỚNG DẪN CÀI ĐẶT MIKROC FOR 8051 .....................................................................101
Phụ lục 2 : HƯỚNG DẪN SỬ DỤNG MIKROC FOR 8051 ...................................................................105
Phụ lục 3 : CÁC LINH KIỆN THƯỜNG DÙNG KHI MÔ PHỎNG PROTEUS .................................112
Phụ lục 4: HƯỚNG DẪN SỬ DỤNG CƠ BẢN PHẦN MỀM Arduino IDE ..........................................115
Tài liệu tham khảo: ......................................................................................................................................118

Khoa Điện – Điện tử 4


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

PHẦN 1:
LẬP TRÌNH VI ĐIỀU KHIỂN MCS51

Khoa Điện – Điện tử 5


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bài thực hành số 1: LẬP TRÌNH ĐIỀU KHIỂN LED ĐƠN


1. MỤC ĐÍCH – YÊU CẦU:
1.1 Mục đích:
- Lập trình điều khiển từng Port, từng chân (pin) của vi điều khiển.
- Sử dụng lệnh: gán, dịch, và lập trình mảng.
1.2 Yêu cầu:
- Điều khiển được từng Port, từng pin vi điều khiển.
- Sử dụng thành thạo các phép toán gán, dịch, tạo và truy xuất mảng.
2. CƠ SỞ LÝ THUYẾT:

Sơ đồ nguyên lý và hình bố trí linh kiện của 32 con LED đơn trên KIT MC-1000
- 32 LED đơn chia làm 4 nhóm, mổi nhóm 8 led. Cực Katode của led nối xuống mass cực
Anod được nối ra các Pin Header thông qua điện trở 330Ω.
- Led sáng: Mức logic tích cực là 1 (5volt), led tắt: mức logic 0 (0volt).
Thực tế, tùy thuộc cách mắc LED mà mức logic tích cực có thể 0 hoặc 1.

LED D1 sáng mức 0.


P3.B7 = 0;

LED D2 sáng mức 1.


P2.B0 = 1;

Khoa Điện – Điện tử 6


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

3. TRÌNH TỰ THỰC HIỆN:


3.1 Yêu cầu đặt ra: Điều khiển 8 led sáng dần từ phải qua trái. Với thời gian dịch chuyển
là 0,5 giây.
3.2 Kết nối phần cứng:
Kết nối trên KIT: Dùng Jump bẹ 8 nối PORT2 với 8 LED đơn.

Mạch thực
tế trên KIT

U19
19 39
XTAL1 P0.0/AD0
38
P0.1/AD1
37
P0.2/AD2
18 36
XTAL2 P0.3/AD3
35
P0.4/AD4
34
P0.5/AD5
33
P0.6/AD6
9 32
RST P0.7/AD7

P2.0/A8
21
22
Mô phỏng
P2.1/A9
29
PSEN
P2.2/A10
P2.3/A11
23
24 trên Proteus
30 25
ALE P2.4/A12
31 26
EA P2.5/A13
27
P2.6/A14
28
P2.7/A15
1 10
P1.0/T2 P3.0/RXD
2
P1.1/T2EX P3.1/TXD
11 R1 R2 R3 R4 R5 R6 R7 R8
3 12 330 330 330 330 330 330 330 330
P1.2 P3.2/INT0
4 13
P1.3 P3.3/INT1
5 14
P1.4 P3.4/T0
6 15
P1.5 P3.5/T1
7
P1.6 P3.6/WR
16 D1 D2 D3 D4 D5 D6 D7 D8
8 17
P1.7 P3.7/RD
AT89C52

Khoa Điện – Điện tử 7


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

3.3. Giải thuật và viết chương trình.


Cách 1: Dùng phương pháp gán giá trị trực tiếp.
Cấu trúc: P2 = 0b00000011; hoặc P2 = 3; hoặc P2 = 0x03;
void main() {
while(1) {
p2=0; Tắc hết led
delay_ms(500);
p2=0b00000001; Sáng LED 1
delay_ms(500);
p2=0b00000011; Sáng LED 2
delay_ms(500);
p2=0b00000111; Sáng LED 3
delay_ms(500);
p2=0b00001111; Sáng LED 4
delay_ms(500);
p2=0b00011111; Sáng LED 5
delay_ms(500);
p2=0b00111111; Sáng LED 6
delay_ms(500);
p2=0b01111111; Sáng LED 7
delay_ms(500);
p2=0b11111111; Sáng LED 8
delay_ms(500); }}
Cách 2: Dùng lệnh dịch trái
Cấu trúc: P2 = P2<<1; hoặc P2<<=1;

Khoa Điện – Điện tử 8


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bắt đầu char i;


void main()
{
P2=0
while(1) Lặp vô tận

{
i=0
p2=0; Led tắt hết
i=0 for(i=0;i<8;i++) Chạy 8 lần
{p2++; Cho sáng led cuối
Tăng P2 delay_ms(500); Trễ 500ms
i<8 T Trễ p2<<=1; Dịch trái 1 bit
Dịch trái P2
}
F
}
Kết thúc }
Cách 3: Sử dụng mảng 1 chiều
Cấu trúc:
- Khai báo mãng: Kiểu mảng tên_mảng[số phần tử]={giá trị thứ 0, GT thứ 1,…};
- Truy xuất: m = tên_mảng[chỉ số mảng];
char i;
Bắt đầu
char maled[8]={1,3,7,15,31, Khai báo mảng
63,127,255}; maled có 8
i=0
void main() phần tử
{
i=0 while(1) {
for(i=0;i<8;i++)
Tăng P2 {delay_ms(500);
i<8 T Trễ p2=maled[i]; Gán P2 = mã
Dịch trái P2 } led thứ i
}
F
}
Kết thúc
3.4. Mô phỏng mạch điện cho các đoạn code trên.
3.5. Dùng mạch nạp để nạp đoạn code trên máy tính vào vi điều khiển.
3.6. Gắn vi điều khiển vào KIT, cấp nguồn chạy thực tế.
4. BÀI TẬP
4.1. Thực hiện lại yêu cầu với 16 LED.
4.2 Thiết kế phần cứng và lập trình điều khiển 8 LED sáng tắt, sáng dần, tắt dần.
4.3 Thiết kế phần cứng và lập trình điều khiển 16 LED sáng hình xếp quạt.
4.4 Thiết kế phần cứng và lập trình cho 32 LED xếp hình trái tim với 3 kiểu sáng khác nhau.

Khoa Điện – Điện tử 9


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bài thực hành số 2: GIAO TIẾP NÚT NHẤN VÀ RELAY


1. MỤC ĐÍCH – YÊU CẦU:
1.1 Mục dích:
- Lập trình nhập/xuất các PORT của vi điều khiển.
1.2 Yêu cầu:
- Kết nối được sơ đồ giao tiếp giữa vi điều khiển, phím ấn đơn, relay.
2. CƠ SỞ LÝ THUYẾT :
Cần xác định 2 vấn đề:
- Cách mắc phím ấn: đối với dòng MCS51, do có sẵn điện trở kéo lên tại các Port 1,2,3 cho
nên phím ấn sẽ được mắc nối mass (GND).
- Phân biệt 2 trạng thái phím ấn: hiện tại đang ấn và hiện tại không ấn.

Hiện tại không ấn, trạng thái pin P1.0 = 1

Hiện tại đang ấn, trạng thái pin P1.0 = 0


3. TRÌNH TỰ THỰC HIỆN:
3.1 Yêu cầu đặt ra:
Điều khiển 1 LED đơn bằng 2 phím nhấn thỏa yêu cầu:
+ Ấn SW1: LED sáng
+ Ấn SW2: LED tắt
3.2 Kết nối phần cứng:
+ Sơ đồ nối trên KIT:
- Dùng Jump bẹ nối PORT3 với LED đơn
- DùngJump bẹ 4 nối SW với P3.0 đến p3.3 trên PORT3 ( lưu ý nối vào trước PORT3
vị trí trước IC đệm)

Khoa Điện – Điện tử 10


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

+ Sơ đồ nguyên lý mô phỏng trên Proteus:


U20 U20
19 39 19 39
XTAL1 P0.0/AD0 XTAL1 P0.0/AD0
38 38
P0.1/AD1 P0.1/AD1
37 37
P0.2/AD2 P0.2/AD2
18 36 18 36
XTAL2 P0.3/AD3 XTAL2 P0.3/AD3
35 35
P0.4/AD4 P0.4/AD4
34 34
P0.5/AD5 P0.5/AD5
33 33
P0.6/AD6 P0.6/AD6
9 32 9 32
RST P0.7/AD7
RST P0.7/AD7
R9 21
R9
21 P2.0/A8
P2.0/A8 22
22 P2.1/A9 330
P2.1/A9 330 23
23 P2.2/A10
29
P2.2/A10
24 D9 29
PSEN P2.3/A11
24 D9
PSEN P2.3/A11 30 25
30 25 ALE P2.4/A12
ALE P2.4/A12 31 26
31 26 EA P2.5/A13
EA P2.5/A13 27
27 P2.6/A14
P2.6/A14 28
28 P2.7/A15 SW1
P2.7/A15 SW1
1 10
1 10 P1.0/T2 P3.0/RXD
P1.0/T2 P3.0/RXD 2 11
2 11 P1.1/T2EX P3.1/TXD
P1.1/T2EX P3.1/TXD 3 12
3 12 P1.2 P3.2/INT0
P1.2 P3.2/INT0 4 13
4 13 P1.3 P3.3/INT1
P1.3 P3.3/INT1 5 14
5 14 P1.4 P3.4/T0
6 15
6
P1.4 P3.4/T0
15 7
P1.5 P3.5/T1
16
SW2
7
P1.5 P3.5/T1
16
SW2 8
P1.6 P3.6/WR
17
P1.6 P3.6/WR P1.7 P3.7/RD
8 17
P1.7 P3.7/RD
AT89C52
AT89C52

Lúc ấn phím SW1 – LED sáng Lúc ấn phím SW2 – LED tắt

Khoa Điện – Điện tử 11


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

3.3 Giải thuật và viết chương trình


+ Giải thuật:

+ Chương trình:
#define sw1 P3.b0
#define sw2 P3.B3
#define led P2.b0
void main(){
led = 0;
while(1)
{ if(sw1==0) led=1;
if(sw2==0) led=0;}}
3.4 Mô phỏng đoạn code.
3.5 Dùng mạch nạp để nạp code vào vi điều khiển
3.6 Gắn vi điều khiển vào KIT, cấp nguồn chạy thực tế.
4. BÀI TẬP
4.1 Thực hiện lại chương trình với yêu cầu dùng 6 phím ấn điều khiển 2 LED đơn như sau:
ON1 OFF1 ON2 OFF2 ON OFF
LED1 Sáng Tắt Sáng Tắt
LED2 Sáng Tắt Sáng Tắt

Khoa Điện – Điện tử 12


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

4.2 Viết chương trình dùng 1 phím ấn điều khiển 1 LED đơn như sau:
- Mỗi khi ấn phím sẽ làm thay đổi trạng thái của LED.
Gợi ý: dùng chống dội phím và lệnh đảo trạng thái (hoặc đặt cờ báo trạng thái).
4.3 Thực hiện lại bài 4.2 với 2 phím ấn điều khiển 2 LED đơn.
4.4 Chương trình dùng 2 phím điều khiển 8 LED đơn như sau:
- Phím 1: mỗi lần nhấn có thêm 1 LED sáng
- Phím 2: mỗi lần nhấn sẽ tắt đi 1 LED.
4.5 Viết chương trình dùng 3 phím ấn điều khiển 8 LED đơn hoạt động như sau:
- Ấn phím 1: 8 LED chớp tắt xen kẻ.
- Ấn phím 2: 8 LED chạy sáng dần từ phải qua trái.
- Ấn phím 3: 8 LED sáng dạng sâu 3 đốt bò từ trái qua phải.
Lưu ý: khi 8 LED đang chạy mà ấn phím bất kỳ thì chương trình chuyển qua chạy chương
trình tương ứng ngay lập tức (không chờ chạy xong chương trình).

Khoa Điện – Điện tử 13


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bài thực hành số 3: LẬP TRÌNH ĐIỀU KHIỂN LED 7 ĐOẠN


1. MỤC ĐÍCH – YÊU CẦU
1.1. Mục đích:
- Mục đích điều khiển LED 7 đoạn.
- Sử dụng phương pháp quét để điều khiển 8 LED 7 đoạn.
1.2. Yêu cầu:
- Kết nối được sơ đồ mạch giữa vi điều khiển với LED 7 đoạn.
- Hiện thị thông tin lên 8 LED 7 đoạn bằng phương pháp quét
2. CƠ SỞ LÝ THUYẾT

- Để điều khiển 8 led 7 đoạn phải dùng: 8 đường dữ liệu 7 đoạn, 8 đường điều khiển
chọn LED.
- Tại mỗi một thời điểm ta chỉ cho 1 transistor dẫn và 7 transistor còn lại tắt.
- Với tốc độ gửi dữ liệu nhanh và mắt lưu ảnh nên chỉ nhìn thấy 8 led sáng cùng 1 lúc.
- Mã quét: mức logic 0 thì transistor dẫn, mức logic 1 thì transistor ngắt.
- Mã led 7 đoạn có hỗ trợ trong chương trình giao tiếp với KIT.

3. TRÌNH TỰ THỰC HIỆN:


3.1. Yêu cầu đặt ra: + Điều khiển 8 LED 7 đoạn hiện thị số 01234567.
+ Điều khiển 8 LED 7 đoạn hiện thị số 00 -99

Khoa Điện – Điện tử 14


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

3.2. Kết nối phần cứng:


+ Trên KIT thực hành
Dùng 2 Jump 8 nối PORT0 với DATA và PORT2 với SCAN của led 7 đoạn

+ Mô phỏng trên Proteus:


U1
19 39 A
XTAL1 P0.0/AD0
38 B
P0.1/AD1
37 C
P0.2/AD2
18 36 D
XTAL2 P0.3/AD3
35 E
P0.4/AD4
34 F
P0.5/AD5
33 G
P0.6/AD6
9 32 P
RST P0.7/AD7
21 1i
P2.0/A8
22 2i
P2.1/A9
23 3i
P2.2/A10
29 24 4i U2 U6
PSEN P2.3/A11 1o
2o
3o
4o
5o
6o
7o
8o
30 25 5i
G
C
D
A
B

P
F

ALE P2.4/A12
31 26 6i 1i 1o 5i 5o
EA P2.5/A13
27 7i
P2.6/A14
28 8i U3 U7
P2.7/A15 NOT NOT
1 10 2i 2o 6i 6o
P1.0/T2 P3.0/RXD
2 11 U4 U8
P1.1/T2EX P3.1/TXD
3 12
P1.2 P3.2/INT0 NOT NOT
4 13 3i 3o 7i 7o
P1.3 P3.3/INT1
5 14 U5 U9
P1.4 P3.4/T0
6 15
P1.5 P3.5/T1 NOT NOT
7 16 4i 4o 8i 8o
P1.6 P3.6/WR
8 17
P1.7 P3.7/RD
NOT NOT
AT89C52

Khoa Điện – Điện tử 15


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

3.3. Giải thuật và chương trình


a. Đếm từ 0 – 9
void main() {
P2.B0=0; // chọn LED thứ 0 sáng
while(1) {
P0=0xC0; // Hiện số 0
delay_ms(1000);
P0=0xF9; // Hiện số 1
delay_ms(1000);
P0=0xA4;// Hiện số 2
delay_ms(1000);
P0=0xB0;// Hiện số 3
delay_ms(1000);
P0=0x99;// Hiện số 3
delay_ms(1000);
P0=0x92;// Hiện số 4
delay_ms(1000);
P0=0x82; // Hiện số 5
delay_ms(1000);
P0=0xF8;// Hiện số 6
delay_ms(1000);
P0=0X80;// Hiện số 7
delay_ms(1000);
P0=0X90;// Hiện số 8
delay_ms(1000);
}
}

Khoa Điện – Điện tử 16


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

b. Đếm 00 – 99
+ Giải thuật

+Chương trình:
#define ledchuc P2.b0 // Chân điều khiển LED hàng chục
#define leddonvi P2.b1 // Chân điều khiển LED đơn vị
#define leddata P0 // port 0 xuất dữ liệu ra LED
// mã led 7 đoạn
char so1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void hienthi(char so, unsigned int time){ //hàm hiển thị
char chuc, donvi, i;
time = time / 10;
chuc = so / 10;
donvi = so % 10;
for(i=0;i<time;i++)
{ledchuc = 0;
leddata = so1[chuc];
delay_ms(10);
ledchuc = 1;

Khoa Điện – Điện tử 17


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

leddonvi = 0;
leddata = so1[donvi];
delay_ms(10);
leddonvi = 1;
}}
void main() {
while(1){
int c;
for(c=0;c<99;c++){ // c t?ng t? 0 - 99
hienthi(c,1000); // hiển thị biến c thời gian trễ là 1000
}
}}
3.4. Mô phỏng mạch điện và đoạn code trên.
3.5. Dùng mạch nạp để nạp đoạn code trên máy tính bvào vi điều khiển.
3.6. Gắn vi điều khiển vàp KIT, cấp nguồn chạy thực tế.
3.7. Thay đổi thời gian trể ( DELAY) đưa ra nhận xét:
- Khi tăng thời gian trể thì hiện tượng gì xãy ra? Vậy thời gian trể lớn nhất là bao
nhiêu để khắc phục hiện tượng đó ?
- Khi giảm thời gian trể thì hiện tượng gì xãy ra? Vậy thời gian trể nhỏ nhất là
bao nhiêu để khắc phục hiện tượng đó ?
- Xác định thời gian trể hợp lý nhất để 8 led sáng đều và rõ nhất?
3.8. Tại sao phải tắt hết các led sau mỗi lần hiển thị? Thử bỏ lệnh này tăng thời gian
làm trể để thấy rõ vấn đề hơn. Tác dụng của lệnh này loại là gì?
3.9. Hãy thay thế các giá trị HEX thành giá trị nhị phân.
3.10. Thực hiện lại yêu cầu trên sao cho 8 LED hiện thị từ 3 đến 9
4. BÀI TẬP
4.1. Viết trương trình điều khiển 8 LED hiện thị chữ DHSPKTVL.
4.2. Viết chương trình điều khiển LED 7 đoạn đếm từ 000 đến 999
4.3. Viết chương trình điều khiển 2 LED 7 đoạn đếm chính xác giây (00 đến 59) bằng
cách sử dụng Timer.
4.4. Thực hiện lại bài 4.3 với 4 LED 7 đoạn đém phút và giây.
4.5. Thực hiện tiếp bài 4.4 với 6 LED 7 đoạn đếm giờ phút giây.
4.6. Viết chương trình cho số 1 chạy từ trái sang phải trên 8 LED 7 đoạn.
4.7. Viết chương trình dùng 2 phím ấn điều khiển đếm 2 LED 7 đoạn như sau:
- Mỗi lần ấn phím INC thì LED 7 đoạn tăng lên 1 đơn vị, tối đa là 24.
- Mỗi lần ấn phím DEC thì LED 7 đoạn giame 1 đơn vị, tối đa là 0.

Khoa Điện – Điện tử 18


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bài thực hành số 4: LẬP TRÌNH ĐIỀU KHIỂN LED MA TRẬN


1. Muc đích – yêu cầu:
1.1. Mục đích:
Lập trình hiển thị ký tự lên led ma trận bằng phương pháp quét
1.2. Yêu cầu:
- Kết nối được sơ đổ mạch giữa LED ma trận và vi điều khiển 8051.
- Lập trình hiển thị chữ “A” lên LED ma trận 8x8 sử dụng phương pháp quét hàng.
2. CƠ SỞ LÝ THUYẾT:
- Cấu tạo LED ma trận là tập hợp các LED đơn được xếp thành các cột và các hàng.

Theo module LED ma trận trên KIT thực hành:

Khoa Điện – Điện tử 19


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

- Các hàng của LED ma trận được điều khiển bằng transsitor PNP nên mức logic tích
cực để đèn sáng cho cả hàng là mức 0.
- Các cột của LED ma trận để xuất dữ liệu, các cột của LED được nối đến Katod của
LED nên mức logic tích cực là mức 0.
 dùng phương pháp quét để hiển thị lên LED ma trận.
Để hiện thị chữ “A”:
- Cần xuất dữ liệu lên các cột.
- Điều khiển hiển thị từng hàng.

3. TRÌNH TỰ THỰC HIỆN


3.1. Yêu cầu đặt ra: Hiển thị chữ A trên LED ma trận

Khoa Điện – Điện tử 20


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

3.2.Kết nối phần cứng:


+ Kết nối trên KIT thực hành:
- Dùng Jump bẹ 8 kết nối PORT1 với ROW-SCAN
- Dùng Jump bẹ 8 kết nối PORT2 với COL-DATA

+ Mô phỏng trên Proteus:

U10

H1
H2
H3
H4
H5
H6
H7
H8
19 39
XTAL1 P0.0/AD0
38
P0.1/AD1
37
P0.2/AD2
18 36
XTAL2 P0.3/AD3
35
P0.4/AD4
34
P0.5/AD5
33
P0.6/AD6
9 32
RST P0.7/AD7
21 C1 U11
P2.0/A8
22 C2
P2.1/A9
23 C3 C1
P2.2/A10
29 24 C4 U12
PSEN P2.3/A11
30 25 C5
ALE P2.4/A12 NOT
31 26 C6 C2
EA P2.5/A13
27 C7 U13
P2.6/A14
28 C8
P2.7/A15 NOT
C3
H8 1 10 U14
P1.0/T2 P3.0/RXD
H7 2 11
P1.1/T2EX P3.1/TXD NOT
H6 3 12 C4
P1.2 P3.2/INT0
H5 4 13 U15
P1.3 P3.3/INT1
H4 5 14
P1.4 P3.4/T0 NOT
H3 6 15 C5
P1.5 P3.5/T1
H2 7 16 U16
P1.6 P3.6/WR
H1 8 17
P1.7 P3.7/RD NOT
C6
AT89C52 U17
NOT
C7
U18
NOT
C8

NOT

Khoa Điện – Điện tử 21


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

3.4. Lưu đồ giải thuật và chương trình:


Lưu đồ giải thuật:

Chương trình:
char i,j;
char arrayCol[8]={0xE7,0xC3,0x99,0x3C,0x00,0x00,0x3C,0x3C}; //ma du lieu cot
char arrayRow[8]={0b01111111,0b10111111,0b11011111,0b11101111,0b11110111,
0b11111011,0b11111101,0b11111110}; //ma quet hang
void main() {
while(1)
{
for(i=0;i<8;i++)
{
P2=arrayCol[i]; //gan du lieu thu i trong arrayColcho PORT 2
P1=arrayRow[i]; //gan du lieu thu I trogn arrayRow cho PORT1
delay_ms(1); //tao tre 1 mili giay
P1=0xff; //cho PORT1 o muc cao de tat het LED
}
}
}

Khoa Điện – Điện tử 22


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

4. Bài tập:
4.1 Thực hiện lại yêu cầu trên với các ký tự B,C,…Z, các số 0,1,…9.
4.2 Viết chương trình để chữ A chạy từ trái sang phải và ngược lại.
4.3 Viết chương trình hiện tên của sinh viên lên LED ma trận, mỗi lần hiện 1 chữ cái, thời gian
hiện 1 giây.
4.4 Dùng 4 phím ấn (0,1,2,3) điều khiển LED ma trận như sau: Ấn phím thứ mấy thì LED ma
trận hiện số tương ứng.

Khoa Điện – Điện tử 23


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bài thực hành số 5: LẬP TRÌNH ĐIỀU KHIỂN ĐÓNG/CẮT ĐỘNG


CƠ DC
1. MỤC ĐÍCH – YÊU CẦU:
1.1. Mục đích:
- Điều khiển động cơ DC bằng L293.
1.2. Yêu cầu:
- Kết nối được sơ đồ mạch giữa vi điều khiển với L293.
- Lập trình điều khiển động cơ DC với các yêu cầu: quay/dừng, quay có định thời,
quay đảo chiều.
2. CƠ SỞ LÝ THUYẾT:
Sơ đồ nguyên lý của mô đun thúc động cơ DC trên KIT thực hành:

Đây là mô đun điều khiển 2 động cơ. Xét động cơ 1(MOTOR1):


- PWM1: để điều khiển động cơ quay hoặc dừng. Ở đây do PWM1 qua cổng NOT mới
đến chân 1 của L293 cho nên:
PWM1=0 → động cơ quay, PWM1=1 → động cơ dừng.
- DIR1: để điều khiển chiều quay của động cơ, quy ước:
DIR1=0 → động cơ quay thuận, DIR1=1 → động cơ quay ngược.
3. TRÌNH TỰ THỰC HIỆN:
3.1.Yêu cầu đặt ra: Điều khiển động cơ DC quay chiều thuận.
3.2. Kết nối phần cứng:
+ Kết nối trên KIT thực hành:
- Dùng Jump bẹ 2 nối P0.0 – PWM1, P0.1 – DIR1 trên PORT0 với Jump DC-
MOTOR.
- Dùng Jump bẹ 4 nối ngõ ra trên module điều khiển động cơ DC (MO1) với động cơ
DC rời.

Khoa Điện – Điện tử 24


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Lưu ý: P0.0=PWM1, P0.1=DIR1.


+ Mô phỏng trên Proteus:

U21 U23
19 39
XTAL1 P0.0/AD0
38
P0.1/AD1
37
P0.2/AD2 U22
18 36 16 8
XTAL2 P0.3/AD3 NOT
35
P0.4/AD4
34 2 3
P0.5/AD5 IN1 VSS VS OUT1
33 DIR U24 7 6
P0.6/AD6 IN2 OUT2
9 32 1
RST P0.7/AD7 EN1
PWM
21
P2.0/A8
22 9
P2.1/A9 NOT EN2
23 10 11
P2.2/A10 IN3 OUT3
29 24 15 14
PSEN P2.3/A11 IN4 GND GND OUT4
30 25
ALE P2.4/A12 RP1
31 26
EA P2.5/A13
27 1 L293D
P2.6/A14
28
P2.7/A15
PWM 2
1 10 DIR 3
P1.0/T2 P3.0/RXD
2 11 4
P1.1/T2EX P3.1/TXD
3 12 5
P1.2 P3.2/INT0
4 13 6
P1.3 P3.3/INT1
5 14 7
P1.4 P3.4/T0
6 15 8
P1.5 P3.5/T1
7 16 9
P1.6 P3.6/WR
8 17
P1.7 P3.7/RD
RESPACK-8
AT89C52

Khoa Điện – Điện tử 25


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

3.3. Giải thuật với chương trình:

sbit PWM at P0_0_bit; //dat ten


chan P0_0
sbit DIR at P0_1_bit; //dat ten
chan P0_1
void main(){
DIR = 0; //gan gia tri cho
DIR
PWM = 0; //gan gia tri cho
PWM
}

3.4. Mô phỏng mạch điện và đoạn code.


3.5. Dùng mạch nạp để nạp đoạn code trên máy tính vào vi điều khiển.
3.6. Gắn vi điều khiển vào KIT, cấp nguồn chạy thực tế.
3.7. Thay đổi vị trí 2 dòng lệnh, nhận xét?
4. BÀI TẬP:
4.1. Viết chương trình điều khiển động cơ quay ngược lại.
4.2. Viết chương trình điều khiển động cơ quay 2 giây, dừng 10 giây. Lặp lại tuần hoàn.
4.3. Kết nối thêm phím ấn đơn. Viết chương trình dùng 2 phím ấn đơn điều khiển động
cơ quay và dừng.
4.4. Tương tự bài 4.3. Viết chương trình dùng 4 phím ấn đơn điều khiển động cơ
quay/dừng và đảo chiều quay (lưu ý phải để động cơ dừng trước khi đảo chiều động cơ).
4.5. Kết nối thêm 1 LED 7 đoạn. Viết chương trình dùng 4 phím ấn điều khiển thời gian
quay của động cơ là 2 giây, 4 giây, 6 giây, 8 giây rồi dừng. Hiển thị thời gian quay trên
LED 7 đoạn (LED 7 đoạn đếm lùi).

Khoa Điện – Điện tử 26


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bài thực hành số 6: LẬP TRÌNH ĐIỀU KHIỂN TỐC ĐỘ ĐỘNG CƠ DC


1. MỤC ĐÍCH – YÊU CẦU:
1.1. Mục đích: Lập trình điều khiển tải DC bằng phương pháp PWM.
1.2. Yêu cầu: Lập trình điều tốc được động cơ DC.
2. CƠ SỞ LÝ THUYẾT:
Ở bài thực hành trước muốn động cơ quay, ta cấp nguốn +5V
vào động cơ và ngược lại muốn dừng động cơ ta ngắt nguồn cung cấp.

Để điều khiển tốc độ của động cơ DC người ta sử dụng nhiều phương pháp, trong đó phương
pháp điều chế độ rộng xung (PWM – Pulse Width Modulation) là hữu hiệu nhất. Xét giản đồ
sau:

Ta thấy thời gian động cơ quay và dừng cũng giống nhau, chỉ khác chỗ lúc động cơ quay, người
ta cung cấp cho nó chuỗi xung vuông tần số cao, lúc đó động cơ sẽ quay mà không thấy trạng
thái dừng. Tuy nhiên ta sẽ thấy động cơ quay chậm hơn so với hình trên.
Xét trong 1 chu kỳ của xung vuông, ta thấy thời gian tồn tại mức cao và mức thấp là bằng nhau,
ta nói độ rộng xung của xung vuông này là 50%.

Độ rộng xung: ∗ %

3. TRÌNH TỰ THỰC HIỆN:


3.1. Yêu cầu đặt ra: Lập trình điều khiển động cơ quay tốc độ 60%.
3.2. Kết nối phần cứng:
- Dùng Jump bẹ 2 nối P0.0, P0.1 trên PORT0 với Jump DC-MOTOR.
- Dùng Jump bẹ 4 nối ngõ ra trên module điều khiển động cơ DC (MO1) với động cơ DC rời.

Khoa Điện – Điện tử 27


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

3.3. Giải thuật và chương trình:

Khoa Điện – Điện tử 28


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

sbit PWM at P0_0_bit;


sbit DIR at P0_1_bit;
unsigned int T, Ton, Toff;
unsigned char Ton_h_reload, Toff_h_reload, Ton_l_reload, Toff_l_reload;
//chuong trinh khoi tao
void PWM_init(unsigned int ck){
PWM = 1; //dat PWM len muc cao
TMOD=0x01;//TIMER0, mode 1
TF0_bit = 0; //dat co tran muc thap
ET0_bit = 1; //cho phep ngat TIMER0
EA_bit = 1; //cho phep ngat toan cuc

T = ck;//gan gia tri cho T


Ton = T/2; //Duty 50%
Toff = T - Ton;//cong thuc

Ton_h_reload = (65536 - Ton) >> 8;


Ton_l_reload = (65536 - Ton) & 0x00FF;

Toff_h_reload = (65536 - Toff) >> 8;


Toff_l_reload = (65536 - Toff) & 0x00FF;

TH0 = (65536 - Ton) >> 8;


TL0 = (65536 - Ton) & 0x00FF;
}
//chuong trinh chay dong co
void PWM_Start(){
TR0_bit=1;
}
//chuong trinh dung dong co
void PWM_Stop(){
TR0_bit=0;
}
//dong co quay theo chieu thuan
void PWM_Thuan(){
DIR=0;
}
//dong co quay theo chieu nguoc
void PWM_Nguoc(){
DIR=1;
}
//thiet lap do rong xung
void PWM_Set_Duty(unsigned char duty){
if(duty < 1){ //xac dinh gia tri nho nhat cua Duty

Khoa Điện – Điện tử 29


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

PWM = 1;
ET0_bit = 0;
}
else if(duty >= 100){ //xac dinh gia tri lon nhat cua Duty
PWM = 0;
ET0_bit = 0;
}
else{
Ton = ((unsigned long)T) * duty / 100; //tinh theo cong thuc
Toff = T - Ton;

Ton_h_reload = (65536 - Ton) >> 8;


Ton_l_reload = (65536 - Ton) & 0x00FF;

Toff_h_reload = (65536 - Toff) >> 8;


Toff_l_reload = (65536 - Toff) & 0x00FF;
}
}
//chuong trinh ngat
void TIMER0_Ngat() org IVT_ADDR_ET0{
PWM =! PWM; //dao trang thai
if(PWM==0){
TH0 = Ton_h_reload; //delay
TL0 = Ton_l_reload;
}
else{
TH0 = Toff_h_reload; //delay
TL0 = Toff_l_reload;
}
}
//chuong trinh chinh
void main(){
PWM_Thuan();//dong co quay chieu thuan
PWM_init(1000);//chu ki bang 1000us = 1ms
PWM_Set_Duty(30);//do rong xung 60%
PWM_Start();//dong co chay
while(1){
}
}
3.3. Mô phỏng mạch điện và đoạn code trên.
3.4. Dùng mạch nạp để nạp đoạn code trên máy tính vào vi điều khiển.
3.5. Gắn vi điều khiển vào KIT, cấp nguồn chạy thực tế.

Khoa Điện – Điện tử 30


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

3.6. Tính tần số của xung vuông đã tác động đến IC L293?
3.7. Thay đổi chu kì T đưa ra nhận xét:
- Khi tăng T thì hiện tượng gì xảy ra?
- Khi giảm T thì hiện tượng gì xảy ra?
3.8. Thay đổi Duty đưa ra nhận xét:
- Khi tăng Duty thì hiện tượng gì xảy ra?
- Khi giảm Duty thì hiện tượng gì xảy ra?
4. BÀI TẬP:
4.1. Thực hiện lại yêu cầu trên với tốc độ 25%.
4.2. Viết chương trình điều khiển để động cơ quay từ nhanh nhất đến chậm nhất.
4.3. Viết chương trình điều khiển động cơ quay 75% trong 5 giây sau đó chuyển qua tốc độ
25% trong 5 giây rồi dừng.
4.4. Kết nối phím ấn đơn. Viết chương trình dùng 4 phím ấn điều khiển tốc độ động cơ như sau:
- ấn phím 1: động cơ dừng.
- ấn phím 2: động cơ quay tốc độ 25%.
- ấn phím 3: động cơ quay tốc độ 75%.
- ấn phím 4: động cơ đảo chiều (giữ nguyên tốc độ hiện tại).
Lưu ý: trước khi đảo chiều phải dừng động cơ ít nhất 3 giây.

Khoa Điện – Điện tử 31


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bài thực hành số 7: LẬP TRÌNH HIỂN THỊ LCD


1. MỤC ĐÍCH – YÊU CẦU:
1.1. Mục đích:
- Tìm hiểu LCD1602 (8bit, 2 dòng ký tự)
- Lập trình hiển thị chuỗi ký tự lên LCD.
1.2. Yêu cầu:
- Thiết kế được phần cứng giao tiếp với LCD1602 (8bit, 2 dòng ký tự)
- Lập trình hiển thị được chuỗi ký tự lên LCD.
2. CƠ SỞ LÝ THUYẾT:
Màn hình LCD1602 là màn hình hiển thị 2 dòng, mỗi dòng 16 ký tự. Hình ảnh thực tế:

Trên KIT thực hành có 2 LCD1602: LCD1602 8 bit mode và LCD1602 4 bit mode.
Trong giáo trình chỉ đề cập đến LCD 8 bit mode, còn chế độ 4 bit thì sinh viên tham khảo thêm
datasheet HD44780.

Ý nghĩa các chân:


- Chân 1, 2: cấp nguồn.
- Chân 3: chỉnh độ sáng.
- Chân 4: RS – Register Select thanh ghi chọn lựa:
+ RS=0: chọn thanh ghi lệnh.

Khoa Điện – Điện tử 32


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

+ RS=1: chọn thanh ghi dữ liệu.


- Chơn 5: R/W – Read/Write đọc hay ghi dữ liệu:
+ R/W=0: ghi dữ liệu lên LCD.
+ R/W=1: đọc dữ liệu trên LCD.
- Chân 6: E – Enable cho phép chốt dữ liệu, khi có xung cạnh xuống sẽ chốt dữ liệu lại.
Độ rộng xung tối thiểu là 450ms.
- Các chân 7-14: DB7..DB0 là 8 chân nhận mã lệnh hoặc nhận dữ liệu 8bit.
- Chân 15: A – chân Anode cấp nguồn dương nuôi đèn LCD.
- Chân 16: K - Katod cấp nguồn âm để nuôi đèn LCD.
Mã lệnh của LCD:

3. TRÌNH TỰ THỰC HIỆN:


3.1. Yêu cầu đặt ra:
- Lập trình xuất chuỗi ‘DHSPKT VINH LONG’ lên hàng 1 và ‘Hello World’ lên hàng
2 của LCD dùng chế độ 8 bit.

Khoa Điện – Điện tử 33


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

3.2. Kết nối phần cứng:


+ Sơ đồ kết nối trên KIT thực hành:

- Kết nối LCD như sau:


+ Dùng Jump bẹ 4 nối 3 bit cao ngõ ra PORT2 với 3 chân E, RW, RS của LCD.
+ Dùng Jump bẹ 8 nối ngõ vào PORT3 với DATA của LCD.
+ Sơ đồ mô phỏng trên Proteus:
U25
19 39
XTAL1 P0.0/AD0 LCD1
38
P0.1/AD1 LM016L
37
P0.2/AD2
18 36
XTAL2 P0.3/AD3
35
P0.4/AD4
34
P0.5/AD5
VDD
VSS

VEE

33
RW
RS

D0
D1
D2
D3
D4
D5
D6
D7

P0.6/AD6
E

9 32
RST P0.7/AD7
1
2
3

4
5
6

7
8
9
10
11
12
13
14

21
P2.0/A8
22
P2.1/A9
23
P2.2/A10
29 24
PSEN P2.3/A11
30 25
ALE P2.4/A12
31 26
EA P2.5/A13
27
P2.6/A14
28
P2.7/A15
1 10
P1.0/T2 P3.0/RXD
2 11
P1.1/T2EX P3.1/TXD
3 12
P1.2 P3.2/INT0
4 13
P1.3 P3.3/INT1
5 14
P1.4 P3.4/T0
6 15
P1.5 P3.5/T1
7 16
P1.6 P3.6/WR
8 17
P1.7 P3.7/RD
AT89C52

Khoa Điện – Điện tử 34


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

3.3. Giải thuật và chương trình:

Bắt đầu Bắt đầu

Gửi mã lệnh ra LCD Gửi dữ liệu ra LCD

Chọn thanh ghi lệnh Chọn thanh ghi dữ


liệu

Chọn ghi vào LCD


Chọn ghi vào LCD

Tạo xung cạnh xuống Tạo xung cạnh xuống


cho phép thực thi cho phép thực thi

Kết thúc Kết thúc

Cách 1: Tự tạo hàm


//dinh nghia cac bien
#define out P3
#define gach_chan 0x0E
#define xoa 0x01
#define dong_1 0x80
#define dong_2 0xc0
#define set_2_8 0x38
#define set_2_4 0x28
#define dau_dong 0x02
#define set_1_8 0x30
#define set_1_4 0x20
#define dich_phai 0x1e
#define dich_trai 0x18
#define nhap_nhay 0x0f
#define tat_con_tro 0x0c
sbit E at P2_7_bit;
sbit RW at P2_6_bit;
sbit RS at P2_5_bit;

Khoa Điện – Điện tử 35


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

//chuong trinh thuc hien lenh


void LCD_Lenh(unsigned char cmd){
RS = 0; //chan RS muc thap de ghi lenh
out = cmd; //xuat ma lenh
E = 0; //tao xung canh xuong o chan E
E = 1;
//tao tre de thuc hien lenh
if(cmd<0x02){ //dat dieu kien
delay_ms(2);//tao tre 2 mili giay
}
else{
delay_ms(1);//tao tre 1 mili giay
}

}
//chuong trinh hien thi mot ki tu
void LCD_Ki_Tu(char c){
RS = 1; //RS muc cao de ghi du lieu
out = c; //xuat du lieu
E = 0; //tao xung canh xuong
E = 1;
delay_ms(1);//tao tre
}
//chuong trinh hien thi mot chuoi ki tu
void LCD_Chuoi_Ki_Tu(char *str){
unsigned char i = 0; //khai bao bien i muc thap
while(str[i] != 0){ //dat dieu kien i khac 0
LCD_Ki_Tu(str[i]); //hien thi ki tu o vi tri i
i++; //i tang 1
}
}
//chuong trinh khoi tao
void LCD_Khoi_Tao(){
RW = 0; //RW muc thap de ghi lenh hoac du lieu
LCD_Lenh(set_2_8);//chon che do hien thi 2 dong 8bit
delay_ms(5);//tao tre 5 mili giay
LCD_Lenh(xoa);//xoa man hinh
LCD_Lenh(gach_chan);//chon kieu gach chan con tro
}
//chuong trinh hien thi chuoi ki tu o vi tri bat ki

Khoa Điện – Điện tử 36


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

void LCD_Chuoi_Ki_Tu_BK(unsigned char row, unsigned char col, char *str){


unsigned char cmd;//khai bao bien cmd
cmd = (row == 1 ? 0x80 : 0xc0) + col - 1;//tinh toan vi tri dat con tro
LCD_Lenh(cmd);//xuat vi tri dat con tro
LCD_Chuoi_Ki_Tu(str);//xuat chuoi ki tu
}
void main(){
LCD_Khoi_Tao();//khoi tao trang thai lam viec
LCD_Lenh(nhap_nhay);//dat lai kieu nhap nhay con tro
LCD_Chuoi_Ki_Tu_BK(1,1,"DHSPKT V INHLONG");//xuat "DHSPKT VINH
LONG" o hang 1 cot 1
LCD_Chuoi_Ki_Tu_BK(2,3,"Hello World");//xuat "Hello World" o hang 2 cot 3
while(1){
}
}

Cách 2: Dùng hàm sẵn có trong mikro C


Start Page > Open Example Folder > ATMEL > Development Systems >
Easy8051v6 > Lcd > Lcd.mcp51
- Các hàm sẵn có:
Lcd_Init(): Khởi tạo LCD chế độ 4 bit 2 dòng.
Lcd_Out(a,b,“chuoi ki tu”): Hiển thị một chuỗi kí tự ở vị ở hàng a, cột b.
Lcd_Out_CP(“chuoi ki tu”): Hiển thị chuỗi kí tự tại vị trí con trỏ.
Lcd_Chr(a,b,‘ki tu’): Hiển thị kí tự ở hàng a, cột b.
Lcd_Chr_CP(‘ki tu’): Hiển thị kí tự tại vị trí con trỏ.
Lcd_Cmd(Lệnh): Ghi lệnh vào LCD.
- Các lệnh cơ bản:
_LCD_CLEAR: Xóa màn hình.
_LCD_RETURN_HOME: Đưa con trỏ về đầu dòng.
_LCD_CURSOR_OFF: Tắt con trỏ.
_LCD_UNDERLINE_ON: Hiển thị con trỏ gạch chân.
_LCD_BLINK_CURSOR_ON: Hiển thị con trỏ chớp tắt.
_LCD_MOVE_CURSOR_LEFT: Di chuyển con trỏ qua trái.
_LCD_MOVE_CURSOR_RIGHT: Di chuyển con trỏ qua phải.
_LCD_TURN_ON: Bật hiển thị LCD
_LCD_TURN_OFF: Tắt hiển thị LCD
_LCD_SHIFT_LEFT: Toàn bộ dữ liệu trên màn hình dịch trái.
_LCD_SHIFT_RIGHT: Toàn bộ dữ liệu trên màn hình dịch phải.
//khai bao chan

Khoa Điện – Điện tử 37


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

sbit LCD_RS at P2_5_bit;


sbit LCD_RW at P2_6_bit;
sbit LCD_EN at P2_7_bit;
sbit LCD_D4 at P3_4_bit;
sbit LCD_D5 at P3_5_bit;
sbit LCD_D6 at P3_6_bit;
sbit LCD_D7 at P3_7_bit;
void main(){
LCD_RW=0;
Lcd_Init(); // khoi tao LCD
Lcd_Cmd(_LCD_CLEAR); // xoa man hinh
Lcd_Cmd(_LCD_CURSOR_OFF); // bat hien thi, tat con tro
Lcd_Out(1,1,"DHSPKT VINH LONG");// xuat "DHSPKT VINH LONG" o hanng 1, cot
1
Lcd_Out(2,3,"Hello World");// xuat "HELLO WORLD" o hang 2, cot 3
while(1) { // vong lap vo han
}
}

Lưu ý: khi mô phỏng đối với code này thì cần chỉ kết nối 4 chân dữ liệu từ D4 đến D7
3.4. Mô phỏng mạch điện và đoạn code trên.
3.5. Dùng mạch nạp để nạp đoạn code trên máy tính vào vi điều khiển.
3.6. Gắn vi điều khiển vào KIT, cấp nguồn chạy thực tế.
3.7. Thay đổi thời gian trễ (delay_ms) đưa ra nhận xét:
- Khi tăng thời gian trễ thì hiện tượng gì xảy ra? Vậy thời gian trễ lớn nhất là bao nhiêu
để khắc phục hiện tượng đó?
- Khi giảm thời gian trễ thì hiện tượng gì xảy ra? Vậy thời gian trễ nhỏ nhất là bao nhiêu
để khắc phục hiện tượng đó?
- Xác định thời gian trể hợp lý nhất để LCD sáng rõ nhất?
4. BÀI TẬP:
4.1. Hiển thị một chuỗi kí tự bất kì đầu dòng 2.
4.2. Hiển thị và dịch phải “Dai hoc SPKT Vinh Long” đầu dòng 1 cách nhau 500ms. Sau
đó dịch lên dòng 2, rồi dịch trái về dòng 1.
4.3. Kết hợp với nút ấn hiển thị số lần ấn nút lên LCD.

Khoa Điện – Điện tử 38


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bài thực hành số 9: LẬP TRÌNH ĐẾM SẢN PHẨM


1. MỤC ĐÍCH – YÊU CẦU:
1.1. Mục đích:
- Lập trình đếm sản phẩm dùng bộ đếm (Counter) với 8051
- Lập trình đếm sản phẩm dùng ngắt ngoài với 8051
1.2. Yêu cầu:
- Lập trình Counter đếm sản phẩm từ 00 đến 59 dùng vi điều khiển 8051
- Lập trình ngắt ngoài đếm sản phẩm từ 00 đến 59 dùng vi điều khiển 8051
- Thiết kế được phần cứng giữa vi điều khiển với LED 7 đoạn 2 số và module thu - phát
hồng ngoại
2. CƠ SỞ LÝ THUYẾT:
Sơ đồ nguyên lý của module hồng ngoại:

- Sản phẩm sẽ đi qua giữa LED phát D1 và LED thu D2. - Lúc không có sản phẩm, LED
D2 nhận được tín hiệu từ LED phát D1 => D2 dẫn => V- = +5V, V+ < +5V ngõ ra của Opamp
U1 là V0=0V => Q1 ngưng dẫn => OUT =1.
- Lúc có sản phẩm, LED D2 không nhận được tín hiệu từ D1 => D2 ngưng dẫn => V-
= 0V => V0 = +5V => Q1 dẫn =>OUT =0.
3. TRÌNH TỰ THỰC HIỆN:
3.1. Yêu cầu đặt ra:
- Lập trình Counter đếm sản phẩm từ 00 => 59 hiện thị lên LED 7 đoạn
- Lập trình ngắt ngoài đếm sản phẩm từ 00 => 59 hiện thị lên LED 7 đoạn

Khoa Điện – Điện tử 39


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

3.2. Kết nối phần cứng:


+ Kết nối trên KIT thực hành
- Kết nối ngõ ra của module hồng ngoại với chân P3.2 (INT0) của vi điều khiển
- Kết nối ngõ ra của module hồng ngoại với chân P3.4 (T0) của vi điều khiển
- Dùng jump bẹ 8 nối PORT 0 của vi điều khiển với LED 7 đoạn 2 số

+ Mô phỏng trên Proteus:

Khoa Điện – Điện tử 40


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

4. Lưu đồ giải thuật và chương trình


4.1. Lưu đồ giải thuật:

4.2. Chương trình:


Cách 1: Dùng bộ đếm (Counter)
//khai bao chan
#define out P0
sbit led1 at P2_1_bit;
sbit led2 at P2_0_bit;
char mang[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //mang du lieu ma
LED 7 doan tu 0 den 9
void hienThi(unsigned char n)
{
unsigned char i, chuc, dvi;
// tach so hang chuc va hang don vi
chuc = n/10;
dvi= n%10;
//hien thi so hang chuc roi tat
out = mang[chuc];
led2 = 0;
delay_ms(1);
led2 = 1;
//hien thi so hang don vi roi tat
out = mang[dvi];
led1 = 0;

Khoa Điện – Điện tử 41


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

delay_ms(1);
led1 = 1;
}
void main() {
TMOD &= 0xF0;//xoa cac bit dieu khien thanh ghi TMOD cua counter T0
TMOD |= 0x06;//khoi tao counter 0 mode 2 tu dong nap lai
TR0_bit = 1; //cho phep dem xung
while(1)
{
if(TL0>59)TL0=0;//TL0 tang tu 0 den 59
hienThi(TL0); //hien thi so san pham
}
}
Cách 2: Dùng ngắt ngoài
//khai bao chan
#define out P0
sbit led1 at P2_1_bit;
sbit led2 at P2_0_bit;
sbit in at P3_2_bit;
unsigned char dem=0;
char mang[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //mang du lieu ma
LED 7 doan tu 0 den 9
//chuong trinh hien thi
void hienThi(unsigned char n){
unsigned char i, chuc, dvi;
// tach so hang chuc va hang don vi
chuc = n/10;
dvi= n%10;
//hien thi so hang chuc roi tat
out = mang[chuc];
led2 = 0;
delay_ms(1);
led2 = 1;
//hien thi so hang don vi roi tat
out = mang[dvi];
led1 = 0;
delay_ms(1);
led1 = 1;
}
//chuong trinh khoi tao
void khoitao(){
out = 1; //khoi tao ma quet
in = 1; //khoi tao chan ngat
IT0_bit = 1; //bat che do ngat xung canh xuong

Khoa Điện – Điện tử 42


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

EX0_bit = 1; //cho phep ngat ngoai 0


EA_bit = 1; //cho phep ngat toan cuc
}
//chuong trinh ngat
void ngatdem() iv IVT_ADDR_EX0{
dem++;// tang so dem
}
void main(){
khoitao(); //ham khoi tao
while(1){ //vong lap vo han
if(dem>59)dem=0; // dem tang tu 0 den 59
hienThi(dem); //ham hien thi
}
}
3.4. Mô phỏng mạch điện và đoạn code trên.
3.5. Dùng mạch nạp để nạp đoạn code trên máy tính vào vi điều khiển.
3.6. Gắn vi điều khiển vào KIT, cấp nguồn chạy thực tế.
3.7. Thay đổi thời gian delay_ms, quan sát, nhận xét.
5. Bài tập:
5.1. Thực hiện lại yêu cầu trên hệ thống sẽ trả số lượng sản phẩm về 0 nếu sản phẩm đủ 90.
5.2. Lập trình lại hệ thống với số lượng sản phẩm cần đếm là 500 sản phẩm
5.3. Lập trình lại hệ thống với số lượng sản phẩm cần đếm là 1500 sản phẩm
5.4. Thực hiện lai 5.3 đếm đến 1234 rồi dừng lại.

Khoa Điện – Điện tử 43


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bài thực hành số 10:


LẬP TRÌNH ĐỒNG HỒ SỐ HIỂN THỊ LED 7 ĐOẠN

1. MỤC ĐÍCH – YÊU CẦU:


1.1. Mục đích:
- Điều khiển LED 7 đoạn.
- Sử dụng phương pháp quét điều khiển 6 LED 7 đoạn.
1.2. Yêu cầu:
- Kết nối sơ đồ mạch giữa vi điều khiển với LED 7 đoạn
- Lập trình hiển thị được giờ, phút, giây lên LED 7 đoạn bằng phương pháp quét.
2. CƠ SỞ LÝ THUYẾT:
2.1. LED 7 đoạn:
* Cấu tạo LED 7 đoạn:

LED 7 đoạn Common Anode (A chung) LED 7 đoạn Common Cathode (K chung)
Logic tích cực 0 Logic tích cực 1
- Việc điều khiển LED 7 đoạn (có dấu chấm_dot point) tương đương với việc điều khiển
8 LED đơn.
* Kết nối LED 7 đoạn A chung:
U1
19 39
XTAL1 P0.0/AD0
38
P0.1/AD1
37
P0.2/AD2
18 36
XTAL2 P0.3/AD3
35
P0.4/AD4
34
P0.5/AD5
33
P0.6/AD6
9 32
RST P0.7/AD7
21
P2.0/A8
22
P2.1/A9
P2.2/A10
23 R1
29 24
PSEN P2.3/A11
30 25
ALE P2.4/A12
31 26
EA P2.5/A13
27
P2.6/A14
28
P2.7/A15
1 10
P1.0 P3.0/RXD
2 11
P1.1 P3.1/TXD
3 12
P1.2 P3.2/INT0
4 13
P1.3 P3.3/INT1
5 14
P1.4 P3.4/T0
6 15
P1.5 P3.5/T1
7 16
P1.6 P3.6/WR
8 17
P1.7 P3.7/RD
AT89C51

Khoa Điện – Điện tử 44


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

* Mã LED 7 đoạn:
- Để LED 7 đoạn hiển thị ký tự theo ý muốn ta cần tạo các mã để LED 7 đoạn hiển thị.
- Ví dụ : Khi hiển thị số 0, ta cần đưa vào các chân LED 7 đoạn các điện áp (mức logic)
phù hợp như sau: Để sáng số 0 cần sáng các đoạn a,b,c,d,e,f và đoạn g tắt.
+ Đối với LED 7 đoạn A chung: chân COM nối nguồn +5V (mức logic 1), để
sáng đoạn nào ta cần cấp điện áp 0V (mức logic 0).
+ Đối với LED 7 đoạn K chung: chân COM nối GND 0V (mức logic 0), để sáng
đoạn nào ta cần cấp điện áp +5V (mức logic 1).
- Trong lập trình vi điều khiển, người lập trình có nhiều cách để kết nối chân của vi điều
khiển ới LED 7 đoạn. Để thống nhất trong lập trình, tôi sẽ kết nối chân vi điều khiển ới LED 7
đoạn như bảng sau:
Bảng kết nối vi điều khiển ới LED 7 đoạn
89C51 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
LED 7d p g f e d c b a
A chung 1 0 0 0 0 0 0 0
K chung 0 1 1 1 1 1 1 1
- Như vậy, mã LED 7 đoạn của số 0 là:
+ Đối với LED 7 đoạn A chung là: 11000000B = C0H
+ Đối với LED 7 đoạn K chung là: 00111111B = 3FH
- Tương tự mã LED 7 đoạn cho các số 1, 2, 3, 4, 5, 6, 7, 8, 9, …
2.2. Phương pháp quét:
Là phương pháp trao đổi dữ liệu với nhiều thiết bị, trong sử dụng 2 loại tín hiệu là dữ
liệu và điều khiển.
Ví dụ : Vi điều khiển giao tiếp với 2 thiết bị
Điều khiển 1
Thiết bị 1

Vi
điều Dữ liệu
khiển
Điều khiển 2
Thiết bị 2

Trong sơ đồ trên, thiết bị 1 và 2 đều giao tiếp với vi điều khiển chung dữ liệu.

Khoa Điện – Điện tử 45


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Khi vi điều khiển muốn giao tiếp với thiết bị nào thì phải thực hiện 2 bước:
- Bước 1: Vi điều khiển xuất dữ liệu ra đường dữ liệu.
- Bước 2: Chọn thiết bị nào được nhận dữ liệu đó.
Cụ thể: Vi điều khiển muốn gửi số 145 cho thiết bị 1. Giả sử mức logic tích cực điều
khiển là 0.
- Bước 1: Vi điều khiển xuất ra số 145 lên đường dữ liệu.
- Bước 2: Cho chân điều khiển 1 = 0, chân điều khiển 2 = 1.
Tương tự nếu thiết bị là LED 7 đoạn thì việc chọn LED chính là cấp nguồn nuôi cho
LED 7 đoạn. Nếu LED A chung thì đóng/cắt nguồn cấp cực Anode, còn LED K chung thì
đóng/cắt GND tại Katode.
Xét sơ đồ kết nối MCS51 với 2 LED 7 đoạn A chung sau:
19 39
XTAL1 P0.0/AD0
38
P0.1/AD1
37
P0.2/AD2
18 36
XTAL2 P0.3/AD3
35
P0.4/AD4
34
P0.5/AD5
33
P0.6/AD6
9 32
RST P0.7/AD7
21 Q1 PNP Q2 PNP
P2.0/A8
22 R1 R2
P2.1/A9
23 LED1 LED2
P2.2/A10
29 24 10k 10k
PSEN P2.3/A11
30 25
ALE P2.4/A12
31 26
EA P2.5/A13
27 LED1
P2.6/A14
28 LED2
P2.7/A15
1 10 A A A
P1.0/T2 P3.0/RXD
2 11 B B B
P1.1/T2EX P3.1/TXD
3 12 C C C
P1.2 P3.2/INT0
4 13 D D D
P1.3 P3.3/INT1
5 14 E E E
P1.4 P3.4/T0
6 15 F F F
P1.5 P3.5/T1
7 16 G G G
P1.6 P3.6/WR
8 17
P1.7 P3.7/RD
AT89C52

Để hiển thị số 10 lên 2 LED, tiến hành các bước:


- Chuẩn bị dữ liệu: mã để hiển thị số tương ứng
Mã số 0: 1100 0000b = C0H
Mã số 1: 1111 1001b = F9H
- Các bước điều khiển:
+ Xuất ra Port 3 giá trị C0H. Ví dụ: P3=0xF9; để hiển thị số 1
+ Chọn LED hàng chục sáng. Ví dụ: P2.B6 = 0;
+ Dừng lại để quan sát. Ví dụ: delay_ms(10); 10 mili giây
+ Tắt thiết bị vừa chọn (tắt LED hàng chục): chống lem. Ví dụ : P2.B6 = 1;

Khoa Điện – Điện tử 46


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

+ Xuất ra Port 3 giá trị C0H. Ví dụ: P3=0xC0; để hiển thị số 0


+ Chọn LED hàng đơn vị sáng. Ví dụ: P2.B7 = 0;
+ Dừng lại để quan sát. Ví dụ: delay_ms(10); 10 mili giây
+ Tắt thiết bị vừa chọn (tắt LED hàng đơn vị): chống lem. Ví dụ : P2.B7 = 1;
Lặp lại quá trình nhiều lần sẽ thấy 2 LED sáng số 10. Để dễ hiểu, ta tăng thời gian hiển
thị lên 5000 (5 giây) sẽ thấy từng LED được sáng.
2.3. Phương pháp ghi dịch:

3. TRÌNH TỰ THỰC HIỆN:


3.1. Yêu cầu đặt ra: Điều khiển 6 LED 7 đoạn hiển thị giờ, phút, giây.
3.2. Kết nối phần cứng:
+ Kết nối trên KIT thực hành:
Dùng 2 Jump bẹ 8 nối PORT0 với DATA và PORT2 với SCAN của LED 7 đoạn.

+ Mô phỏng trên Proteus:

Khoa Điện – Điện tử 47


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

U1
19 39 A
XTAL1 P0.0/AD0
38 B
P0.1/AD1
37 C
P0.2/AD2
18 36 D
XTAL2 P0.3/AD3
35 E
P0.4/AD4
34 F
P0.5/AD5
33 G
P0.6/AD6
9 32 P
RST P0.7/AD7
21 1i
P2.0/A8
22 2i
P2.1/A9
23 3i
P2.2/A10
29 24 4i U2 U6
PSEN P2.3/A11

1o
2o
3o
4o
5o
6o
7o
8o
30 25 5i

G
C
D
A
B

P
F
ALE P2.4/A12
31 26 6i 1i 1o 5i 5o
EA P2.5/A13
27 7i
P2.6/A14
28 8i U3 U7
P2.7/A15 NOT NOT
1 10 2i 2o 6i 6o
P1.0/T2 P3.0/RXD
2 11 U4 U8
P1.1/T2EX P3.1/TXD
3 12
P1.2 P3.2/INT0 NOT NOT
4 13 3i 3o 7i 7o
P1.3 P3.3/INT1
5 14 U5 U9
P1.4 P3.4/T0
6 15
P1.5 P3.5/T1 NOT NOT
7 16 4i 4o 8i 8o
P1.6 P3.6/WR
8 17
P1.7 P3.7/RD
NOT NOT
AT89C52

3.3. Giải thuật và chương trình:


+Giải thuật

Khoa Điện – Điện tử 48


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

+Chương trình
//khai bao chan
sbit ledgiochuc at P2_0_bit;
sbit ledgiodonvi at P2_1_bit;
sbit ledphutchuc at P2_3_bit;
sbit ledphutdonvi at P2_4_bit;
sbit ledgiaychuc at P2_6_bit;
sbit ledgiaydonvi at P2_7_bit;
#define data P0 //dat port 0 = data
char so1[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//ma 7 doan
// 0 1 2 3 4 5 6 7 8 9
void hienthi(unsigned char gio, unsigned char phut, unsigned char giay, unsigned int time){
// nhap so gio so phut so giay thoi gian
unsigned char giochuc, giodonvi, phutchuc, phutdonvi, giaychuc, giaydonvi;
unsigned int i;
time = time/3;//tinh thoi gian tre
giochuc = gio / 10;//tinh so chuc
giodonvi = gio % 10;//tinh so don vi
phutchuc = phut / 10;//tinh so chuc
phutdonvi = phut % 10;//tinh so don vi
giaychuc = giay / 10;//tinh so chuc
giaydonvi = giay % 10;//tinh so don vi

for(i=0;i<time;i++){//tao tre
//quet so chuc
ledgiochuc = 0;
data = so1[giochuc];
delay_us(500);
ledgiochuc = 1;
//quet don vi
ledgiodonvi = 0;
data = so1[giodonvi];
delay_us(500);
ledgiodonvi = 1;

//quet so chuc
ledphutchuc = 0;
data = so1[phutchuc];
delay_us(500);
ledphutchuc = 1;
//quet don vi
ledphutdonvi = 0;

Khoa Điện – Điện tử 49


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

data = so1[phutdonvi];
delay_us(500);
ledphutdonvi = 1;
//quet so chuc
ledgiaychuc = 0;
data = so1[giaychuc];
delay_us(500);
ledgiaychuc = 1;
//quet don vi
ledgiaydonvi = 0;
data = so1[giaydonvi];
delay_us(500);
ledgiaydonvi = 1;
}
}
void main() {
unsigned char giay=0, phut=0,gio=0;//khoi tao gia tri ban dau
while(1){//vong lap vo han
if(giay>59){//giay tu 0 den 59
phut++;//tang phut
giay=0;
}
if(phut>59){//phut tu 0 den 59
gio++;//tang gio
phut=0;
}
if(gio>23)gio=0;//gio tu 0 den 23
hienthi(gio, phut, giay, 1000);//ham hien thi
giay++;//tang giay
}}
3.4. Mô phỏng mạch điện và đoạn code trên.
3.5. Dùng mạch nạp để nạp đoạn code trên máy tính vào vi điều khiển.
3.6. Gắn vi điều khiển vào KIT, cấp nguồn chạy thực tế.
3.7. Thay đoạn chương trình sau vào vòng lặp while và nhận xét
giay++;//tang giay
if(giay>59){//giay tu 0 den 59
phut++;//tang phut
giay=0;
}
if(phut>59){//phut tu 0 den 59
gio++;//tang gio
phut=0;

Khoa Điện – Điện tử 50


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

}
if(gio>23)gio=0;//gio tu 0 den 23
hienthi(gio, phut, giay, 1000);//ham hien thi
3.8. Thay đổi thời gian trễ (delay_ms) đưa ra nhận xét:
- Khi tăng thời gian trễ thì hiện tượng gì xảy ra? Vậy thời gian trễ lớn nhất là bao nhiêu để khắc
phục hiện tượng đó?
- Khi giảm thời gian trễ thì hiện tượng gì xảy ra? Vậy thời gian trễ nhỏ nhất là bao nhiêu để
khắc phục hiện tượng đó?
- Xác định thời gian trể hợp lý nhất để LED 7 đoạn sáng rõ nhất?
4. BÀI TẬP:
4.1. Thực hiện lại bài tập trên với chương trình đếm lùi.
4.2. Kết nối với nút ấn để điều chỉnh thời gian, đếm xuôi hoặc ngược.
4.3. Thực hiện lại bài tập 4.2 viêt chương trình hẹn giờ (chuông báo động).

Khoa Điện – Điện tử 51


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bài thực hành số 11: LẬP TRÌNH ĐO LƯỜNG VÀ HIỂN THỊ NHIỆT
ĐỘ LÊN LCD
1. MỤC ĐÍCH – YÊU CẦU:
1.1. Mục đích:
- Tìm hiểu IC cảm biến nhiệt độ LM35
- Tìm hiểu IC chuyển đổi tương tự - số ADC0804
- Tìm hiểu LCD1602 (8bit, 2 dòng ký tự)
- Lập trình hiển thị chuỗi ký tự lên LCD.
1.2. Yêu cầu:
- Thiết kế được phần cứng giao tiếp IC cảm biến nhiệt LM35 với IC chuyển đổi tương
tự- số ADC0804
- Thiết kế được phần cứng giao tiếp với LCD1602 (8bit, 2 dòng ký tự)
- Lập trình đo lường hiển thị được nhiệt độ lên LCD.
2. CƠ SỞ LÝ THUYẾT:
2.1. LCD1602:(xem lại bài Lập trình hiển thị LCD)
2.2. Cảm biến nhiệt độ LM35:
IC LM35 là IC cảm biến nhiệt tuyến tính, ngõ ra của IC được xác định dựa vào công
thức: V0=0mV +10mV* t0 = 10*t (mV). Trong đó t được đo là độ C. Sơ đồ chân:

Cách đấu chân:

Khoa Điện – Điện tử 52


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

2.3. IC chuyển đổi tương tự - số ADC0804:


IC ADC0804 là IC chuyển đổi tín hiệu tương tự sang số công nghệ CMOS 8 bit.
Sơ đồ chân:

Khoa Điện – Điện tử 53


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Ý nghĩa các chân được chia thành các nhóm sau:


- Nhóm điều khiển dùng để kết nối với vi điều khiển:
Chân 1: CS (Chip Select) chân chọn chip. Nếu CS=1 sẽ khóa IC, nếu CS=0 sẽ cho phép
IC hoạt động.
Chân 2: RD (Read). Nếu RD=1 sẽ khóa ngõ ra của IC (ngõ ra tổng trở cao), nếu RD=0
sẽ cho phép mở cổng ngõ ra.
Chân 3: WR (Write) có tác dụng chốt dữ liệu. Khi có xung cạnh lên tác động lên chân
WR thì IC cho phép xuất 8 bit, bình thường thì chốt dữ liệu ngõ ra.
Chân 5: INTR (Interrupt) có tác dụng báo cho vi điều khiển biết IC đã thực hiện chuyển
đổi xong, chờ vi điều khiển đọc dữ liệu 8 bit ngõ ra của IC ADC0804.
- Nhóm các ngõ ra: bao gồm các chân từ 18 đến 11 tương ứng các bit 0 đến bit 7.
- Nhóm nguồn:
Chân 10: GND
Chân 20: VCC=+5V
Chân 9: VREF/2 là chân cấp điện áp tham chiếu quyết định độ phân giải 8 bit nhị phân
ngõ ra.

Từ hình trên ta có:


Mã nhị phân ngõ ra = (áp vào * 256 / VREF) /2
Chân 8: AGND là chân đồng bộ GND với tín hiệu tương tự cần chuyển đổi.

Khoa Điện – Điện tử 54


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

- Nhóm chân dao động: bao gồm chân 4 và chân 19. Ta có thể mắc tụ và điện trở vào cặp chân
này để lấy xung clock nội bên trong IC ADC0804, cũng có thể lấy xung clock bên ngoài đưa
vào chân 19. Như sơ đồ sau:

- Nhóm ngõ vào:


Chân 6: VIN(+) ngõ vào không đảo của mạch so sánh.
Chân 7: VIN(-) ngõ vào đảo của mạch so sánh.
Nguyên lý hoạt động của IC ADC0804 được chia thành 2 giai đoạn:
Giai đoạn IC 0804 đọc giá trị tương tự vào và thực hiện chuyển đổi:

Giai đoạn xuất dữ liệu ra ngõ ra của IC ADC0804:

Khoa Điện – Điện tử 55


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Sơ đồ nguyên lý của module IC ADC0804 trên KIT thực hành:

3. TRÌNH TỰ THỰC HIỆN


3.1. Yêu cầu đặt ra: Lập trình đo lường và hiển thị nhiệt độ lên LCD.
3.2. Kết nối phần cứng:
+ Sơ đồ kết nối trên KIT:

Khoa Điện – Điện tử 56


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

- Kết nối ADC0804: Tương tự như bài 28.1.


- Kết nối LCD như sau:
+ Dùng Jump bẹ 4 nối 3 bit cao ngõ ra PORT2 với 3 chân E, RW, RS của LCD.
+ Dùng Jump bẹ 8 nối ngõ vào PORT3 với DATA của LCD.
+ Mô phỏng trên Proteus:

Khoa Điện – Điện tử 57


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Giải thuật chương trình chính Giải thuật hiển thị lên LCD

Bắt đầu Bắt đầu

- Cài đặt LCD - Tạo dữ liệu cần hiển thị


- Cài đặt ADC - Xóa màn hình
- Đưa con trỏ về dòng 1

Chờ ADC0804 chuyển đổi

Đủ 10 kí tự S
Đọc giá trị số từ ADC0804
vào vi điều khiển

Đ
Tính toán và lưu vào vi
điều khiển
Hiển thị nhiệt độ

Hiển thị ra LCD


Hiển thị ‘℃’

Kết thúc
Kết thúc

Khoa Điện – Điện tử 58


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Giải thuật ghi lệnh vào LCD Giải thuật ghi dữ liệu vào LCD

Bắt đầu Bắt đầu

Gửi mã lệnh ra LCD Gửi dữ liệu ra LCD

Chọn thanh ghi lệnh Chọn thanh ghi dữ


liệu

Chọn ghi vào LCD


Chọn ghi vào LCD

Tạo xung cạnh xuống Tạo xung cạnh xuống


cho phép thực thi cho phép thực thi

Kết thúc Kết thúc

Chương trình:
//khai bao cac lenh
#define gach_chan 0x0E
#define xoa 0x01
#define dong_1 0x80
#define dong_2 0xc0
#define set_2_8 0x38
#define set_2_4 0x28
#define dau_dong 0x02
#define set_1_8 0x30
#define set_1_4 0x20
#define dich_phai 0x1e
#define dich_trai 0x18
#define nhap_nhay 0x0f
#define tat_con_tro 0x0c

//khai bao chan LCD


#define out P3
sbit E at P2_7_bit;

Khoa Điện – Điện tử 59


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

sbit RW at P2_6_bit;
sbit RS at P2_5_bit;

//khai bao chan ADC0804


#define in P0
sbit CS at P1_0_bit;
sbit RD at P1_1_bit;
sbit WR at P1_2_bit;
sbit INT at P1_3_bit;

unsigned char adc;

//chuong trinh thuc hien lenh


void LCD_Lenh(unsigned char cmd){
RS = 0; //chan RS muc thap de ghi lenh
out = cmd; //xuat ma lenh
E = 0; //tao xung canh xuong o chan E
E = 1;
//tao tre de thuc hien lenh
if(cmd<0x02){ //dat dieu kien
delay_ms(2);//tao tre 2 mili giay
}
else{
delay_ms(1);//tao tre 1 mili giay
}

}
//chuong trinh hien thi mot ki tu
void LCD_Ki_Tu(char c){
RS = 1; //RS muc cao de ghi du lieu
out = c; //xuat du lieu
E = 0; //tao xung canh xuong
E = 1;
delay_ms(1);//tao tre
}
//chuong trinh hien thi mot chuoi ki tu
void LCD_Chuoi_Ki_Tu(char *str){
unsigned char i = 0; //khai bao bien i muc thap
while(str[i] != 0){ //dat dieu kien i khac 0
LCD_Ki_Tu(str[i]); //hien thi ki tu o vi tri i
i++; //i tang 1
}
}
//chuong trinh khoi tao

Khoa Điện – Điện tử 60


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

void LCD_Khoi_Tao(){
RW = 0; //RW muc thap de ghi lenh hoac du lieu
LCD_Lenh(set_2_8);//chon che do hien thi 2 dong 8bit
delay_ms(5);//tao tre 5 mili giay
LCD_Lenh(xoa);//xoa man hinh
LCD_Lenh(gach_chan);//chon kieu gach chan con tro
}
//chuong trinh hien thi chuoi ki tu o vi tri bat ki
void LCD_Chuoi_Ki_Tu_BK(unsigned char row, unsigned char col, char *str){
unsigned char cmd;//khai bao bien cmd
cmd = (row == 1 ? 0x80 : 0xc0) + col - 1;//tinh toan vi tri dat con tro
LCD_Lenh(cmd);//xuat vi tri dat con tro
LCD_Chuoi_Ki_Tu(str);//xuat chuoi ki tu
}
void ADC_0804(){

CS = 0;//chon chip
WR = 0;//tao xung
WR = 1;
while(INT);//doi den khi chuyen doi xong
//doc gia tri sau khi chuyen doi
RD = 0;
adc = in;
RD = 1;
}
void hienthi(unsigned int a){
LCD_Chuoi_Ki_Tu_BK(1,1,"NHIET DO: ");//hien thi "NHIET DO: " hang 1, cot 1
if(a<10){
LCD_Ki_Tu(' ');//hien thi so hang tram cua nhiet do
LCD_Ki_Tu(' ');//hien thi so hang chuc
LCD_Ki_Tu(a%10+0x30);//hien thi so hang don vi
LCD_Ki_Tu(0xdf); //hien thi ki tu 'do'
LCD_Ki_Tu('C'); //hien thi chu 'C'
}
else if(a<100){
LCD_Ki_Tu(' ');//hien thi so hang tram cua nhiet do
LCD_Ki_Tu(a%100/10+0x30);//hien thi so hang chuc
LCD_Ki_Tu(a%10+0x30);//hien thi so hang don vi
LCD_Ki_Tu(0xdf); //hien thi ki tu 'do'
LCD_Ki_Tu('C'); //hien thi chu 'C'
}
else{
LCD_Ki_Tu(a/100+0x30);//hien thi so hang tram cua nhiet do
LCD_Ki_Tu(a%100/10+0x30);//hien thi so hang chuc

Khoa Điện – Điện tử 61


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

LCD_Ki_Tu(a%10+0x30);//hien thi so hang don vi


LCD_Ki_Tu(0xdf); //hien thi ki tu 'do'
LCD_Ki_Tu('C'); //hien thi chu 'C'
}
}
void main(){
unsigned char t;
LCD_Khoi_Tao();//khoi tao trang thai lam viec
LCD_Lenh(tat_con_tro);//dat lai kieu nhap nhay con tro
while(1){
ADC_0804();//goi ham doc ADC
t = adc * 1.961f + 0.5f;//tinh toan
hienthi(t);//hien thi nhiet do
delay_ms(500);//tre 500 mili giay
}
}
3.4. Mô phỏng mạch điện và đoạn code trên.
3.5. Dùng mạch nạp để nạp đoạn code trên máy tính vào vi điều khiển.
3.6. Gắn vi điều khiển vào KIT, cấp nguồn chạy thực tế.
4. BÀI TẬP:
4.1. Thực hiện lại mục 3.4 nhưng gắn thêm RELAY ngõ OUT (P1.7) vi điều kiển nếu nhiệt độ
dưới 40 độ thì bật RELAY và ngược lại.
4.2. Thực hiện lại bài 4.1. Với điều kiện:
- Nếu nhiệt độ dưới 37 độ thì bật RELAY (gắn thêm đèn tròn) cho đến khi nhiệt độ vượt quá
40 độ.
- Nếu nhiệt độ vượt quá 40 độ thì tắt RELAY cho đến khi nhiệt độ dưới 37 độ.
Sau khi mô phỏng thành công hãy nạp vào vi điều khiển và thực hiện trên KIT thực hành.

Khoa Điện – Điện tử 62


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Phần 2:
Lập trình Arduino

Khoa Điện – Điện tử 63


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bài thực hành số 1: LẬP TRÌNH ĐIỀU KHIỂN LED ĐƠN


1. MỤC ĐÍCH – YÊU CẦU:
1.1. Mục đích:
- Kết nối được LED với chân digital của Arduino
- Lập trình điều khiển bật tắt LED dùng chân digital của Arduino
- Sử dụng lệnh nhập xuất digital
1.2. Yêu cầu:
- Điều khiển nhập xuất được các chân digital của Arduino
- Sử dụng được lệnh digitalWrite và delay để điều khiển LED
- Sử dụng được lệnh for để tạo vòng lặp xác định.
2. CƠ SỞ LÝ THUYẾT:
2.1. Board Arduino:
Thực hành trên board arduino UNO

Khoa Điện – Điện tử 64


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Các thông số của bo Arduino UNO R3


Vi điều khiển ATmega328P
Điện áp hoạt động 5V
Điện áp vào khuyên dùng 7-12V
Digital I/O pin 14 (6 pin -PWM)
Analog Input Pins 6
Cường độ dòng điện trên mỗi I/O pin 20 mA
Flash Memory 32 KB
SRAM 2 KB
EEPROM 1 KB
Tốc độ 16 MHz
Lưu ý:
- Tổng chân có thể lập trình: Từ 0-14 và A0-A5.
- Các chân đặc biệt:
+ Ngõ vào tương tự: A0-A5.
+ Ngõ ra điều chế độ rộng xung (PWM): ~3, 5, 6, 9, 10, 11.
- Cổng USB có thể vừa là nguồn nuôi, vừa là cáp nạp code.
- Cổng USB đang giao tiếp truyền nối tiếp với máy tính. Cổng này đang giao tiếp 2
chân 0 (Rx) và 1 (Tx) với vi điều khiển.
2.2. Cách mắc LED đơn:
Có 2 kiểu mắc:

Kiểu mắc Mức logic tích cực

0
digitalWrite(13,0);
hoặc digitalWrite(13,LOW);

1
digitalWrite(13,0);
hoặc digitalWrite(13,HIGH);

Khoa Điện – Điện tử 65


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

2.3. LED RGB:


LED RGB là LED tích hợp 3 LED có 3 màu chuẩn R (Red), G (Green), B (Blue) mắc
cung anode hoặc cathode và có điện trở hạn dòng mắc sẵn.
Sơ đồ thực tế Sơ đồ mô phỏng Proteus

D2
R
G K
B
RGBLED-CC
Loại K chung, điều khiển mức 1
2.4. Lệnh thực hiện:
- Lệnh xuất ngõ ra dưới dạng số: 0 hoặc 1.
digitalWrite( tên chân, giá trị);
Ví dụ : Xuất ra chân 13 mức cao (mức 1)
digitalWrite(13,1); hoặc digitalWrite(13,HIGH);
Ví dụ : Xuất ra chân 13 mức thấp (mức 0)
digitalWrite(13,0); hoặc digitalWrite(13,LOW);
- Lệnh làm trễ với thời gian mili giây:
delay(m);
Ví dụ: Làm trễ 1 giây.
delay(1000);
- Lệnh tạo vòng lặp for:
for(khởi tạo; điều kiện; bước nhảy)
Ví dụ : Muốn công việc thực hiện 5 lần
for(i=0;i<5;i++)
{
Công việc
}

Khoa Điện – Điện tử 66


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

3. TRÌNH TỰ THỰC HIỆN:


3.1. Yêu cầu 1: Điều khiển 1 LED đơn sáng tắt.
3.2. Kết nối phần cứng:
+ Kết nối phần cứng trên KIT thực hành:
Kết nối chấn 13 của arduino với 1 LED đơn hoặc quan sát trên arduino đã có LED gắn
vào chân 13..

+ Mô phỏng trên Proteus:


Từ khóa:

Tên linh kiện Hình ảnh Keyword


SIM1

AREF

13
13
12
ARDUINO

SIMULNO UNO
RESET 12
~11
11
5V ~10
10
9
Board Arduino UNO ~9
8
(hoặc đánh Arduino sau đó
SIMULINO
POWER

GND 8

tìm các dòng Arduino)


ATMEGA328P

7
DIGITAL (PWM~)

7
~6
6
AT M EL

A0 5
ANALOG IN

A0 ~5
A1 A1
4
4
A2 A2 ~3
3
A3 A3 2
2
A4 A4 TX > 1
1
A5 A5 RX < 0
0
www.arduino.cc
blogembarcado.blogspot.com

SIMULINO UNO

Điện trở
R2 10k
RES

D2 LED-YELLOW
LED đơn Led-
D2
R
G K
LED RGB K chung B
RGBLED-CC
RGBLED-CC

Khoa Điện – Điện tử 67


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Mạch điện:
SIM1

AREF
R1
13

ARDUINO
RESET 12 330
~11
5V ~10
D1
~9 LED-YELLOW

SIMULINO
POWER
GND 8

ATMEGA328P

DIGITAL (PWM~)
7
~6

ATMEL
ANALOG IN
A0 ~5
A1 4
A2 ~3
A3 2
A4 TX > 1
A5 RX < 0
www.arduino.cc
blogembarcado.blogspot.com

3.3. Lưu đồ giải thuật và chương trình:


- Lưu đồ giải thuật:

- Viết Code:

Bước 1: Mở phần mềm Arduino IDE


Bước 2: Viết code
int led = 13; //khai báo biến led thay cho chân 13 Arduino
void setup() {
pinMode(led,OUTPUT); //cấu hình chân led là OUTPUT
}
void loop() {

Khoa Điện – Điện tử 68


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

digitalWrite(led,HIGH); //xuất tín hiệu mức cao ở chân led(chân 13)


delay(1000); //tạo trễ 1000ms = 1 giây
digitalWrite(led,LOW); //xuất tín hiệu mức thấp ở chân led(chân 13)
delay(1000); //tạo trễ 1000ms = 1giây
}
Bước 3: Kiểm tra lỗi của code

Click vào Verify/Compile


Xảy ra 2 trường hợp:
Trường hợp không lỗi Trường hợp lỗi

Bước 4: Xuất file HEX để mô phỏng

Bước 4: Nếu chạy thực tế


Bước 4.1: Kết nối PC với board arduino

Khoa Điện – Điện tử 69


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bước 4.2: Kiểm tra máy vi tính đã kết nối với board Arduino
Vào Tools/Port

chưa kết nối được với board Arduino Đã kết nối được với board Arduino

Bước 4.3: Chọn loại board arduino để nạp


Chọn đúng loại board arduino để nạp. Trong tài liệu, tác giả hướng dẫn sử dụng board
arduino UNO nên chọn loại board này

Bước 4: Nạp code xuống board arduino UNO

Click vào Upload


4. Bài tập:
4.1. Thay đổi giá trị trong hàm delay với giá trị bất kỳ và nhận xét.
4.2. Lập trình thay đổi thời gian sáng tắt của LED với thời gian sáng là 10 giây, thời gian
tắt 5 giây.
4.3. Thực hiện lại bài tập mẫu sao cho LED chớp tắt 3 lần rồi dừng.
4.4. Thiết kế mạch và viết code điều khiển 8 LED đơn sáng dần, lặp lại vô tận.
4.5. Thực hiện lại 4.4 với thời gian lặp lại 5 lần rồi dừng.
4.6. Lắp mạch và thực hiện yêu cầu sau:

Khoa Điện – Điện tử 70


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Mạch thực tế Mạch mô phỏng Proteus

SIMULINO UNO

SIM1
RESET
A5
A4
A3
A2
A1
A0

GND

5V
ANALOG IN POWER

blogembarcado.blogspot.com
www.arduino.cc
ATMEL
ATMEGA328P

ARDUINO
SIMULINO
DIGITAL (PWM~)

RX < 0
TX > 1

AREF
~10
~11
~3

~5
~6

~9

12
13
2

11
12
13
13

330
R3
Lưu ý: (hình ngược) B
12
- GND nối GND K G

330
R4
R

- Chân 13 nối B

RGBLED-CC
D1
11
- Chân 12 nối G

330
R5
- Chân 11 nối R
- Yêu cầu 1: Viết code để LED sáng màu đỏ
- Yêu cầu 2: Viết code để LED sáng đổi màu: đỏ  xanh lá  xanh dương  vàng 
tím  trắng  đỏ….

Khoa Điện – Điện tử 71


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bài thực hành số 2:


LẬP TRÌNH GIAO TIẾP LED ĐƠN VÀ PHÍM NHẤN ĐƠN

1. MỤC ĐÍCH VÀ YÊU CẦU:


1.1. Mục đích:
- Kết nối phần cứng giữa LED, nút nhấn với Arduino
- Lập trình điều khiển sáng tắt LED bằng nút nhấn
1.2. Yêu cầu:
- Sử dụng lệnh nhập xuất digitalRead và câu lệnh if, while trong Arduino
- Xác định được phím ấn tác động mức cao hay thấp.
2. CƠ SỞ LÝ THUYẾT:
2.1. Cách đấu phím ấn đơn
Có 2 cách đấu phím ấn đơn: về nguyên tắc là đấu nối tiếp phím ấn với điện trở (khoảng
10k), một đầu nối nguồn (+5V) và 1 đầu nối GND. Điểm giữa phím ấn và điện trở đưa vào chân
vi điều khiển. Tùy theo thứ tự phím ấn ở trên hay dưới mà có 2 cách như sau:

Cách đấu 1: tác động mức thấp Cách đấu 2: tác động mức cao

- Khi không đang ấn: chân VĐK mức cao - Khi không đang ấn: chân VĐK mức thấp
(mức 1). (mức 0).
- Khi đang ấn: chân VĐK mức thấp (mức 0). - Khi đang ấn: chân VĐK mức cao (mức 1).

Khoa Điện – Điện tử 72


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

2.2. Xác định trạng thái phím ấn:


Xét cách đấu 1:
Trạng thái chưa đang ấn Trạng thái đang ấn
SIM1 SIM1

AREF AREF

13 13
R4

ARDUINO
R4
ARDUINO

RESET 12
RESET 12
10k ~11 10k
~11
5V ~10
5V ~10
~9
~9

SIMULINO
POWER
8
SIMULINO

GND
POWER

GND 8

ATMEGA328P
ATMEGA328P

DIGITAL (PWM~)
7
DIGITAL (PWM~)

7
~6

ATMEL
~6

ANALOG IN
ATMEL

A0 ~5
ANALOG IN

A0 ~5
A1 4
A1 4 A2 ~3
A2 ~3 A3 2
A3 2 A4 TX > 1
A4 TX > 1 A5 RX < 0
A5 RX < 0 www.arduino.cc
www.arduino.cc blogembarcado.blogspot.com
blogembarcado.blogspot.com SIMULINO UNO
SIMULINO UNO

A=digitalRead(8); A=digitalRead(8);
Kết quả: Kết quả:
A = HIGH hoặc A = 1 hoặc A = TRUE A = LOW hoặc A = 0 hoặc A = FALSE
2.3. Sử dụng lệnh:
Có thể sử dụng lệnh if hoặc while.
- Ví dụ sử dụng lệnh if:
if(digitalRead(8)==0)
{
Thực hiện nếu ấn phím
}
Hoặc:
if(!digitalRead(8))
{
Thực hiện nếu ấn phím
}
- Sử dụng lệnh while:
while(!digitalRead(8)) ; // chờ buông phím ấn
{ Thực hiện sau khi ấn phím}

Khoa Điện – Điện tử 73


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

3. TRÌNH TỰ THỰC HIỆN:


3.1. Yêu cầu đặt ra: Điều khiển sáng, tắt bằng 2 phím ấn.
3.2. Kết nối phần cứng:.
+ Sơ đồ thực tế:

+ Sơ đồ mô phỏng Proteus:

SIM1

AREF
13

13
13
ARDUINO

RESET 12
~11 R1 R2 R3
5V ~10
10k 10k 330
~9
SIMULINO
POWER

GND 8
2 3
ATMEGA328P

DIGITAL (PWM~)

7
~6 D1
ATMEL
ANALOG IN

A0 ~5
A1 4
3
A2 ~3
2
A3 2
A4 TX > 1
A5 RX < 0
www.arduino.cc
blogembarcado.blogspot.com
SIMULINO UNO

Khoa Điện – Điện tử 74


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

3.3. Lưu đồ giải thuật và chương trình:


Lưu đồ giải thuật:

Code chương trình:


int led = 13; //khai báo biến led thay cho chân 13 Arduino
int nutNhan1 = 2; //khai báo chân 2 tên nutNhan1
int nutNhan2 = 3; //khai báo chân 3 tên nutNhan3
void setup() {
pinMode(led,OUTPUT); //cấu hình chân led là OUTPUT
pinMode(nutNhan1,INPUT); //cấu hình chân nut nhan là INPUT
pinMode(nutNhan2,INPUT);
}
void loop() {
if(digitalRead(nutNhan1) == LOW) //kiểm tra nếu nút 1 có được nhấn hay không
digitalWrite(led,HIGH); //xuất tín hiệu mức cao ở chân led(chân 13)
if(digitalRead(nutNhan2) == LOW) //kiểm tra nếu nút 2 có được nhấn hay không
digitalWrite(led,LOW);//xuất tín hiệu mức thấp ở chân led(chân 13)
}
4. Bài tập:
4.1. Thực hiện lại bài mẫu với 4 phím ấn điều khiển 2 LED đơn.
4.2. Thực hiện lại bài tập mẫu với 1 phím ấn điều khiển 1 LED đơn: mỗi khi ấn sẽ làm đổi
trạng thái LED.
4.3. Thực hiện lại bài tập 4.2 với 4 phím ấn điều khiển 2 LED đơn:
- Phím 1: Điều khiển sáng tắt LED1 mỗi khi ấn.
- Phím 2: Điều khiển sáng tắt LED2 mỗi khi ấn.
- Phím 3: Mỗi khi ấn sẽ làm cả 2 LED sáng.

Khoa Điện – Điện tử 75


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

- Phím 4: Mỗi khi ấn sẽ làm cả 2 LED tắt.


4.4. Lắp mạch và viết code điều khiển LED RGB bằng 2 phím ấn như sau:

SIM1

AREF

13

12

11
13
13
ARDUINO
12
RESET 12
11
~11 R1 R2 R3 R4 R5
5V ~10
10k 10k 330 330 330
~9
SIMULINO
POWER

GND 8
2 3
ATMEGA328P

DIGITAL (PWM~)

B
G
R
~6 D1
ATMEL
ANALOG IN

A0 ~5 RGBLED-CC
A1 4

K
3
A2 ~3
2
A3 2
A4 TX > 1
A5 RX < 0
www.arduino.cc
blogembarcado.blogspot.com
SIMULINO UNO

- Yêu cầu 1: Ấn phím 1 đèn Đỏ sáng, ấn phím 2 đèn Đỏ tắt.


- Yêu cầu 2: Ấn phím 1 đèn sáng màu Tím, ấn phím 2 đèn sáng màu Vàng.
- Yêu cầu 3:
Mỗi khi ấn phím 1 thì đèn sáng màu theo thứ tự: Đỏ  Xanh lá  Xanh dương  Vàng
 Tím  Trắng  Đỏ….
4.5. Thực hiện lại bài mẫu, thay LED đơn bằng module Relay tác động mức cao.
4.6. Thực hiện lại bài 4.1 với module phím ấn cảm ứng điện dung sau (tác động mức cao)

Hướng dẫn:
- Cấp nguồn +5V và GND cho module.
- Các ngõ ta sẽ lên mức cao khi có phím được ấn.

Khoa Điện – Điện tử 76


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bài thực hành số 3:


LẬP TRÌNH ARDUINO ĐIỀU KHIỂN 8 LED ĐƠN
1. MỤC ĐÍCH VÀ YÊU CẦU:
1.1. Mục đích:
- Lập trình điều khiển PORT của vi điều khiển;
- Sử dụng mảng 1 chiều;
- Giải thuật che mặt nạ.
1.2. Yêu cầu:
- Điều khiển được PORT của vi điều khiển;
- Truy xuất được dữ liệu trong mảng;
- Điều khiển 8 led sáng tùy ý.
2. CƠ SỞ LÝ THUYẾT:
2.1. Mảng:
- Khai báo mảng: Thực chất là biến có cùng chức năng.
Cú pháp: kiểu_mảng tên_mảng[]={phần tử thứ 0, thứ 1,….};
Ví dụ: Khai báo mảng cảm biến tên sensor có 5 phần tử, giá trị các sensor là số nguyên
int sensor[]={34, 67, 200, 145, 1};
- Truy xuất mảng:
Cú pháp: Biến = tên_mảng[vị trí mảng];
Ví dụ: Gán cho biến Giá trị bằng giá trị cảm biến thứ 3.
Gia_tri = sensor[3];
Kết quả: Gia_tri = 145;
Lưu ý: Phần tử đầu tiên của mảng là phần tử thứ 0.
2.2. Giải thuật sử dụng mặt nạ:
Là giải thuật dùng một mặt nạ che bớt các bit (phần tử) không cần thiết để lộ ra các bit (phần
tử) cần thiết.
Ví dụ: Gia_tri = 145 tương đương số nhị phân Gia_tri = 1001 0001
Nếu ta thực hiện phép toán AND với số nhị phân 1000 0000 thì
Gia_tri & 1000 0000 = 1001 0001 & 1000 0000 = 1000 0000 ≠ 0
Gia_tri & 0100 0000 = 1001 0001 & 0100 0000 = 0000 0000 = 0

Khoa Điện – Điện tử 77


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Gia_tri & 0001 0000 = 1001 0001 & 0001 0000 = 0001 0000 ≠ 0
Kết luận: Mặt nạ trong trường hợp này là bit 1 kết hợp toán AND để tìm ra các vị trí
1 (≠ 0) và vị trí 0 (=0).
Giải thuật:

T Bit thứ 7 là bit 1


Gia_tri & 1000 0000

Bit thứ 7 là bit 0

Để code viết ngắn hơn, người ta thường sử dụng số HEX:


0b1000 0000 = 0x80
3. TRÌNH TỰ THỰC HIỆN:
3.1. Yêu cầu đặt ra: Điều khiển 8 LED sáng dần.
3.2. Kết nối phần cứng:
+ Kết nối thực tế:
Kết nối lần lượt các chân 2,3,4,5,6,7,8,9 Arduino với điện trở nối tiếp chân Anod của
các LED. Chân Katod của các LED nối với GND.
Kết nối Arduino với KIT thực hành:

Khoa Điện – Điện tử 78


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

+ Mạch mô phỏng Proteus:


SIM1 330 D1
R1
330 D2
R2

AREF 330 D3
R3
13
D4

ARDUINO
RESET 12 330
~11
R4
5V ~10
~9 330 D5
R5

SIMULINO
POWER
GND 8

D6

ATMEGA328P
330

DIGITAL (PWM~)
7
~6
R6
ATMEL
ANALOG IN

A0 ~5
A1 4 330 D7
A2 ~3
R7
A3 2
A4 TX > 1 330 D8
A5 RX < 0
R8
www.arduino.cc
blogembarcado.blogspot.com
SIMULINO UNO

3.3. Chương trình:


Chương trình mẫu số 1: Xuất một byte dữ liệu: 11000101
char a=0b11000101;
byte led[]={9,8,7,6,5,4,3,2};
void setup() {char i;
for(i=2;i<10;i++)
pinMode(led[i],OUTPUT);}
int hienthi(char num)
{
if(num&0x80) digitalWrite(led[0],1);
else digitalWrite(led[0],0);
if(num&0x40) digitalWrite(led[1],1);
else digitalWrite(led[1],0);
if(num&0x20) digitalWrite(led[2],1);
else digitalWrite(led[2],0);
if(num&0x10) digitalWrite(led[3],1);
else digitalWrite(led[3],0);
if(num&0x08) digitalWrite(led[4],1);
else digitalWrite(led[4],0);
if(num&0x04) digitalWrite(led[5],1);
else digitalWrite(led[5],0);
if(num&0x02) digitalWrite(led[6],1);
else digitalWrite(led[6],0);
if(num&0x01) digitalWrite(led[7],1);
else digitalWrite(led[7],0);
}
void loop() { hienthi(a); }

Khoa Điện – Điện tử 79


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Chương trình con hiển thị có thể viết ngắn hơn:


int hienthi(char num)
{char j=0b10000000;
for(i=0;i<8;i++) {
if(num&j) digitalWrite(led[i],1);
else digitalWrite(led[i],0);
j>>=1;}}
Chương trình mẫu số 2: Điều khiển 8 LED đơn sáng dần từ trái sang phải
byte hieuung[]={0,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF};
byte led[]={9,8,7,6,5,4,3,2};
byte i,m;
void setup() {
for(i=2;i<10;i++)
pinMode(led[i],OUTPUT);}
int hienthi(byte num)
{byte j=0b10000000;
for(i=0;i<8;i++) {
if(num&j) digitalWrite(led[i],1);
else digitalWrite(led[i],0);
j>>=1;}}
void loop() {
for(m=0;m<9;m++)
{hienthi(hieuung[m]);
delay(500);}}
4. BÀI TẬP:
4.1. Thực hiện lại bài mẫu số 2 với yêu cầu điều khiển 8 LED sáng dồn.
4.2. Thực hiện lại bài mẫu số 2 cho 10 LED.

Khoa Điện – Điện tử 80


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bài thực hành số 4:


LẬP TRÌNH ARDUINO HIỂN THỊ LÊN LED 7 ĐOẠN
1. MỤC ĐÍCH VÀ YÊU CẦU:
1.1. Mục đích:
- Lập trình điều khiển LED 7 đoạn.
- Sử dụng phương pháp quét để hiển thị lên LED 7 đoạn.
- Sử dụng phương pháp ghi dịch để hiển thị lên LED 7 đoạn.
1.2. Yêu cầu:
- Kết nối được phần cứng Arduino với LED 7 đoạn.
- Lập trình hiển thị được lên LED 7 đoạn bằng phương pháp quét và ghi dịch.
- Lập trình đếm LED 7 đoạn.
2. CƠ SỞ LÝ THUYẾT:
2.1. LED 7 đoạn: (xem lại bài LED 7 đoạn phần vi điều khiển MCS51)
2.2.
3. TRÌNH TỰ THỰC HIỆN:

4. Kết nối phần cứng:


- Trong mô phỏng bằng phần mềm Proteus ta có thể sử dụng LED 7 đoạn 2 số và 2 cổng
NOT để quét 2 LED 7 đoạn với Arduino.
- Kết nối lần lượt các chân 1,2,3,4,5,6,7,11,10 của Arduino với chân G,F,E,D,C,B,A,1,2
của LED 7 đoạn 2 số.

Khoa Điện – Điện tử 81


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Kết nối Arduino với KIT thực hành:


- Kết nối các chân từ 0 đến 7 của Arduinoi với 8 chân LED – DATA trên module LED 7
đoạn
- 2 chân số 10 và 11 cảu Arduino kêt nối với 2 chân LED – SCAN trên module

5. Lưu đồ giải thuật và chương trình:


4.1. Lưu đồ:

Khoa Điện – Điện tử 82


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bắt đầu

Tạo bộ mã cho LED 7 đoạn hiển


thị từ số 0 đến 9

- Khởi tạo mã quét


-Khởi tạo chân
- Khởi tạo bộ đếm i=0

- Lấy mã LED trong bộ mã


- Hiển thị
- Xoay mã quét
- Làm trễ
- Chống lem
- Tăng bộ đếm lên 1

i < 100 Đ

Kết thúc

4.2. Code chương trình:


#define led1 0x04//mã led 1 sang led 2 tat
#define led2 0x08//mã led 2 sang led 1 tat
#define led3 0x0C//mã 2 led tắt
char so[]={0x03,0x9f,0x24,0x0c,0x98,0x48,0x40,0x1f,0x00,0x08};

Khoa Điện – Điện tử 83


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

// 0 1 2 3 4 5 6 7 8 9
void setup(){
DDRD=0XFF;//khai báo 8 chân ở PORTD
DDRB=0X0C;//khai báo chân 11 và 10 ở PORTB
}
//hàm hiển thị led 7 đoạn
void hienthi(unsigned char i,unsigned int t){
unsigned char chuc, donvi;
t=t/2;
chuc = i/10;//chia lấy số chục
donvi= i%10;//chia lấy số đơn vị
if(i<10){
for(int a=0;a<t;a++){
PORTB=led2;//xuất mã quét ra portB led 2 sáng
PORTD=so[donvi];//xuất mã 7 đoạn ra portD
delay(1);//tạo trễ 1 mili giây
PORTB=led3;//tắt led 1 và led 2
delay(1);//tạo trễ 1 mili giây
}
}
else{
for(int a=0;a<t;a++){
//quét số chục
PORTB=led1;//led 1 sáng
PORTD=so[chuc] ;
delay(1);//tạo trễ 1 mili giây
PORTB=led3;//tắt led
//quét số đơn vị
PORTB=led2;//led 2 sáng
PORTD=so[donvi];
delay(1);//tạo trễ 1 mili giây
PORTB=led3;//
}
}
}
void loop(){//vòng lặp
for(int i=0;i<100;i++){//i sẽ tăng từ 0 đến 99
hienthi(i,1000);//hiển thị số i, trễ 1 giây
}
}
4.3. Mô phỏng mạch điện và đoạn code trên.
4.4. Nạp đoạn code trên vào vi điều khiển, cấp nguồn chạy thực tế.
4.5. Hãy thay thế các giá trị HEX trong chương trình bằng nhị phân.

Khoa Điện – Điện tử 84


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

5. Bài tập:
5.1. Lập trình lại hiển thị đếm số từ 41 đến 86.
5.2. Tạo thêm mã 7 đoạn chữ cái từ A đến F và hiển thị lên led 7 đoạn.
5.3. Lập trình hiển thị 4 đến 8 LED 7 đoạn.

Khoa Điện – Điện tử 85


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bài thực hành số 5: LẬP TRÌNH ARDUINO ĐỌC GIÁ TRỊ


ANALOG
1. Mục đích:
- Điều khiển độ sáng của LED bằng PWM thông qua đọc giá trị analog từ biến trở
- Sử dụng hàm analogRead và analogWrite.
2. Yêu cầu:
- Kết nối được phần cứng giao tiếp Arduino với LED và biến trở
- Lập trình hiển thị được độ sáng của LED bằng cách điều chỉnh biến trở
3. Kết nối phần cứng:
Chân 9 của arduino nối với chân Anot của LED thông qua trở hạn dòng.
Chân A0 nối chân 2 của biến trở. Chân 1 và 3 của biến trở nối với 5V và GND.

Khoa Điện – Điện tử 86


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Kết nối Arduino với KIT thực hành:

4. Lưu đồ giải thuật và chương trình:


4.1. Lưu đồ giải thuật:

Bắt đầu

Khai báo chân

- Đọc giá trị analog


- PWM
- Làm trễ

Kết thúc

4.2. Code chương trình:


const int sensorPin = A0; //khai báo chân A0 là sensorPin
const int ledPin = 9; // khai báo chân 9 là ledPin
int a=0;//đặt giá trị ban đầu cho a
void setup() {

Khoa Điện – Điện tử 87


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

pinMode(ledPin, OUTPUT);//đặt chân ledPin là OUTPUT


}

void loop() { //vòng lặp


a = analogRead(A0);//gán giá trị analog cho a
analogWrite(ledPin,a/4);//hàm tạo PWM tại chân ledPin, độ lớn là a/4
delay(10);//chờ 10 mili giây
}
4.3. Mô phỏng mạch điện và đoạn code trên.
4.4. Nạp đoạn code trên vào vi điều khiển, cấp nguồn chạy thực tế.
4.5. Thay ledPin=8 giải thích hiện tượng.
5. Bài tập:
5.1. Thiết kế phần cứng và lập trình thay đổi độ sáng cùng lúc 6 LED.
5.2. Thiết kế phần cứng và lập trình điều khiển sáng tắt 10 LED theo giá trị analog.
5.3. Thiết kế phần cứng và lập trình đồng hồ đo điện áp hiển thị lên LCD.
5.4. Lập trình hiển thị lên LED 7 đoạn giá trị điện áp tại chân A0.

Khoa Điện – Điện tử 88


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bài thực hành số 6: LẬP TRÌNH ĐIỀU KHIỂN LED MA TRẬN


1. Mục đích:
- Lập trình hiện thị ký tự lên LED ma trạn bằng phương pháp quét.
2. Yêu cầu:
- Kết nối được sơ đồ mạch giữa LED ma trận với Arduino
- Hiễn thị thông tin lên LED ma trận bằng phương pháp quét.
3. Kết nối phần cứng:
Sử dụng IC 74HC595 để điều khiển LED ma trận 8x8
+ Sơ đồ chân IC 74HC595:

+ Sơ đồ nối với KIT thực hành:

+ Chân 11, chân 14, và chân 12 của 74HC595 lần lượt nối với chân 13, 12, 11(7,6.5) của
Arduino.
+ Chân 8 và chân 13 nối xuống GND, chân 16 và chân 10 nối nguồn 5v.
+ Các chân của LED ma trận được nối lần lượt với các chân của 2 IC 74HC595 như sau:
LED ma trận 8x8 74HC595

Khoa Điện – Điện tử 89


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Cột 1 15
Cột 2 1
Cột 3 2
Cột 4 3
Cột 5 4
Cột 6 5
Cột 7 6
Cột 8 7
Hàng 1 15
Hàng 2 1
Hàng 3 2
Hàng 4 3
Hàng 5 4
Hàng 6 5
Hàng 7 6
Hàng 8 7
Giải thuật và viết chương trình
+ Lưu đồ:

+ Chương trình
int clock1=13;
int data1=12;
int enable1=11;
int clock2=7;
int data2=6;

Khoa Điện – Điện tử 90


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

int enable2=5;
unsigned int arrayCol[8]={0x66,0x66,0x66,0x7E,0x66,0x66,0x3C,0x18}; //mã dữ liệu cột cho
ký tự "A"
unsigned int
arrayRow[8]={0b11111110,0b11111101,0b11111011,0b11110111,0b11101111,0b11011111
,0b10111111,0b01111111}; //mã quét hàng
void setup() {
for(int d=3;d<=13;d++)
{
pinMode(d,OUTPUT); //thiet lập OUTPUT cho các chân cần sử dụng
}
}
void loop() {
for(int i=0;i<=7;i++)
{
//xuat du lieu ra cac cot
digitalWrite(enable1,LOW);
shiftOut(data1,clock1,MSBFIRST,arrayCol[i]);
digitalWrite(enable1,HIGH);
//quet lần lượt các hàng
digitalWrite(enable2,LOW);
shiftOut(data2,clock2,MSBFIRST,arrayRow[i]);
digitalWrite(enable2,HIGH);
delay(1); //tạo trễ phù hợp để mắt lưu ảnh nên nhìn thấy ký tự "D" trên ma trận
//tat led
digitalWrite(enable2,LOW);
shiftOut(data2,clock2,MSBFIRST,255);
digitalWrite(enable2,HIGH);
}
}
4. BÀI TẬP
4.1. Thực hiện yêu cầu trên với các ký tự B,C, ….Z và các số 0, 1, 2, …9.
4.2. Thực hiện lạy yêu cầu trên với các ký hiệu: !, >,<,?,$…
4.3. Dựa vào bài thực hành về led 7 đoạn, hãy viết chương trình để chữ A chạy từ trái qua phải.

Khoa Điện – Điện tử 91


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bài thực hành số 7: LẬP TRÌNH ĐIỀU KHIỂN ĐỘNG CƠ DC


1. Mục đích:
- Điều khiển đóng cắt động cơ DC bằng IC L293
2. Yêu cầu:
- Kết nối được sơ đồ mạch giữa vi điều khiển và IC L293
- Lập trình điều khiển động cơ quay/dừng, quay đảo chiều
3. Kết nối phần cứng:
- Nguyên lý của module điều khiển động cơ dùng L293 ta có thể xem lại ở phần lập trình
ứng dụng điều khiển động cơ của vi điều khiển 8051.
- Kết nối chân 5,8 Arduino với module điều khiển động cơ L293 và nút nhấn vào chân số
2 trên board Arduino.
+ Sơ đồ nguyên lý:

Khoa Điện – Điện tử 92


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

+ Sơ đồ kết nối với KIT:

4. Lưu đồ giải thuật và chương trình:


4.1. Lưu đồ giải thuật

4.2. Code chương trình:


#define switch1 2//chan nut nhan 1
#define switch2 3//chan nut nhan 2
#define speedPin 5 //chan so 1 Enable cua L293

Khoa Điện – Điện tử 93


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

#define pin 8 //chan so 2 cua L293


void setup() {
pinMode(switch1,INPUT);
pinMode(switch2,INPUT);
pinMode(speedPin,OUTPUT);
pinMode(pin,OUTPUT);
}

void loop() {
analogWrite(speedPin,255); //đăt tốc đô quay cho đong cơ
//kiểm tra nut nhan nào đuoc nhấn để đảo chiều đong cơ
if((digitalRead(switch1) == LOW))
{
digitalWrite(pin,HIGH);
}
if((digitalRead(switch2) == LOW))
{
digitalWrite(pin,LOW);
}
}
5. Bài tập:
5.1. Lập trình điều khiển cho động cơ quay với tốc độ lớn nhất và nhỏ nhất không dùng
biến trở
5.2. Lập trình điều khiển cho động cơ quay tốc độ 75% sau 10 giây quay với tốc độ 25%
trong 5 giây rồi dừng.
5.3. Kết nối với nút nhấn đơn. Viết chương trình dùng 4 nút nhấn điều khiển tốc độ động
cơ theo yêu cầu:
- Ấn phím 1 động cơ dừng.
- Ấn phím 2 động cơ quay tốc độ 25%
- Ấn phím 3 động cơ quay tốc độ 75%
- Ấn phím 4 động cơ đảo chiều (giữ nguyên tốc độ hiện tại)
Lưu ý: trước khi đảo chiều phải dừng động cơ ít nhất 3 giây.

Khoa Điện – Điện tử 94


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bài thực hành số 8: LẬP TRÌNH GIAO TIẾP ARDUINO VỚI


LCD
1. Mục đích:
- Tìm hiểu LCD 16x2 (chế độ 4 bit, 2 dòng, 16 cột)
- Lập trình hiển thị chuỗi ký tự lên LCD
2. Yêu cầu:
- Kết nối được phần cứng giao tiếp Arduino với LCD 16x2
- Lập trình hiển thị được chuỗi ký tự lên LCD
3. Kết nối phần cứng:
Ở đây ta sử dụng LCD 16x2 ở chế độ 4 bit, do đó chỉ dùng 4 chân data (D4-D7)
- Kết nối lần lượt các chân 2,3,4,5 Arduino với chân data D4,D5,D6,D7 của LCD.
- Chân số 11 nối với chân Enable, 12 nối với chân RS.
- Chân R/W và VSS nối với GND. Chân VDD nối nguồn 5V.
- Chân VEE nối với chân biến trở để điều chình độ sáng màn hỉnh LCD.

Khoa Điện – Điện tử 95


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Kết nối Arduino với KIT thực hành LCD:

4. Lưu đồ giải thuật và chương trình:


a. Lưu đồ:

b. Code chương trình:


Lập trình giao tiếp giữa Arduino và LCD 16x2 đơn giản hơn so với vi điều khiển 8051 vì
Arduino IDE đã có sẵn thự viện cho LCD là LiquidCrystal.h.
Các hàm cơ bản trong thư viện LiquidCrystal.h:
- LiquidCrystal(RS,E,D4,D5,D6,D7): định nghĩa LCD làm việc ở chế độ 4 bit
- begin(): khởi tạo số cột và dòng của LCD

Khoa Điện – Điện tử 96


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

- clear(): xóa màn hình LCD


- setCursor(): thiết lập vị trí đặt con trỏ
- print(): in văn bản lên màn hình
- cursor(): hiển thị con trỏ
- noCursor(): ẩn con trỏ
- scrollDisplayLeft(): dịch văn bản sang trái
- scrollDisplayRight(): dịch văn bản sang phải…
Ngoài ra còn nhiều hàm khác trong thư viện LiquidCrystal.h. Ta có thể truy cập vào liên kết
(https://www.arduino.cc/en/Reference/LiquidCrystal) để xem thêm.
Chương trình:
#include <LiquidCrystal.h> //khai bao thu vien LCD
LiquidCrystal lcd(12,11,5,4,3,2); //thiet lap chan cho LCD che do 4 bit
void setup() {
lcd.begin(16,2); //thiet lap loai LCD 16 cot va 2 dong
lcd.clear(); //xoa man hinh LCD
}
void loop() {
lcd.display(); //bât hiển thi LCD
lcd.setCursor(0,0); //đặt con trỏ ở cột thứ 0, dòng thứ 0
lcd.print("DHSPKT VINH LONG"); //in ra LCD dong chu DHSPKT VINH LONG
lcd.setCursor(3,1); //đặt con trỏ ở cột thứ 3, dòng thứ 1
lcd.print("Hello World"); //in ra LCD dong chữ Hello World
}
5. Bài tập:
4.1. Lập trình lại hiển thị văn bản tùy ý lên LCD 16x2
4.2. Áp dụng hàm dịch văn bản trong thư viện LiquidCrystal.h để dịch văn bản trong
chương trình ở mục 4 sang trái và phải.
4.3. Lập trình hiện thị lên LCD với IC 74HC595 để tiết kiệm số chân Arduino.

Khoa Điện – Điện tử 97


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bài thực hành số 9: LẬP TRÌNH ĐO NHIỆT ĐỘ MÔI TRƯỜNG DÙNG


LM35 HIỂN THỊ LÊN LCD VÀ SERIAL MONITOR.
1. Mục đích:
- Lập trình Arduino dùng cảm biến LM35 đo nhiệt độ môi trường hiển thị lên LCD và
Serial Monitor
2. Yêu cầu:
- Kết nối được phần cứng giao tiếp giữa Arduino với LM35
- Lập trình đọc dữ liệu từ cảm biến LM35 để hiển thị nhiệt độ lên LCD và Serial Monitor
3. Kết nối phần cứng:
- Kết nối giữa Arduino với LCD 16x2 ta có thể kết nối như bài thực hành số 8. Đối với
LM35 ta kết nối chân OUT (chân số 2) với chân A0 của Arduino, chân số 1 nối đến
nguồn 5V, chân số 3 nối GND.
- Sơ đồ chân của LM35 có thể xem lại ở bài thực hành đo lường nhiệt độ phần vi điều
khiển 8051
Kết nối với Arduino với LCD và LM35:

4. Lưu đồ giải thuật và chương trình:


4.1. Lưu đồ giải thuật:

Khoa Điện – Điện tử 98


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

4.2. Chương trình:


#include<LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2); //thiet lap chan cho LCD
int sensor = A0;
int state;
float temp;
void setup() {
lcd.begin(16,2); //thiet lap loai LCD 16 cot 2 dong
Serial.begin(9600); //thiet lap toc do baud la 9600
}
void loop() {
state = analogRead(sensor);
temp = (state*(5.0/1024.0))/0.01; //tinh toán giá trị nhiệt độ
Serial.print("Nhiet do moi truong: "); //in len Serial Monitor
Serial.println(temp);
lcd.clear();
lcd.display();
lcd.print("Nhiet do la:");
lcd.setCursor(6,1); //đặt con trỏ ở cột thứ 6, dòng thứ 1
lcd.print(temp); //in ra gia tri nhiệt độ
lcd.write(B11011111); //in ra o
lcd.print("C");
delay(3000); //tạo trễ mỗi 1 giây sẽ quay lai đọc nhiệt độ
}

Khoa Điện – Điện tử 99


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

5. Bài tập:
5.1 Thực hiện lại chương trình nhưng kết nối thêm Relay với Arduino với điều khiện nếu
nhiệt độ trên 500C thì bật Relay và ngược lại.
5.2 Thực hiện lại chương trình dùng Relay điều khiển bật tắt bóng đèn với điều kiện:
- Nếu nhiệt độ từ dưới 500C thì bật Relay điều khiển đèn sáng và hiển thị lên màn hình
LCD nhiệt độ và trạng thái bóng đèn sáng hay tắt
- Nếu nhiệt độ trên 500C thì tắt Relay điều khiển đèn tắt cho đến khi nhiệt độ dưới 500C,
hiển thị lên LCD nhiệt độ và trạng thái bóng đèn.

Khoa Điện – Điện tử 100


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

PHỤ LỤC
Phụ lục 1 : HƯỚNG DẪN CÀI ĐẶT MIKROC FOR 8051
Bước 1: Double click vào file “ Mikroc-8051-setup-v360.exe” bắt đầu cài đặt. Hộp thoại bên
dưới xuất hiện, tiếp tục chọn Next.

Bước 2: Nhấn stick ngay “ I accept the terms of the License Agreement” sao đó chọn Next.

Bước 3: Tiếp tục chọn Next.

Bước 4: Tiếp tục chọn Next.

Khoa Điện – Điện tử 101


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bước 5: Chọn ổ đĩa để lưu phần mềm, sau đó chọn Install

Bước 6: Đang cài đặt.

Bước 7: Cài đặt hoàn tất chọn Finish

Khoa Điện – Điện tử 102


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bước 8: Cài đặt chương trình 8051 FLASH chọn Yes.

Bước 9: Chọn Next và làm như các bước trên.

Bước 10: Cài đặt điều khiển lập trình 8051 FLASH.

Khoa Điện – Điện tử 103


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bước 11: Cài đặt hoàn tất, chọn No do không cần cài đặt công cụ nạp vi điều khiển bằng phần
mềm này.

Bước 12: Chọn Finish để hoàn thành cài đặt.

Khoa Điện – Điện tử 104


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Phụ lục 2 : HƯỚNG DẪN SỬ DỤNG MIKROC FOR 8051


Trong phụ lục này chỉ hướng dẫn sử dụng cơ bản phần mềm MikroC for 8051.
Mở giao diện phần mềm.

Tại cửa sổ Start Page cho phép 3 lựa chọn:


New Project… : Tạo dự án mới.
Open Project…: Mở dự án có sẵn.
Open Examples Folder…: Mở dự án mẫu.
1. Cách tạo dự án mới:
Bước 1: Tạo dự án, Có 3 cách tạo:
- Tại Start Page chọn New Project.
- Vào File/New/New Project.
- Vào Project chọn New Project.

Bước 2: Sau khi bấm vào tạo dự án mới, cửa sổ hiện lên, chọn Next để tiếp tục.

Khoa Điện – Điện tử 105


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bước 3: Cài đặt dự án

Project Name: Đặt tên cho dự án, cũng là file hex nạp code ho vi điều khiển.
Project folder: Chọn nơi lưu dự án.
Device Name: Chọn dòng vi điều khiển để lập trình.
Device Clock: Chọn tần số hoạt động (thạch anh gắn vào vi điều khiển).
Sau khi cài đặt, chọn Next để tiếp tục.
Bước 4: Chọn kiểu bộ nhớ, mặc định là kiểu bộ nhớ nhỏ. Chọn Next để tiếp tục.

Khoa Điện – Điện tử 106


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bước 5: Đưa thêm file vào dự án mới, nếu không cần thêm thì chọn Next để tiếp tục.

Bước 6: Lựa chọn thêm thư viện hoặc không, mặc định là thêm đầy đủ các thư viện.

Bước 7: Hoàn tất các bước tạo dự án mới.

Khoa Điện – Điện tử 107


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bước 8: Cửa sổ dự án mới sau khi bấm Finish.

Một số chức năng trên thanh công cụ của phần mềm Mikro C được
trình bày như các bảng sau:

Bảng chức năng biên dịch chương trình

Build Sự miêu tả

Biên dịch sang file hex

Khoa Điện – Điện tử 108


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Biên dịch tất cả sang file hex

Biên dịch và nạp chương trình cho vi điều khiển, phải


sử dụng bootloader mới được.

Bảng chức năng mô phỏng chương trình

Run Sự miêu tả

Bắt đầu phần mềm mô phỏng.

Dừng chương trình gỡ rối.

Tạm dừng Debugger.

Bước vào.

Bước qua.

Bước ra khỏi.

Chuyển đến gián đoạn trong dự án hiện tại.

Toggle Breakpoint.

Hiện / ẩn điểm dừng

Xoá điểm dừng

Show / Hide Xem Window

Hiện / Ẩn Stopwatch Window

Chuyển đổi giữa các mã nguồn C và tháo gỡ.

Khoa Điện – Điện tử 109


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Bảng chức năng nạp chương trình và chức năng khác

Tools Sự miêu tả

Nạp chương trình.

Hỗ trợ kết nối USART.

Xem và sữa dữ liệu trên EEPROM

Chạy Chart ASCII

Tạo mã hex cho led 7 đoạn.

Xuất code dạng mã HTML

Tạo những kí tự đặc biệt trên LCD.

Tạo ra ma trận dữ liệu ảnh, để hiển thị trên GLCD

Thiết bị đầu cuối giao tiếp UDP.

Hiệu chỉnh màu sắc cho chương trình.

- Cách quản lý dự án nhanh (Project manager ): Project manager giúp dễ dàng quản lý các
thành phần trong project như: source code C, các hình ảnh đã add file vào eeprom, file xml,
file hex và các file khác….

- Cách quản lý thư viện nhanh ( Library manager): Library manager nơi quản lý các thư viện
hàm trong mikroc, nếu trong chương trình bạn có sử dụng thư viện hàm nào thì phải đánh
dấu check vào thư viện đó nếu không Build sẽ bị lỗi.

- Giả sử trong chương trình có viết lệnh Lcd_out(1,1, “dientucongnghiep”) thì phải đánh dấu
check vào LCD trong Library manager.

Khoa Điện – Điện tử 110


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

- Thanh trạng thái massage: Khi bạn Build (Ctrl+F9) một chương trình thì tất cả các lỗi (nếu
như có) sẽ được hiển thị ở đây. Nếu biên dịch thành công thì sẽ hiển thị các thông tin như:
Used RAM, Used ROM và báo Finished successfully như hình

Khoa Điện – Điện tử 111


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Phụ lục 3 : CÁC LINH KIỆN THƯỜNG DÙNG KHI MÔ PHỎNG


PROTEUS
Tên linh kiện Ký hiệu Keywords
U1
19 39
XTAL1 P0.0/AD0
38
P0.1/AD1
37
P0.2/AD2
18 36
XTAL2 P0.3/AD3
35
P0.4/AD4
34
P0.5/AD5
33
P0.6/AD6
9 32
RST P0.7/AD7
21
P2.0/A8
22
P2.1/A9
23
P2.2/A10
29 24
Vi điều khiển 8952 30
31
PSEN
ALE
P2.3/A11
P2.4/A12
25
26
8952
EA P2.5/A13
27
P2.6/A14
28
P2.7/A15
1 10
P1.0/T2 P3.0/RXD
2 11
P1.1/T2EX P3.1/TXD
3 12
P1.2 P3.2/INT0
4 13
P1.3 P3.3/INT1
5 14
P1.4 P3.4/T0
6 15
P1.5 P3.5/T1
7 16
P1.6 P3.6/WR
8 17
P1.7 P3.7/RD
AT89C52

R1
Điện trở res
10k
RP1
1

2
3
4
Điện trở thanh 5
6 respack
7
8
9

RESPACK-8

LED đơn D1 Led-


LED-YELLOW

LED 7 đoạn
(lưu ý có rất nhiều loại 7seg
led 7 đoạn)

Khoa Điện – Điện tử 112


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Nút ấn button

Q2
Transistor thuận PN3644 PN3644

Q3
Transistor nghịch NPN NPN

RL2
12V
Rờ le RELAY

LCD1 LM016L

LCD 16x2 LM016L


VDD
VSS

VEE

RW
RS

D0
D1
D2
D3
D4
D5
D6
D7
E
1
2
3

4
5
6

7
8
9
10
11
12
13
14

1 U1

27.0
Cảm biến nhiệt LM35 LM35
2
VOUT

3 LM35

Khoa Điện – Điện tử 113


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

U1
1 20
CS VCC
2 18
RD DB0(LSB)
3 17
WR DB1
4 16
CLK IN DB2
IC chuyển đổi tương tự- 5
8
INTR DB3
15
14
số 10
A GND
D GND
DB4
DB5
13 Adc0804
9 12
ADC0804 19
VREF/2
CLK R
DB6
DB7(MSB)
11

6
VIN+
7
VIN-
ADC0804

SIM1

AREF

13
13
12

ARDUINO
RESET 12

SIMULNO UNO
~11
11
5V ~10
10
9
Board Arduino UNO ~9
8
(hoặc đánh Arduino sau

SIMULINO
POWER
GND 8

đó tìm các dòng Arduino)


ATMEGA328P
7

DIGITAL (PWM~)
7
~6
6

AT MEL
A0 5
ANALOG IN

A0 ~5
A1 A1
4
4
A2 A2 ~3
3
A3 A3 2
2
A4 A4 TX > 1
1
A5 A5 RX < 0
0
www.arduino.cc
blogembarcado.blogspot.com
SIMULINO UNO

Nguồn xoay chiều ALTERNATOR

Khoa Điện – Điện tử 114


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Phụ lục 4: HƯỚNG DẪN SỬ DỤNG CƠ BẢN PHẦN MỀM Arduino


IDE
Giao diện chính của chương trình Arduino IDE như hình sau:

1. Thanh Menu (vùng số 1):

Ta cần chú ý một số mục sau:


 File Menu:
Trong file menu có các chức năng tạo file mới, mở file đã có, lưu file đang mở,… Ta cần quan
tâm đến mục Examples, đây là nơi chứa các code ví dụ hướng dẫn sử dụng các chân digital,
analog, sensor,…

Khoa Điện – Điện tử 115


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Hình 3.3 Các chức năng trong File Menu


 Sketch menu:

Hình 3.4 Các chức năng trong Sketch Menu


Trong Sketch menu có các chức năng cơ bản sau:
- Verify/Compile: có chức năng kiểm tra lỗi, biên dịch code.
- Upload: nạp code vào board Arduino.
- Export compiled Binary: Xuất ra file HEX để mô phỏng trong Proteus.
- Include Library: chọn thư viện để khai báo vào chương trình đang soạn thảo.
- Add File: thêm code chương trình của file khác vào chương trình đang soạn thảo.

 Tool menu:

Khoa Điện – Điện tử 116


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Trong Tools menu ta cần quan tâm mục Board và Port:


+ Board: Nếu đang lập trình cho board Arduino nào thì phải chọn đúng tên board Arduino loại
đó để lập trình và nạp code. Nếu không sẽ có lỗi trong quá trình nạp code xuống board Arduino.
+ Port: Đây là nơi chọn cổng COM kết nối với board Arduino. Khi có kết nối máy tính với
board Arduino thì mục Port sẽ sáng lên. Ta chỉ việc chọn đúng cổng COM mà Arduino được
kết nối. Nếu chọn sai cổng COM sẽ không thể nạp code được.
2. Thanh Toolbar (vùng số 2):

Chức năng của các nút theo thứ tự từ trái qua phải như sau:
+ Verify: biên dịch kiểm tra xem code có lỗi hay không.
+ Upload: nạp code đang soạn thảo vào board Arduino.
+ New, Open, Save : có chức năng tạo mới, mở, lưu file Sketch.
+ Serial Monitor: chọn vào đây để mở màn hình hiển thị dữ liệu gửi từ Arduino lên máy tính.
3. Vùng soạn thảo code chương trình( vùng số 3):
Đây là nơi để người lập trình soạn thảo code cho chương trình Arduino của mình
4. Vùng thông báo (vùng số 4):
Đây là nơi hiện thị thông báo các thông tin về lỗi của chương trình và vi trị, dung lượng file
code khi biên dịch xong.

Khoa Điện – Điện tử 117


Thực hành Lập trình C cho Vi điều khiển MCS51 và Arduino

Tài liệu tham khảo:


 Giáo trình Thực hành vi điều khiển – Đặng Thành Tựu, Lương Hoài Thương.
 Giáo trình Vi điều khiển và Ứng dụng – Mai Nhật Thiên, Đặng Thành Tựu, Lương Hoài
Thương.
 Website: https://www.arduino.cc/
 Website: http://arduino.vn/
 Website: http://www.giaiphaptt.vn/

Khoa Điện – Điện tử 118

You might also like