Tải bản đầy đủ (.pdf) (43 trang)

Báo cáo quá trình thiết kế và thi công Đồng hồ thời gian thực RTC ppsx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (506.69 KB, 43 trang )



















Báo cáo quá trình thiết kế và thi
công Đồng hồ thời gian thực RTC
Người báo cáo:
Nguyễn Trung Chính
Tài liệu:
REP03.01
Ngày:
9/5/2006
Trang:
1/42

Report n
o


03.01

Gửi đến:

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

2. Sơ đồ nguyên lí mạch RTC
Để thuận tiện cho việc bố trí góc nhìn, thiết kế mẫu mã sản phẩm và mục đích sử dụng,
ứng dụng RTC sẽ bao gồm 3 mạch: mạch điều khiển, mạch hiển thị và mạch cho các nút bấm.

2.1. Sơ đồ nguyên lí mạch điều khiển
Mạch điều khiển bao gồm các thành phần điều khiển chính như:
- Vi điều khiển PIC16F877A và các bộ phận hỗ trợ (thạch anh, reset, nạp chương
trình dùng Tiny Bootloader, các Jumper cho các chân còn dư).
- IC thời gian thực DS12C887 và các thành phận hỗ trợ (điện trở kéo lên cho chân
IRQ, reset).
- IC ghi dịch 74HC595.
- Các khóa điện tử dùng Transistor A1015 phục vụ cho việc quét LED.
- Các Bus điều khiển và Bus dữ liệu nối sang các Board hiển thị và Board nút bấm.

- Nguồn cung cấp cho toàn bộ các Board. Điện áp đưa vào nguồn là điện áp 9V lấy từ
Adapter loại 9V/500mA.
Sau đây là sơ đồ nguyên lí cụ thể cho Board đ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:
3/42


Hình 1: Sơ đồ nguyên lí Board đ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:
4/42

2.2. Sơ đồ nguyên lí Board hiển thị
Board hiển thị bao gồm các LED 7 đoạn. Sơ đồ nguyên lí cụ thể như sau:

NTC5

1
2
3
4
56
7
8
9
1 0
G
F
V C C
A
BD P
C
V C C
D
E
NTC2
1
2
3
4
56
7
8
9
1 0
G
F

V C C
A
BD P
C
V C C
D
E
NTC12
1
2
3
4
56
7
8
9
1 0
G
F
V C C
A
BD P
C
V C C
D
E
NTC7
1
2
3

4
56
7
8
9
1 0
G
F
V C C
A
BD P
C
V C C
D
E
NTC4
1
2
3
4
56
7
8
9
1 0
G
F
V C C
A
BD P

C
V C C
D
E
NTC14
1
2
3
4
56
7
8
9
1 0
G
F
V C C
A
BD P
C
V C C
D
E
NTC1
1
2
3
4
56
7

8
9
1 0
G
F
V C C
A
BD P
C
V C C
D
E
NTC9
1
2
3
4
56
7
8
9
1 0
G
F
V C C
A
BD P
C
V C C
D

E
NTC6
1
2
3
4
56
7
8
9
1 0
G
F
V C C
A
BD P
C
V C C
D
E
NTC11
1
2
3
4
56
7
8
9
1 0

G
F
V C C
A
BD P
C
V C C
D
E
J2
CON8
1
2
3
4
5
6
7
8
NTC13
1
2
3
4
56
7
8
9
1 0
G

F
V C C
A
BD P
C
V C C
D
E
J7
1
2
3
4
5
6
NTC8
1
2
3
4
56
7
8
9
1 0
G
F
V C C
A
BD P

C
V C C
D
E
NTC3
1
2
3
4
56
7
8
9
1 0
G
F
V C C
A
BD P
C
V C C
D
E
J6
1
2
3
4
5
6

7
8
NTC10
1
2
3
4
56
7
8
9
1 0
G
F
V C C
A
BD P
C
V C C
D
E

Hình 2: Sơ đồ nguyên lí Board hiển thị.

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.

2.3. Sơ đồ nguyên lí Board nút bấm
Board nút bấm gồm 3 nút dùng để chỉnh giờ. Sơ đồ nguyên lí như sau:


0
HI
SW3
ALARMSET
HI
R27
R
R29
R
SW4
INC
HI
J2
CON6
1
2
3
4
5
6
0
HI
R28
R
0
SW2
TIMESET
0

Hình 3: Sơ đồ nguyên lí Board nút bấm.


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

