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:
[email protected]
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
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
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
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
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
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
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
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ó
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)
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
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
HI
330
E
330
HI
30 pF
F
R1
10 K
C
HI
B
A
C
330
NTC3
PIC16F877A
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
;========================================================================
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
;-----------------------------------------------------------------------------------
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
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
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
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
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
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
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
;---------------------------------------------------------------------
; 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