You are on page 1of 31

BỘ GIÁO DỤC VÀ ĐÀO TẠO

THỰC HÀNH
VI ĐIỀU KHIỂN

Biên soạn: ThS. Phạm Hùng Kim Khánh

Tài Liệu Lưu Hành Tại HUTECH www.hutech.edu.vn


THỰC HÀNH VI ĐIỀU KHIỂN

Ấn bản 2018
MỤC LỤC I

MỤC LỤC
MỤC LỤC ................................................................................................................... 1
HƯỚNG DẪN .............................................................................................................. 2

BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN .................................................................. 1

1.1 LED ĐƠN ................................................................................................................ 1


1.2 LED 7 ĐOẠN .......................................................................................................... 11
1.3 CÔNG TẮC NHẤN ..................................................................................................... 13
1.4 LCD ................................................................................................................... 14

BÀI 2: TIMER VÀ NGẮT ............................................................................................. 17

2.1 TIMER ................................................................................................................. 17


2.2 NGẮT TIMER .......................................................................................................... 19

BÀI 3: ADC VÀ PWM .................................................................................................. 21

3.1 ADC ................................................................................................................... 21


3.2 PWM .................................................................................................................. 24
TÀI LIỆU THAM KHẢO .................................................................................................. 1
II HƯỚNG DẪN

HƯỚNG DẪN
MÔ TẢ MÔN HỌC
Thực hành Vi điều khiển là môn học hỗ trợ cho môn Vi điều khiển. Môn học này thực
hiện xây dựng mạch phần cứng và viết chương trình phần mềm để thực hiện một hệ
thống điều khiển.

NỘI DUNG MÔN HỌC


 Bài 1: Điều khiển các thiết bị cơ bản.
 Bài 2: Timer và ngắt.
 Bài 3: ADC và PWM.

KIẾN THỨC TIỀN ĐỀ


Môn học Thực hành Vi điều khiển cần sinh viên có nền tảng về Vi điều khiển.

YÊU CẦU MÔN HỌC


Người học phải dự học đầy đủ các buổi lên lớp và làm bài tập đầy đủ ở nhà.

CÁCH TIẾP NHẬN NỘI DUNG MÔN HỌC


Để học tốt môn này, sinh viên cần viết chương trình, giải các bài tập trước khi thực
hiện thực hành.

PHƯƠNG PHÁP ĐÁNH GIÁ MÔN HỌC


Môn học được đánh giá gồm:

 Điểm trung bình của từng bài thực hành.


BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN 1

BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ


BẢN

1.1 Phần chuẩn bị


1. Sơ đồ mạch Led đơn tích cực mức 1:

2. Sơ đồ mạch Led đơn tích cực mức 0:

3. Câu lệnh xuất giá trị 0x80 ra port B:

4. Tính mã cho led đơn sáng dần từ D1 – D8:

.................................................................................................................

.................................................................................................................

5. Tính mã cho led đơn sáng dần từ D8 – D1:

.................................................................................................................

.................................................................................................................

6. Tính mã cho Led 7 đoạn anode chung từ 0 – 9, t, A, r, P:

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................
2 BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN

7. Sơ đồ mạch của công tắc nhấn:

8. Sơ đồ chân kết nối giữa LCD và PIC 16F877A.

9. Câu lệnh chuyển tọa độ và xuất chuỗi ra LCD:

.................................................................................................................

.................................................................................................................

10. Câu lệnh xuất biến ra LCD với độ dài 3:

.................................................................................................................

11. Lệnh tạo vòng lặp 10 lần:

.................................................................................................................

.................................................................................................................
BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN 3

1.2 Led đơn


Bài 1.1:

- B1: Khởi động Proteus, chọn New Project.

- B2: Trong phần Name, đặt tên cho Project, ví dụ như Bai1_1, phần Path đặt
tên vị trí lưu trữ Project, ví dụ như D:\17DOTJ01.

- B3: Nhấn Next, chọn Create a …