3.1. LED 7 đoạn
3.1.1 Cấu tạo của LED 7 đoạn
LED 7 đoạn là một công cụ thông dụng được dùng để hiển thị các thông số dưới dạng
các số từ 0 đến 9. Mặc dù công cụ LCD giúp ta thể hiện các thông số một cách linh động
hơn nhưng LED 7 đoạn vẫn được sử dụng nhiều trong công nghiệp do các ưu thế của nó
như: ít chịu ảnh hưởng của nhiệt độ, dễ tạo sự chú ý và góc nhìn rộng.
LED 7 đoạn bao gồm 7 đoạn LED được đánh dấu là các kí tự a, b, c, d, e, f, g và một dấu
chấm thập phân kí hiệu là dp. Ta có thể xem LED 7 đoạn là một tổ hợp gồm 8 LED. 8 LED
này có một đầu (Anode hoặc Cathode) được nối chung và được bố trí theo một qui tắc nhất
định dùng để hiển thị các chữ số thập phân.
Có hai loại LED 7 đoạn, đó là loại Anode chung (cực Anode của các LED được nối
chung với nhau) và loại Cathode chung (cực Cathode của các LED được nối chung với
nhau). Tùy theo từng loại LED mà ta có các phương pháp điều khiển các LED trong tổ hợp
đó sáng tắt một cách thích hợp. Đối với loại Anode chung, một LED sẽ được bật sáng nếu

mức logic đưa vào chân điều khiển đoạn LED đó là mức logic 0. Đối với loại Cathode
chung, một LED sẽ được bật sáng nếu mức logic đưa vào chân điều khiển đoạn LED đó là
mức logic 1.

Hình 4: LED 7 đoạn

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.

3.1.2 Xây dựng module hiển thị trên LED 7 đoạn
Module ứng dụng sau đây được xây dựng dùng để hiển thị 2 chữ số thập phân trên 2
LED 7 đoạn sử dụng loại LED 7 đoạn Anode chung.

Trước hết ta sẽ tiến hành kết nối phần cứng giữa vi điều khiển và LED 7 đoạn để từ đó
xác định được dữ liệu cần đưa vào LED 7 đoạn để hiển thị một chữ số thập phân nào đó.
Thứ tự kết nối các chân như sau:
- Chân dp nối vào chân RD7.
- Chân g nối vào chân RD6.
- Chân f nối vào chân RD5.
- Chân e nối vào chân RD4.
- Chân d nối vào chân RD3.
- Chân c nối vào chân RD2.
- Chân b nối vào chân RD1.
- Chân a nối vào chân RD0.
Muốn điều khiển một đoạn LED nào đó sáng lên, ta đưa vào chân điều khiển LED đó
về mức logic 0. Với cách nối chân như vậy, ta có bảng dữ liệu tương ứng với các chữ số cần
hiển thị trên LED 7 đoạn như sau:

Chữ
số
RB7
(dp)
RB6
(g)
RB5
(f)
RB4
(e)
RB3
(d)
RB2
(c)
RB1

(b)
RB0
(a)

HEX
0
1 1 0 0 0 0 0 0
C0h
1
1 1 1 1 1 0 0 1
F9h
2
1 0 1 0 0 1 0 0
A4h
3
1 0 1 1 0 0 0 0
B0h
4
1 0 0 1 1 0 0 1
99h
5
1 0 0 1 0 0 1 0
92h
6
1 0 0 0 0 0 1 0
82h
7
1 1 1 1 1 0 0 0
F8h
8

1 0 0 0 0 0 0 0
80h
9
1 0 0 1 0 0 0 0
90h

Người báo cáo:
Nguyễn Trung Chính
Tài liệu:
REP03.01
Ngày:
9/5/2006
Trang:
7/42

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
10 K
HI
A

LO
RBx

Hình 5: Sơ đồ nguyên lí công tắc điều khiển

Sau đây là sơ đồ mạch 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:
8/42

B
0
H I
DP
A1015
D
NTC1
1
2
3
4
56
7
8
9

10
G
F
VC C
A
BD P
C
VC C
D
E
330
30 pF
R2
10K
C
4 MHz
H I
330
E
330
HI
G
E
A1015
SW1
A
330
330
330
G

D
330
NTC2
1
2
3
4
56
7
8
9
10
G
F
VC C
A
BD P
C
VC C
D
E
30 pF
F
R1
10 K
C
H I
B
A
C

330
NTC3
PIC16F877A
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

