Professional Documents
Culture Documents
**********************
Bài Giảng
Kỹ Thuật Vi Xử Lý
- Số nhị phân
- Số thập phân
- Số HEX
- Cách chuyển đổi số nhị phân sang HEX và ngược lại
- Mã nhị phân
- Mã BCD
- Mã led bảy đoạn
Ví dụ: Tìm giá trị thập phân của số nhị phân 10110.012
= 16 + 0 + 4 + 2 + 0 + 0 + 0.25 = 22.25
Ôn lại kiến thức kỹ thuật số
Ví dụ: Tìm giá trị thập phân của số thập lục phân 2AB16
2AB 16 = (2 x 162)+(10 x 161)+(11 x 160)
= 512 + 160 + 11 = 683
2. Đổi số từ hệ thập lục phân sang nhị phân và ngược lại
2.1 chuyển từ thập lục phân sang nhị phân
Thay mỗi chữ số trong hệ thập lục phân bằng 4 bit nhị phân
tương ứng.
2.2 chuyển từ nhị phân sang thập lục phân
Từ dấu phẩy thập phân ta gom lần lượt các nhóm 4 bit về
hai phía. Thay thế giá trị của mỗi nhóm 4 bit này bằng 1 số
thập lục phân tương ứng.
(nếu nhóm đầu và cuối không đủ 4 bit thì ta thêm 0 vào cho
đủ 4 bit mà không làm thay đổi giá trị của số đã cho).
Vi dụ: Từ nhị phân sang thập lục phân:
0 01 1 1 0 1 1 0 1 0 1 1 1 0 1 , 0 1 1 0 1 0 1 0
3 B 5 D , 6 A H
2 C 9 , E 8
0 0 1 0 1 1 0 0 1 0 0 1 , 1 1 1 0 1 0 0 0 (B)
8
Các loại mã thường gặp trong kỹ thuật số
Mã led bảy đoạn anode chung
Mã led bảy đoạn cathode chung
CHƯƠNG 1
GIỚI THIỆU CHUNG
Bus dữ liệu
1. Tổng quan về hệ vi xử lý
A0 – AN: các chân địa chỉ (Address - N: số chân địa chỉ).
D0 – DM: các chân dữ liệu (Data - M: số chân dữ liệu).
OE: ngõ ra cho phép xuất (Output Enable).
CS: ngõ vào cho phép IC hoạt động (Chip Select).
WR: ngõ vào cho phép ghi (Write) – chỉ có ở RAM
Phân loại ROM
MROM (Mask ROM): ROM mặt nạ.
PROM (Programmable ROM): ROM lập trình được.
EPROM (Eraseable PROM): ROM lập trình và xóa được.
UV-EPROM (Ultra Violet EPROM): ROM xóa bằng tia
cực tím.
EEPROM (Electric EPROM): ROM lập trình và xóa
bằng tín hiệu điện.
Flash ROM: ROM lập trình và xóa bằng tín hiệu điện.
Phân loại RAM
SRAM (Static RAM- RAM tĩnh) : là một loại bộ nhớ sử dụng
công nghệ bán dẫn. Từ "tĩnh" nghĩa là bộ nhớ vẫn lưu dữ liệu nếu
có điện
MÃ SỐ = XXYYYY
• XX: xác định loại bộ nhớ.
27: UV-EPROM 28: EEPROM
61, 62: SRAM 40, 41: DRAM
• YYYY: xác định dung lượng.
40
• Kiến trúc 8-bit PIC® MCU (Baseline, Mid-Range, Enhanced Mid-Range,
PIC18)
41
• Kiến trúc 8-bit PIC® MCU (Baseline, Mid-Range, Enhanced Mid-Range,
PIC18)
42
• Kiến trúc 8-bit PIC® MCU (Baseline, Mid-Range, Enhanced Mid-Range,
PIC18)
43
• 16-bit PIC® MCU: PIC24F, PIC24H, PIC24E
• 16-bit dsPIC® DSC: dsPIC30F, dsPIC33F, dsPIC33E.
44
• 32-bit PIC® MCU: PIC32
45
7. Giới thiệu về PIC (tt)
• Có hai kiểu kiến trúc vi điều khiển là Von Neumann và
Harvard
• Kiến trúc Von Neumann: Có chung một không gian bộ nhớ
cho cả chương trình và dữ liệu, sử dụng chung hệ thống bus
nên tốc độ xử lý thông tin sẽ có nhiều hạn chế
• Kiến trúc Harvard: Có hai không gian bộ nhớ tách biệt nhau
(một cho chương trình và một cho dữ liệu), sử dụng hai hệ
thống bus do đó có thể hoạt động cả hai bộ nhớ trong cùng
một thời điểm, nên tốc độ xử lý thông tin được cải thiện rất
nhiều.
46
Vi điều khiển PIC chúng ta tìm hiểu trong môn học này (Họ 8-bit PIC®
MCU Mid-Range) sử dụng kiến trúc Harvard.
47
RISC – CISC
• Vi điều khiển được tổ chức theo kiến trúc Harvard còn được gọi là Vi
điều khiển RISC (Reduced Instruction Set Computer) hay vi điều
khiển có tập lệnh rút gọn. Là một phương pháp thiết kế vi điều khiển
theo hướng đơn giản hóa tập lệnh, thời gian thực thi tất cả các lệnh
đều như nhau. Phổ biến là: ARM, AVR, SuperH, MIPS, SPARC, DEC
Alpha, PA-RISC, PIC và PowerPC của IBM
• Vi điều khiển được tổ chức theo kiến trúc Von Neumann còn được gọi
là Vi điều khiển CISC (Complex Instruction Set Computer) hay vi
điều khiển có tập lệnh phức tạp, với độ dài mã lệnh luôn là bội số của
Byte. Là một phương pháp thiết kế vi điều khiển theo hướng phức tạp
hóa tập lệnh, thời gian thực thi của các lệnh khác nhau. Phổ biến là:
Motorola 68x, Intel x86, MCS-51.
48
CHƯƠNG 2:
CẤU TRÚC PHẦN CỨNG
PIC16F887
5
SƠ ĐỒ CHÂN CỦA PIC16F887
• Kiểu chân QFN:
6
SƠ ĐỒ CHÂN CỦA PIC16F887
• Kiểu chân TQFP:
7
2. SƠ ĐỒ KHỐI TỔNG QUÁT CỦA PIC16F887
2. SƠ ĐỒ KHỐI TỔNG QUÁT CỦA PIC16F887
9/19
3. Các PORT xuất nhập của PIC16F887
PIC16F887 có 5 PORT xuất/nhập: PORTA, PORTB, PORTC,
PORTD, PORTE
10
3.1 Cấu hình chiều dữ liệu cho PORT
Để cấu trình chiều dữ liệu cho PORTx ta dùng thanh ghi
TRISx, với x là tên port cần cấu hình.
TRISA cấu hình chiều dữ liệu cho PORTA
TRISB cấu hình chiều dữ liệu cho PORTB
TRISC cấu hình chiều dữ liệu cho PORTC
TRISD cấu hình chiều dữ liệu cho PORTD
TRISE cấu hình chiều dữ liệu cho PORTE
11
Ví dụ : Thanh ghi TRISB cấu hình chiều dữ liệu cho
PORTB
PORTB Tri-State Register (TRISB)
TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB0
12
Ví dụ: Cấu hình chiều dữ liệu cho PORTB như sau :
chân RB7,RB6,RB5,RB4 là input; RB3,RB2,RB1,RB0 là output
PORTB Register (PORTB)
RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
Giải:
Cách 1: cấu hình từng chân
TRISB7 = 1; TRISB6 =1; TRISB5 = 1; TRISB4 = 1;
TRISB3 = 0; TRISB2 =0; TRISB1 = 0; TRISB0 = 0;
Cách 2: cấu hình theo PORT
TRISB = 0B11110000 //định dạng theo số nhị phân
TRISB = 0XF0; //định dạng theo số HEX 13
Ví dụ:
Cấu hình PORTC có chân RC0,RC2,RC6 là input, các chân còn lại
là output :
TRISC = 0B01000101; //định dạng theo số nhị phân
Hoặc:
TRISC = 0X45; //định dạng theo số hex
14
3.1 Cấu hình kiểu dữ liệu cho PORT
- PIC16F887 có thể làm việc với tín hiện digital và analog,
do đó ta phải cấu hình kiểu dữ liệu cho các PORT trước khi
lập trình.
- PIC16F887 có 14 chân analog AN0, AN1,…AN13. Các chân
này có thể cấu hình theo 3 cách sau:
+ analog input
+ digital input
+ digital output
- Các chân còn lại của các PORT là các chân digital, được
cấu hình theo 2 cách sau:
+ digital input + digital output
- Khi reset PIC thì các chân analog mặc định được cấu hình
là analog input 15
TỔNG QUAN VỀ CỔNG XUẤT NHẬP
16
3.1 Cấu hình kiểu dữ liệu cho PORT
Thanh ghi cấu hình kiểu dữ liệu cho PORT là: ANSEL, ANSELH
Analog Select Register (ANSEL)
17
VD: hãy cấu hình chân RE2 là analog input
VD: Hãy cấu hình chân RE2 là analog input
Analog Select Register (ANSEL)
input: TRISE2 = 1
Giải:
RE2 là kênh AN7
analog: ANS7 = 1
Hoặc ANSEL = 0X80
19
VD 1
Cho port E của PIC16F887 có cấu hình như sau:
Analog Input
Digital Output
Digital Input
• Hãy xác định giá trị của thanh ghi TRISE, ANSEL, ANSELH
20
Đáp án:
Cho port E của PIC16F887 có cấu hình như sau:
Analog Input
Digital Output
Digital Input
TRISE - - - - X 1 0 1
ANSEL 0 0 1 x x x x x
ANSELH x x x x x x
PIC16F887
23
Kích hoạt điện trở kéo lên cho PORTB :
Sử dụng thanh ghi WPUB và bit RBPU trong thanh ghi
OPTION
OPTION_REG Register (OPTION_REG)
WPUBi = 1 Cho phép kích hoạt điện trở kéo lên tại chân RBi
WPUBi = 0 Cấm kích hoạt điện trở kéo lên tại chân RBi
Với i = (0,1,2,3,4,5,6,7) là chỉ số bit
24
Ví dụ: Kích hoạt tính năng điện trở kéo lên cho chân RB3
OPTION_REG Register (OPTION_REG)
RBPU = 0
WPUB3 = 1
RB3
Pull-up Resistor 25
Ví dụ: Cấu hình PORT cho phần cứng sau, các chân nối với thạch anh
và MCLR không cần cấu hình.
PORTE : chân 0,1,2 digital output
Cấu hình
PORTB : chân 0,1,2 digital input, có điện trở kéo lên
Đáp án: Cấu hình PORT cho phần cứng sau, các chân nối với thạch
anh và MCLR không cần cấu hình.
ANSEL = 0X00;
ANSELH = 0X00;
TRISE = 0X00;
TRISB = 0XFF;
nRBPU = 0;
WPUB0 = 1;
WPUB1 = 1;
WPUB2 = 1;
// WPUB = 0X07;
28
Tổng kết chung
1. Cấu trúc và các thanh ghi cấu hình PORTA
• Port A có 8 chân: RA0 RA7
• Thanh ghi TRISA (TRISA0 TRISA7) : cấu hình chiều
dữ liệu.
TRISAi = 1: chân RAi là input
TRISAi = 0: chân RAi là output
• Thanh ghi ANSEL, ANSELH (ANS0 ANS13) : cấu
hình kiểu dữ liệu.
ANSi = 0: chân ANi có kiểu dữ liệu là digital
ANSi = 1: chân ANi có kiểu dữ liệu là anolog
29
2. Cấu trúc và các thanh ghi cấu hình PORTB
• Port B có 8 chân: RB0 RB7
• Thanh ghi TRISB (TRISB0 TRISB7) : cấu hình chiều
dữ liệu.
TRISBi = 1: chân RBi là input
TRISBi = 0: chân RBi là output
• Thanh ghi ANSEL, ANSELH (ANS0 ANS13) : cấu
hình kiểu dữ liệu.
ANSi = 0: chân ANi có kiểu dữ liệu là digital
ANSi = 1: chân ANi có kiểu dữ liệu là anolog
• Thanh ghi WPUB và bit RBPU : kích hoạt điện trở kéo lên
30
3. Cấu trúc và các thanh ghi cấu hình PORTC
• Port C có 8 chân: RC0 RC7
• Thanh ghi TRISC (TRISC0 TRISC7) : cấu hình chiều
dữ liệu
TRISCi = 1: chân RCi là input
TRISCi = 0: chân RCi là output
• PORTC không có chân analog
31
4. Cấu trúc và các thanh ghi cấu hình PORTD
• Port D có 8 chân: RD0 RD7
• Thanh ghi TRISD (TRISD0 TRISD7) : cấu hình chiều
dữ liệu
TRISDi = 1: chân RDi là input
TRISDi = 0: chân RDi là output
• PORTD không có chân analog
32
5. Cấu trúc và các thanh ghi cấu hình PORTE
• Port E có 4 chân: RE0 RE3
• Thanh ghi TRISE (TRISE0 TRISE3) : cấu hình chiều
dữ liệu.
TRISEi = 1: chân REi là input
TRISEi = 0: chân REi là output
• Thanh ghi ANSEL, ANSELH (ANS0 ANS13) : cấu
hình kiểu dữ liệu.
ANSi = 0: chân ANi có kiểu dữ liệu là digital
ANSi = 1: chân ANi có kiểu dữ liệu là anolog
33
4. BỘ DAO ĐỘNG
• PIC16F887 Có thể hoạt động khi được cấp xung clock bên
trong hoặc bên ngoài
• Tần số tối đa để PIC16F887 hoạt động ổn định là 20 MHz
• Nguồn xung clock bên ngoài được cung cấp cho PIC16F887
thông qua chân OSC1/CLKIN và OSC2/CLKOUT
• Nguồn xung clock bên trong được cung cấp cho PIC16F887
do người dung lập trình bằng phần mềm.
34
BỘ DAO ĐỘNG
36
4.2 Chế độ dao động bên trong:
Có 2 chế độ như sau :
INTOSC – Internal oscillator with FOSC/4 output on OSC2 and
I/O on OSC1/CLKIN
INTOSCIO – Internal oscillator with I/O on OSC1/CLKIN and
OSC2/CLKOUT.
37
Các chế độ xung clock được chọn bằng bit FOSC<2:0> trong
thanh ghi CONFIG1
• 000: LP Oscillator
• 001: XT Oscillator
• 010: HS Oscillator
• 011: EC Oscillator
• 100: INTOSCIO Oscillator
• 101: INTOSC Oscillator
• 110: RCIO Oscillator
• 111: RC Oscillator.
38
Lưu ý: nên chọn chế độ HS khi chạy các phần chứng trên
mô hình vi xử lý
Chế độ HS
(High Gain Crystal )
39
• Các thanh ghi có liên hệ với nguồn xung clock
52
5. RESET HỆ THỐNG
•Có nhiều loại tín hiệu reset:
MCLR\ Reset
POR (Power-On Reset)
BOR (Brown-Out Reset)
WDT Reset
•MCLR\ Reset là tín hiệu reset bên ngoài hoặc bên
trong
•WDT Reset, POR, BOR là các tín hiệu reset bên trong.
53
Sơ đồ khối mạch reset của PIC16F887
54
• MCLR\ Reset
• Cho phép reset PIC từ mạch điện bên ngoài
• Được chọn lựa và cho phép bằng bit MCLR trong thanh ghi CONFIG1
• MCLRE\ = 0: Tín hiệu reset được tạo ra bên trong PIC, chân RA3 là
ngõ vào số (pull-up)
• MCLRE\ = 1: Tín hiệu reset
được tạo ra từ mạch điện
bên ngoài PIC, chân RE3
trở thành ngõ vào reset PIC,
tích cực mức thấp.
64ms
Internal
Reset
VDD
VBOR
64ms
Internal
Reset <64ms
VDD
VBOR
64ms
Internal
Reset
57
5. RESET HỆ THỐNG (TT)
• WDT Reset
• Tạo tín hiệu reset PIC sau một khoảng thời gian được lập trình trước
• Chu kỳ reset từ 1ms đến 268s
• Được chọn lựa và cho phép bằng bit WDTE trong thanh ghi
CONFIG1.
58
5. RESET HỆ THỐNG (TT)
VDD
• POR (Power-On Reset)
• Khi MCLR được nối với MCLR
TPWRT
VDD, một xung reset được
PWRT
tạo ra khi cạnh lên VDD
TOST
được phát hiện OST
PIC được giữ ở trạng thái reset trong 64ms để VDD tăng lên tới
resonator) ổn định tần số và biên độ; không hoạt động ở các chế
độ RC (tính từ sau POR hoặc Wake Up từ SLEEP).
59
6. NGUỒN CUNG CẤP
• Điện áp nguồn cung cấp từ 2.0V đến 5.5V
• Có 4 chân cấp nguồn:
• VDD (chân 11 và chân 32) +2.0V đến +5.5V
• VSS (chân 12 và chân 31) 0V
• Cả 4 chân đều phải được kết nối thì PIC mới hoạt động.
60
LẬP TRÌNH NỐI TIẾP TÍCH HỢP
Được hỗ trợ cho các loại mạch nạp như: ICD2, PICkit2, PICkit3.
Pin Function
MCLR/VPP VPP Programming Voltage = 13V
ICSP Connector
VDD Supply Voltage
PIC16Fxxx
VSS Ground
VDD RB6 Clock Input
VSS
RB7 Data I/O & Command Input
RB6
RB7
Isolation
To application circuit
circuits
61
7. TỔ CHỨC BỘ NHỚ CỦA PIC16F887
Nội dung bao gồm:
• Bộ nhớ chương trình (Program Memory)
• Bộ đếm chương trình (Program Counter)
• Ngăn xếp (Stack)
• Bộ nhớ dữ liệu (Data Memory)
• RAM
• EEPROM
• Thanh ghi chức năng đặc biệt khác (Special Function
Registers).
62
BỘ NHỚ CHƯƠNG TRÌNH Reset Vector 0000h
• Dung lượng: 8K word
• 8K x 14bit = 14Kbyte
• Vectơ RESET: 0000h Interrupt Vector
0004h
0005h
• Bộ đếm chương trình (PC) sẽ đi tới địa chỉ ………………………
0FFFh
• Bộ đếm chương trình (PC) sẽ đi tới địa chỉ Page 1
2K 1000h
này ngay khi có một sự kiện ngắt bất kỳ. PCH = 08h …………………………………….
17FFh
Page 2 1800h
………………………….
2K
PCH = 10h 1FFFh
Page 3 2K
PCH = 18h
63
PCLATH
• Bộ đếm chương trình: PC<12:0>
• Có 13 bit (PCH + PCL)
• PCL: Từ kết quả ALU (8 bit) hoặc từ mã PCH<12:8> PCL
lệnh (11 bit) CALL, RETURN,
• PCH: Các bit chọn trang RETFIE, RETLW
• Được cập nhật từ PCLATH Stack Level 1
• Xác định trang hiện tại trong bộ nhớ
chương trình
• Ngăn xếp:
• Có 8 mức, hoạt động theo vòng kín Stack Level 8
• Dùng lưu lại nội dung của PC
• Cất vào (PUSH): CALL / Interrupt PROGRAM
• Lấy ra (POP): RETURN, RETFIE,RETLW. MEMORY
64
BỘ NHỚ DỮ LIỆU - RAM
• Dung lượng: 368Byte (368 x 8bit)
• Bộ nhớ dữ liệu được chia thành 4
Bank:
RP1 RP0 Bank
• Bank 0, Bank 1, Bank 2 và Bank 3
• Mỗi Bank có dung lượng 128 Byte, 0 0 Bank 0
gồm: 0 1 Bank 1
• Thanh ghi đa mục đích (GPR) RAM
• Thanh ghi chức năng đặc biệt (SFR) 1 0 Bank 2
• Các Bank này được 1 1 Bank 3
lựa chọn bởi hai bit RP<1:0> nằm
trongthanh ghi STATUS.
65
THANH GHI CHỨC NĂNG ĐẶC BIỆT
Bank 0 Bank 1
66
THANH GHI CHỨC NĂNG ĐẶC BIỆT
67
CHƯƠNG 3
NGÔN NGỮ LẬP TRÌNH
VI ĐIỀU KHIỂN
4
Các bước lập trình vi điều khiển
5
II. Nhắc lại ngôn ngữ lập trình C
6
1. Biến và Kiểu Dữ Liệu
a. Biến : Biến cho phép cung cấp một tên có ý nghĩa cho
mỗi vị trí nhớ
b. Hằng (constant) :
Hằng là một giá trị không thay đổi trong suốt quá trình
thực thi chương trình
ví dụ:
5 số / hằng số nguyên
5.3 số / hằng số thực
‘Black’ hằng chuỗi
‘C’ hằng ký tự
Biến lưu giữ các giá trị hằng
7
c.Từ khóa:
Từ khóa là các từ dành riêng (reserved words) của C mà
người lập trình có thể sử dụng nó trong chương trình tùy
theo ý nghĩa của từng từ.
Ta không được dùng từ khóa để đặt cho các tên của riêng
mình.
Các từ khóa phải viết bằng chữ thường
Các từ khóa của C:
• asm • auto • break • case • cdecl • char • class • const • continue • _cs • default •
delete • do double • _ds • else • enum • _es • extern • _export • far • _fastcall •
float • for • friend • goto • huge • if • inline • int • interrupt • _loadds • long • near
• new • operator • pascal • private • protected • public • register • return •
_saveregs • _seg • short • signed • sizeof • _ss • static • struct • switch • template •
this • typedef • union • unsigned • virtual • void • volatile • while
8
d. Định danh:
• Tên của các biến (variables), các hàm (functions), các nhãn
(labels) và các đối tượng khác nhau do người dùng định nghĩa
gọi là định danh
Chiều dài tối đa của tên là 32 ký tự, phân biệt chữ hoa và chữ
thường.
Các nguyên tắc đặt tên định danh:
Tên định danh phải bắt đầu bằng một ký tự alphabet
Theo sau ký tự đầu có thể là các ký tự chữ, số …
Nên tránh đặt tên biến trùng tên các từ khoá
Tên biến nên mô tả được ý nghĩa của nó
Tránh dùng các ký tự gây lầm lẫn
Nên áp dụng các quy ước đặt tên biến chuẩn khi lập trình
9
Ví dụ:
Các tên định danh đúng: delta, a_1, Num_ODD, ABC
Các tên định danh sai:
3a_1 (ký tự đầu là số)
num-odd (sử dụng dấu gạch ngang)
int (đặt tên trùng với từ khóa)
del ta (có khoảng trắng)
f(x) (có dấu ngoặc tròn)
10
e. Kiểu Dữ Liệu
Kiểu dữ liệu mô tả loại dữ liệu sẽ được lưu trong biến
Tên biến đặt sau kiểu dữ liệu
11
e. Kiểu Dữ Liệu
Kiểu dữ liệu cơ bản
int
float double char void
12
e. Kiểu Dữ Liệu
13
f. Các kiểu định dạng số nguyên trong C
• Bát phân: viết bắt đầu bằng số 0
• Nhị phân: viết bắt đầu bằng số 0B
• Thập phân: viết bắt đầu bằng số từ 1 đến 9
• Thập lục phân: viết bắt đầu bằng 0x
14
2. Các phép toán trong C:
Toán tử Chức năng
Các phép toán số học + Cộng
- Trừ
* Nhân
/ Chia lấy phần nguyên
% Chia lấy phần dư
18
5. Định dạng dữ liệu nhập xuất
%c : Ký tự đơn
%s : Chuỗi
%d : Số nguyên thập phân có dấu
%f : Số chấm động (ký hiệu thập phân)
%e : Số chấm động (ký hiệu có số mũ)
%g : Số chấm động (%f hay %g)
%x : Số nguyên thập phân không dấu
%u : Số nguyên hex không dấu
%o : Số nguyên bát phân không dấu
19
6. Biến toàn cục và biến cục bộ
• Biến toàn cục: vị trí biến đặt bên ngoài tất cả các hàm,
cấu trúc...Các biến này có ảnh hưởng đến toàn bộ
chương trình. Chu trình sống của nó là bắt đầu chạy
chương trình đến lúc kết thúc chương trình.
• Biến cục bộ: Vị trí biến đặt bên trong hàm, cấu trúc….
Chỉ ảnh hưởng nội bộ bên trong hàm, cấu trúc đó….
Chu trình sống của nó bắt đầu từ lúc hàm, cấu trúc được
gọi thực hiện đến lúc thực hiện xong.
20
7. Các cấu trúc điều khiển thường dùng
Cấu trúc điều khiển rẽ nhánh:
if / if else
switch…case
Cấu trúc điều khiển vòng lặp:
for
while
do while
Cấu trúc rẽ nhánh if / if ….else
if
(biểu_thức_điều_kiện)
{
if
(biểu_thức_điều_kiện) Lệnh 1;
{ Lệnh 2;
Lệnh 1; …
Lệnh 2; Lệnh n;
… }
Lệnh n; else
} {
Lệnh 1;
Lệnh 2;
…
Lệnh n;
}
switch (biểu_thức_chọn)
{
case Giá_Trị_1:
Lệnh 1;
..
Lệnh n;
break;
case Giá_Trị_2:
Cấu trúc rẽ nhánh Lệnh 1;
Switch … case ..
Lệnh n;
break;
default:
Lệnh 1;
..
Lệnh n;
break;
}
Cấu trúc vòng lặp:
void main()
{
ANSEL = 0X00;
ANSELH = 0X00;
TRISE = 0X00;
while(1)
{
PORTE = 0X00;
__delay_ms(500); //su dung 5 lan ham __delay_ms(100)
PORTE = 0X06;
__delay_ms(500);
}
}
Sinh viên xem video hướng dẫn
sử dụng mplab và mô phỏng mạch trên proteus
VD 2: lập trình điều khiển 8 led đơn nối với PORTD sang đuổi từ
trái sang phải và lặp lại
Bảng dữ liệu:
00000000
10000000
01000000
00100000
00010000
00001000
00000100
00000010
00000001
Hãy vẽ lưu đồ giải thuật lập trình điều khiển 8 led đơn sáng đuổi
từ trái sang phải và lặp lại
VD 2: Dựa vào sơ đồ, viết chương trình điều khiển LED sáng đuổi từ
trái sang phải và lặp lại
#include <htc.h>
#include <math.h>
__CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF &
CPD_OFF & BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF);
#define _XTAL_FREQ 4000000
37
Ví dụ 3: Dựa vào sơ đồ, viết chương trình điều khiển 8 LED sáng dần từ
phải sang trái, Led nối với port D
• Lưu đồ giải thuật:
39
Ví dụ 3: Dựa vào sơ đồ, viết chương trình điều khiển LED sáng dần
từ phải qua trái
#include <htc.h>
#include <math.h>
__CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF
& BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF);
#define _XTAL_FREQ 4000000
const unsigned char a[] = while(1)
{0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF}; {
void main() for(j=0;j<=8;j++)
{ {
unsigned char j; PORTD = a[j];
__delay_ms(500);
ANSEL = 0X00; }
ANSELH = 0X00; }
TRISD = 0X00; }
PORTD = 0X00;
40
Ví dụ 3: Dựa vào sơ đồ, viết chương trình điều khiển LED sáng dần
từ phải qua trái (cách 2)
void main()
{
unsigned char i;
TRISD = 0X00;
while(1)
{
PORTD = 0X00;
__delay_ms(500);
PORTD = 0X01;
__delay_ms(500);
for (i=1;i<=7;i++)
{
PORTD = PORTD | (PORTD << 1);
__delay_ms(500);
}
}
}
41
Ví dụ 4: Dựa vào sơ đồ, viết chương trình hiển thị số 03 chớp
tắt trên 2 led7SEG (LED4)
42
Lưu đồ giải thuật
Hướng dẫn:
- Xác định led 7 đoạn dùng loại nào: anode hay cathode?
- Tìm mã led 7 đoạn cho số 3, số 0
- Chọn Ton = ? Toff =?
- Xác định led hien thị nối với port nào?
- Cấu hình port: digital, output
- Xuất dữ liệu ra port
Giải:
- led 7 đoạn dùng loại anode chung 0 sáng, 1 tắt
- mã led 7 đoạn cho số 3 là 10110000 = 0XB0
- mã led 7 đoạn cho số 0 là 11000000 = 0XC0
- Chọn Ton = Toff = 500ms
- led hien thị nối với PORTD,C
- Cấu hình PORTD,C: digital, output
- Xuất dữ liệu ra portD,C
#include <htc.h>
#include <math.h>
__CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF &
BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF);
#define _XTAL_FREQ 4000000
void main()
{ PORTD = 0XFF;
TRISD = 0X00; PORTC = 0XFF;
PORTD = 0XFF; __delay_ms(500);
TRISC = 0X00;
PORTC = 0XFF; }
}
while(1)
{
PORTD = 0XB0;
PORTC = 0XC0;
__delay_ms(500);
Ví dụ 5: viết chương trình hiển thị số đếm 00-15 trên 2
led7SEG, thời gian sáng mỗi trạng thái là 500ms
47
Lưu đồ giải thuật
BEGIN
Khao báo mã
led7SEG
A[]={0xC0, .0X90}
i=0
CH = i/10
DV = i%10
PORTC=A[CH]
PORTD=A[DV]
delay500ms
i = i++
i <=15
#include <htc.h>
#include <math.h>
__CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF &
BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_ON);
#define _XTAL_FREQ 4000000
const unsigned char a[]= {0xC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
unsigned char i,ch,dv;
void main()
{
TRISD = 0X00; PORTD = 0XFF;
TRISC = 0X00; PORTC = 0XFF;
while(1)
{
for (i=0;i<16;i++)
{
ch = i/10;
dv = i%10;
PORTD = a[dv];
PORTC = a[ch];
__delay_ms(500);
}
}
} 49
Ví dụ 6 : Viết chương trình hiển thị số đếm 0023 trên 2
led7SEG có sử dụng IC giải mã
Ví dụ 6: Viết chương trình hiển thị số đếm 0023 trên 2 led7SEG có sử
dụng IC giải mã
#include <htc.h>
#include <math.h>
__CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF &
CPD_OFF & BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_ON);
#define _XTAL_FREQ 4000000
void main()
{ unsigned char i,a;
TRISD = 0X00; PORTD = 0X00;
while(1)
{ for (i=0; i<24; i++)
{ a = i/10;
PORTD = (a<<4)|(i%10);
__delay_ms(500);
}
}
}
VD 7: viết chương trình điều khiển nút nhấn
Nhấn nút 1 (RB0) : led7seg hiển thị số 12 trong 1s
Nhấn nút 2 (RB1) : led7seg hiển thị số 24 trong 1s
52
Lưu đồ giải thuật
56
Gợi ý:
PORCx sẽ cấp tín hiệu cho chân anode của các led trên cùng 1 hàng
PORDx sẽ cấp tín hiệu cho chân cathode của các led trên cùng 1
cột
để led[x,y] sáng thì RCx = 0 và Rdy =1
Ta thực hiện quét cột (PORTD) và xuất dữ liệu hàng (PORTC)
60
#include <htc.h>
#include <math.h>
__CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF &
BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF);
#define _XTAL_FREQ 4000000
const unsigned char a[]= {0xF3,0xE1,0xC1,0x83,0xC1,0xE1,0xF3,0xFF};
void main(void) for(i=0;i<83;i++) //2000:24 = 83
{ { vitri=0x01;
unsigned char scancode,i; for(j=0;j<8;j++)
ANSEL = 0X00; {
ANSELH = 0X00; PORTC=a[j];
PORTD=vitri;
TRISD = 0X00; __delay_ms(3);
PORTD = 0X00; PORTD=0x00;
vitri = vitri << 1;
TRISC = 0X00; PORTD=0x00;
PORTC = 0X00; }
}
PORTC=0xFF; PORTD=0x00;
while (1);
}