- B4: Nhấn Next, chọn Do not create …

- B5: Nhấn Next, chọn Create Firmware …, trong phần Family chọn PIC16,
phần Controller chọn 16F877A, phần Compiler chọn CCS for PIC.
4 BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN

- B6: Nhấn Next, sau đó nhấn Finish.

- B7: Chọn Tab Schematic Capture để vẽ sơ đồ phần cứng.

- B8: Double-click vào vi điều khiển 16F877A, chọn tần số 8 MHz:

- B9: Nhấn menu Library > Pick parts …


BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN 5
- B10: Trong phần Keywords, gõ vào chuỗi Led, phần Category chọn
Optoelectronics, phần Sub-category chọn LEDs, phần Results chọn LED-
YELLOW, sau đó nhấn OK.

- B11: Thực hiện tương tự cho 7 Led còn lại.

- B12: Đặt thêm 8 điện trở nối với 8 Led:

Keywords Category Sub-category Result


resistor Resistors Generic RES

- B13: Double-click vào điện trở để đặt giá trị 270.

- B14: Thực hiện tương tự cho các điện trở còn lại.

Ghi chú: có thể thay 8 điện trở bằng Rx8:


6 BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN

Keywords Category Sub-category Result


resistor Resistors Resistor Packs Rx8

- B15: Nhấn vào Terminals Mode phía bên trái và chọn GROUND.

- B16: Nối dây: di chuyển chuột vào chân 15 của 16F877A (RC0), kéo 1 đoạn sau
đó nhấn double-click.

- B17: Đặt tên dây: nhấn vào Wire Label Mode phía bên trái.

- B18: Click vào đoạn dây vừa vẽ tại RC0, nhập vào giá trị RC0.
BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN 7

- B19: Thực hiện tương tự cho Led D1.

- B20: Thực hiện tương tự cho RC1 – RC7 và Led D2 – D8 tương ứng với tên dây
là RC1 – RC7, ta được sơ đồ phần cứng sau:

VDD

U1
13 33
OSC1/CLKIN RB0/INT
14 34
OSC2/CLKOUT RB1
35
RB2
2 36
RA0/AN0 RB3/PGM
3 37
RA1/AN1 RB4
4 38
RA2/AN2/VREF-/CVREF RB5
5 39
RA3/AN3/VREF+ RB6/PGC
6 40
RA4/T0CKI/C1OUT RB7/PGD
7
RA5/AN4/SS/C2OUT
15 RC0
RC0/T1OSO/T1CKI
8 16 RC1
RE0/AN5/RD RC1/T1OSI/CCP2
9 17 RC2
RE1/AN6/WR RC2/CCP1
10 18 RC3
RC0

RC1

RC2

RC3

RC4

RC5

RC6

RC7
RE2/AN7/CS RC3/SCK/SCL
23 RC4
RC4/SDI/SDA
1 24 RC5
MCLR/Vpp/THV RC5/SDO
25 RC6
RC6/TX/CK
RC7/RX/DT
26 RC7 D1 D2 D3 D4 D5 D6 D7 D8
LED-YELLOW LED-YELLOW LED-YELLOWLED-YELLOWLED-YELLOWLED-YELLOWLED-YELLOWLED-YELLOW
19
RD0/PSP0
20
RD1/PSP1
21
RD2/PSP2
22
RD3/PSP3
RD4/PSP4
27 R8 R7 R6 R5 R3 R4 R2 R1
28 270 270 270 270 270 270 270 270
RD5/PSP5
29
RD6/PSP6
30
RD7/PSP7
PIC16F877A

- B21: Nhấn vào Tab Source Code:

- B22: Nhập chương trình sau:

#include <16F877A.h>
#fuses NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8M)
void main (void)
8 BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN

{
While (1)
{
Output_c(0x01);
Delay_ms(400);
Output_c(0x00);
Delay_ms(400);
}
}
- B23: Nhấn nút Run ở phía dưới để thực hiện mô phỏng.