28
29
30
31
32
33
34
35
36
37
38
39
40
MCLR/VPP
RA0/AN0
RA1/AN1
RA2/AN2/VREF-/CVREF
RA3/AN3/VREF+
RA4/TOCKI/C1OUT
RA5/AN4/SS/C2OUT
RE0/RD/AN5
RE1/WR/AN6
RE2/CS/AN7
VDD
VSS
OSC1/CLKI
OSC2/CLKO
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
RC2/CCP1

RC3/SCK/SCL
RD0/PSP0
RD1/PSP1
RD2/PSP2
RD3/PSP3
RC4/SDI/SDA
RC5/SD0
RC6/TX/CK
RC7/RX/DT
RD4/PSP4
RD5/PSP5
RD6/PSP6
RD7/PSP7
VSS
VDD
RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
0
DP
0
F
R13
R


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

MOVLW 0x92 ; hiển thị số 5
MOVWF PORTD
MOVLW b'11111110' ; bật LED hàng đơn vị
MOVWF PORTB
CALL delay_1ms ; delay_1ms
GOTO loop
;=========================================================================

; Chương trình con
;===================================================================
======
;
; Chương trình con tạo thời gian delay 1 ms
;
delay_1ms
MOVLW d'1'
MOVWF count1
d1
MOVLW 0xC7

MOVWF counta
MOVLW 0x01
MOVWF countb
delay_0
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay_0
DECFSZ count1,1
GOTO d1
RETURN
END
;========================================================================

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


3.2. IC ghi dịch 74HC595
Đây là IC ghi dịch nối tiếp sang song song. IC được ứng dụng để tăng số lượng chân
output cho vi điều khiển. Có nhiều phương pháp để tăng số lượng chân , ví dụ như dùng
IC giải mã, tuy nhiên IC ghi dịch 74HC595 được lựa chọn như là một giải pháp vì các
nguyên nhân sau:
- Số lượng chân điều khiển luôn cố định là 4 chân: nếu dùng giải mã thì số lựong
chân điều khiển sẽ tăng theo số lượng chân ngõ ra (khi phải ghép nhiều IC lại với
nhau). Trong khi dùng ghi dịch thì số lượng chân điều khiển luôn là cố định ngay cả
khi cần ghép nhiều IC lại với nhau.
- Cho phép điều khiển linh họat và ổn định hơn: giữa các thanh ghi dịch và ngõ ra
có một “chốt”. Điều này cho phép thay đổi linh hoạt dữ liệu trong các thanh ghi
dịch và ổn định trạng thái logic ngõ ra.
3.2.1 Cấu tạo của 74HC595
74HC595 là IC ghi dịch nối tiếp sang song với 8 ngõ ra QH:QA và bộ chốt dữ liệu 8 bit.
Dữ liệu được đưa vào các thanh ghi dịch bên trong IC thông qua 1 chân SER (chân 14) và
các chân điều khiển RCK (chân 12, điều khiển chốt dữ liệu), chân SCK (chân 11, điều khiển
quá trình dịch dữ liệu), chân (chân 10, dùng để tác động lên quá trình xóa dữ liệu)
chân Q’H (chân 9, chân đưa dữ liệu nối tiếp ra ngoài dùng để ghép nhiều IC lại với nhau)
và chân dùng để cho phép các ngõ ra.


Hình 7: Sơ đồ chân là bảng sự thật của 74HC595.
Người báo cáo:
Nguyễn Trung Chính
Tài liệu:
REP03.01
Ngày:
9/5/2006
Trang:

12/42


Hình 8: Sơ đồ khối 74HC595.

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.
0
74HC5958
9
10
13
14
16

11
1215
1
2
3
4
5
6
7
GND
SDO
CLR
G
SDI
VCC
SRCLK
RCLKQA
QB
QC
QD
QE
QF
QG
QH
0
DATA OUT
74HC5958
9
10
13

14
16
11
1215
1
2
3
4
5
6
7
GND
SDO
CLR
G
SDI
VCC
SRCLK
RCLKQA
QB
QC
QD
QE
QF
QG
QH
HI
CLR
0
HI

RCK
DATA IN
SCK

Hình 9: Nối nhiều IC 74HC595 với nhau.

