Sử dụng vi điều khiển PIC 16f877a thực hiện lịch vạn niên bao gồm hiện thị giờ; phút; giây; ngày; tháng; năm hiệu chỉnh thời gian thông qua nút bấm bên ngoài
Trang 1Lời mở đầu
Hầu hết các ứng dụng của vi xử lý có mặt ở tất cả các ngành nghề Ờ các nước phát triển
công nghệ xử lý bằng máy tính đã rất thông dụng Việc xuất hiện phát triển của các bộ vi xử lý
giúp con nguòi đạt được những thành tựu vượt bậc trong thời gian ngắn Tuy ảnh hưởng của các
chip vi xử lý là vô cùng to lớn đối với cuộc sống con người và không có người nào có thể tính
toán vượt qua chip vi xử lý, nhưng các chip vi xử lý này vẫn phải chịu sự điểu khiển của con
người Với đề tài: ứng dụng vi điều khiển pic 16F877A làm lịch vạn niên cho thấy các vi điều
khiển đã được sử dụng rộng rãi, gẫn gũi với cuộc sống hằng ngày Việc thực hiện đề tài đã mang
lại nhiều kinh nghiệm trong việc tiếp cận với một vi điểu khiển mới, qua đó mở ra nhiều thuận
lợi cho việc phát triển đề tài cũng như làm quen các vi điều khiển hiện đại hơn
ĐỂ TÀI:
Sử dụng vi điều khiển PIC 16F877A thực hiện lịch vạn niên bao
gồm hiện thị giờ; phút; giây; ngày; tháng; năm Hiệu chỉnh thời gian
thông qua nút bấm bên ngoài
Ý tưởng thực hiện:
Khối thời gian: Sử dụng IC đếm thời gian thực DS12C887+ để thực hiện việc đếm
thời gian Vì con RTC (real time counter) chuyên dùng để đếm thời gian thực với sai số thấp
(điều kiện lý tưởng sai số 1 tháng là 1 giây) Ngoài ra, RTC còn hỗ trợ việc định thời mở rộng
các ứng dụng về sau Đặc biệt DS12C887+ sử dụng thạch anh nội tự dao động thông qua nguồn
pin được tích hợp sẵn bên trong Điều này giúp giảm sai sót trong việc thiết kế mạch thach anh
Trang 2http://www.ebook.edu.vn 2
và pin bên ngoài Bên cạnh đó việc giao tiếp song song với VĐK tạo điều kiện thuận lợi hơn với
giao tiếp nối tiếp
Khối nút bấm điều khiển : bao gồm 3 nút Nút 1 (SET_TIME) cho phép truy cập
vào phần hiệu chỉnh thời gian Nút 2 (INC): tăng giá trị Nút 3(DEC): giảm giá trị Thiết kế bộ
nút bấm là đơn giản và dễ sử dụng nhất Khi nút 1 bấm, đồng hồ ngừng và truy cập vào phần
hiệu chỉnh và đợi lệnh tiếp theo Sau đó sẽ dựa vào nút tăng và giảm để xử lý Bấm bút 1 để
chuyển qua mục tiếp theo Sau khi đã hết các 6 mục, việc bấm nút 1 sẽ quay lại việc chạy đồng
hồ
Khối hiển thị: sử dụng LCD 16x2 Bộ LCD 16x2 là một trong những cách hiển thị
thông dụng bên cạnh dùng LED Ưu điểm việc dùng LCD là rất dễ hiện thị và điều khiển, bên
cạnh đó việc mở rộng đề tài cũng đơn giản hơn Với 2 dòng chữ, mỗi dòng gồm 16 ký tự là đủ để
hiển thị
Bộ điểu khiển: vi điểu khiển PIC 16F877A Công việc chủ yếu của PIC là điều khiển
giao tiếp với các phần khác trong mạch, cho nên việc sử dụng PIC 16F877A là hơi phí phạm vì
PIC có nhiều công dụng tốt hơn Các công dụng này có thể dùng trong phần mở rộng đề lài
B TÍNH TOÁN THI CÔNG VÀ THIẾT KẾ
B.1) KẾT NỐI và THIẾT KẾ
B.1.1) PIC và LCD
Giao tiếp giữa PIC và LCD theo sơ đồ tổng quát là đơn công Tức dữ liệu được truyền từ
PIC ra LCD Chế độ của LCD là chế độ truyền nhận 4 bit Cổng giao tiếp với LCD là port C, với
KHỐI ĐIỀU KHIỂN PIC 16F877A
KHỐI HIỂN THỊ LCD 16x2
KHỐI THỜI GIAN THỰC
IC DS12C887
KHỐI HIỆU CHỈNH NÚT BẤM
Trang 3bit 0-3 của port C nối với bit D4-D7 của LCD (D0-D3 không sử dụng nối đất) Bit 6 của port C
nối chân EN; bit 7 nối RS Do ta không có nhu cầu lấy dữ liệu từ LCD nên chân W/R của LCD
coi như nối đất, xác định chỉ ghi Thiết kế này là tiết kiệm nhất với số lượng bit dùng chỉ là 6 bit
để giao tiếp
Mạch hiển thị (LCD): Thiết kế mạch hiển thị LCD bao gồm 1 bộ LCD 16x2 dùng hiển thị
Một biến trở để điều chỉnh độ tương phản cho LCD Và một điện trở để hạ áp cho LED đèn nền
của LCD
B.1.2) PIC và DS12C887
Giao tiếp giữa PIC và DS12C887 là giao tiếp song song theo kiểu bán song công Tức là tại
một thời điểm chỉ truyền theo một chiều duy nhất Ta kết nối như sau: portD của PIC là port
truyền dữ liệu nối với AD0-AD7 của RTC Port E của PIC là port điều
khiển nối với các chân DS,RW,AS của RTC
Mạch thời gian thực (DS12C887): do tính ưu việt hơn các IC thời
gian thực khác là đã tích hợp thạch anh và nguồn pin dữ trự sẵn trong IC
nên mạch thời gian thực rất đơn giản chỉ gồm 1 IC và tụ 104 để nối chân
dương và âm của IC
B.1.3) PIC và nút nhấn
Giao tiếp này thực hiện qua port B của pic với nút TIME_SET là bit2;
INC la bit 5; DEC là bit 4 Lý do cho việc sắp xếp này là đáp ứng việc
chạy dây trên mạch thực tế đơn giản trên một lớp mạch
Mạch hiệu chỉnh (nút bấm): Do PIC hoạt động ở 20mAvà 5V trên các
chân Khi chưa bấm nút thì nguồn 5V được nối với chân của PIC Nếu
trong trường hợp nào đó chân input của PIC chuyển thành output thì yêu
cầu là dòng vào phải nhỏ hơn hoặc bằng 20mA Như vậy trong thiết kế ta
dùng R có giá trị 4.7K Khi đó I=5/4.7K < 20mA là đạt ưu cầu thiết kế
B.1.4) Mạch điều khiển (PIC):
Sử dụng thạch anh 4Mhz, chế độ XT Theo datasheet của vi điều khiển PIC (trang 2-7)
thì giá trị tụ được chọn là từ 15-30pF Trong mạch này ta chọn giá trị của tụ bằng 22pF Bên
cạnh đó ta có tụ 104 nối giữa Vss và Vdd của PIC để giảm tình trạng sốc điện
Trang 4http://www.ebook.edu.vn 4
Trang 5B.2) CHƯƠNG TRÌNH ĐIỀU KHIỂN
B.2.1) Thuật tốn
B.2.1.1) CHUONG TRINH CHINH
Giải thích: Ta bắt đầu khởi tạo các port sau khi ra tắt bộ ngắt, nhằm tránh tình trạng chưa thiết lập
xong đã ngắt dẫ đến sự mất điều khiển hệ thống Sau đó gọi các trình con khởi động cho LCD; RTC
Ta phải con chương trình con UPDATE (Nvụ: cập nhật dữ liệu từ RTC vào ô nhớ trong PIC); với mục
đích là thiết lập giá trị ban đầu cho PIC Sau đó ta gọi INIT_TRANSFER (Nvụ: xuất toàn bộ hiển thị
các gia trị ra LCD); với mục đích là thiết lập hiển thị ban đâu cho LCD vì lần sau khi hiển thị ra LCD,
ta chỉ cập nhật các thông số bị thay đổi Sau khi đã thiết lập, ta bật bộ ngắt để nhận xung clk để cập
Tắt ngắt ngoài RB0/INT
Khởi động các port:
S
Đ
Trang 6http://www.ebook.edu.vn 6
nhật thời gian từ RTC Sau đó KT coi nut SET_TIME được nhấn, nếu có gọi chương trình SET_GIO;
nếu không; quay về và KT tiếp
B.2.1.2) CHUONG TRINH CON INIT_LCD
Giải thích: Port C là port giao tiếp ra LCD (với bit 3-0:truyền dữ liệu; bit 7: EN; bit 6: RS) Mỗi lần
khởi động cho LCD cần 15ms Sau đó ta phải RESET 3 lần đảm bảo không còn dũ liệu trong RAM
của LCD (lần 1 delay 5ms; 2 lần sau delay 160ms) Các giá trị delay tính theo datasheet của LCD
Rồi các lệnh phát về sau chỉ delay 160ms Các lệnh khởi động được đề cập trong bảng tập lệnh điều
hiển LCD trang xx
B.2.1.3) CHUONG TRINH CON INIT_DS12C887
Giải thích
Truyền giá trị 00101111 vào thanh ghi A của RTC; mục đích: x010xxxx : cho phép RTC hoạt
động đếm theo TA nội, và xxxx1111: thiết lập chế độ tạo xung CLK 2Hz ở chân SWQ với mục đích
xác định thời điểm cập nhật dữ liệu vào VĐK
Tuyền giá trị 01011010 vào thanh ghi B của RTC; much đích: cho phép ngắt định thời; cho phép
bật cờ ngắt định thời; bâth chế độ phát xung SWQ; chế đọ lưu là BCD; đếm 24h/ngày
Port C: output
Phát lệnh RESET 3
lần.( Mỗi lần Delay
160US để chắc chắn
LCD nhận được lệnh)
Phát lệnh 0x02: thiết
lập chế độ truyền
4bits
Phát lệnh 0x28: thiết lập chế độ 2 dòng 5x7
Phát lệnh 0x0C: bật hiển thị tắt con trỏ
Phát lệnh 0x01:
CLR màn hình Kết thúc Phát lệnh 0x01:
CLR màn hình
Trang 7B.2.1.4) CHUONG TRINH CON UPDATE(IN:RTC; OUT:RAM)
Giaỉ thích:
Nguyên tăc update đơn giản chỉ là truy cập vào các địa chỉ các ơ nhớ thời gian trong RTC
và lấy dữ liệu ra (thong qua trình con: READ_12C887), lưu vào RAM VĐK
Các giá trị lấy ra gồm: giây(0x00); phút(0x02); giờ(0x04); ngày(0x07); tháng(0x08);
năm(0x09)
Lưu vào ADD_W địa chỉ thanh ghi A
Lưu vào giá trị 28H vào thanh ghi A
Lưu vào ADD_W địa chỉ thanh ghi B
Lưu vào giá trị 5AH vào thanh ghi B
Gọi: CT WRITE_12C887
Gọi: CT WRITE_12C887
Kết thúc
Trang 8http://www.ebook.edu.vn 8
B.2.1.5) CHUONG TRINH CON INIT_TRANSFER (IN: RAM;OUT:LCD)
Mục đích của CT con này là chuyển 1 lần đầu tất cả các giá trị lên LCD để tránh tinh trạng mỗi
lần cập nhật là phải chuyển hết lại, điều này sẽ làm LCD nhấp nháy khi cập nhật
Do chỉ là thiết lập ban đầu nên chỉ để quy địnnh vị trí từng biến thời gian
Trình con này không vẽ sơ đồ do thuật toán đơn giản, có thể hiểu trực tiếp được
B.2.1.6) CHUONG TRINH CON WRITE_12C887 (IN:ADD_W , DATA_W; OUT:RTC)
Mục đích của trình con này là đi dữ liệu từ RAM nội VĐK qua RAM nội của RTC Theo nghiên
cứu qua datasheet của RTC (theo tiêu chuẩn Intel, MOT=0) thì có thể tóm tắt các bước như sau:
B1: Đưa chân DS và RW lên mức cao
B2: Xuất giá trị cần ghi lên RAM của RTC ra các chân của DATAPORT (portD)
B3: Tạo cạnh xuống tại chân AS
B4: Đưa dữ liệu cần ghi vào đia chỉ ô nhớ vừa định của RTC
B5: Đưa chân RW về mức thấp
B6: Tạo cạnh lên tại chân AS
Chuyển địa chỉ chứa biến giây vào ADD_R
Gọi trình con: READ_12C887 Lưu giá tri DATA_R vào RAM_SEC
Chuyển địa chỉ chứa biến năm vào ADD_R
Gọi trình con: READ_12C887
Lưu giá tri DATA_R vào RAM_YEA
…
Kết thúc
Trang 9Khởi tạo port
D là port xuất
Chuyển địa chỉ cần đọc ra DATAPORT
Thiết lập DS, RW, AS mức cao
Tạo cạnh xuóng tại chân AS
Tạo cạnh xuóng tại chân DS
Khởi tạo port D là port nhập Lấy dữ liệu từ DATA_PORT
ra thanh ghi W
Thiết lập AS mức cao
Kết thúc
Trong ASM của CT con này có rất nhiểu lệnh NOP với mục đích là tạo trễ 1 chu
kỳ máy để đảm bảo thời gian chuyển mức cho các chân
Chuyển địa chỉ cần ghi ra DATAPORT
B.2.1.7) CHUONG TRINH CON READ_RTC (IN: ADD_R;OUT:DATA_R)
B1: đưa chân DS, RW, AS lên mức cao
B2: Đưa địa chỉ của thanh ghi cần đọc của RTC vào DATA_PORT
B3: Tạo cạnh xuống tại chân AS
B4: Tạo cạnh xuống tại chân DS
B5: Khởi tạo DATA_PORT thành port nhập để lấy dữ liệu ra tư RTC
B6: Dưa chân AS lên mức cao
Khởi tạo port
D là port xuất
Chuyển địa chỉ cần ghi ra DATAPORT
Thiết lập DS, RW mức cao
Tạo xung lên ở chân AS
Chuyển giá trị cần ghi ra DATAPORT
Thiết lập RW mức thấp
Thiết lập AS mức cao Kết thúc
Trang 10http://www.ebook.edu.vn 10
B.2.1.8) CHUONG TRINH CON TRANSFER_LCD
Giải thích: Chuyển các giá trị thời gian vào LCD Ý tưởng là chỉ có những phần nào thay
đổi thì mới được cập nhật vào LCD Thực hiện bằng cách: kiểm tra cách giá trị thời gian, nếu
bằng giá trị đầu tiên (0: đối với giây, phút, giờ; 1: đối với ngày, tháng, năm) thì sẽ được quét đến
giá trị cao hơn
B.2.1.9) CHUONG TRINH CON WRITE_DATA
Mục đích: ghi dữ liệu thời gian trong PIC ra LCD Chương trình này khác với CT con Write_ins
(ghi lệnh điều khiển LCD) Hai chương trìng này đều có lưu đồ giống nhau Điểm khác nhau duy
nhất là: Đối với write_data: ta khời động thêm chân RS (RS=1) của LCD (nhận biết là byte đó là
byte dữ liệu), và ngược lại đối với write_ins
Trang 11Nguyên tăc thực hiện:
B1: tách 1 byte 8 bit thành 2 phần 4 bit (do nguyên tăc kết nối là 4 bit)
B2: Chuyển dữ liệu (MSB) ra port_LCD Mục đích chuyển ra trước tạo sự ổn định do dữ liệu
B3: bật và tắt EN (cho phép gửi bit ra LCD) Đối với CT write_data thì ta phải bật RS trước khi
bật và tắt EN, còn đv CT write_ins thì không cần
B4: delay 1 khoảng 160 us, chắc chắn là LCD đã nhận được dữ liệu
B5: tiếp tục thực hiện tiếp đv 4 bit thấp và thực hiện lại bước 1
B.2.1.10) CHUONG TRINH NGAT
Loại ngắt: sử dụng ngắt ngoài RB0/INT
Mục đích của trình ngắt: nhận xung clock từ RTC để báo hiệu thời gian cầp nhật dữ liệu, do
LCD khác với LED ở chỗ là LCD chỉ cần truyền qua 1 lần thì giá trị đó được giữ; còn LED phải
truyền phát lien tục(quét led)
Cách thực hiện: do RTC 12C887 chỉ có thể tạo xung clk ra chân SQW với tốc độ tối
thiểu là 2Hz, tương đương 0.5s Ta cần xung 1s nên dẫn đến việc đùng 1 biến tạm Với giá trị
mặc định ban đầu là 2, sau 2 lần ngắt thì sẽ nhận 1 lần tức bằng 1s
Sau khi đã phát hiện 1s đã trôi qua, ta cần kiểm tra RTC xem coi RTC đã sẵn sang cho
việ truy xuất dữ liệu Bit cho phép truy xuất là bit thứ 7 của thanh ghi A của RTC Nếu là 1: cho
phép; 0 là từ chối
Sau khi được cho phép, gọi trình con UPDATE để cập nhật và xuất ra LCD luôn Sau đó
thiết lập lại chế độ ngắt
Lưu ý: mỗi khi thực hiện chương trình ngắt ta cần lưu lại tất cả các giá trị của thanh ghi w;
thanh ghi status và vị trí con trỏ chạy chương trình (PClath) và FSR
B.2.1.11) CHUONG TRINH HIEU CHINH GIO
Cách hiệu chình: Để vào phần hiệu chỉnh thì thông qua nút bấm SET_TIME Sau khi
truy cập vào phần hiệu chỉnh thời gian thi hiệu chỉnh tuần tự theo giờ, phút, năm, tháng, ngày
Mỗi lần chuyển sẽ thông qua việc bấm nút SET_TIME Theo nguyên tắc tăng giảm từng giá trị
thời gian thông qua 2 nút bấm(TURN_UP và TURN_DOWN) Sau khi đã đi hết 1 lượt các giá
trị hiệu chỉnh thì bấm lại nút SET_TIME để khởi động lại chương trình Đối với phần hiệu chỉnh
sẽ luôn xuất hiện con trỏ nhấp nháy ngay hàng đơn vị của mỗi giá trị đang được hiệu chỉnh
Mục đích việc sắp xếp thứ tự hiệu chỉnh: vì lý do kiểm soát giá trị tối đa ngày của từng
tháng nên cần phải xác định năm trước, để chọn maxngày bằng 28 hay 29; sau đó việc hiệu chỉnh
tháng sẽ giúp xác định maxngay chính xác, tránh tình trạng nhập lố số ngày đối với mỗi tháng,
dẫn đến RTC hoạt động sai
Cách thực hiện:
- Đối với phần hiệu chỉnh giờ dựa trên lưu đồ sau đây Giải thuật của phần hiệu chỉnh phút,
năm, tháng cũng tương tự như trên Điểm khác nhau duy nhất là giá trị khi đem so sánh Đối với
giờ thì so sánh với 23; phút thì là: 59; năm thì là: 99; tháng thì là: 12 Cũng theo nguyên tắc đó ta
cũng cần thay đổi giá trị gán cho từng biến thời gian
Trang 12http://www.ebook.edu.vn 12
Đợi 50ms
TIME_SET nhấn?
Trở về
Tắt bộ ngắt Đợi cho nút nhả ra Định vị trí giờ Bật và nhấp nháy con trỏ
TIME_SET nhấn?
Hiệu chỉnh
phút
TURN_UP nhấn?
Đợi 50ms
TURN_UP nhấn?
TURN_DOWN nhấn?
Đợi 50ms
TURN_DOWN nhấn?
RAM_HOU
= 23?
GIẢM RAM_HOU
- Đối với phần hiệu chỉnh ngày thì công việc phức tạp hơn Ta cần kiểm tra tháng trước
Nếu là tháng 4, 6, 9, 11 thì maxngay là 30 Đối với tháng 2 thì phải xét thêm năm Nếu năm chia
hết cho 4 thì maxngay la 29 ngược lại là 28 òn lại là: 31 ngày Như vậy công việc cần làm duy
nhất là xác định giá trị maxngay Î Chương trình tim max ngay
Trang 13B.2.1.12) CHUONG TRINH CON TIM_MAXNGAY
Cách thực hiện: đầu tiên xét giá trị của tháng Nếu tháng là 4 6 9 11 thì maxngay là 30
Nếu tháng là 2 thì ta xét đến năm Phương pháp xét năm nhuần như sau Đưa năm về dạng BIN,
sau đó kiểm tra 2 trọng số thấp nhất của giá trị năm đó Nếu cả 2 trọng số đó đều bằng 0 thì năm
đó là năm nhuần Vì tất cả dữ liệu thời gian đều lưu dưới dạng BCD nén, ta dung thuật toán để
chuyển lại bin nhưng để ý là ta đã tách BCD nén được thành BCD không nén Ta chỉ cần cộng
thêm MSB lần số 10 và LSB là ta đã có số BIN
MACH IN
Trang 14; DE TAI: DUNG PIC 16F887A TAO LICH VAN NIEN KY THUAT SO XUAT RA LCD 16X2
; NGUOI THUC HIEN: NGUYEN DUC TRI
; NGAY HOAN THANH: 30/10/2009
; -
; GIAO VIEN HUONG DAN: NGUYEN QUYNH ANH
; NGAY KIEM TRA: //2009
; -
;VERSION 1.1:
; KHOI DEM THOI GIAN: DUNG DS12C887(RTC)
; KHOI XU LY: PIC 16F877A
; KHOI HIEN THI: LCD 16X2
; KHOI DIEU KHIEN: BUTTON 3 NUT
Trang 15#DEFINE TIME_SET PORTB,2
#DEFINE TURN_UP PORTB,5
#DEFINE TURN_DOWN PORTB,4
#DEFINE DATAPORT PORTD
#DEFINE PORT_LCD PORTC
#DEFINE RS PORTC,6
; -
ORG 0X0004 ; NGAT NGOAI THEO XUNG CLK CUA DS1307 DE XAC DINH
THOI GIAN TRUY XUAT DU LIEU TRONG DS1307
NGAT
; -
; PHAN LUU LAI CAC GIA TRI VI KHI NGAT RAT CO THE CAC GIA TRI TREN SE BI THAY DOI
MOVLW W_SAVE ; LUU W RA THANH GHI NGOAI MOVF STATUS,W ; DOI DO W VA STATUS MOVLW STATUS_SAVE ; LUU W LUC DO DANG CHUA GIA TRI STATUS
; PHAN BAT DAU CHUONG TRINH NGAT
BTFSS INTCON,1 ; BIT KIEM TRA COI CO XAY RA NGAT BR0 GOTO NEXT_INTERRUPT; NEU GIA TRI CUA HAM SS TREN TRA VE O (KO CO NGAT RB0) THI THUC HIEN NGAT TIEP THEO
BTFSC DATA_R,7 ; Du lieu da san sang de truy xuat??
GOTO VONGLAP ; neu chua, Doi CALL UPDATE ; neu roi, cap nhat gia tri moi
Trang 17MOVLW b'01011010' ; dua gia tri vao thanh ghi "register B"
MOVWF DATA_W ; dang du lieu 24 gio
MOVLW d'11' ; dang du lieu BCD
Trang 18WRITE_12C887 ; GHI DU LIEU VAO RTC
BSF STATUS,RP0 ; CHON PORTD LA PORTOUT
READ_12C887 ; DOC DU LIEU TU RTC
BSF STATUS,RP0 ; CHON PORTD OUT
Trang 19TRANSFER_LCD ; CHUYEN CAC GIA TRI THOI GIAN VAO LCD
;Y TUONG LA CHI NHUNG GIA TRI NAO THAY DOI THI MOI DUOC CAP NHAT LEN LCD
;THUC HIEN: KT GIA TRI DAU CUA MOI MUC THOI GIAN, NEU GIA TRI THANH GHI THOI GIAN
;BANG VOI GIA TRI BAN DAU (O HAY 1) THI SE DUOC QUET TIEP DEN TH TIEP THEO