Professional Documents
Culture Documents
Giáo Trình Thực Hành Vi Điều Khiển Và Ứng Dụng C - 2020 - Khoa Điện + Ô Tô
Giáo Trình Thực Hành Vi Điều Khiển Và Ứng Dụng C - 2020 - Khoa Điện + Ô Tô
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
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
PHẦN 1:
LẬP TRÌNH VI ĐIỀU KHIỂN MCS51
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.
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
{
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.
Lúc ấn phím SW1 – LED sáng Lúc ấn phím SW2 – LED tắ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
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).
- Để đ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.
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
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;
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.
- 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.
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
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
}
}
}
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.
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
Để đ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: ∗ %
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;
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.
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.
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
}
//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
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.
- 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
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
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
* 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.
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
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
+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;
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;
}
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).
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:
- 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:
Giải thuật chương trình chính Giải thuật hiển thị lên LCD
Đủ 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 độ
Kết thúc
Kết thúc
Giải thuật ghi lệnh vào LCD Giải thuật ghi dữ liệu vào LCD
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
sbit RW at P2_6_bit;
sbit RS at P2_5_bit;
}
//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
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
Phần 2:
Lập trình Arduino
0
digitalWrite(13,0);
hoặc digitalWrite(13,LOW);
1
digitalWrite(13,0);
hoặc digitalWrite(13,HIGH);
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
}
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
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
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
- Viết Code:
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
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 đỏ….
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).
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}
+ 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
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
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.
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:
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
Bắt đầu
i < 100 Đ
Kết thúc
// 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.
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.
Bắt đầu
Kết thúc
+ 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
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;
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.
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.
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.
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 10: Cài đặt điều khiển lập trình 8051 FLASH.
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 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.
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.
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.
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:
Build Sự miêu tả
Run Sự miêu tả
Bước vào.
Bước qua.
Bước ra khỏi.
Toggle Breakpoint.
Tools Sự miêu tả
- 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.
- 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
R1
Điện trở res
10k
RP1
1
2
3
4
Điện trở thanh 5
6 respack
7
8
9
RESPACK-8
LED 7 đoạn
(lưu ý có rất nhiều loại 7seg
led 7 đoạn)
Nút ấn button
Q2
Transistor thuận PN3644 PN3644
Q3
Transistor nghịch NPN NPN
RL2
12V
Rờ le RELAY
LCD1 LM016L
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
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
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
Tool menu:
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.