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.
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 – 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.
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 Độ rộng xung:𝐷𝑢𝑡𝑦 = 𝑇𝑜𝑛𝑇 ∗ 100% .........................................................................................................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
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
3. TRÌNH TỰ THỰC HIỆN: ....................................................................................................................39 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 .......................49 1. MỤC ĐÍCH – YÊU CẦU: .....................................................................................................................49 2. CƠ SỞ LÝ THUYẾT:............................................................................................................................49 3. TRÌNH TỰ THỰC HIỆN......................................................................................................................53 Phần 2: Lập trình Arduino ...............................................................................................................................60 Bài thực hành số 1: LẬP TRÌNH ĐIỀU KHIỂN LED ĐƠN .....................................................................61 1.
Kết nối phần cứng:.............................................................................................................................76
4.
BÀI TẬP .............................................................................................................................................78
Bài thực hành số 7: LẬP TRÌNH ĐIỀU KHIỂN ĐỘNG CƠ DC..............................................................79 1.
u cầu: ..............................................................................................................................................82
3.
Kết nối phần cứng:.............................................................................................................................82
4.
Lưu đồ giải thuật và chương trình: ..................................................................................................83
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. ..............................................................................................................................85 1.
Phụ lục 1 : HƯỚNG DẪN CÀI ĐẶT MIKROC FOR 8051 .......................................................................88 Phụ lục 2 : HƯỚNG DẪN SỬ DỤNG MIKROC FOR 8051 .....................................................................92 Phụ lục 3 : CÁC LINH KIỆN THƯỜNG DÙNG KHI MÔ PHỎNG PROTEUS ...................................99 Phụ lục 4: HƯỚNG DẪN SỬ DỤNG CƠ BẢN PHẦN MỀM Arduino IDE ..........................................102 Tài liệu tham khảo: ......................................................................................................................................105
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 – 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ơ đồ ngun 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.
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; delay_ms(500); p2=0b00000001;
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; char maled[8]={1,3,7,15,31, Khai báo mảng 63,127,255}; maled có 8 void main() phần tử {
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 – 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
#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:
LED1
ON1
OFF1
Sáng
Tắt
LED2
Khoa Điện – Điện tử
ON2
Sáng
OFF2
Tắt
ON
OFF
Sáng
Tắt
Sáng
Tắ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 – 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
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{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
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 – 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. 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 DCMOTOR. - 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. -
3.
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