Bài 1.2: Lập trình trên PIC-C CCS.

- Thực hiện tương tự như trên đến B20.

- Khởi động PIC-C.

- Chọn File > New > Project Wizard.

- Chọn thư mục và đặt tên Project (nên giống như Proteus).
BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN 9

- Trong phần Device, chọn Family là PIC16, Device là PIC16F877A, Crystal


Clock Speed là 8MHz.

- Nhấn nút Create Project.

- Nhập đoạn chương trình như B22.

- Nhấn menu Compile > Build hay F9. Nếu chương trình không lỗi, cửa sổ phía
dưới sẽ có dòng Build Successful.

- Quay trở lại Proteus, double-click vào PIC16F877A, tại mục Program File, click
vào nút Browse.
10 BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN

- Chọn file vừa dịch xong, có thể chọn C Debug file hay HEX file.

- Nhấn nút Run ở phía dưới để thực hiện mô phỏng.


BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN 11
Bài 1.3: Sửa chương trình để nhấp nháy 4 Led D1 – D4 vô hạn, thời gian delay 1s.

Bài 1.4: Sửa chương trình để Led sáng dần từ D1 – D8, thời gian delay 300ms, lặp
lại vô hạn lần.

Bài 1.5: Sửa chương trình để Led sáng dần từ D1 – D8, thời gian delay 300ms, lặp
lại 30 lần.

Bài 1.6: Sửa chương trình để Led sáng dần từ D1 – D8, thời gian delay 300ms, lặp
lại 30 lần, sau đó tắt dần từ D1 – D8, lặp lại 257 lần.

Bài 1.7: Sửa chương trình để Led sáng dần từ D1 – D8, thời gian delay 300ms, lặp
lại 30 lần, sau đó tắt dần từ D1 – D8, lặp lại 257 lần. Lặp lại toàn bộ quá trình 40 lần.

Bài 1.8: Vẽ lại sơ đồ mạch trong đó D1, D3, D5, D7 tích cực mức 1, 4 Led còn lại
tích cực mức 0. Viết lại chương trình như bài 1.7.

Bài 1.9: Vẽ lại sơ đồ mạch trong đó D1, D3, D5, D7 tích cực mức 1, 4 Led còn lại
tích cực mức 0, sơ đồ kết nối như bảng. Viết lại chương trình như bài 1.7.

D1 D2 D3 D4 D5 D6 D7 D8
RC6 RC4 RC3 RC0 RC7 RC1 RC5 RC2

1.3 Led 7 đoạn


- Vẽ sơ đồ như hình vẽ (clock = 8M), các linh kiện cho như bảng sau:

Keywords Category Sub-category Result


7 seg Optoelectronics 7-segment displays 7SEG-MPX4-CA-BLUE
not Simulator NOT
Primitives

Bài 1.10: Thực hiện đoạn chương trình sau:

#include <16F877A.h>
#fuses NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8M)
void main (void)
{
output_d(0xFF);
output_b(0x03);
12 BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN

output_low(PIN_D3);
while (1) ;
}

VDD
U2

U1
NOT
13 33
OSC1/CLKIN RB0/INT
14 34 U3
OSC2/CLKOUT RB1
35
RB2
2 36
RA0/AN0 RB3/PGM
3 37
RA1/AN1 RB4
4 38
RA2/AN2/VREF-/CVREF RB5 NOT
5 39
RA3/AN3/VREF+ RB6/PGC
6 40 U4
RA4/T0CKI/C1OUT RB7/PGD
7
RA5/AN4/SS/C2OUT
15 RC0
RC0/T1OSO/T1CKI
8 16 RC1
RE0/AN5/RD RC1/T1OSI/CCP2
9 17 RC2
RE1/AN6/WR RC2/CCP1 NOT
10 18 RC3
RE2/AN7/CS RC3/SCK/SCL
23 RC4
RC4/SDI/SDA
1 24 RC5
MCLR/Vpp/THV RC5/SDO
25 RC6 U5
RC6/TX/CK
26 RC7
RC7/RX/DT
19
RD0/PSP0
20
RD1/PSP1 NOT
21
RD2/PSP2
22
RD3/PSP3
27
RD4/PSP4
28
RD5/PSP5
29
RD6/PSP6
30
RD7/PSP7
RC0