3.2.2 Xây dựng module điều khiển IC 74HC595
Cách điều khiển IC được thể hiện thông qua bảng sự thật ở hình 7. Trước tiên đưa 1 bit
dữ liệu vào chân SDI, sau đó tạo ra một xung dương ở chân SCK để dịch bit dữ liệu đó
vào. Trạng thái logic của chân SDI khi kích xung dương quyết định mức logic của bit được
dịch vào. Quá trình này được lặp đi lặp lại liên tục cho đến khi toàn bộ dữ liệu được dịch
vào trong IC. IC tiếp theo sẽ tiếp tục dịch dữ liệu vào từ chân SDO của của IC trước đó.
Khi quá trình dịch dữ liệu hoàn tất, ta tạo một xung dương ở chân RCK để đưa dữ liệu ra
ngoài các chân ngõ ra QH:QA.
Ứng dụng sau được dùng để đưa một byte dữ liệu ra IC ghi dịch 74HC595. Kết quả
được kiểm định thông qua các LED được nối vào các chân QH:QA của IC.
Các chân điều khiển sẽ được nối vào các chân RB3:RB0 của PORT B. Cụ thể như sau:
- Chân RB0 nối với chân SDI.
- Chân RB1 nối với chân SCK.
- Chân RB2 nối với chân .
Người báo cáo:
Nguyễn Trung Chính
Tài liệu:
REP03.01
Ngày:
9/5/2006
Trang:
14/42

- Chân RB3 nối với chân RCK.

Các thứ tự này không bắt buộc phải tuân thủ một cách tuyệt đối.
Sau đây là sơ đồ nguyên lí mạch ứng dụng:

0
D3
330
CLR
D2
30 pF
330
0
D8
330
D6
30 pF
HI
U2
74HC595
8
16
12
10
11
14
15
1
2
3
4
5

6
7
9
13
GND
VCC
RCK
SRCLR
SRCK
SER
QA
QB
QC
QD
QE
QF
QG
QH
QHP
G
330
SDI
330
HI
330
330 D7
NTC1
PIC16F877A
1
2

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

33
34
35
36
37
38
39
40
MCLR/VPP
RA0/AN0
RA1/AN1
RA2/AN2/VREF-/CVREF
RA3/AN3/VREF+
RA4/TOCKI/C1OUT
RA5/AN4/SS/C2OUT
RE0/RD/AN5
RE1/WR/AN6
RE2/CS/AN7
VDD
VSS
OSC1/CLKI
OSC2/CLKO
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
RC2/CCP1
RC3/SCK/SCL
RD0/PSP0
RD1/PSP1
RD2/PSP2
RD3/PSP3

RC4/SDI/SDA
RC5/SD0
RC6/TX/CK
RC7/RX/DT
RD4/PSP4
RD5/PSP5
RD6/PSP6
RD7/PSP7
VSS
VDD
RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
SCK
RCK
330
SDI
CLR
D1
4 MHz
HI
D5
SW1
D4
0

10 K
0
RCK
0
SCK

Hình 10: Sơ đồ nguyên lí mạch ứng dụng điều khiển IC 74HC595.

Sau đây là chương trình viết cho ứng dụng:
Chương trình 2:
;========================================================================
title “chuongtrinh2.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
;
sendreg EQU 0X20 ; chứa dữ liệu cần xuất ra
count EQU 0X21 ; dùng để kiểm soát số lượng bit
; đã gửi ra
;
;Khai báo phần cứng
Người báo cáo:
Nguyễn Trung Chính
Tài liệu:
REP03.01
Ngày:

9/5/2006
Trang:
15/42

;
#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


3.3. IC thời gian thực DS12C887
Đây là IC thời gian thực được sản xuất bởi hãng Dallas với một vài đặc tính sơ lược sau:
- Chứa các giá trị thời gian giây, phút, giờ, thứ, ngày, tháng, năm với thời gian hoạt
động đúng đến năm 2100.
- Bộ đếm hoạt động với thời gian 10 năm nếu không có nguồn điện ngoài cung cấp.
- Các hệ thống bên trong bao gồm hệ thống thời gian thực, nguồn nội bằng Lithium
và bộ tạo dao động với bộ chia tần số đính kèm cho phép lập trình được. Ngoài ra
còn hỗ trợ các ngắt phục vụ cho quá trình xử lí thông tin của hệ thống bên ngoài.
- Cho phép hai dạng dữ liệu BCD và Binary.
- Cho phép chế độ hiển thị giờ 24 giờ hoặc 12 giờ (với AM và PM).
- Cho phép lựa chọn các chế độ giao tiếp BUS của Intel hoặc Motorola.
- Bộ nhớ RAM 128 byte. Trong đó gồm 15 byte chứa các giá trị thời gian và điều
khiển, 113 byte còn lại được phép tùy ý sử dụng.
- Các cờ ngắt hỗ trợ bao gồm: ngắt toàn cục, ngẳt báo giờ, ngắt báo hiệu cho phép/
không cho phép truy xuất giá trị thời gian thực.
Sau đây là phần cấu tạo và xây dựng module điều khiển IC DS12C887.

