You are on page 1of 7

IHW#3.

1
1.1. Yêu cầu:
- Vẽ mạch điện mô phỏng như hình dưới

U1
2 15
RA0/AN0/C1IN- RC0/T1OSO/T13CKI
3 16
RA1/AN1/C2IN- RC1/T1OSI/CCP2B
4
RA2/AN2/C2IN+/VREF-/CVREF RC2/CCP1/P1A
17 R2
R1 5
RA3/AN3/C1IN+/VREF+ RC3/SCK/SCL
18 100
10k 6 23
RA4/T0CKI/C1OUT RC4/SDI/SDA
7 24
RA5/AN4/SS/HLVDIN/C2OUT RC5/SDO
14 25
RA6/OSC2/CLKO RC6/TX/CK
13 26
PB1 RA7/OSC1/CLKI RC7/RX/DT
33 19
RB0/AN12/FLT0/INT0 RD0/PSP0
34 20
RB1/AN10/INT1 RD1/PSP1
35 21
RB2/AN8/INT2 RD2/PSP2
36 22
RB3/AN9/CCP2A RD3/PSP3
37 27
RB4/KBI0/AN11 RD4/PSP4
38 28
RB5/KBI1/PGM RD5/PSP5/P1B
39 29
RB6/KBI2/PGC RD6/PSP6/P1C
40 30
RB7/KBI3/PGD RD7/PSP7/P1D

RE0/RD/AN5
8 7SEG-COM-AN-BLUE
9
RE1/WR/AN6
10
RE2/CS/AN7
1
RE3/MCLR/VPP
PIC18F4520
CLOCK=12MHz

- Viết chương trình đếm số lần nhấn PB1 và hiển thị số lần nhấn trên LED 7
đoạn (giả thiết số lần nhấn PB1 không lớn hơn 9).
1.2. Gợi ý thực hiện
1.2.1. Hiển thị số nguyên trên LED 7 đoạn:
LED 7 thanh có 2 loại A chung (Common Anode) và K chung (Common
Cathode).
Loại được sử dụng ở mạch điện trên là loại A chung, nghĩa là toàn bộ Anode
của 7 LED tương ứng 7 thanh được nối chung với nhau.
Điều khiển LED 7 thanh sáng theo các số mong muốn thực chất là điều khiển
các LED tương ứng với các thanh sáng hoặc tắt. VD: muốn LED sáng số 0 ta sẽ
làm cho LED tương ứng thanh g tắt, các LED khác sáng.
Với mạch điện trên, chân A chung của 7 LED đã nối với Vcc (5 volt), vì vậy
muốn LED sáng số 0, vi điều khiển cần:
- Xuất ra chân RD6 mức logic 1 (5 volt) làm cho thanh g tắt;
- Xuất ra các chân RD0-RD5 mức logic 0 (0 volt) làm cho các thanh a-f
sáng
Tức là VĐK cần xuất ra PORTD giá trị: 0b?1000000. Bit ? tương ứng chân
RD7 không sử dụng nên có thể bằng 0 hoặc 1. Nếu ?=1, lệnh
PORTD=0b11000000 sẽ làm cho LED 7 thanh sáng số 0.
Tính tương tự,
lệnh PORTD= 0b11111001 sẽ làm cho LED 7 thanh sáng số 1

lệnh PORTD= 0b10010000 sẽ làm cho LED 7 thanh sáng số 9
Nếu khai báo một biến dạng mảng:
unsigned char ma_led[]={0b11000000, 0b11111001, 0b10100100, 0b10110000,
0b10011001, 0b10010010, 0b10000010, 0b11111000, 0b10000000,
0b10010000};
và viết:
PORTD= ma_led[0]; //LED 7 thanh sẽ sáng số 0 vì ma_led[0]= 0b11000000

PORTD= ma_led[9]; //LED 7 thanh sẽ sáng số 9
Đến đây, muốn LED hiển thị giá trị của biến nguyên (biến i) cần viết:
unsigned int i;

TRISD =0b00000000;
PORTD=maled[i];
1.2.2. Lưu đồ thuật toán:
Chương trình chính CTCPVN

Begin Có ngắt INT1

- Khởi tạo: Xóa cờ ngắt (INT1IF)