RC1

RC2

RC3

RC4

RC5

RC6

RC7
PIC16F877A

D1 D2 D3 D4 D5 D6 D7 D8
LED-YELLOW LED-YELLOW LED-YELLOWLED-YELLOWLED-YELLOWLED-YELLOWLED-YELLOWLED-YELLOW

R8 R7 R6 R5 R3 R4 R2 R1
270 270 270 270 270 270 270 270

Bài 1.11: Viết chương trình hiện số từ 0 – 9 trên Led1, thời gian delay 400 ms.

Bài 1.12: Viết chương trình hiện số 12.34 trên 4Led, thời gian quét led 3 ms.

Bài 1.13: Viết chương trình hiện chữ StOP trên 4Led, thời gian quét led 3 ms.

Bài 1.14: Viết chương trình hiện chữ StAr trên 4Led trong 5s, thời gian quét led 3
ms. Sau đó hiện chữ StOP trên 4Led.

Bài 1.15: Viết chương trình hiện các Led đơn sáng dần từ D1 – D8, thời gian delay
300ms, lặp lại 8 lần đồng thời hiện số lần lặp trên Led7 đoạn 4.
BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN 13
Bài 1.16: Viết chương trình hiện các Led đơn sáng dần từ D1 – D8, thời gian delay
300ms, lặp lại 30 lần đồng thời hiện số lần lặp trên Led7 đoạn 3, 4.

1.4 Công tắc nhấn


- Vẽ sơ đồ mạch như hình vẽ (clock = 8M), các linh kiện cho như bảng sau:

Keywords Category Sub-category Result


Button BUTTON

VDD

RD6

RD2

RD7

RD1

RD3

RD0

RD5

RD4
U1 D1A D2A D3A D4A D5A D6A D7A D8A
13 33 LED-YELLOW LED-YELLOW LED-YELLOWLED-YELLOWLED-YELLOWLED-YELLOWLED-YELLOWLED-YELLOW
OSC1/CLKIN RB0/INT
14 34
OSC2/CLKOUT RB1
35
RB2
2 36
RA0/AN0 RB3/PGM
3 37 RB4
RA1/AN1 RB4
4 38 RB5
RA2/AN2/VREF-/CVREF RB5
5 39
RA3/AN3/VREF+ RB6/PGC
6 40
RA4/T0CKI/C1OUT RB7/PGD
7
RA5/AN4/SS/C2OUT
15 RC0 R10 R9
RC0/T1OSO/T1CKI
8 16 RC1
RE0/AN5/RD RC1/T1OSI/CCP2 10k 10k
9 17 RC2 SW1
RE1/AN6/WR RC2/CCP1
10 18 RC3
RE2/AN7/CS RC3/SCK/SCL
23 RC4 RB4
RC4/SDI/SDA
1 24 RC5
MCLR/Vpp/THV RC5/SDO
25 RC6 SW2
RC6/TX/CK
26 RC7
RC7/RX/DT
RB5
19 RD0
RD0/PSP0
20 RD1
RD1/PSP1
21 RD2
RD2/PSP2
22 RD3
RD3/PSP3
27 RD4
RD4/PSP4
28 RD5
RC0

RC1

RC2

RC3

RC4

RC5

RC6

RC7
RD5/PSP5
29 RD6
RD6/PSP6
30 RD7
RD7/PSP7
PIC16F877A D1 D2 D3 D4 D5 D6 D7 D8
LED-YELLOW LED-YELLOW LED-YELLOWLED-YELLOWLED-YELLOWLED-YELLOWLED-YELLOWLED-YELLOW

Bài 1.17: Nhập đoạn chương trình:

#include <16F877A.h>
#fuses NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8M)
#define D5 PIN_C4
#define D6 PIN_C5
#define SW1 PIN_B4
#define SW2 PIN_B5
void main (void)
{
while(1)
{
14 BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN

if(!input(SW1)) output_high(D5);
if(!input(SW2)) output_low(D5);
}
}
Bài 1.18: Viết chương trình kiểm tra SW như sau:

- Nhấn SW1: D5 tắt trong khi D6 sáng/tắt vô hạn; thời gian delay 200 ms.

- Nhấn SW2: D6 tắt trong khi D5 sáng/tắt vô hạn; thời gian delay 500 ms.

Bài 1.19: Viết chương trình kiểm tra SW như sau:

- Nhấn SW1: D5 tắt trong khi D6 sáng/tắt vô hạn; thời gian delay 200 ms.

- Nhấn SW2: D6 tắt trong khi D5 đổi trạng thái khi đã nhấn SW2 3 lần.

1.5 LCD
- Vẽ sơ đồ như hình vẽ (clock = 8M), các linh kiện cho như bảng:

VDD

LCD1
U1 LM016L
13 33
OSC1/CLKIN RB0/INT
14 34
OSC2/CLKOUT RB1
35
RB2
2 36
RA0/AN0 RB3/PGM
3 37
RA1/AN1 RB4
4 38
RA2/AN2/VREF-/CVREF RB5
5 39
RA3/AN3/VREF+ RB6/PGC
VDD
VSS

VEE

6 40
RW
RS

D0
D1
D2
D3
D4
D5
D6
D7
RA4/T0CKI/C1OUT RB7/PGD
E

7
RA5/AN4/SS/C2OUT
15
RC0/T1OSO/T1CKI
1
2
3

4
5
6

7
8
9
10
11
12
13
14

8 16
RE0/AN5/RD RC1/T1OSI/CCP2
9 17
LD4
LD5
LD6
LD7

RE1/AN6/WR RC2/CCP1
RW
RS

EN

10 18 RC3
RE2/AN7/CS RC3/SCK/SCL
23 RC4
RC4/SDI/SDA
1 24
MCLR/Vpp/THV RC5/SDO
RC6/TX/CK
25 R2 R1
26 10k 10k
RC7/RX/DT
19 EN SW1
RD0/PSP0
20 RS RC3
RD1/PSP1
21 RW
RD2/PSP2
22
RD3/PSP3
27 LD4 SW2
RD4/PSP4
28 LD5 RC4
RD5/PSP5
29 LD6
RD6/PSP6
30 LD7
RD7/PSP7
PIC16F877A

Keywords Category Sub-category Result


Lm016L LM016L
BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN 15
Bài 1.20: Nhập đoạn chương trình:

#include <16F877A.h>
#fuses NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8M)
#include <lcd.c>
void main (void)
{
lcd_init();
lcd_gotoxy(1,1);
printf(lcd_putc,"Welcome to");
delay_ms(3);
lcd_gotoxy(1,2);
printf(lcd_putc,"*****HUTECH*****");
delay_ms(3);
while(1) ;
}
Bài 1.21: Viết chương trình hiển thị chữ: “Counter:” trên dòng 1 và số đếm từ 00 –
99 trên dòng 2 từ tọa độ (x,y) = (10,2); thời gian delay để tăng số đếm là 300 ms.

Bài 1.22: Viết chương trình thực hiện:

- Nhấn SW1: hiển thị chữ “Xin chao cac ban!” trên dòng 01 LCD tại (x,y) = (1,1)

- Nhấn SW2: hiển thị chữ “HUTECH” trên dòng 02 tại (x,y) = (10,2)

Bài 1.23: Viết chương trình thực hiện:

Viết chương trình thực hiện: hiển thị chữ “Set value:” trên dòng 1 tại (x,y) = (5,1)
và hiển thị biến set_val (khởi động = 0) trên dòng 2 tại (x,y) = (8,2); và nếu:

