Đồ án môn học 2: Thiết kế đồng hồ và lịch điện tử sử dụng vi điều khiển 16F887
PHỤ LỤC
PHỤ LỤC………………………………………………………………………………………………… 1
LỜI GIỚI THIỆU……………………………………………………………………………………… 2
PHẦN 1: LÝ THUYẾT………………………………………………………………… ………………3
CHƯƠNG 1: TỔNG QUAN VỀ VI ĐIỀU KHIỂN PIC…………………………………………… …3
1.1 PIC LÀ GÌ? …………………………………………………………………………………………….3
1.2 TẠI SAO LÀ PIC MÀ KHÔNG LÀ CÁC HỌ VI ĐIỀU KHIỂN KHÁC…………………………….3
1.3 KIẾN TRÚC CỦA PIC……………………………………………………………………………… 3
1.4 CÁC DÒNG PIC VÀ CÁCH LỰA CHỌN VI ĐIỀU KHIỂN PIC……………………………… … 4
1.5 NGÔN NGỮ LẬP TRÌNH CHO PIC……… ……………………………………………………… 5
1.6 MẠCH NẠP PIC……….………………………………………………………………………………5
CHƯƠNG 2: VI ĐIỀU KHIỂN PIC 16F887…………………………………………………………….6
2.1 SƠ ĐỒ CHÂN VÀ HÌNH DẠNG THỰC TẾ………………………………………………………….6
2.2 MỘT VÀI THÔNG TIN VỀ VI ĐIỀU KHIỂN PIC16F887………………………………………… 7
2.3 SƠ ĐỒ KHỐI VI ĐIỀU KHIỂN PIC16F887………………………………………………………… 8
2.4 TỔ CHỨC BỘ NHỚ……………………………………………………………………………… ….9
2.4.1 Bộ nhớ chương trình………………………………………………………………………………….9
2.4.2 bộ nhớ dữ liệu……………………………………………………………………………………….10
2.4.3 Các cổng ra vào của PIC……….……………………………………………………………………12
2.5 TIMER0……………………………………………………………………………………………….13
CHƯƠNG 3: LCD……………………………………………………………………………………….15
PHẦN 2: THIẾT KẾ…………………………………………………………………………………….21
A. SƠ ĐỒ KHỐI………………………………………………………………………………………….21
B. SƠ ĐỒ NGUYÊN LÝ………………………………………………………………………… …….22
C. LƯU ĐỒ GIẢI THUẬT……………………………………………………………………………….24
D. LẬP TRÌNH ……………………………………………………………………………………….….30
PHẦN 3: MÔ PHỎNG BẰNG PROTEUS ………………………………………………………… 36
PHẦN 4: TÀI LIỆU THAM KHẢO………………………………………………………………… 36
1
Đồ án môn học 2: Thiết kế đồng hồ và lịch điện tử sử dụng vi điều khiển 16F887
liệu, số lượng ứng dụng mở đã được phát triển thành công, dễ dàng trao đổi, học tập, dễ dàng tìm được
sự chỉ dẫn khi gặp khó khăn…
- Sự hỗ trợ của nhà sản xuất về trình biên dịch, các công cụ lập trình, nạp chưng trình từ đơn giản đến
phức tạp,…
- Các tính năng đa dạng của vi điều khiển PIC, và các tính năng này không ngừng được phát triển.
1.3 KIẾN TRÚC CỦA PIC
Cấu trúc phần cứng của một vi điều khiển được thiết kế theo hai dạng kiến trúc: kiến trúc Von Neuman
và kiến trúc Havard.
3
Đồ án môn học 2: Thiết kế đồng hồ và lịch điện tử sử dụng vi điều khiển 16F887
Hình 1. cấu trúc Von Neuman
Hình 2. cấu trúc Havard
Tổ chức phần cứng của PIC được thiết kế theo kiến trúc Havard. Điểm khác nhau giữa hai kiến trúc trên
là cấu trúc bộ nhớ dữ liệu và bộ nhớ chương trình.
Đối với kiến trúc Von Neuman, bộ nhớ dữ liệu và bộ nhớ chương trình nằm chung một bộ nhớ, do đó ta
có thể tổ chức, cân đối một cách linh hoạt bộ nhớ chương trình và bộ nhớ dữ liệu. Tuy nhiên điều này chỉ
có ý nghĩa khi tốc độ xử lý của CPU phải rất cao, vì với cấu trúc đó, trong một thời điểm, CPU chỉ có thể
tương tác với bộ nhớ dữ liệu hoặc bộ nhớ chương trình. Như vậy có thể nói kiến trúc Von Neuman không
thích hợp với cấu trúc của một vi điều khiển.
Đối với kiến trúc Havard, bộ nhớ dữ liệu và bộ nhớ chương trình tách ra thành hai bộ nhớ riêng biệt. Do
đó trong một thời điểm, CPU có thể tương tác với cả hai bộ nhớ, như vậy tốc độ của vi điều khiển được
cải thiện đáng kể.
Một điểm cần lưu ý nữa là tập lệnh trong kiến trúc Havard có thể được tối ưu tùy theo yêu cầu của kiến
trúc vi điều khiển mà không phụ thuộc vào cấu trúc dữ liệu. Ví dụ với dòng điều khiển PIC16F, độ dài
lệnh luôn là 14 bit (khi dữ liệu được tổ chức thành từng byte), còn với kiến trúc Von Neuman, độ dài lệnh
luôn là bội số của byte (do dữ liệu được tổ chức thành từng byte).
1.4 CÁC DÒNG PIC VÀ CÁCH LỰA CHỌN VI ĐIỀU KHIỂN PIC
Các ký hiệu của vi điều khiển PIC:
- PIC12xxxx: độ dài lệnh 12 bit.
- PIC16xxxx: độ dài lệnh 14 bit.
Ngoài ra do tính năng cho phép nhiều chế độ nạp khác nhau, còn có rất nhiều mạch nạp được thiết kế
dành cho VĐK PIC. Có thể sơ lược một số mạch nạp PIC sau:
JDM Programmer: mạch nạp này dùng chương trình nạp ICprog cho phép nạp các vi điều khiển PIC có
hỗ trợ tính năng nạp chương trình điện áp thấp ICSP (In circuit Serial Programming). Hầu hết mạch nạp
đều hỗ trợ tính năng nạp chương trình này.
WARP-13A và MCB-USB: hai mạch nạp này giống với PICSTART plus do nhà sản xuất Microchip
cung cấp, tương thích với trình biên dịch MPLAB, nghĩa là ta có thể dùng trực tiếp MPLAB để nạp cho vi
điều khiển PIC mà không cần sử dụng một chương trình nạp khác, chẳng hạn như Icprog.
P16PRO40: mạch nạp này do Nigel thiết kế và cũng khá nổi tiếng. Ông còn thiết kế cả chương trình nạp,
tuy nhiên ta có thể sử dụng chương trình nạp Icprog.
Mạch nạp Universal của Williem: đây không phải là mạch nạp chuyên dùng cho PIC như P16PRO40.
Các mạch nạp kể trên có ưu điểm rất lớn là đơn giản, rẻ tiền, hoàn toàn có thể tự lắp ráp dễ dàng và mọi
thông tin về sơ đồ mạch nạp, cách thiết kế, thi công, kiểm tra và chương trình nạp đều dễ dàng tìm được
và download miễn phí từ mạng Internet. Tuy nhiên các mạch nạp trên có nhược điểm là hạn chế về số vi
điều khiển PIC được hỗ trợ. Bên cạnh đó, mỗi mạch nạp cần được sử dụng một chương trình nạp thích
hợp.
5
Đồ án môn học 2: Thiết kế đồng hồ và lịch điện tử sử dụng vi điều khiển 16F887
CHƯƠNG 2: VI ĐIỀU KHIỂN PIC 16F887
2.1 SƠ ĐỒ CHÂN VÀ HÌNH DẠNG THỰC TẾ
Hình 3. sơ đồ chân vi điều khiển PIC 16F887
Hình 4. hình dạng thực tế của vi điều khiển PIC 16F887
6
Đồ án môn học 2: Thiết kế đồng hồ và lịch điện tử sử dụng vi điều khiển 16F887
2.2 MỘT VÀI THÔNG TIN VỀ VI ĐIỀU KHIỂN PIC16F887
Đây là vi điều khiển thuộc họ PIC16xxxx với tập lệnh gồm 35 lệnh có độ dài 14 bit. Mỗi lệnh đều được
thực thi trong một chu kỳ xung clock. Tốc độ hoạt động tối đa cho phép là 20Mhz với một chu kỳ lệnh là
200ns. Bộ nhớ flash chương trình là 8192 words và bộ nhớ dữ liệu là 368 bytes SRAM + 256 bytes
EEPROM. Số PORT I/O là 5 với 33 pin I/O.
Các đặc tính ngoại vi bao gồm các khối chức năng sau:
2.4.1 Bộ nhớ chương trình
Bộ nhớ chương trình của vi điều khiển PIC 16F887 là bộ nhớ flash, dung lượng là 8 Kword (1 word = 14
bit) và được phân thành nhiều trang (từ page0 đến page3).
Như vậy bộ nhớ chương trình có khả năng chứa được 8x1024 = 8192 lệnh (vì mỗi lệnh sau khi mã hóa sẽ
có dung lượng 14 bit = 1 word).
Để mã hóa được địa chỉ của 8 Kword chương trình, bộ đếm chương trình có dung lượng 13 bit. Khi vi
điều khiển được reset bộ đếm chương trình sẽ chỉ đến địa chỉ 0000H (Reset vector). Khi có ngắt xảy ra,
bộ đếm chương trình sẽ chỉ đến địa chỉ 0004H (Interrupt vector).
Bộ nhớ chương trình không bao gồm bộ nhớ stack và không được địa chỉ hóa bởi bộ đếm chương trình.
Bộ nhớ stack sẽ được đề cập cụ thể trong phần sau:
9
Đồ án môn học 2: Thiết kế đồng hồ và lịch điện tử sử dụng vi điều khiển 16F887
Hình 6. bộ nhớ chương trình của vi điều khiển PIC 16F887
2.4.2 bộ nhớ dữ liệu
Bộ nhớ dữ liệu của PIC và bộ nhớ EEPROM được chia ra làm nhiều bank. Đối với vi điều khiển PIC
16F887 thì bộ nhớ dữ liệu được chia là 4 bank. Bank được chọn phụ thuộc vào bit RP1 và RP0 (bit thứ 6
và bit thứ 5) của thanh ghi trạng thái status.
RP1: RP0 BANK
00 0
01 1
10 2
11 3
Mỗi bank có dung lượng 128 byte, bao gồm các thanh ghi có chức năng đặc biệt SFR (Special Function
Register) nằm ở 32 vị trí đầu tiên của mỗi bank và các thanh ghi mục đích chung GPR (General Purpose
Register) nằm ở 96 vị trí cuối cùng của mỗi bank, đóng vai trò như Static RAM.
Các thanh ghi SFR thường xuyên được sử dụng (ví dụ như thanh ghi STATUS) sẽ được đặt ở tất cả các
bank của bộ nhớ dữ liệu, giúp thuận tiện trong quá trình truy xuất và làm giảm bớt lệnh chương trình. Sơ
đồ cụ thể của bộ nhớ dữ liệu vi điều khiển PIC 16F887 như sau:
10
Đồ án môn học 2: Thiết kế đồng hồ và lịch điện tử sử dụng vi điều khiển 16F887
ngắt Timer0 tác động. Sơ đồ khối của Timer0 như sau:
13
Đồ án môn học 2: Thiết kế đồng hồ và lịch điện tử sử dụng vi điều khiển 16F887
Hình 8. Sơ đồ khối Timer0
OPTION_RES
Muốn cho Timer0 hoạt động ở chế độ Timer ta CLEAR bit T0SC (OPTION_RES < 5 >), khi đó giá trị
thanh ghi TMR0 sẽ tăng theo từng chu kỳ xung đồng hồ (tần số vào Timer0 = ¼ tấn số oscillator). Khi giá
trị Timer0 từ FFH trở về 00H, ngắt Timer0 sẽ xuất hiện. Thanh ghi TMR0 cho phép ghi và xóa được giúp
ta ấn định thời điểm ngắt Timer0 xuất hiện một cách linh động.
Muốn Timer0 hoạt động ở chế độ counter ta SET bit T0SC (OPTION_RES < 5 >). Khi đó xung tác động
lên bộ đếm được lấy từ chân RA4/TOCK1. Bit T0SE (OPTION_RES < 4 >) cho phép lựa chọn cạnh tác
động vào bộ đếm. Cạnh tác động sẽ là cạnh lên nếu T0SE = 0 và sẽ là cạnh xuống nếu T0SE = 1.
Khi thanh ghi TMR0 bị tràn, bit TMR0IF (INTCON < 2 >) sẽ được SET. Đây chính là cờ ngắt của
Timer0. Cờ ngắt này phải được xóa bằng chương trình trước khi bộ đếm bắt đầu thực hiện lại quá trình
đếm. Ngắt Timer0 không thể “đánh thức” vi điều khiển từ chế độ sleep.
14
Đồ án môn học 2: Thiết kế đồng hồ và lịch điện tử sử dụng vi điều khiển 16F887
Bộ chia tần số (prescaler) được chia sẽ giữa Timer0 và WDT (Watchdog Timer), điều đó có nghĩa là nếu
prescaler được sử dụng cho Timer0 thì WDT sẽ không có được sự hỗ trợ của prescaler và ngược lại.
Prescaler được điều chỉnh bởi thanh ghi OPTION_REG. Bit PSA (OPTION_REG < 3 >) xác định đối
tượng tác động của prescaler. Các bit PS2:PS0 (OPTION_REG<2:0>) xác định tỷ số chia tần số của
prescaler. Xem lại thanh ghi OPTION_REG để xác định lại một cách chi tiết về các bit điều khiển trên.
Các lệnh tác động lên giá trị thanh ghi TMR0 sẽ xóa chế độ hoạt động của prescaler. Khi đối tượng tác
động là Timer0, tác động lên giá trị thanh ghi TMR0 sẽ xóa prescaler nhưng không làm thay đổi đối
tượng tác động của prescaler. Khi đối tượng tác động là WDT, lệnh CLR WDT sẽ xóa prescaler, đồng
thời prescaler sẽ ngưng tác vụ hỗ trợ cho WDT.
Các thanh ghi điều khiển liên quan đến Timer0 bao gồm:
TMR0 (địa chỉ 01H, 101H): chứa giá trị đếm của Timer0.
INTCON (địa chỉ 0BH, 8BH, 10BH, 18BH): cho phép ngắt hoạt động (GIE và PEIE).
OPTION_REG (địa chỉ 81H, 181H): điều khiển prescaler.
• LCD graphic: đặc điểm loại này là toàn bộ màn hình được chia thành các điểm ảnh, giá thành tùy
thuộc vào độ phân giải và hãng sản xuất. Các độ phân giải thông thường là: 240x64, 240x128,
160x64, 128x128, 128x64 v.v
• LCD alphanumeric: Chỉ dùng để hiển thị chữ cái và chữ số. Với loại này 1 ký tự hiển thị trên
một ma trận 5x7 hoặc 5x10, như vậy với loại LCD 16x2 (có hai hàng và mỗi hàng có 16 ký tự) sẽ
có 32 ma trận xếp trên hai hàng. Hiện nay có các loại LCD thông alphanumeric thông dụng là:
14x2, 16x1, 20x2, 20x4.
16
Đồ án môn học 2: Thiết kế đồng hồ và lịch điện tử sử dụng vi điều khiển 16F887
Chân số Tên Chức năng
1 Vss Đất
2 VDD Cực + của nguồn điện
3 VEE Tương phản (constrast)
4 RS Register Select (chọn thanh ghi)
5 R/W Read/Write
6 E Enable (cho phép)
7 D0 Bit 0 của dữ liệu
8 D1 Bit 1 của dữ liệu
9 D2 Bit 2 của dữ liệu
10 D3 Bit 3 của dữ liệu
11 D4 Bit 4 của dữ liệu
12 D5 Bit 5 của dữ liệu
13 D6 Bit 6 của dữ liệu
14 D7 Bit 7 của dữ liệu
Mặc dù theo sổ tay kỷ thuật LCD thì cấp nguồn cho nó là 5V DC (khoảng vài mA) nhưng cung cấp cho
nó 6VDC hay 4.5 VDC thì nó vẫn hoạt động tốt và ngay cả với 3 VDC cũng đủ cho một số module. Kết
quả là các module LCD tiêu thị năng lượng ít.
Chân 3 là chân điều khiển VEE dùng để thay đổi độ tương phản của màn hiển thị. Lý tưởng thì chân này
nên nối nguồn điện áp thay đổi được, người ta thực hiện bằng cách gắn mạch chia áp dùng biến trở có đầu
ra thay đổi đưa vào chân này; tuy nhiên nên chú ý là một số module cần nguồn điện DC 7V. Đơn giản là
Đồ án môn học 2: Thiết kế đồng hồ và lịch điện tử sử dụng vi điều khiển 16F887
Mã (Hex) Lệnh đến thanh ghi của LCD
1 Xóa màn hình hiển thị
2 Trở về đầu dòng
4 Giảm con trỏ (dịch con trỏ sang trái)
6 Tăng con trỏ (dịch con trỏ sang phải)
5 Dịch hiển thị sang phải
7 Dịch hiển thị sang trái
8 Tắt hiển thị, tắt con trỏ
A Tắt hiển thị, bật con trỏ
C Bật hiển thị, tắt con trỏ
E Bật hiển thị, nhấp nháy con trỏ
F Tắt hiển thị, nhấp nháy con trỏ
10 Dịch vị trí con trỏ sang trái
14 Dịch vị trí con trỏ sang phải
18 Dịch toàn bộ hiển thị sang trái
1C Dịch toàn bộ hiển thị sang phải
80 Ép con trỏ về đầu dòng thứ nhất
C0 Ép con trỏ về đầu dòng thứ hai
38 Hai dòng và ma trận 5x7
Điều khiển LCD qua các bước:
Bước 1: khởi tạo cho LCD.
Bước 2: gán các giá trị cho các bit điều khiển các chân RS, R/W, E cho phù hợp với các chế độ: hiển thị
các ký tự lên LCD hay thực hiện một lệnh của LCD.
Bước 3: xuất byte dữ liệu ra cổng điều khiển 8 bit dữ liệu của LCD.
Bước 4: kiểm tra cờ bận xem LCD sẵn sàng nhận dữ liệu mới chưa.
Bước 5: quay vòng lại bước 1.
Các lệnh LCD cơ bản ở chế độ 8 bit:
LCD_FIRST_ROW: Đưa con trỏ về hàng đầu tiên
LCD_SECOND_ROW: Đưa con trỏ về hàng thứ 2
B2 B3
B0
B1
B2
B3
B4 B5 B6
B4
B5
B6
B7
B7
RE3/MCLR/VPP
1
RA1/AN1/C12IN1-
3
RA2/AN2/VREF-/CVREF/C2IN+
4
RA4/T0CKI/C1OUT
6
RA5/AN4/SS/C2OUT
7
RB0/AN12/INT
33
RB1/AN10/C12IN3-
34
RB2/AN8
35
RA7/OSC1/CLKIN
13
RA6/OSC2/CLKOUT
21
RD1
20
RD0
19
RC7/RX/DT
26
RC6/TX/CK
25
RE2/AN7
10
RE1/AN6
9
RE0/AN5
8
RA3/AN3/VREF+/C1IN+
5
RD4
27
RB3/AN9/PGM/C12IN2-
36
RA0/AN0/ULPWU/C12IN0-
2
U1
PIC16F887
D7
14
D6
13
D5
4k7
R10
4k7
R11
4k7
R3
4k7
X1
4M
C1
30pF
C2
30pF
22
Đồ án môn học 2: Thiết kế đồng hồ và lịch điện tử sử dụng vi điều khiển 16F887
KHỐI VI ĐIỀU KHIỂN
B0
B1
B2
B3
B4
B5
B6
B7
RE3/MCLR/VPP
1
RA1/AN1/C12IN1-
3
RA2/AN2/VREF-/CVREF/C2IN+
4
RC0/T1OSO/T1CKI
15
RB7/ICSPDAT
40
RB6/ICSPCLK
39
RB5/AN13/T1G
38
RB4/AN11
37
RD3
22
RD2
21
RD1
20
RD0
19
RC7/RX/DT
26
RC6/TX/CK
25
RE2/AN7
10
RE1/AN6
9
RE0/AN5
8
RA3/AN3/VREF+/C1IN+
5
7
E
6
RW
5
RS
4
VSS
1
VDD
2
VEE
3
LCD1
LM016L
23
Đồ án môn học 2: Thiết kế đồng hồ và lịch điện tử sử dụng vi điều khiển 16F887
KHỐI PHÍM NHẤN
B2 B3 B4 B5 B6 B7
R5
4k7
R6
4k7
R9
4k7
R10
4k7
R11
4k7
R3
YES
YES
NO
NO
NO
NO
NO
NO