3.3.1 Cấu tạo DS12C887
Sơ đồ chân:

NTC1
DS12C887
1
2
3
4
5
6
7
8
9
10
11
13
14
15
16
17
18
19
20
21
22
23
12
24
MOT
NC
NC
AD0

AD1
AD2
AD3
AD4
AD5
AD6
AD7
CS
AS
R/W
NC
DS
RESET
IRQ
NC
NC
NC
SQW
GND
VCC

Hình 11: Sơ đồ chân DS12C887
DS12C887 gồm 24 chân và có thể được chia làm 3 nhóm 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:

18/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:

Thanh ghi Địa chỉ Chức năng
SECONDS
00h Chứa giá trị giây của thời gian thực
SECOND
ALARM
01h Chứa giá trị giây của thời gian hẹn giờ

MINUTES
02h Chứa giá trị phút của thời gian thực
MINUTES
ALARM
03h Chứa giá trị phút của thời gian hẹn giờ
HOUR
04h Chứa giá trị giờ của thời gian thực
HOUR ALARM

05h Chứa giá trị giờ của thời gian hẹn giờ

DAY OF THE
WEEK
06h Chứa giá trị thứ của thời gian thực

DAY OF THE
MONTH
07h

Chứa giá trị ngày thong tháng

MONTH
08h Chứa giá trị tháng
YEAR
09h Chứa giá trị năm
REGISTER A
10h Thanh ghi điều khiển
REGISTER B
11h Thanh ghi điều khiển
REGISTER C
12h Thanh ghi điều khiển
REGISTER D
13h Thanh ghi điều khiển
CENTURY
50h Thanh ghi chứa giá trị thế kỉ của thời gian thực
Còn lại 14h->4Dh Thanh ghi mục đích chung

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


THANH GHI REGISTER A
Bit 7
UIP
Chỉ thị trạng thái dữ liệu của các thanh ghi chứa giá trị thời
gian thực. Bit này chỉ đọc
UIP = 1: dữ liệu chưa sẵn sàng để truy xuất.
UIP = 0: dữ liệu đã sẵn sàng cho quá trình truy xuất
Bit 6-4
DV2-
DV0
Lựa chọn trạng thái hoạt động của IC. Chỉ có giá trị 010 là
cho phép IC hoạt động theo chế độ thời gian thực.
Bit 3-0
RS3-RS0
Xác định tỉ số chia tần số của bộ tạo dao động
THANH GHI REGISTER B
Bit 7
SET SET = 0: cho phép cập nhật thời gian vào các thanh ghi
SET = 1: không cập nhật thời gian vào các thanh ghi
Bit 6
PIE