Nhấn SW1: nếu set_val < 200: set_val = set_val + 5

Nhấn SW2: Nếu set_val > 0: set_val = set_val -1

Nội dung thay đổi của set_val được cập nhật tức thời trên dòng 2 LCD tại vị trí
(x,y) = (8,2).

Bài 1.24: Viết chương trình đồng hồ đếm giây: tại (1,1) hiển thị “DONG HO DEM
GIAY”, tại (4,2) hiển thị “00:00”, và khi:

Nhấn SW1: bắt đầu đếm “giây : phần trăm giây”


16 BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN

Nhấn SW2: dừng đếm

Nhấn giữ SW2 hơn 5 giây sẽ xóa số đếm về 0

Bài 1.25: Viết chương trình thực hiện: hiển thị chữ “DONG HO” trên dòng 1 tại (4,1)
và hiển thị “giờ:phút:giây” tại (6,2); thời gian bắt đầu là “00:00:00” và nếu:

Nhấn SW1: cho phép chỉnh giờ (0-23)

Nhấn SW2: cho phép chỉnh phút (0-59)


BÀI 2: TIMER VÀ NGẮT 17

BÀI 2: TIMER VÀ NGẮT

2.1 Phần chuẩn bị


1. Viết chương trình delay 100 ms dùng timer0, thạch anh 8 MHz và giải thích:

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................

2. Viết chương trình delay 100 ms dùng timer1, thạch anh 8 MHz và giải thích:

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................
18 BÀI 2: TIMER VÀ NGẮT

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................

3. Đoạn chương trình cho phép ngắt tại timer 0:

.................................................................................................................

.................................................................................................................

.................................................................................................................

4. Đoạn chương trình cho phép ngắt tại timer 1:

.................................................................................................................

.................................................................................................................

.................................................................................................................

2.2 Timer
Bài 2.1: Hình vẽ như bài 1.1, nhập đoạn chương trình:

#include <16F877A.h>
#fuses NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8M)
void delay400ms()
{
Setup_timer_1(T1_INTERNAL|T1_DIV_BY_2); //1us/xung
For (int8 i = 0;i < 10;i++) // cần 400 000 xung = 10*40 000
{
Set_timer1(25536);
While (get_timer1()>25536) ;
BÀI 2: TIMER VÀ NGẮT 19
}
}
void main (void)
{
While (1)
{
Output_c(0x01);
Delay400ms();
Output_c(0x00);
Delay400ms();
}
}
Bài 2.2: Thực hiện lại bài 2.1 với delay400ms dùng timer 0 có cấu hình như sau:
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4);

2.3 Ngắt timer


Bài 2.3: Dùng hình vẽ như bài 1.10, nhập đoạn chương trình:

#include <16F877A.h>
#fuses NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8M)
#INT_TIMER1
void qled()
{
Output_d(0xff);// tắt các led
Output_b(0x91); output_low(PIN_D3); delay_ms(3);// “H”
Output_d(0xff);// tắt các led
Output_b(0x61); output_low(PIN_D2); delay_ms(3); // “E”
Output_d(0xff);// tắt các led
Output_b(0xe3); output_low(PIN_D1); delay_ms(3);// “L”
Output_d(0xff);// tắt các led
Output_b(0x31); output_low(PIN_D0); delay_ms(3);// “P”
}
void main (void)
{
enable_interrupts(GLOBAL);
20 BÀI 2: TIMER VÀ NGẮT

enable_interrupts(INT_TIMER1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
while(1);
}
Bài 2.4: Dùng ngắt timer 0 để quét led, thời gian quét led là 2 ms. Sử dụng:

Setup_timer_0(RTCC_DIV_64|RTCC_INTERNAL)

- Tính thời gian ngắt timer 0.

- Viết chương trình hiển thị số tăng dần từ 000 đến 999 trên LED 7S 2, 3 và 4.

Bài 2.5: Dùng ngắt timer 1 để quét led, thời gian delay mỗi led là 3 ms. Sử dụng:

Setup_timer_1(T1_INTERNAL| T1_DIV_BY_1)

Tính thời gian ngắt timer 1.

Viết chương trình led sáng dần từ D1 đến D8, thời gian delay 200 ms, lặp lại 50 lần
đồng thời hiển thị số lần trên LED1 đến LED4 theo dạng: “Ct.XX”
BÀI 3: ADC VÀ PWM 21

BÀI 3: ADC VÀ PWM

3.1 Phần chuẩn bị


1. Đoạn chương trình sử dụng kênh 0 Analog với VREF = 5V:

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................

2. Đoạn chương trình sử dụng kênh 0 Analog với VREF lấy từ AN3:

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................

3. Cách tính nhiệt độ môi trường từ LM35:

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................

4. Đoạn chương trình cấu hình PWM1 có tần số 1 KHz và chu kỳ bổn phận 60%:

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................
22 BÀI 3: ADC VÀ PWM

5. Đoạn chương trình cấu hình PWM2 có tần số 1 KHz và chu kỳ bổn phận 40%:

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................

.................................................................................................................

3.2 ADC
- Vẽ sơ đồ như hình vẽ (clock = 8M), các linh kiện cho như bảng:

R10 R9
10k 10k
SW1

RC0
VDD
SW2

RC1
U1
13 33 U2
OSC1/CLKIN RB0/INT +5V
14 34
OSC2/CLKOUT RB1
35
RB2
TEMP 2 36
RA0/AN0 RB3/PGM
SET 3 37 VREF
RA1/AN1 RB4 NOT
4 38
RA2/AN2/VREF-/CVREF RB5 U6
VREF 5 39 U3 1 TEMP
RA3/AN3/VREF+ RB6/PGC
6 40
RA4/T0CKI/C1OUT RB7/PGD RV1 RV2
7
RA5/AN4/SS/C2OUT
15 RC0
RC0/T1OSO/T1CKI 28.8
8 16 RC1
RE0/AN5/RD RC1/T1OSI/CCP2 NOT
9 17 D9 SET VREF
70%

15%
RE1/AN6/WR RC2/CCP1
10 18 D10 U4 2 TEMP
RE2/AN7/CS RC3/SCK/SCL VOUT
23
RC4/SDI/SDA
1 24
MCLR/Vpp/THV RC5/SDO
25 1k 10k
RC6/TX/CK
26 3 LM35
RC7/RX/DT NOT
19
RD0/PSP0
20
RD1/PSP1
21 U5
RD2/PSP2
22
RD3/PSP3
27
D10

RD4/PSP4
D9

28
RD5/PSP5
29
RD6/PSP6 NOT
RD7/PSP7
30 D1 D2
LED-YELLOW LED-YELLOW
PIC16F877A

Keywords Category Sub-category Result


LM35 LM35
Pot-hg POT-HG

Bài 3.1: Nhập đoạn chương trình:

#include <16F877A.h>
BÀI 3: ADC VÀ PWM 23
#fuses NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8M)
int8 LED7S[10] = {0x03, 0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};
int8 LED7S1[10] = {0x02, 0x9e,0x24,0x0c,0x98,0x48,0x40,0x1e,0x00,0x08};
int8 data_led[4] = {0xFF,0xFF,0xFF,0xFF};
int8 control_led[4] = {0xF7,0xFB,0xFD,0xFE};
int8 tram,chuc,dvi;
int16 temp;
float volt;
#INT_TIMER0
void qled()
{
for (int8 i=0;i<4;i++)
{
output_d(0xFF);
output_b(data_led[i]);
output_d(control_led[i]);
delay_ms(2);
}
}
void main (void)
{
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);
Setup_timer_0(RTCC_DIV_128|RTCC_INTERNAL);
// Cau hinh ADC
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(AN0);
set_adc_channel(0);
while (1)
{
temp = read_adc();
volt = (float)(temp)*5/10.23;
temp = (int16)volt;
chuc = temp/10;
dvi = temp%10;
24 BÀI 3: ADC VÀ PWM

data_led[0] = LED7S[chuc];
data_led[1] = LED7S[dvi];
data_led[2] = 0x39;
data_led[3] = 0x63;
}
}
Bài 3.2: Giống bài 3.1 nhưng sử dụng điện áp chuẩn là Vref = 2.5V

