Professional Documents
Culture Documents
Thoi Gian Thuc
Thoi Gian Thuc
01
Ngày: 9/5/2006 Trang: 1/42
Report no 03.01
Gửi đến: picvietnam@googlegroups.com
Nội dung: Real Time Clock Version 1.0
MICROSOFT WORD
Tóm tắt:
Báo cáo quá trình thiết kế và thi công Đồng hồ thời gian thực RTC (Real Time Clock) với các nội
dung:
- Sơ lược về RTC (các chức năng và ứng dụng).
- Sơ đồ nguyên lí RTC.
- Cấu tạo và chức năng các linh kiện sử dụng cho RTC.
- Giải thuật và chương trình ứng dụng viết cho RTC.
Các file đính kèm: File chương trình, sơ đồ nguyên lí và sơ đồ mạch in của RTC.
1. Sơ lược về RTC
Đây là ứng dụng sử dụng vi điều khiển PIC để thiết kế một đồng hồ điện tử treo tường
hoặc để bàn. Sau đây là một vài điểm giới thiệu sơ lược:
- Sử dụng LED 7 đoạn để hiển thị. Thiết bị này thích hợp hơn cho mục đích hiển thị của
RTC khi dùng làm động hồ treo tường hoặc để bàn.
- Sử dụng IC thời gian thực DS12C887. IC này có tác dụng tạo ra thời gian thực chính
xác tuyệt đối, bao gồm giờ, phút, giây, thứ, ngày, tháng, năm. Bên cạnh đó là các ngắt
lập trình được phục vụ cho việc cập nhật thời gian thực và hẹn giờ.
- Sử dụng IC ghi dịch 74HC595 để tăng số lượng chân điều khiển cho vi điều khiển.
- Sử dụng vi điều khiển PIC16F877A cho các thao tác truy cập thời gian thực, hiển thị
giờ và chỉnh giờ. Thực chất việc sử dụng PIC16F877A cho ứng dụng này là phí phạm,
vì ứng dụng không yêu cầu thêm một chức năng phụ nào của vi điều khiển ngoài chức
năng I/O.
RTC Version 1.0 là bản “nháp” và bao gồm các chức năng cụ thể sau:
- Hiển thị giờ, phút, giây, ngày, tháng, năm. Không hiển thị thứ (quên mất tiêu ☺ ).
- Điều chỉnh được giờ, phút, giây.
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 2/42
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
NTC1 NTC2 NTC3 NTC4 NTC5 NTC6 NTC7 NTC8 NTC9 NTC10 NTC11 NTC12 NTC13 NTC14
J2
A
B
A
B
A
B
A
B
A
B
A
B
A
B
A
B
A
B
A
B
A
B
A
B
A
B
A
B
G
F
G
F
G
F
G
F
G
F
G
F
G
F
G
F
G
F
G
F
G
F
G
F
G
F
G
F
VCC
VCC
VCC
VCC
VCC
VCC
VCC
VCC
VCC
VCC
VCC
VCC
VCC
VCC
8
7
6
5
4
3
2
1
CON8
VC C
VC C
VC C
VC C
VC C
VC C
VC C
VC C
VC C
VC C
VC C
VC C
VC C
VC C
DP
DP
DP
DP
DP
DP
DP
DP
DP
DP
DP
DP
DP
DP
D
C
E
E
10
10
10
10
10
10
10
10
10
10
10
10
10
10
9
8
7
6
9
8
7
6
9
8
7
6
9
8
7
6
9
8
7
6
9
8
7
6
9
8
7
6
9
8
7
6
9
8
7
6
9
8
7
6
9
8
7
6
9
8
7
6
9
8
7
6
9
8
7
6
J7
1
2
3
4
5
6
J6
1
2
3
4
5
6
7
8
Các giá trị giờ, phút, giây, ngày, tháng dùng 2 LED để hiển thị. Giá trị năm dùng 4 LED
để hiển thị. Tổng cộng ta cần sử dụng 14 LED.
HI
HI
R R R
1
2
3
4
SW2 SW3 SW4 5
TIMESET ALARMSET INC 6
0 CON6
0 0 0
3. Cấu tạo và chức năng các linh kiện sử dụng trong RTC
Phần này sẽ đi sâu vào cấu tạo bên trong của các linh kiện sử dụng cho RTC và cách điều
khiển chúng sử dụng vi điều khiển PIC.
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 5/42
Hình vẽ trên là một LED 7 đoạn loại Cathode chung. Thực ra cấu trúc các chân của LED
7 đoạn có thể thay đổi chứ không cố định. Một phương pháp để xác định chính xác các
chân điều khiển của LED 7 đoạn là kiểm tra từng chân của LED đó.
Dựa vào hình vẽ ta có thể hiểu được một phần nào phương pháp hiển thị của một LED
7 đoạn. Ví dụ, muốn hiển thị số “6”, ta sẽ điều khiển các đoạn LED a, c, d, e, g, f sáng lên.
Việc điều khiển sáng tắt được thực hiện bằng cách đưa dữ liệu thích hợp vào các chân a-g
và dp (tạm gọi là các chân dữ liệu) của LED 7 đoạn. Đó là cách hiển thị theo từng LED. Tuy
nhiên, trong thực tế, để tiết kiệm số chân cần thiết để điều khiển cùng một lúc nhiều LED 7
đoạn, các chân dữ liệu của các LED sẽ được nối song song với nhau, các chân anode chung
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 6/42
(hoặc cathode chung) được dùng để cho phép LED đó sáng hay tắt (tạm gọi là các chân
điều khiển). Phương pháp hiển thị sẽ dựa trên nguyên lí lưu ảnh của mắt.
Dựa vào bảng dữ liệu trên, muốn hiển thị một chữ số lên LED 7 đoạn, ta chỉ việc đưa
mã HEX tương ứng với chữ số đó ra PORT D của vi điều khiển. Bảng mã trên không cố
định mà có thể thay đổi tùy thuộc vào cấu trúc phần cứng của mạch điều khiển. Tùy theo
cách kết nối mà ta có thể xây dựng bảng mã tương ứng.
Để điều khiển việc cho phép một LED nào đó tắt hoặc sáng. Ta nối các chân RB0 và RB1
với các chân điều khiển của LED thông qua các “công tắc”. “Công tắc” này là các Transistor
và có cấu trúc mạch như hình 5. Khi chân điều khiển ở mức logic 1, transistor ngưng dẫn
và không có dòng vào LED 7 đoạn. Khi chân diều khiển ở mức logic 0, transistor dẫn bão
hòa và xuất hiện dòng điện đi qua các LED.
Ta sẽ sử dụng chân RB0 để điều khiển LED hàng đơn vị và chân RB1 để điều khiển LED
hàng chục.
5V
HI
10 K
RBx
LO
HI
R13
R
NTC3
HI
1 40
HI
MCLR/VPP RB7/PGD 39
SW1 2 RB6/PGC 38
3 RA0/AN0 RB5 37
4 RA1/AN1 RB4 36
5 RA2/AN2/VREF-/CVREF RB3/PGM 35
6 RA3/AN3/VREF+ RB2 34 R1 R2
7 RA4/TOCKI/C1OUT RB1 33 10 K 10K
RA5/AN4/SS/C2OUT RB0/INT A1015 A1015
0 8
9 RE0/RD/AN5 30 330 DP B
10 RE1/WR/AN6 RD7/PSP7 29 330 G A
RE2/CS/AN7 RD6/PSP6 28 330 F F
15 RD5/PSP5 27 330 E G
16 RC0/T1OSO/T1CKI RD4/PSP4 22 330 D E
17 RC1/T1OSI/CCP2 RD3/PSP3 21 330 C D
18 RC2/CCP1 RD2/PSP2 20 330 B C
23 RC3/SCK/SCL RD1/PSP1 19 330 A DP NTC1 NTC2
RC4/SDI/SDA RD0/PSP0
1
2
3
4
5
1
2
3
4
5
24
25 RC5/SD0
A
B
A
B
G
G
F
F
VC C
VC C
26 RC6/TX/CK 11 HI
30 pF RC7/RX/DT VDD 32
14 VDD
OSC2/CLKO
4 MHz 31
VSS 12
13 VSS
OSC1/CLKI
30 pF PIC16F877A 0
0
VC C
VC C
DP
DP
D
C
E
E
10
10
9
8
7
6
9
8
7
6
Hình 6 : Sơ đồ nguyên lí module hiển thị cho LED 7 đoạn
Chương trình viết cho ứng dụng trải qua các bước sau:
- Đưa dữ liệu của LED 1 vào
- Bật LED 1
- Delay
- Đưa dữ liệu của LED 2 vào
- Bật LED 2
- Delay
- Lặp lại bước 1
Sau đây là chương trình cụ thể:
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 9/42
Chương trình 1:
;========================================================================
title “chuongtrinh1.asm”
processor 16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON &
_XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
;========================================================================
;------------------------------------------------------------------
; Khai báo biến
;------------------------------------------------------------------
count1 EQU 0x20
counta EQU 0x21
countb EQU 0x22
;=========================================================================
; Chương trình chính
ORG 0x000
GOTO start
;=========================================================================
start
;-----------------------------------------------------------------------------------
; Khởi tạo các PORT
;-----------------------------------------------------------------------------------
BCF STATUS, RP1
BSF STATUS,RP0 ; BANK1
CLRF TRISD ; PORTD <- output
CLRF TRISB ; PORTB <- output
BCF STATUS,RP0 ; BANK0
CLRF PORTB
CLRF PORTD
;-----------------------------------------------------------------------------------
; Vòng lặp chính của chương trình
;-----------------------------------------------------------------------------------
loop
MOVLW 0x99 ; hiển thị số 4
MOVWF PORTD
MOVLW b'11111101' ; bật LED hàng chục
MOVWF PORTB
CALL delay_1ms ; delay_1ms
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 10/42
Trong chương trình trên, mỗi LED sẽ được bật sáng trong một khoảng thời gian 1 ms,
sau đó tắt LED đó và bật LED khác lên. Do thời gian bật tắt quá nhanh nên mắt sẽ bị đánh
lừa là LED sáng liên tuc. Hiện tượng này có thể quan sát rõ hơn bằng cách tăng thời gian
delay lên, khi đó ta sẽ thấy từng LED được bật tắt một cách tuần tự.
Tương tự ta có thể mở rộng số lượng LED bằng cách nối song song tất cả chúng lại với
nhau và áp dụng giải thuật trên để hiển thị.
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 11/42
Ta có thể điều khiển được một hoặc nhiều IC 74HC595 ghép với nhau thông qua 4 chân
SER, RCK, SCK và . Điều này cho phép mở rộng một cách vô hạn số lượng chân ngõ
ra của vi điều khiển. Tuy nhiên nhược điểm của nó là thời gian truy xuất các ngõ ra chậm
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 13/42
hơn so với việ truy xuất trực tiếp, vì dữ liệu phải được đưa từng bỉt vào IC trước khi cho
xuất ra ngoài.
Hình sau thể hiện cách nối nhiều IC ghi dịch lại với nhau. Các chân điều khiển (RCK,
SCK và ) được nối chung lại với nhau, chân dữ liệu nối tiếp ngõ ra (chân 9) của IC
này được nối với chân dữ liệu nối tiếp ngõ vào của IC tiếp theo. Ta có thể mở rộng số
lương IC ghép với nhau theo cách tương tự mà số lượng chân điều khiển vẫn không đổi.
DATA IN
RCK
SCK
CLR
13
10
11
12
14
13
10
11
12
14
HI
HI
SRCLK
SRCLK
RCLK
RCLK
CLR
CLR
G
G
SDI
SDI
16 16
VCC VCC
8 74HC595 8 74HC595
GND GND
SDO
SDO
0
QG
QG
QH
QD
QC
QH
QD
QC
QE
QB
QA
QE
QB
QA
QF
QF
0 0
15
15
7
6
5
4
3
2
1
7
6
5
4
3
2
1
9
DATA OUT
HI
10 K
NTC1
1 40
MCLR/VPP RB7/PGD 39
SW1 2 RB6/PGC 38
3 RA0/AN0 RB5 37
4 RA1/AN1 RB4 36 RCK
5 RA2/AN2/VREF-/CVREF RB3/PGM 35 CLR
HI
6 RA3/AN3/VREF+ RB2 34 SCK
0 7 RA4/TOCKI/C1OUT RB1 33 SDI
RA5/AN4/SS/C2OUT RB0/INT
8
16
9 RE0/RD/AN5 30 U2
10 RE1/WR/AN6 RD7/PSP7 29 15 330 D1
VCC
RE2/CS/AN7 RD6/PSP6 28 QA 1 330 D2
15 RD5/PSP5 27 QB 2 330 D3
16 RC0/T1OSO/T1CKI RD4/PSP4 22 SDI 14 QC 3 330 D4
17 RC1/T1OSI/CCP2 RD3/PSP3 21 RCK 12 SER QD 4 330 D5
18 RC2/CCP1 RD2/PSP2 20 SCK 11 RCK QE 5 330 D6
23 RC3/SCK/SCL RD1/PSP1 19 CLR 10 SRCK QF 6 330 D7
24 RC4/SDI/SDA RD0/PSP0 SRCLR QG 7 330 D8
25 RC5/SD0 HI 13 QH
26 RC6/TX/CK 11 8 G 9
30 pF RC7/RX/DT VDD 32 GND QHP
14 VDD 74HC595 0
OSC2/CLKO 0
4 MHz 31
30 pF VSS 12
13 VSS
OSC1/CLKI
0
0 PIC16F877A
;----------------------------------------------------------
#define data PORTB,0
#define clock PORTB,1
#define clear PORTB,2
#define latch PORTB,3
;========================================================================
; Chương trình chính
ORG 0x000
GOTO start
;========================================================================
start
;------------------------------------------------------
; Khởi tạo các PORT điều khiển
;-------------------------------------------------------
BCF STATUS,RP1
BSF STATUS,RP0 ; BANK1
MOVLW 0xF0 ; các chân RB3:RB0 là output
MOVWF TRISB ; các chân RB7:RB4 là input
BCF STATUS,RP0 ; BANK0
;---------------------------------------------------------------------
; Khởi tạo IC 74HC595
;---------------------------------------------------------------------
BCF clear ; reset dữ liệu trong IC 74HC595
NOP ; clear tác động cạnh xuống
BSF clear ; đưa chân trở về mức logic cao
;----------------------------------------------------------------------
; Đoạn chương trình xuất dữ liệu ra 74HC595
;----------------------------------------------------------------------
MOVLW 0xCA ; dữ liệu cần đưa ra IC 74HC595
CALL serout ; chương trình con “serout”
BSF latch ; tạo cạnh dương tại chân RCK để đưa
NOP ; dữ liệu ra ngõ ra IC 74HC595
BCF latch ; đưa chân RCK trở về mức logic thấp
;--------------------------------------------------------
; Vòng lặp chính của chương trình
;--------------------------------------------------------
GOTO $
;========================================================================
; Chương trình con
;========================================================================
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 16/42
;-----------------------------------------------------------------------------------------
; Chương trình con “serout”
; Dùng để đưa dữ liệu vào các thanh ghi dịch của IC 74HC595
;-----------------------------------------------------------------------------------------
serout
MOVWF sendreg ; đưa dữ liệu vào thanh ghi sendreg
MOVLW 0x08 ; đếm 8 bit dữ liệu
MOVWF count
testbit
BCF data ; dữ liệu mặc định bằng 0
BTFSC sendreg,7 ; sendreg,7 == 0 ??
BSF data ; nếu không bằng 0, set dữ liệu từ 0 -> 1
BSF clock
NOP ; tạo cạnh dương tại chân SCK để đưa
; dữ liệu vào IC
BCF clock ; đưa chân SCK về lại mức logic thấp
RLF sendreg,0 ; dịch trái thanh ghi sendreg
MOVWF sendreg
DECFSZ count,1 ; giảm biến count 1 đơn vị
GOTO testbit ; nếu biến “count” chưa bằng 0, tiếp tục
; quá trình dịch dữ liệu
RETURN ; trở về chương trình chính nếu count = 0
;========================================================================
END
Thuật toán cụ thể của ứng dụng trên như sau: ban đầu dữ liệu được mặc định mang
mức logic 0, sau đó ta kiểm tra từng bit dữ liệu một ( bit thứ 7 trong thanh ghi “sendreg”)
xem có thực sự bằng 0 hay không. Nếu bằng 1, ta set đường dữ liệu lên mức logic 1. Sau đó
tạo xung dương tại chân “SCK” để đưa dữ liệu vào IC. Dữ liệu trên thanh ghi “sendreg”
sau đó được dịch trái và quá trình trên tiếp tục cho đến khi 8 bit dữ liệu được dịch xong.
Cần chú ý khởi tạo 74HC595 bằng cách xóa các ngõ ra và đưa chân lên mức logic
cao (do chân tác động cạnh thấp). Nếu không các ngõ ra sẽ luôn ở trạng thái logic 0
(bị xóa).
Trong trường hợp nối nhiều IC lại với nhau ta chỉ việc lần lựot đưa dữ liệu vào thanh
ghi “sendreg” và gọi chương trình con “serout” cho đến khi tất cả các dữ liệu được gửi ra
hết.
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 17/42
- Nhóm chân DATA: bao gồm các chân AD7:AD0. Đây là các chân mà DS12C887
dùng để đưa dữ liệu ra hay nhận dữ liệu vào.
- Nhóm chân điều khiển giao tiếp BUS: bao gồm các chân MOT, AS, DS, R/W với
các chức năng phụ thuộc vào việc lựa chọn chế độ giao tiếp BUS theo chuẩn của
Intel (MOT =1) hay Motorola (MOT = 0).
- Nhóm chân chức năng: bao gồm các chân RESET (dùng để reset IC), IRQ (chân tác
dộng của các ngắt trong DS12C887) và chân SQW (chân tạo sóng vuông ngõ ra).
- Ngoài ra còn có các chân dùng để cấp nguồn cho IC và các chân không cần thiết
(NC).
Các thanh ghi chức năng:
Ngoại trừ các thanh ghi “REGISTER A, B, C, D” dùng để điều khiển, các thanh ghi còn
lại đều đựoc dùng để truy xuất dữ liệu.
Sau đây là chức năng của từng bit trong các thanh ghi điều khiển.
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 19/42
Các thông tin khác có liên quan sẽ được tìm thấy trong datasheet của nhà sản xuất.
HI
10 K
NTC1
1 40 330 D1
MCLR/VPP RB7/PGD 39 330 D2
SW1 2 RB6/PGC 38 330 D3
3 RA0/AN0 RB5 37 330 D4
4 RA1/AN1 RB4 36 330 D5
5 RA2/AN2/VREF-/CVREF RB3/PGM 35 330 D6
6 RA3/AN3/VREF+ RB2 34 330 D7
0 7 RA4/TOCKI/C1OUT RB1 33 330 D8
RA5/AN4/SS/C2OUT RB0/INT
AS 8
RW 9 RE0/RD/AN5 30 AD7
DS 10 RE1/WR/AN6 RD7/PSP7 29 AD6 0
RE2/CS/AN7 RD6/PSP6 28 AD5
HI
15 RD5/PSP5 27 AD4
HI
16 RC0/T1OSO/T1CKI RD4/PSP4 22 AD3 NTC1
17 RC1/T1OSI/CCP2 RD3/PSP3 21 AD2 DS 17 24
18 RC2/CCP1 RD2/PSP2 20 AD1 RW 15 DS VCC
23 RC3/SCK/SCL RD1/PSP1 19 AD0 AS 14 R/W
24 RC4/SDI/SDA RD0/PSP0 AS 23 10 K
25 RC5/SD0 AD7 11 SQW 19
26 RC6/TX/CK 11 HI AD6 10 AD7 IRQ 18
30 pF RC7/RX/DT VDD 32 AD5 9 AD6 RESET
14 VDD AD4 8 AD5 SW2
OSC2/CLKO AD3 7 AD4 20
4 MHz 31 AD2 6 AD3 NC 16
30 pF VSS 12 AD1 5 AD2 NC 2
13 VSS AD0 4 AD1 NC
OSC1/CLKI AD0
0 21 12 0
0 PIC16F877A NC GND
22 13
3 NC CS 1
NC MOT
DS12C887 0
Yêu cầu của ứng dụng là ghi một giá trị nào đó lên một thanh ghi trong RAM của
DS12C887, sau đó đọc ra và kiểm tra kết quả bằng việc xuất ra các LED ở PORT B.
Dựa vào giản đồ xung được cung cấp bởi datasheet của nhà sản xuất, muốn ghi một giá
trị lên RAM của DS12C887 theo chuẩn giao tiếp của Intel ta lần lượt tiến hành các bước sau:
- Bước 1: Đưa chân DS và RW lên mức logic 1.
- Bước 2: Xuất địa chỉ cần ghi lên RAM ra các chân data của DS12C887.
- Bước 3: Tạo cạnh xuống tại chân AS.
- Bước 4: Đưa dữ liệu cần ghi lên RAM ra các chân data của DS12C887.
- Bước 5: Đưa chân RW về mức logic 0.
- Bước 6: Tạo cạnh lên tại chân AS.
Do các chân dữ liệu của DS12C887 được nối với PORT D nên khi cần đưa giá trị địa chỉ
hay dữ liệu vào các chân data của DS12C887, ta chỉ cần xuất các giá trị địa chỉ hoặc dữ liệu
đó ra PORT D của vi điều khiển.
Muốn đọc một giá trị từ một thanh ghi trong RAM của DS12C887 ta tiến hành lần lượt
các bước như sau:
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 22/42
;========================================================================
processor 16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON &
_XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
;========================================================================
;---------------------------------------------------------
; Khai bao bien
;---------------------------------------------------------
DATA_W EQU 0x26
ADDRESS_W EQU 0x27
DATA_R EQU 0x28
ADDRESS_R EQU 0x29
;-------------------------------------------------------
; Khai bao phan cung
;------------------------------------------------------
#define DS PORTE, 2
#define RW PORTE, 1
#define AS PORTE, 0
#define DATAPORT PORTD
#define LEDPORT PORTB
;========================================================================
; CHUONG TRINH CHINH
;========================================================================
ORG 0x000
GOTO start
start
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 23/42
;---------------------------------------------------
; Khoi tao cac PORT I/O
;---------------------------------------------------
BSF STATUS,RP0 ; select BANK1
MOVLW 0x06 ; tat ca cac chan I/O deu la dang so
MOVWF ADCON1
CLRF TRISB
CLRF TRISE
BCF STATUS,RP0 ; select BANK0
;--------------------------------------------------------------
; Doc va ghi len RAM cua DS12C887
;-------------------------------------------------------------
MOVLW b'10101010' ; du lieu can ghi vao thanh ghi
MOVWF DATA_W
MOVLW d'14' ; dia chi cua thanh ghi can ghi
MOVWF ADDRESS_W
CALL write_12C887 ; chuong trinh con "write_12C887"
MOVLW d'14' ; dia chi thanh ghi can doc
MOVWF ADDRESS_R
CALL read_12C887 ; chuong trinh con "read_12C887"
MOVF DATA_R,0 ; xuat du lieu vua doc duoc ra LED
MOVWF LEDPORT
;-------------------------------------------------------------------
; VONG LAP CHINH CUA CHUONG TRINH
;-------------------------------------------------------------------
main
GOTO main
;========================================================================
; Chuong trinh con
;========================================================================
;-------------------------------------------------------------------------------------------------------
; Chuong trinh con "write_12C887" dung de ghi du lieu len 12C887
; Du lieu can ghi chua trong thanh ghi DATA
; Dia chi can ghi du lieu vao chua trong thanh ghi ADDRESS
; Giao tiep theo chuan cua INTEL
;-------------------------------------------------------------------------------------------------------
write_12C887
BSF STATUS,RP0
CLRF TRISD
BCF STATUS,RP0
MOVF ADDRESS_W,0
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 24/42
MOVWF DATAPORT
BSF DS
BSF RW
NOP
BSF AS
NOP
BCF AS
NOP
MOVF DATA_W,0
MOVWF DATAPORT
BCF RW
NOP
BSF AS
RETURN
;---------------------------------------------------------------------------------------------------
; Chuong trinh con "read_12C887" dung de doc du lieu tu 12C887
; Dia chi can doc du lieu vao chua trong thanh ghi ADDRESS_R
; Du lieu sau khi doc chua trong thanh ghi DATA_R
; Giao tiep theo chuan cua INTEL
;---------------------------------------------------------------------------------------------------
read_12C887
BSF STATUS,RP0
CLRF TRISD
BCF STATUS,RP0
MOVF ADDRESS_R,0
MOVWF DATAPORT
BSF DS
BSF RW
NOP
BSF AS
NOP
BCF AS
NOP
BCF DS
NOP
BSF STATUS,RP0
MOVLW 0xFF
MOVWF TRISD
BCF STATUS,RP0
MOVF DATAPORT,0
MOVWF DATA_R
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 25/42
BSF AS
RETURN
;========================================================================
END
Trong trường hợp này, do dữ liệu cần truy xuất không nằm trong các byte chứa giá trị
thời gian thực được thường xuyên cập nhật nên có thể đọc ghi một cách tự do. Trong
trường hợp cần truy xuất các giá trị thời gian thực, ta phải kiểm tra bit UIP (bit 7 của thanh
ghi REGISTER A) trước khi tiến hành thao tác truy xuất.
KHOI TAO
DATA
DS12C887
READY??
HIEN THI
TIMESET CO
DUOC N
NHAN??
CHUYEN QUA
CHE DO CHINH
GIO
Chương trình hoàn chỉnh của ứng dụng RTC được viết như sau:
Chương trình 4:
;========================================================================
processor 16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON &
_XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
;========================================================================
;------------------------------
; Khai bao bien
;------------------------------
count1 EQU 0x20
counta EQU 0x21
countb EQU 0x22
hc EQU 0x23
hdv EQU 0x24
duphong EQU 0x25
DATA_W EQU 0x26
ADDRESS_W EQU 0x27
DATA_R EQU 0x28
ADDRESS_R EQU 0x29
gio EQU 0x2A
phut EQU 0x2B
giay EQU 0x2C
ngay EQU 0x2D
thang EQU 0x2E
nam EQU 0x2F
sendreg EQU 0X32
count EQU 0X33
hcgiay EQU 0x34
hdvgiay EQU 0x35
hcphut EQU 0x36
hdvphut EQU 0x37
hcgio EQU 0x38
hdvgio EQU 0x39
hcngay EQU 0x40
hdvngay EQU 0x41
hcthang EQU 0x42
hdvthang EQU 0x43
hcnam EQU 0x44
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 27/42
#define DS PORTE,2
#define RW PORTE,1
#define AS PORTE,0
#define DATAPORT PORTB
#define LEDPORT PORTD
RETLW 0x90
;---------------------------------------------------------------------------------------
start
;---------------------------------------------------
; Khoi tao cac PORT I/O
;---------------------------------------------------
BSF STATUS,RP0 ; select BANK1
MOVLW 0x06
MOVWF ADCON1
MOVLW b'00100000'
MOVWF TRISA
CLRF TRISD
CLRF TRISE
MOVLW b'00000111'
MOVWF TRISC
MOVLW b'01010110' ; dua gia tri vao thanh ghi "register B"
MOVWF DATA_W ; dang du lieu 24 gio
MOVLW d'11' ; dang du lieu Binary
MOVWF ADDRESS_W
CALL write_12C887
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 29/42
;--------------------------------------------------------
; can chu y doan chuong trinh duoi day
; do chua trang bi chua nang dieu chinh ngay thang nam
; nen tam them doan chuong trinh nay vao de dieu chinh
; khi cho dong ho hoat dong lau dai, can bo doan code nay di
; vi neu mach bi reset, doan chuong trinh nay duoc thuc thi
; khi do, thoi gian hien thi khong con dung nua
;----------------------------------------------------------
hello
MOVLW d'10' ; kiem tra dieu kien de thao tac len
; cac thanh ghi chua gia tri thoi gian thuc
MOVWF ADDRESS_R ; thuc chat la kiem tra trng thai bit UIP
CALL read_12C887 ; xem lai chuc nang cua bit UIP
BTFSC DATA_R,7
GOTO hello
MOVLW d'23' ; Khoi tao cac gia tri thoi gian cho DS12C887
MOVWF DATA_W ; ngay 23
MOVLW d'7'
MOVWF ADDRESS_W
CALL write_12C887
MOVLW d'3' ; thang 3
MOVWF DATA_W
MOVLW d'8'
MOVWF ADDRESS_W
CALL write_12C887
;--------------------------------------------------------------------------------
; VONG LAP CHINH CUA CHUONG TRINH
;--------------------------------------------------------------------------------
main
MOVLW d'10'
MOVWF ADDRESS_R
CALL read_12C887
BTFSC DATA_R,7 ; Du lieu da san sang de truy xuat??
GOTO quet ; neu chua, nhay den che do hien thi
CALL update ; neu roi, cap nhat gia tri moi
quet
CALL hienthigiay
BTFSS timeset
CALL time_set
CALL hienthiphut
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 30/42
BTFSS timeset
CALL time_set
CALL hienthigio
BTFSS timeset
CALL time_set
CALL hienthingay
BTFSS timeset
CALL time_set
CALL hienthithang
BTFSS timeset
CALL time_set
CALL hienthinam
BTFSS timeset
CALL time_set
GOTO main
;========================================================================
; CHUONG TRINH CON
;========================================================================
;--------------------------------------------------------------------------------------------------------
; Chuong trinh con "UPDATE"
; Dung de cap nhat cac gia tri thoi gian moi trong DS12C887
; Cac gia tri thoi gian duoc doc ra va duoc luu trong cac
; thanh ghi tuong ung
;--------------------------------------------------------------------------------------------------------
update
MOVLW d'0' ; doc gia tri giay
MOVWF ADDRESS_R
CALL read_12C887
MOVF DATA_R,0
MOVWF giay ; luu vao thanh ghi “giay”
MOVLW d'2'
MOVWF ADDRESS_R
CALL read_12C887 ; doc gia tri phut
MOVF DATA_R,0
MOVWF phut ; luu vao thanh ghi “phut”
MOVLW d'4'
MOVWF ADDRESS_R
CALL read_12C887 ; doc gia tri gio
MOVF DATA_R,0
MOVWF gio ; luu vao thanh ghi gio
MOVLW d'7'
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 31/42
MOVWF ADDRESS_R
CALL read_12C887 ; doc gia tri ngay
MOVF DATA_R,0
MOVWF ngay ; luu vao thanh ghi ngay
MOVLW d'8'
MOVWF ADDRESS_R
CALL read_12C887 ; doc gia tri thang
MOVF DATA_R,0
MOVWF thang ; luu vao thanh ghi “thang”
MOVLW d'9'
MOVWF ADDRESS_R
CALL read_12C887 ; doc gia tri nam
MOVF DATA_R,0
MOVWF nam ; luu vao thanh ghi “nam”
RETURN
;---------------------------------------------------------------------------------
; Chuong trinh con "hienthigiay"
; Dung de hien thi gia tri giay ra LED 7 doan
; Cac gia tri hang chuc va hang don vi giay duoc chua trong
; cac thanh ghi "hcgiay" va "hdvgiay "
;-----------------------------------------------------------------------------------
hienthigiay
MOVF giay,0
CALL tach
MOVF hc,0
CALL table
MOVWF LEDPORT
MOVLW b'11111101'
CALL serout
MOVLW b'11111111'
CALL serout
CALL out
CALL delay_150us
MOVF hdv,0
CALL table
MOVWF LEDPORT
MOVLW b'11111110'
CALL serout
MOVLW b'11111111'
CALL serout
CALL out
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 32/42
CALL delay_150us
RETURN
;------------------------------------------------------------------------------------------
; Chuong trinh con "hienthiphut"
; Dung de hien thi gia tri phut ra LED 7 doan
; Cac gia tri hang chuc va hang don vi phut duoc chua trong
; cac thanh ghi "hcphut" va "hdvphut"
;------------------------------------------------------------------------------------------
hienthiphut
MOVF phut,0
CALL tach
MOVF hc,0
CALL table
MOVWF LEDPORT
MOVLW b'11110111'
CALL serout
MOVLW b'11111111'
CALL serout
CALL out
CALL delay_150us
MOVF hdv,0
CALL table
MOVWF LEDPORT
MOVLW b'11111011'
CALL serout
MOVLW b'11111111'
CALL serout
CALL out
CALL delay_150us
RETURN
;-----------------------------------------------------------------------------------------------
; Chuong trinh con "hienthigio"
; Dung de hien thi gia tri gio ra LED 7 doan
; Cac gia tri hang chuc va hang don vi gio duoc chua trong
; cac thanh ghi "hcgio" va "hdvgio"
;-----------------------------------------------------------------------------------------------
hienthigio
MOVF gio,0
CALL tach
MOVF hc,0
CALL table
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 33/42
MOVWF LEDPORT
MOVLW b'11011111'
CALL serout
MOVLW b'11111111'
CALL serout
CALL out
CALL delay_150us
MOVF hdv,0
CALL table
MOVWF LEDPORT
MOVLW b'11101111'
CALL serout
MOVLW b'11111111'
CALL serout
CALL out
CALL delay_150us
RETURN
;---------------------------------------------------------------------------------------------
; Chuong trinh con "hienthingay"
; Dung de hien thi gia tri gio ra LED 7 doan
; Cac gia tri hang chuc va hang don vi ngay duoc chua trong
; cac thanh ghi "hcngay" va "hdvngay"
;----------------------------------------------------------------------------------------------
hienthingay
MOVF ngay,0
CALL tach
MOVF hc,0
CALL table
MOVWF LEDPORT
MOVLW b'11111111'
CALL serout
MOVLW b'11111110'
CALL serout
CALL out
CALL delay_150us
MOVF hdv,0
CALL table
MOVWF LEDPORT
MOVLW b'11111111'
CALL serout
MOVLW b'11111101'
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 34/42
CALL serout
CALL out
CALL delay_150us
RETURN
;-----------------------------------------------------------------
; Chuong trinh con "hienthithang"
; Dung de hien thi gia tri gio ra LED 7 doan
; Cac gia tri hang chuc va hang don vi thang duoc chua trong
; cac thanh ghi "hcthang" va "hdvthang"
;-----------------------------------------------------------------
hienthithang
MOVF thang,0
CALL tach
MOVF hc,0
CALL table
MOVWF LEDPORT
MOVLW b'11111111'
CALL serout
MOVLW b'11111011'
CALL serout
CALL out
CALL delay_150us
MOVF hdv,0
CALL table
MOVWF LEDPORT
MOVLW b'11111111'
CALL serout
MOVLW b'11110111'
CALL serout
CALL out
CALL delay_150us
RETURN
;------------------------------------------------------------------------------------------
; Chuong trinh con "hienthinam"
; Dung de hien thi gia tri nam ra LED 7 doan
; Cac gia tri hang chuc va hang don vi nam duoc chua trong
; Cac thanh ghi "hcnam" va "hdvnam"
; Gia tri "20" trong gia tri nam "20xx" duoc gui co dinh
;-------------------------------------------------------------------------------------------
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 35/42
hienthinam
MOVF nam,0
CALL tach
MOVLW d'2'
CALL table
MOVWF LEDPORT
MOVLW b'11111111'
CALL serout
MOVLW b'11101111'
CALL serout
CALL out
CALL delay_150us
MOVLW d'0'
CALL table
MOVWF LEDPORT
MOVLW b'11111111'
CALL serout
MOVLW b'11011111'
CALL serout
CALL out
CALL delay_150us
MOVF hc,0
CALL table
MOVWF LEDPORT
MOVLW b'11111111'
CALL serout
MOVLW b'10111111'
CALL serout
CALL out
CALL delay_150us
MOVF hdv,0
CALL table
MOVWF LEDPORT
MOVLW b'11111111'
CALL serout
MOVLW b'01111111'
CALL serout
CALL out
CALL delay_150us
RETURN
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 36/42
;------------------------------------------------------------------------------------------
; Chuong trinh con "write_12C887" dung de ghi du lieu len 12C887
; Du lieu can ghi chua trong thanh ghi DATA
; Dia chi can ghi du lieu vao chua trong thanh ghi ADDRESS
; Giao tiep theo chuan cua INTEL
;------------------------------------------------------------------------------------------
write_12C887
BSF STATUS,RP0
CLRF TRISB
BCF STATUS,RP0
MOVF ADDRESS_W,0
MOVWF DATAPORT
BSF DS
BSF RW
NOP
BSF AS
NOP
BCF AS
NOP
MOVF DATA_W,0
MOVWF DATAPORT
BCF RW
NOP
BSF AS
RETURN
;----------------------------------------------------------------------------------------------------
; Chuong trinh con "read_12C887" dung de doc du lieu tu 12C887
; Dia chi can doc du lieu vao chua trong thanh ghi ADDRESS_R
; Du lieu sau khi doc chua trong thanh ghi DATA_R
; Giao tiep theo chuan cua INTEL
;----------------------------------------------------------------------------------------------------
read_12C887
BSF STATUS,RP0
CLRF TRISB
BCF STATUS,RP0
MOVF ADDRESS_R,0
MOVWF DATAPORT
BSF DS
BSF RW
NOP
BSF AS
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 37/42
NOP
BCF AS
NOP
BCF DS
NOP
BSF STATUS,RP0
MOVLW 0xFF
MOVWF TRISB
BCF STATUS,RP0
MOVF DATAPORT,0
MOVWF DATA_R
BSF AS
RETURN
;-------------------------------------------------------------------------------------
; Chuong trinh con dua du lieu can xuat vao 74HC595
;-------------------------------------------------------------------------------------
serout
MOVWF sendreg
MOVLW 0x08
MOVWF count
testbit
BCF data ; default
BTFSC sendreg,7 ; sendreg,7 == 0 ??
BSF data ; if not, set dulieu from 0 -> 1
BSF clock
NOP ; generate 1 clock to shift 74HC595
BCF clock ; register content
RLF sendreg,0 ; rotate sendreg register to the left
MOVWF sendreg
DECFSZ count,1 ; decrement bit counter
GOTO testbit ; if count != 0, continue from "testbit" label
RETURN
;---------------------------------------------------------------------------------------------------
; Chuong trinh con tach chu so hang chuc va hang don vi cua thanh ghi
; Du lieu can tach duoc dua vao thanh ghi W
; Ket qua sau khi tach chua trong hai thanh ghi "hc" (chua hang chhuc)
; va "hdv" (chua hang don vi)
; Dang du lieu dua vao la dang HEX
;---------------------------------------------------------------------------------------------------
tach
MOVWF hdv
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 38/42
CLRF hc
next
MOVLW d'10'
SUBWF hdv,0
BTFSS STATUS,C
GOTO exit
MOVWF hdv
INCF hc,1
GOTO next
exit
RETURN
;------------------------------------------------------------------------------------
; Cac chuong trinh con delay
; Ho tro cho cac thao tac quet LED va chong doi phim nhan
; chu y thoi gian delay khong thuc su chinh xac
; do yeu cau quet LED, nen phai dieu chinh nhieu lan
; do do thi gian delay thuc te khac voi du kien khi viet chuong trinh
;------------------------------------------------------------------------------------
delay_25ms
MOVLW d'250'
GOTO delay
delay_150us
MOVLW d'5'
delay
MOVWF count1
d2
MOVLW 0xC7
MOVWF counta
MOVLW 0x01
MOVWF countb
delay_1
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay_1
DECFSZ count1,1
GOTO d2
RETURN
;------------------------------------------------------------------------------------------------
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 39/42
GOTO quet_gio
CALL wait
quet_phut
CALL hienthiphut
BTFSS timeset
GOTO exit_set_phut
BTFSS increase
GOTO set_phut1
GOTO quet_phut
set_phut1
CALL delay_25ms
CALL delay_25ms
BTFSC increase
GOTO quet_phut
INCF phut,1
MOVLW d'60'
XORWF phut,0
BTFSC STATUS,Z
CLRF phut
GOTO quet_phut
exit_set_phut
CALL delay_25ms
CALL delay_25ms
BTFSC timeset
GOTO quet_phut
CALL wait
quet_giay
CALL hienthigiay
BTFSS timeset
GOTO exit_set_giay
BTFSS increase
GOTO set_giay1
GOTO quet_giay
set_giay1
CALL delay_25ms
CALL delay_25ms
BTFSC increase
GOTO quet_giay
INCF giay,1
MOVLW d'60'
XORWF giay,0
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 41/42
BTFSC STATUS,Z
CLRF giay
GOTO quet_giay
exit_set_giay
CALL delay_25ms
CALL delay_25ms
BTFSC timeset
GOTO quet_giay
CALL wait
hey
MOVLW d'10' ; du lieu da san sang truy xuat??
MOVWF ADDRESS_R
CALL read_12C887
BTFSC DATA_R,7
GOTO hey ; neu chua, tiep tuc cho
MOVF giay,0 ; neu roi, ghi cac gia tri cua dieu chinh
MOVWF DATA_W ; vao trong cac thanh ghi thoi gian thuc
MOVLW d'0' ; cua DS12C887
MOVWF ADDRESS_W
CALL write_12C887
MOVF phut,0
MOVWF DATA_W
MOVLW d'2'
MOVWF ADDRESS_W
CALL write_12C887
MOVF gio,0
MOVWF DATA_W
MOVLW d'4'
MOVWF ADDRESS_W
CALL write_12C887
RETURN
;---------------------------------------------------------------------------------------------
; Chuong trinh con "wait" ho tro cho chuong trinh con "timeset"
; Dung de cho cho toi khi nut an duoc tha ra
;---------------------------------------------------------------------------------------------
wait
CALL delay_25ms
CALL delay_25ms
BTFSS timeset
GOTO wait
Người báo cáo: Nguyễn Trung Chính Tài liệu: REP03.01
Ngày: 9/5/2006 Trang: 42/42
RETURN
;========================================================================
END
5. Kết luận
RTC sử dụng IC chuyên dụng cho ta độ chính xác tuyệt đối về thời gian thực mà không
cần lo lắng đến việc có sai số như khi thực hiện RTC bằng Timer. Đây là ưu điểm vựợt trội của
RTC thời gian thực và dựa trên đó, ta có thể phát triển rộng rãi hơn các ứng dụng cho phép sử
dụng được trong thực tế.
Định hướng phát triển cho các phiên bản sau này:
- Thay đổi phương pháp hiển thị sao cho đẹp và có mỹ thuật hơn (sử dụng ma trận LED).
- Dựa vào ngày tháng năm dương lịch để tính toán ngày tháng năm âm lịch và hiển thị.
- Hoàn chỉnh chức năng chỉnh giờ và trang bị thêm chức năng hen giờ.
- Hạ giá thành sản phẩm (sử dụng vi điều khiển PIC rẻ hơn).
Tuy rằng LCD cho phép các chế độ hiển thị linh hoạt hơn nhưng không được lựa chọn là
giải pháp nâng cấp sản phẩm với các lí do:
- Giá thành cao.
- Tầm nhìn hạn chế, không phù hợp với định hướng sản phẩm là một đồng hồ điện tử
dùng để treo tường hoặc để bàn.
Nhược điểm:
- Giá thành cao.
- Khả năng hiển thị còn hạn chế.