Cho phép tạo ngắt định kì tại chân IRQ và cho phép cờ ngắt
PF. Thời gian định kì được quyết định bởi các bit RS3-RS0.
PIE =1: cho phép
PIE = 0: không cho phép
Bit 5
AIE
Cho phép ngắt báo giờ tại chân IRQ và cho phép cờ ngắt AF
AIE = 1 : cho phép
AIE = 0 : không cho phép
Bit 4
UIE
Cho phép tạo ngắt khi quá trình cập nhật thời gian hoàn tẩt
và cho phép cờ ngắt UF.
UIE = 1 : cho phép
UIE = 0 : không cho phép
Bit 3
SQWE SQWE = 1 : cho phép tạo sóng vuông tại chân SQW (tần số
được quyết định bởi các bit RS3:RS0.
SQWE = 0 : không cho phép, chân SQW luôn ở mức 0.
Bit 2
DM
Chọn dạng dữ liệu ở các thanh ghi chứa thời gina thực
DM = 1 : dang dữ liệu là Binary
DM = 0 : dạng dữ liệu là BCD
Bit 1
24/12
Định dạng dữ liệu giờ
24/12 = 1 : dạng 24 giờ
24/12 = 0 : dạng 12 giờ
Bit 0

DSE
Daylight Saving Enable.
THANH GHI REGISTER C
Bit 7
IRQF
Interrupt Request Flag: cờ chỉ thị trạng thái ngắt
IRQF = 1 : có ngắt xảy ra
IRQF = 0 : không có ngắt xảy ra
Bit 6
PF
Periodic Interrupt Flag bit: cờ chỉ thị trạng thái của ngắt
định kì.
Người báo cáo:
Nguyễn Trung Chính
Tài liệu:
REP03.01
Ngày:
9/5/2006
Trang:
20/42

PF = 1 : ngắt định kì xảy ra
PF = 0 : ngắt định kì không xảy ra
Bit 5
AF
Alarm Interrupt Flag bit: cờ chỉ thị trạng thái của ngắt hẹn
giờ.
AF = 1 : ngắt hẹn giờ xảy ra
AF = 0 : ngắt hẹn giờ chưa xảy ra
Bit 4

UF
Update Ended Interrupt Flag bit: cờ chỉ thị trạng thái dữ liệu

UF = 1 : quá trình cập nhật hoàn tẩt
UF = 0 : quá trình cập nhật chưa hoàn tất
Bit 3-0

Không quan tâm
THANH GHI REGISTER D
Bit 7
VRT Bit chỉ thị trạng thái của nguồn nội. VRT luôn băng 1. Nếu
VRT = 0, nguồn nội bằng Lithium đã bị cạn và dữ liệu trong
RAM là không xác định.
Bit 6-0

Không quan tâm

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.

3.3.2 Xây dựng module điều khiển IC DS12C887.
Các thao tác cần thiết để làm việc với DS12C887 sẽ là thao tác đọc và ghi các giá trị trên
bộ nhớ của IC thông qua quá trình giao tiếp BUS.
DS12C887 hỗ trợ hai chuẩn giao tiếp của Intel và Motorola. Chuẩn giao tiếp được lựa
chọn bằng chân MOT. MOT = 1 sẽ cho phép chế độ giao tiếp thep chuẩn của Motorola.
MOT = 0 cho phép chế độ giao tiếp theo chuẩn của Intel.
Ta chọn chuẩn của Intel (nối chân MOT xuống mass).
Ứng dụng sau dùng để kiểm tra các thao tác đọc ghi lên RAM của DS12C887. Sơ đồ
nguyên lí của mạch ứng dụng 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:
21/42

0
NTC1
PIC16F877A
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
MCLR/VPP
RA0/AN0
RA1/AN1
RA2/AN2/VREF-/CVREF
RA3/AN3/VREF+
RA4/TOCKI/C1OUT
RA5/AN4/SS/C2OUT
RE0/RD/AN5
RE1/WR/AN6
RE2/CS/AN7

VDD
VSS
OSC1/CLKI
OSC2/CLKO
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
RC2/CCP1
RC3/SCK/SCL
RD0/PSP0
RD1/PSP1
RD2/PSP2
RD3/PSP3
RC4/SDI/SDA
RC5/SD0
RC6/TX/CK
RC7/RX/DT
RD4/PSP4
RD5/PSP5
RD6/PSP6
RD7/PSP7
VSS
VDD
RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD

AD2 DS
330
AD0
0
HI
330
DS
4 MHz
AD1
330
NTC1
DS12C887
1
2
3
4
5
6
7
8
9
10
11
13
14
15
16
17
18
19

20
21
22
23
12
24
MOT
NC
NC
AD0
AD1
AD2
AD3
AD4
AD5
AD6
AD7
CS
AS
R/W
NC
DS
RESET
IRQ
NC
NC
NC
SQW
GND
VCC

AS
D5
D2
30 pF
AS
D4
10 K
AD4
SW1
330
HI
30 pF
D7
0
10 K
HI
330
D6
0
AD0
AD3
330
0
AD7
AD1
D8
AD5
D3
AD6
AD7

RW
0
D1
AD5
HI
330
AD2
AD4
SW2
RW
330
AD3
AD6

Hình 12: Sơ đồ nguyên lí mạch ứng dụng điều khiển DS12C887.

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

- Bước 1: Đưa các chân DS, RW và AS lên mức logic 1.
- Bước 2: Đưa địa chỉ thanh ghi cần đọc vào các chân dữ liệu của DS12C887.
- Bước 3: Tạo cạnh xuống tại chân AS
- Bước 4: Tạo cạnh xuống tại chân DS.
- Bước 5: Lúc này dữ liệu cần đọc đã xuất hiện tại các chân data của DS12C887. Ta chỉ
việc khởi tạo lại port thành input và đọc dữ liệu đó vào.
- Bước 6: Đưa chân AS về mức logic cao.
Chương trình ứng dụng được viết như sau:
Chương trình 3:

;========================================================================
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

×