Bài 3.3: Giống bài 3.1 nhưng nếu:

- Nhiệt độ <= 20 độ C: D9, D10 tắt

- Nhiệt độ > 20 độ C: D9 sáng, D10 tắt

- Nhiệt độ > 30 độ C: D9 tắt, D10 sáng

- Nhiệt độ > 35 độ C: D9 và D10 chớp tắt với delay 100ms

3.3 PWM
- Vẽ sơ đồ như hình vẽ (clock = 8M), các linh kiện cho như bảng:

VDD

U1
13 33 RB7
OSC1/CLKIN RB0/INT
14 34 RB1 RB6
OSC2/CLKOUT RB1
35 RB2 RB5
RB2
2 36 RB3 RB4 R10 R9
RA0/AN0 RB3/PGM
3 37 RB4 RB3
RA1/AN1 RB4 10k 10k
4 38 RB5 RB2 SW1
RA2/AN2/VREF-/CVREF RB5
5 39 RB6 RB1
RA3/AN3/VREF+ RB6/PGC
6 40 RB7 RD1
RA4/T0CKI/C1OUT RB7/PGD
7
RA5/AN4/SS/C2OUT
15 SW2
RC0/T1OSO/T1CKI
8 16 PMW2
RE0/AN5/RD RC1/T1OSI/CCP2
9 17 PMW1 RD2
RE1/AN6/WR RC2/CCP1
10 18
RE2/AN7/CS RC3/SCK/SCL
23 RC4
RC4/SDI/SDA +12V
1 24
MCLR/Vpp/THV RC5/SDO
25
RC6/TX/CK
26
RC7/RX/DT
19
RD0/PSP0
20 RD1
RD1/PSP1
21 RD2
RD2/PSP2 U2
22 9 4
RD3/PSP3
27
RD4/PSP4
28 5
RD5/PSP5 IN1 VCC VS
29 7 2
RD6/PSP6 IN2 OUT1
30 10 +88.8
RD7/PSP7 IN3
12 3
IN4 OUT2
PIC16F877A 6
ENA
11 13
ENB OUT3
1 14
SENSA OUT4
15
SENSB GND

8 L298

+88.8
BÀI 3: ADC VÀ PWM 25
Keywords Category Sub-category Result
L298 L298
Motor MOTOR-DC

Bài 3.4: Nhập đoạn chương trình:

#include <16F877A.h>
#fuses NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8M)
void main (void)
{
Setup_timer_2(T2_DIV_BY_1,99,1);
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);
set_pwm1_duty(30);
set_pwm2_duty(90);
while (1) ;

}
Bài 3.5: Cấu hình timer 2 giống bài 3.4. Viết chương trình cho phép đặt 10 tốc độ
quay cho MG1 (dùng SW1: tăng 1 đơn vị, SW2: giảm 1 đơn vị), hiển thị tốc độ trên led
7 đoạn (0,1,2,3,4,5,6,7,8,9), trong đó tốc độ 0 là dừng động cơ.

Bài 3.6: Cấu hình timer 2 giống bài 3.4. Viết chương trình thực hiện:

Nhấn SW1: MG1 quay với duty_cycle = 80%

Nhấn SW2: MG2 quay với duty_cycle = 50%

Nhấn đồng thời SW1 và SW2: dừng MG1 và MG2


TÀI LIỆU THAM KHẢO
[1] Trần Viết Thắng, Phạm Hùng Kim Khánh – Giáo trình Vi điều khiển – ĐH Công
nghệ TPHCM.

You might also like