+ Vào/ra số; PB1 có chiều vào, RD0- Tăng giá trị của biến I lên 1 đơn vị
RD7 có chiều ra (i=i+1)
+ Cho phép ngắt INT1
- Xóa biến chứa số lần nhấn PB1 (i=0)
Về CTC

Hiển thị giá trị của biến i trên


LED 7 đoạn

S
i>9?

End

(i là biến toàn cục)


1.3. Hình thức nộp bài tập:
Upload file ảnh chụp ảnh màn hình lên hệ thống học trực tuyến. File cần thể
hiện đủ các thông tin: Project trên MPLAB được tạo, cửa sổ chứa mã nguồn,
cửa sổ thể hiện biên dịch thành công (Error: 0); kết quả mô phỏng trên Protues;
thanh Taskbar của Windows (như mô tả ở hình dưới)
IHW#3.2
1.1. Yêu cầu:
- Vẽ mạch điện mô phỏng như hình dưới

R3
100
U1
2 15
RA0/AN0/C1IN- RC0/T1OSO/T13CKI
3 16
RA1/AN1/C2IN- RC1/T1OSI/CCP2B
4 17
RA2/AN2/C2IN+/VREF-/CVREF RC2/CCP1/P1A
R1 5
RA3/AN3/C1IN+/VREF+ RC3/SCK/SCL
18
10k 6 23
RA4/T0CKI/C1OUT RC4/SDI/SDA
7 24
PB1 14
RA5/AN4/SS/HLVDIN/C2OUT RC5/SDO
25
RA6/OSC2/CLKO RC6/TX/CK
13 26
RA7/OSC1/CLKI RC7/RX/DT
33
RB0/AN12/FLT0/INT0 RD0/PSP0
19 LED1
34 20
RB1/AN10/INT1 RD1/PSP1
35 21
RB2/AN8/INT2 RD2/PSP2
36 22
RB3/AN9/CCP2A RD3/PSP3
R2 37
RB4/KBI0/AN11 RD4/PSP4
27
10k 38 28
RB5/KBI1/PGM RD5/PSP5/P1B
39 29
PB2 40
RB6/KBI2/PGC RD6/PSP6/P1C
30
RB7/KBI3/PGD RD7/PSP7/P1D

RE0/RD/AN5
8 LED2
9
RE1/WR/AN6
10
RE2/CS/AN7
1
RE3/MCLR/VPP
PIC18F4520

- Viết chương trình đếm số lần nhấn PB1 và hiển thị số lần nhấn trên LED1,
đếm số lần nhấn PB2 và hiển thị số lần nhấn trên LED2 (giả thiết số lần nhấn
không lớn hơn 9). Yêu cầu: Sử dụng ngắt INT1 với mức ưu tiên thấp (vector
0x0018).
1.2. Gợi ý thực hiện
- Khai báo các biến toàn cục: i, j
- Sử dụng cấu trúc
if (…) {…}
else if (…) {…}
else if (…) {…}
else {…}
để kiểm tra giá trị của các biến i, j
Lưu đồ thuật toán như hình dưới.
Chương trình chính CTCPVN
(Vector 0x0018)
Begin
Có ngắt INT1

- Khởi tạo:
+ Vào/ra số; PB0,PB1 có chiều vào; RD0-RD7, Xóa cờ ngắt (INT1IF)
RC0-RC7 có chiều ra Tăng giá trị của biến j
+ Cho phép ngắt INT0 lên 1 đơn vị (j=j+1)
+ Cho phép ngắt INT1 với mức ưu tiên thấp
- Xóa biến chứa số lần nhấn PB1 (i=0), xóa biến
chứa số lần nhấn PB2 (j=0). Về CTC

*
CTCPVN
Hiển thị giá trị của biến i,j trên
LED1, LED2 (Vector 0x0008)

Có ngắt INT0
*
i≤9 và Đ
j≤9 ? Xóa cờ ngắt (INT0IF)
Tăng giá trị của biến i
S lên 1 đơn vị (i=i+1)
*
Đ
i>9 và Cấm ngắt INT0 Về CTC
j≤9 ? (xóa bit INT0IE)

S *
Đ
j>9 và Cấm ngắt INT1
i≤9 ? (xóa bit INT1IE)

End

1.3. Hình thức nộp bài tập: Tương tự IHW#I.3.1.

You might also like