i BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP HỒ CHÍ MINH KHOA ĐIỆN – ĐIỆN TỬ MÔN HỌC ĐỒ ÁN 1 ĐỀ TÀI THIẾT KẾ MẠCH ĐỒNG HỒ SỐ SỬ DỤNG VI ĐIỀU KHIỂN PIC16F887 GIAO TIẾP VỚI IC THỜI GIAN T.
TỔNG QUAN
Lý do chọn đề tài
Chiếc đồng hồ là một vật dụng thiết yếu trong cuộc sống hàng ngày, giúp con người xác định thời gian chính xác để thực hiện công việc đúng giờ Với chức năng hiển thị thứ, ngày, tháng, năm dương lịch và âm lịch, cùng với giờ phút giây và báo thức, đồng hồ hỗ trợ chúng ta lập kế hoạch và hoàn thành công việc hiệu quả Nhận thấy những lợi ích từ chiếc đồng hồ, tác giả quyết định thực hiện đề tài này.
“THIẾT KẾ ĐỒNG HỒ SỐ SỬ DỤNG VI ĐIỀU KHIỂN PIC16F887 GIAO TIẾP VỚI IC
Mục tiêu nghiên cứu
Đồng hồ số được thiết kế để hiển thị giờ, phút, giây, cùng với thứ, ngày, tháng và năm, bao gồm cả âm lịch và dương lịch Người dùng có thể dễ dàng điều chỉnh thời gian và sử dụng chức năng hẹn giờ tiện lợi.
Phạm vi nghiên cứu
Thiết kế sử dụng vi điều khiển PIC16F887 giao tiếp với IC thời gian thực DS1307 thông qua chuẩn truyền thông I2C
Người thiết kế lập trình và biên dịch chương trình cho vi điều khiển bằng phần mềm CCS, sử dụng thư viện “16F887.h” và “cld.c” để hỗ trợ quá trình lập trình.
Thiết kế được mô phỏng và được layout bằng phần mềm Proteus.
Bố cục
Nội dung đề tài gồm 5 chương:
Chương 1: Tổng quan: Chương này trình bày lý do chọn đề tài, cũng như mục tiêu và phạm vi nghiên cứu của đề tài
Chương 2: Cơ sở lý thuyết: Giới thiệu về vi điều khiển PIC16F887, chuẩn truyền thông I2C, IC thời gian thực DS1307 và LCD
Chương 3: Thiết kế hệ thống: Trình bày sơ đồ khối, thiết kế sơ đồ nguyên lý cho từng khối và xây dựng lưu đồ giải thực của hệ thống
Chương 4: Kết quả thực hiện: Trình bày các kết quả thực hiện thiết kế
Chương 5: Kết luận và hướng phát triển: Đưa ra kết luận và hướng phát triển của đề tài
CƠ SỞ LÝ THUYẾT
Giới thiệu về Vi điều khiển PIC 16F887
PIC16F887 là một vi điều khiển 8 bit của Microchip, được thiết kế theo kiến trúc RISC, mang lại tốc độ thực thi lệnh cao và dễ dàng giao tiếp với người dùng Chip hoạt động trong dải điện áp từ 2V đến 5.5V, với tần số dao động từ 31 kHz đến 8 MHz có thể điều chỉnh bằng phần mềm, và hỗ trợ dòng điện khoảng 25mA Về bộ nhớ, PIC16F887 có SRAM 368 bytes, EEPROM 256 bytes và bộ nhớ chương trình Flash 8192 words cho phép ghi xóa nhiều lần Vi điều khiển này tích hợp các tính năng như Watchdog, ngắt, 3 bộ định thời Timer, và modules CCP/PWM, cùng với 35 chân I/O, trong đó có 14 chân chuyển đổi tương tự Các giao thức truyền thông hỗ trợ bao gồm USART, SPI và I2C PIC16F887 tự động reset khi có nguồn điện cấp hoặc có thể được reset bằng chân RE3 khi được cấu hình cho chức năng MCLR.
Sơ đồ chân của vi điều khiển PIC16F887 loại 40 được thể hiện trong hình 2.2, với 40 chân được chia thành 5 port Mỗi chân tích hợp nhiều chức năng khác nhau, và các chức năng của từng chân được mô tả chi tiết theo từng port.
Hình 2 1: Vi điều khiển PIC 16F887 (Nguồn: Internet)
Chân RA0/AN0/ULPWU/C12IN0- (2): có 4 chức năng:
RA0: xuất/ nhập số - bit thứ 0 của port A
AN0: ngõ vào tương tự của kênh thứ 0
ULPWU (Ultra Low-power Wake up input): ngõ vào đánh thức CPU công suất cực thấp
C12IN0- (Comparator C1 or C2 negative input): ngõ vào âm thứ 0 của bộ so sánh C1 hoặc C2
Chân RA1/AN1/C12IN1- (3): có 3 chức năng:
RA1: xuất/nhập số - bit thứ 1 của port A
AN1: ngõ vào tương tự của kênh thứ 1
C12IN1- (Comparator C1 or C2 negative input): ngõ vào âm thứ 1 của bộ so sánh C1 hoặc C2
Chân RA2/AN2/VREF-/CVREF/C2IN+ (4): có 5 chức năng:
RA2: xuất/nhập số - bit thứ 2 của port A
AN2: ngõ vào tương tự của kênh thứ 2
Hình 2 2: Sơ đồ chân vi điều khiển 16F887
(Nguồn: Microchip, PIC16F882/883/884/886/887 Data Shet, trang 6)
VREF-: ngõ vào điện áp chuẩn (thấp) của bộ ADC
CVREF: điện áp tham chiếu VREF ngõ vào bộ so sánh
C2IN+: ngõ vào dương của bộ so sánh C2
Chân RA3/AN3/VREF+/C1IN+ (5): có 4 chức năng:
RA3: xuất/nhập số - bit thứ 3 của port A
AN3: ngõ vào tương tự kênh thứ 3
VREF+: ngõ vào điện áp chuẩn (cao) của bộ A/D
C1IN+: ngõ vào dương của bộ so sánh C1
Chân RA4/T0CKI/C1OUT (6): có 3 chức năng:
RA4: xuất/nhập số – bit thứ 4 của port A
T0CKI: ngõ vào xung clock từ bên ngoài cho Timer0
C1OUT: ngõ ra bộ so sánh 1
Chân RA5/AN4/ SS / C2OUT (7): có 4 chức năng:
RA5: xuất/nhập số – bit thứ 5 của port A
AN4: ngõ vào tương tự kênh thứ 4
SS : ngõ vào chọn lựa SPI tớ (Slave SPI device)
C2OUT: ngõ ra bộ so sánh 2
Chân RA6/OSC2/CLKOUT (14): có 3 chức năng:
RA6: xuất/nhập số – bit thứ 6 của port A
OSC2: ngõ ra dao động thạch anh Kết nối đến thạch anh hoặc bộ cộng hưởng
CLKOUT: ở chế độ RC, ngừ ra của OSC2, bằng ẳ tần số của OSC1
Chân RA7/OSC1/CLKIN (13): có 3 chức năng:
RA7: xuất/nhập số – bit thứ 7 của port A
OSC1: ngõ vào dao động thạch anh hoặc ngõ vào nguồn xung ở bên ngoài
CLKIN: ngõ vào nguồn xung bên ngoài
Chân RB0/AN12/INT (33): có 3 chức năng:
RB0: xuất/nhập số – bit thứ 0 của port B
AN12: ngõ vào tương tự kênh thứ 12
INT: ngõ vào nhận tín hiệu ngắt ngoài
Chân RB1/AN10/C12IN3- (34): có 3 chức năng:
RB1: xuất/nhập số – bit thứ 1 của port B
AN10: ngõ vào tương tự kênh thứ 10
C12IN3-: ngõ vào âm thứ 3 của bộ so sánh C1 hoặc C2
Chân RB2/AN8 (35): có 2 chức năng:
RB2: xuất/nhập số – bit thứ 2 của port B
AN8: ngõ vào tương tự kênh thứ 8
Chân RB3/AN9/PGM/C12IN2 (36): có 4 chức năng:
RB3: xuất/nhập số – bit thứ 3 của port B
AN9: ngõ vào tương tự kênh thứ 9
PGM: Chân cho phép lập trình điện áp thấp ICSP
C12IN1-: ngõ vào âm thứ 2 của bộ so sánh C1 hoặc C2
Chân RB4/AN11 (37): có 2 chức năng:
RB4: xuất/nhập số – bit thứ 4 của port B
AN11: ngõ vào tương tự kênh thứ 11
Chân RB5/ AN13/ T1G (38): có 3 chức năng:
RB5: xuất/nhập số – bit thứ 5 của port B
AN13: ngõ vào tương tự kênh thứ 13
T1G (Timer1 gate input): ngõ vào Gate cho phép time1 đếm dùng để đếm độ rộng xung
Chân RB6/ICSPCLK (39): có 2 chức năng:
ICSPCLK: xung clock lập trình nối tiếp
Chân RB7/ICSPDAT (40): có 2 chức năng:
ICSPDAT: ngõ xuất nhập dữ liệu lập trình nối tiếp
Chân RC0/T1OSO/T1CKI (15): có 3 chức năng:
RC0: xuất/nhập số – bit thứ 0 của port C
T1OSO: ngõ ra của bộ dao động Timer1
T1CKI: ngõ vào xung clock từ bên ngoài Timer1
Chân RC1/T1OSI/CCP2 (16): có 3 chức năng:
RC1: xuất/nhập số – bit thứ 1 của port C
T1OSI: ngõ vào của bộ dao động Timer1
CCP2: ngõ vào Capture2, ngõ ra compare2, ngõ ra PWM2
Chân RC2 /P1A/CCP1 (17): có 3 chức năng:
RC2: xuất/nhập số – bit thứ 2 của port C
CCP1: ngõ vào Capture 1, ngõ ra compare 1, ngõ ra PWM1
Chân RC3/SCK/SCL (18): có 3 chức năng:
RC3: xuất/nhập số – bit thứ 3 của port C
SCK: ngõ vào xung clock nối tiếp đồng bộ/ngõ ra của chế độ SPI
SCL: ngõ vào xung clock nối tiếp đồng bộ/ngõ ra của chế độ I2C
Chân RC4/SDI/SDA (23): có 3 chức năng:
RC4: xuất/nhập số – bit thứ 4 của port C
SDI: ngõ vào dữ liệu trong truyền dữ liệu kiểu SPI
SDA: xuất/nhập dữ liệu I2C
Chân RC5/SDO (24): có 2 chức năng:
RC5: xuất/nhập số – bit thứ 5 của port C
SDO: ngõ xuất dữ liệu trong truyền dữ liệu kiểu SPI
Chân RC6/TX/CK (25): có 3 chức năng:
RC6: xuất/nhập số – bit thứ 6 của port C 14
TX: ngõ ra phát dữ liệu trong chế độ truyền bất đồng bộ USART
CK: ngõ ra cấp xung clock trong chế độ truyền đồng bộ USART
Chân RC7/RX/DT (26): có 3 chức năng:
RC7: xuất/nhập số – bit thứ 7 của port C
RX: ngõ vào nhận dữ liệu trong chế độ truyền bất đồng bộ EUSART
DT: ngõ phát và nhận dữ liệu ở chế độ truyền đồng bộ EUSART
Chân RD0 (19): có 1 chức năng: RD0: xuất/nhập số – bit thứ 0 của port D
Chân RD1 (20): có 1 chức năng: RD1: xuất/nhập số – bit thứ 1 của port D
Chân RD2 (21): có 1 chức năng: RD2: xuất/nhập số – bit thứ 2 của port D
Chân RD3 (22): có 1 chức năng: RD3: xuất/nhập số – bit thứ 3 của port D
Chân RD4 (27): có 1 chức năng: RD4: xuất/nhập số – bit thứ 4 của port D
Chân RD5/ P1B (28): có 2 chức năng:
RD5: xuất/nhập số – bit thứ 5 của port D
Chân RD6/ P1C (29): có 2 chức năng:
RD6: xuất/nhập số – bit thứ 6 của port D
Chân RD7/P1D (30): có 2 chức năng:
RD7: xuất/nhập số – bit thứ 7 của port D
P1D: ngõ ra tăng cường CPP1
Chân RE0/AN5 (8): có 2 chức năng:
AN5: ngõ vào tương tự 5
Chân RE1/AN6 (9): có 2 chức năng:
AN6: ngõ vào tương tự kênh thứ 6
Chân RE2/AN7 (10): có 2 chức năng:
AN7: ngõ vào tương tự kênh thứ 7
Chân RE3/ MCLR /VPP (1): có 3 chức năng:
RE3: xuất/nhập số - bit thứ 3 của port E
MCLR : là ngõ vào reset tích cực mức thấp
VPP: ngõ vào nhận điện áp khi ghi dữ liệu vào bộ nhớ nội flash
Ngoài ra, còn có các chân VDD (11), (32): cấp nguồn dương từ 2V đến 5V và VSS
Giới thiệu chuẩn truyền thông I2C
I2C, viết tắt của Inter-Integrated Circuit, là một chuẩn truyền thông do Philips Semiconductor phát triển, cho phép một thiết bị chủ (Master) giao tiếp với nhiều thiết bị tớ (Slave) qua hai đường tín hiệu: SDA (dữ liệu nối tiếp) để truyền tải dữ liệu và SCL (xung đồng hồ nối tiếp) để cung cấp xung clock từ Master cho Slave, nhằm đồng bộ hóa thời gian của các bit dữ liệu Mỗi thiết bị Slave được phân biệt bằng một địa chỉ riêng 7 bit hoặc 10 bit, do nhà sản xuất thiết lập theo chuẩn I2C.
Trong quá trình truyền dữ liệu giữa thiết bị chủ và thiết bị tớ, thiết bị chủ bắt đầu bằng cách tạo trạng thái START Sau đó, nó gửi địa chỉ của thiết bị tớ cần giao tiếp, trong đó có 7 bit địa chỉ và 1 bit điều khiển đọc/ghi (R/W) được đặt bằng 0 để thông báo thiết bị tớ chuẩn bị nhận byte tiếp theo Thiết bị chủ chờ nhận tín hiệu bắt tay từ thiết bị tớ trước khi gửi địa chỉ ô nhớ cần ghi dữ liệu Sau khi nhận tín hiệu trả lời từ thiết bị tớ, thiết bị chủ tiến hành gửi dữ liệu từng byte một và chờ nhận tín hiệu xác nhận sau mỗi lần gửi Quá trình này tiếp tục cho đến khi hoàn tất việc gửi byte cuối cùng, sau đó thiết bị chủ chuyển sang trạng thái STOP để kết thúc giao tiếp.
Hình 2 3: Dạng song quá trình thiết bị chủ ghi dữ liệu vào thiết bị tớ
(Nguồn: Nguyễn Đình Phú, Phan Vân Hoàn, Trương Ngoc Anh Giáo trình Vi điều khiển PIC, trang 365)
Trong quá trình giao tiếp giữa thiết bị chủ và thiết bị tớ, thiết bị chủ bắt đầu bằng trạng thái START để khởi động truyền dữ liệu Sau đó, thiết bị chủ gửi địa chỉ của thiết bị tớ cần giao tiếp, trong đó dữ liệu 8 bit bao gồm 7 bit địa chỉ và 1 bit điều khiển đọc/ghi (R/W), với bit này bằng 0 để thông báo rằng thiết bị tớ sẽ nhận byte tiếp theo Thiết bị chủ sẽ chờ tín hiệu bắt tay từ thiết bị tớ trước khi gửi địa chỉ ô nhớ cần đọc dữ liệu Sau khi nhận tín hiệu trả lời từ thiết bị tớ, thiết bị chủ chuyển sang trạng thái STOP và khởi động lại trạng thái START để gửi địa chỉ thiết bị và bit R/W bằng 1, yêu cầu thiết bị tớ gửi dữ liệu từ ô nhớ đã chỉ định Quá trình này tiếp tục cho đến khi thiết bị chủ nhận đủ dữ liệu mong muốn, sau đó tạo tín hiệu STOP để kết thúc giao tiếp.
Hình 2 4: Dạng sóng quá trình thiết bị chủ đọc dữ liệu từ thiết bị tớ
(Nguồn: Nguyễn Đình Phú, Phan Vân Hoàn, Trương Ngoc Anh Giáo trình Vi điều khiển PIC, trang 365)
Giới thiệu IC DS1307
IC DS1307 là một vi mạch thời gian thực của Dallas Semiconductor, có khả năng đếm thời gian chính xác với 64 ô nhớ, bao gồm 8 ô nhớ 8-bit lưu trữ dữ liệu thời gian như giây, phút, giờ, ngày trong tuần, ngày, tháng và năm IC này còn có 56 ô nhớ để lưu trữ dữ liệu khác Điểm nổi bật của DS1307 là khả năng hoạt động liên tục ngay cả khi mất điện nhờ vào nguồn pin CMOS 3.3V dự phòng Khi sử dụng DS1307, vi điều khiển chỉ cần đọc dữ liệu thời gian từ IC để thực hiện các thao tác hiển thị hoặc điều khiển, giúp đơn giản hóa chương trình điều khiển.
Các chân của DS1307 có chức năng như sau [1]:
Hai chân X1 và X2: dùng để kết nối với tụ thạch anh có tần số 32768 Hz để tạo dao động
Chân VBAT nối với nguồn dương của pin 3V3 để chip vẫn hoạt động đếm thời gian khi mất nguồn
Chân GND là chân nối 0V
Chân Vcc nối với nguồn Vcc có thể là 5V hoặc 3V3 tùy thuộc vào từng loại chip
Chân SQW/OUT là ngõ ra tạo xung vuông (Square Wave / Output Driver), tần số có thể lập trình
Hai chân SCL, SDA là 2 đường tín hiệu giao tiếp chuẩn I2C
Hình 2 5 : Sơ đồ chân DS1307
Serial Real Time Clock, trang 1)
Hình 2 6: IC thời gian thực DS1307
DS1307 hoạt động trong dải điện áp từ 2V đến 5.5V và giao tiếp với vi điều khiển qua chuẩn I2C, với vi điều khiển đóng vai trò Master để thực hiện việc đọc và ghi dữ liệu Để hiểu rõ hơn về cách giao tiếp với DS1307, cần xem xét bộ nhớ bên trong của nó, đặc biệt là 7 thanh ghi đầu tiên, vì chúng rất quan trọng cho hoạt động của chip Ô nhớ lưu giây (SECONDS) có địa chỉ 0x00, có chức năng lưu trữ hàng chục giây và hàng đơn vị giây Bit thứ 7, được gọi là CH (Clock Halt), nếu có giá trị bằng 1, sẽ ngừng hoạt động của đồng hồ, trong khi để đồng hồ hoạt động bình thường, bit này cần phải có giá trị bằng 0.
Hình 2 7: Sơ đồ kết nối giữa vi điều khiển với DS1307
(Nguồn: Nguyễn Đình Phú, Phan Vân Hoàn, Trương Ngoc Anh Giáo trình Vi điều khiển PIC, trang 375)
Hình 2 8:Tổ chức các thanh ghi thời gian của
(Nguồn: Dallas Semiconductor, Ds1307 64x8 Serial Real
Hình 2 9: Tổ chức bộ nhớ của DS1307
64x8 Serial Real Time Clock, trang 3 )
Ô nhớ lưu phút (MINUTES) có địa chỉ 0x01, lưu giá trị phút hàng đơn vị và hàng chục, với bit 7 luôn bằng 0 Ô nhớ lưu giờ (HOURS) có địa chỉ 0x02, lưu hàng chục và hàng đơn vị giờ ở chế độ 12 hoặc 24 giờ, được chọn bởi bit 6 (12/24) Nếu chọn chế độ 24 giờ, hàng chục giờ sử dụng 2 bit 4 và 5 (10HR); nếu chọn chế độ 12 giờ, bit 4 lưu hàng chục giờ và bit 5 lưu giá trị A/P cho AM và PM, với bit 7 luôn bằng 0 Ô nhớ lưu thứ trong tuần (DAY) có địa chỉ 0x03, lưu giá trị từ 1 đến 7 tương ứng với Chủ nhật đến thứ Bảy, chỉ sử dụng 3 bit thấp Ô nhớ lưu ngày (DATE) có địa chỉ 0x4H, lưu hàng chục và hàng đơn vị ngày, với 4 bit thấp từ 0 đến 3 cho đơn vị ngày và 2 bit 4 và 5 cho hàng chục, trong khi bit 6 và 7 luôn bằng 0 Ô nhớ lưu tháng (MONTH) có địa chỉ 0x5H, lưu hàng chục và hàng đơn vị tháng (giá trị từ 1 đến 12), với 4 bit thấp từ 0 đến 3 cho đơn vị tháng và 2 bit 4 và 5 cho hàng chục.
Ô nhớ lưu năm (YEAR) có địa chỉ 0x6H, đảm nhiệm chức năng lưu trữ hàng chục và đơn vị năm Bốn bit thấp từ thứ 0 đến thứ 3 chứa giá trị đơn vị của năm, trong khi bốn bit cao từ thứ 4 đến thứ 7 lưu trữ giá trị hàng chục của năm.
Thanh ghi điều khiển (CONTROL REGISTER): có địa chỉ 0x7H được sử dụng để điều khiển hoạt động của chân SQW/OUT.
Giới thiệu LCD
LCD là một module hiển thị ký tự, cho phép giao tiếp trực tiếp với người dùng thông qua màn hình bền bỉ, rõ nét và dễ sử dụng, rất phổ biến trên thị trường Có nhiều loại LCD, bao gồm LCD 16X2 với 2 hàng hiển thị 16 ký tự mỗi hàng, và LCD 20X4 với 4 hàng hiển thị 20 ký tự mỗi hàng Ngoài ra, còn có các loại LCD 14 hoặc 16 chân, khác nhau về cách cấp nguồn Trong số 16 chân của LCD, chúng được phân chia thành 4 dạng tín hiệu khác nhau.
Các chân cấp nguồn gồm chân số 1 nối với mass (0V), chân số 2 kết nối với nguồn +5V (VDD), và chân số 3 dùng để điều chỉnh độ tương phản, thường được kết nối với biến trở để điều chỉnh độ rõ của ký tự trên màn hình.
Chân điều khiển trong mạch điện có vai trò quan trọng, trong đó chân số 4 (RS) được sử dụng để chọn thanh ghi Chân R/W kiểm soát quá trình đọc và ghi dữ liệu, trong khi chân E đóng vai trò là chân cho phép dạng xung chốt, đảm bảo quá trình hoạt động chính xác.
Các chân dữ liệu D7÷D0: Chân số 7 đến chân số 14 là 8 chân dùng để trao đổi dữ liệu giữa thiết bị điều khiển và LCD
Các chân LED_A và LED_K: Chân số 15, 16 là 2 chân dùng để cấp nguồn cho đèn nền để có thể nhìn thấy vào ban đêm
LCD có ba vùng nhớ nội với các chức năng khác nhau: RAM – CGRAM cung cấp bộ nhớ để tạo ra 8 ký tự tùy ý, mỗi ký tự bao gồm 5 cột và 8 hàng; DDRAM lưu trữ mã ký tự hiển thị trên màn hình, tham chiếu với bitmap ký tự trong CGROM đã được định nghĩa trước hoặc do người dùng đặt; ROM - CGROM chứa các kiểu bitmap cho mỗi ký tự đã được định nghĩa trước mà LCD có thể hiển thị, như các ký tự trong bảng mã ASCII, với ký tự lưu trong DDRAM được tham chiếu đến một vị trí trong CGROM.
Trong bài viết về thiết kế đồng hồ số, tác giả sẽ khai thác vùng nhớ CGRAM của LCD, cho phép người dùng tự tạo và hiển thị các ký tự số lớn Vùng nhớ CGRAM này có địa chỉ từ 0x40 đến 0x7F, cung cấp khả năng lưu trữ linh hoạt cho việc hiển thị thông tin Hình 2.11 minh họa cấu trúc của vùng nhớ CGRAM trên LCD.
64 byte dữ liệu Mỗi ký tự hiển thị trên LCD là một ma trận gồm 8 byte nên vùng nhớ CGRAM cho phép lưu được 8 ký tự
Hình 2 11: Vùng nhớ CGRAM của LCD
Để tạo ra các số lớn từ 0 đến 9 dễ nhìn, chúng ta có thể ghép các vùng ký tự tự tạo lại với nhau, tương tự như mã của đèn LED 7 đoạn Mỗi đoạn được đánh tên là a, b, c, d, e, f, g, i, như thể hiện trong hình 2.12 Hình 2.13 cung cấp bảng mã hex tương ứng cho các đoạn này Chúng ta chỉ sử dụng 5 bit có trọng số thấp trong vùng nhớ CGRAM, trong khi 3 bit có trọng số cao được mặc định bằng 0.
Sau khi phân tích các đoạn con, chúng ta kết hợp chúng để tạo ra các số từ 0 đến 9, mỗi số chiếm 6 vị trí Để thuận tiện trong việc tạo dữ liệu và lập trình, các đoạn được sắp xếp theo thứ tự: f, a, b, c, d, e, f hoặc g+d Mỗi ký tự số lớn sẽ tương ứng với 6 ký tự bình thường, và khi tính toán, chúng ta sẽ xử lý 3 ký tự đầu tiên trước, sau đó đến 3 ký tự tiếp theo, quy trình lập trình cũng tương tự.
Số 0 sáng thì các đoạn: f, a, b, e, d, c sáng, tương ứng với các số: 0, 1, 2, 4, 3, 5
Hình 2 13: Tìm mã của các đoạn cho số lớn trên LCD
(Nguồn: Nguyễn Đình Phú, Trương Ngọc Anh, Phan Vân Hoàn, Giáo trình Thực hành vi điều khiển PIC, trang 111)
Hình 2 12: Hình ảnh các đoạn cho số lớn
(Nguồn: Nguyễn Đình Phú, Trương Ngọc Anh,
Phan Vân Hoàn, Giáo trình Thực hành vi điều khiển PIC, trang 110)
Hình 2 14: Hình ảnh các số to từ 0 đến 9
(Nguồn: Nguyễn Đình Phú, Trương Ngọc Anh, Phan Vân Hoàn, Giáo trình Thực hành vi điều khiển PIC, trang 111)
Số 1 sáng thì các đoạn: a, b, ‘ ’, d, i, d, sáng, tương ứng với các số: 1, 2, 0x20, 3, 7, 3
Số 2 sáng thì các đoạn: g+d, g+d, b, e, d, d sáng, tương ứng với các số: 6, 6, 2, 4, 3, 3
Số 3 sáng thì các đoạn: g+d, g+d, b, d, d, c sáng, tương ứng với các số: 6, 6, 2, 3, 3, 5
Số 4 sáng thì các đoạn: i, d, i, 0, 0, i sáng, tương ứng với các số: 7, 3, 7, 0x20, 0x20, 7
Số 5 sáng thì các đoạn: i, g+d, g+d, d, d, c sáng, tương ứng với các số: 7, 6, 6, 3, 3, 5
Số 6 sáng thì các đoạn: f, g+d, g+d, e, d, c sáng, tương ứng với các số: 0, 6, 6, 4, 3, 5
Số 7 sáng thì các đoạn: a, a, i, 0, 0, i sáng, tương ứng với các số: 1, 1, 7, 0x20, 0x20, 7
Số 8 sáng thì các đoạn: f, g+d, b, e, d, c sáng, tương ứng với các số: 0, 6, 2, 4, 3, 5
Số 9 sáng thì các đoạn: f, g+d, b, d, d, c sáng, tương ứng với các số: 0, 6, 2, 3, 3, 5
Mã 0x20 hay 32 là hiển thị khoảng trắng
Khi lập trình, mã của các đoạn được tổ chức thành mảng 2 chiều với 10 ký tự từ 0 đến 9 Mỗi ký tự chiếm 8 byte, và khi hiển thị, chúng sẽ tạo thành một con số.
Sơ đồ khối thiết kế
Các khối có chức năng như sau:
- Khối nguồn: Có chức năng cung cấp nguồn điện để duy trì hoạt động của cả hệ thống
- Khối vi điều khiển: Có nhiệm vụ xử lý dữ liệu được tiếp nhận để đưa thông tin hiển thị trên LCD
Khối nút nhấn đóng vai trò quan trọng trong việc giao tiếp giữa người dùng và hệ thống, bằng cách truyền tín hiệu điện tương ứng với mức logic 0 và 1 vào khối xử lý trung tâm.
- Khối hiển thị: Hiển thị lên màn hình LCD những thông tin về thời gian
- Khối thời gian thực: cung cấp thời gian thực một chính xác kể cả khi hệ thống bị mất điện
- Khối còi báo: Có nhiệm vụ phát tín hiệu âm thanh khi thời gian thực bằng với thời gian đã đặt hẹn giờ.
Thiết kế chi tiết
Khối nguồn sử dụng IC ổn áp 7805 U2 để cung cấp nguồn điện ổn định 5V cho CLD và PIC16F887, với mạch nguyên lý được thể hiện trong Hình 3.2 Nguồn DC từ 7,5V đến 12V được cấp vào J1, và tụ C1 giúp lọc nguồn để tăng tính ổn định IC 7805 U2 có khả năng cung cấp dòng tối đa 1A, và nguồn 5V ở ngõ ra sẽ được lọc thêm bằng tụ C2 và C3 để đảm bảo độ ổn định cao hơn cho mạch.
Hình 3 1: Sơ đồ khối thiết kế
Vi điều khiển có vai trò quan trọng trong việc giao tiếp và điều khiển các thành phần khác để thực hiện các chức năng theo yêu cầu của mạch Cụ thể, nó sẽ đọc thời gian từ DS1307 và hiển thị thông tin này trên màn hình LCD Người dùng có thể sử dụng các nút nhấn để hiệu chỉnh thời gian, sau đó hiển thị và ghi lại thời gian đã chỉnh sửa vào DS1307 Ngoài ra, vi điều khiển cũng so sánh thời gian hiện tại với thời gian đã được cài đặt sẵn để kích hoạt còi báo khi hai thời gian này trùng khớp.
Vi điều khiển PIC16F887 được lựa chọn vì là một vi điều khiển 8 bit với kiến trúc RISC, mang lại tốc độ thực thi lệnh cao và dễ dàng lập trình nhờ vào tập lệnh tương đối ít Ngoài ra, PIC16F887 đã được nghiên cứu trong môn học lý thuyết và hỗ trợ giao tiếp I2C với DS1307, giúp lập trình viên dễ dàng đọc dữ liệu thời gian và xử lý hiển thị mà không cần tính toán thiết lập timer.
Mạch nguyên lý của khối vi điều khiển được minh họa trong Hình 3.1, trong đó người thiết kế đã chọn sử dụng giao động ngoại với thạch anh 20M để tạo ra xung nhịp cho PIC, nhằm tối ưu hóa tốc độ xử lý của chip.
Hình 3 2: Mạch nguyên lý của khối nguồn
Hình 3 3: Mạch nguyên lý khối vi điều khiển
Vi điều khiển sử dụng 18 thạch anh và 2 chân OSC2 (chân 14) cùng OSC1 (chân 13) để dao động nhanh ổn định Chân 1 được kết nối với nút nhấn và điện trở kéo lên để thực hiện chức năng MCLR, cho phép người dùng reset hệ thống Các chân 33, 34, 35, 36 ở port B được kết nối với các nút nhấn Mode, Up, Dow, Timer, với chức năng chi tiết ở mục 3.2.3 Việc chọn port B cho các nút nhấn là do bên trong có điện trở kéo lên có thể kích hoạt bằng lệnh port_b_pullups(), giúp tiết kiệm chi phí thiết kế nhờ không cần sử dụng điện trở kéo lên bên ngoài Các chân ở port D được chọn để giao tiếp với LCD.
Cổng 4 bit của vi điều khiển có cấu trúc đơn giản, với các chân chủ yếu dùng để xuất/nhập số Các chân RD0, RD1, RD2 kết nối với RS, E, RW trên LCD, trong khi các chân RD4 đến RD7 kết nối với D4 đến D7 trên LCD để truyền dữ liệu ở chế độ 4 bit Chân RD3 được chọn làm ngõ ra kích hoạt khối còi báo, giúp đơn giản hóa lập trình chỉ với việc thiết lập các chân của port D Hai chân RC3 (SCL) và RC4 (SDA) hỗ trợ giao tiếp I2C, được sử dụng để kết nối với DS1307, trong khi chân RE0 kích hoạt còi báo Nguồn cấp chính được cung cấp từ khối nguồn 5V.
Mạch nguyên lý của khối nút nhấn sử dụng các nút nhấn một tiếp điểm để tạo mức thay đổi logic cho vi điều khiển Các nút này có thể dễ dàng thay đổi chức năng thông qua lập trình Nút nhấn K1 được kết nối với chân MCLR để reset mạch, trong khi điện trở R1 giữ mức cao khi không nhấn nút Nút K2 dùng để chọn đối tượng điều chỉnh giá trị, K3 tăng giá trị đối tượng đã chọn, K4 giảm giá trị, và K5 được sử dụng để hẹn giờ Khi ở chế độ chỉnh thời gian (nhấn K2), nhấn K5 sẽ thoát khỏi chế độ này.
Hình 3 4: Mạch nguyên lý khối nút nhấn
Khi rời khỏi chế độ chỉnh thời gian, đồng hồ sẽ tự động cập nhật giá trị thời gian đã chỉnh và tiếp tục hoạt động bình thường Nếu đang ở chế độ cài đặt báo thức (nhấn K5) mà nhấn K2, đồng hồ sẽ quay lại chế độ đếm thời gian, trong khi thời gian báo thức đã cài sẽ được lưu lại Khi thời gian cài đặt báo thức trùng với thời gian thực, còi báo sẽ phát tín hiệu âm thanh.
Người thiết kế sử dụng màn hình LCD 20x4 để hiển thị thời gian, tận dụng vùng nhớ CGRAM nhằm trình bày số lớn, giúp người dùng dễ dàng quan sát Hai dòng đầu hiển thị giờ, phút, giây với kích thước lớn; dòng thứ ba cung cấp thông tin về thứ, ngày, tháng, năm dương lịch; và dòng cuối cùng hiển thị ngày, tháng, năm âm lịch Mạch nguyên lý của khối hiển thị được minh họa trong hình 3.5.
Hình 3 5: Mạch nguyên lý khối hiển thị
Chân VDD và VSS trên LCD cung cấp nguồn và kết nối với mass để chiếu sáng nền màn hình Biến trở 10 KΩ được sử dụng để điều chỉnh độ tương phản của màn hình LCD Các chân còn lại của LCD được kết nối với vi điều khiển như đã trình bày ở phần 3.2.2.
Việc sử dụng IC thời gian thực DS1307 giúp đơn giản hóa chương trình điều khiển, cho phép vi điều khiển chỉ cần đọc dữ liệu thời gian từ IC này để xử lý hiển thị hoặc điều khiển Người dùng không cần phải tính toán hay thiết lập timer trên vi điều khiển Mạch nguyên lý khối thời gian thực được trình bày trong hình 3.6.
Thạch anh 32,768 KHz kết nối với chân X1, X2 của DS1307 để tạo ra dao động chuẩn thời gian, trong khi pin 3V3 cung cấp nguồn cho IC thời gian thực, giúp duy trì độ chính xác ngay cả khi mất điện Các điện trở kéo lên R5 và R6 có giá trị 10k nhằm ngăn chặn tình trạng thả nổi trên đường tín hiệu Thời gian sẽ được cập nhật tự động trong U3 và các giá trị thời gian có thể được vi điều khiển truy cập để đọc và ghi thông qua giao thức I2C.
Mạch nguyên lý khối còi báo (Hình 3.6) sử dụng còi báo LS1 buzzer để phát ra âm thanh, được điều khiển nguồn bởi transistor Q1 C1815 Transistor Q1 có nhiệm vụ nâng dòng điều khiển lên đến 1A, trong khi điện trở R8 hoạt động như điện trở phân cực cho Q1 Khi Q1 được kích hoạt, nó sẽ cung cấp nguồn cho còi báo Vi điều khiển cần cấp tín hiệu điều khiển mức cao qua điện trở R8 để kích Q1 dẫn.
Tính toán giá trị điện trở R8 Vì dòng của Q1 C1815 có thể lên đến 50mA [4] Hệ số khuếch đại là = 120 Vậy để C1815 dẫn bảo hòa thì:
Ib=Icmax/ P/120=0.42mA Điện trở Rb được tính: Rb = Vbe/Ib =(5-0.7)/0.42 10k
Hình 3 6: Mạch nguyên lý khói thời gian thực
Hình 3 7: Mạch nguyên lý khối còi báo
Lưu đồ giải thuật
Mục này trình bày lưu đồ giải thuật mà người thiết kế sử dụng để lập trình cho vi điều khiển bằng phần mềm CCS Để thuận tiện, chương trình được chia thành các chương trình con với chức năng cụ thể Đầu tiên, chương trình đọc dữ liệu từ DS1307 và ghi dữ liệu ngược vào DS1307, phục vụ cho giao tiếp giữa vi điều khiển và DS1307 Dữ liệu từ DS1307 sẽ được lưu vào mảng mang_tg_rtc[7], với 7 phần tử tương ứng với giây, phút, giờ, thứ, ngày, tháng và năm.
Dữ liệu thời gian từ vi điều khiển DS1307 được lưu trữ dưới dạng chuỗi số nhị phân 8 bit Để hiển thị thông tin này, cần chuyển đổi chuỗi nhị phân thành số BCD Hình 3.10 minh họa quy trình chuyển đổi từ số nhị phân sang số BCD.
Hình 3 8: Lưu đồ chương trình ghi dữ liệu từ
DS1307 Hình 3 9: Lưu đồ chương trình đọc dữ liệu từ
Chương trình chỉnh giờ cho phép người dùng điều chỉnh thời gian trên đồng hồ khi có sai lệch so với thời gian thực tế Người dùng chỉ cần nhấn nút Mode để chọn các đối tượng cần chỉnh như giờ, phút, giây, thứ, ngày, tháng, năm dương lịch và ngày, tháng, năm âm lịch Đối tượng được lựa chọn sẽ nhấp nháy trên màn hình LCD, giúp người dùng dễ dàng nhận biết và thực hiện điều chỉnh.
Chức năng Up và Down cho phép điều chỉnh giá trị của các đối tượng trong phạm vi nhất định, như ngày từ 1 đến 31 và thứ từ thứ Hai đến Chủ Nhật Khi tất cả các đối tượng đã được điều chỉnh, nhấn nút Mode lần thứ 10 sẽ hoàn tất quá trình Nếu nhấn Mode lần thứ 11 hoặc nút Timer trong khi điều chỉnh, chương trình sẽ thoát Sau khi kết thúc, thời gian đã điều chỉnh sẽ được lưu vào DS1307 và hệ thống sẽ tiếp tục đếm thời gian từ các giá trị mới này.
Hình 3 10: Lưu đồ chương trình chuyển số nhị phân sang số BCD
Để thiết lập chức năng báo thức, chúng ta sử dụng lưu đồ chương trình chỉnh báo thức Khi nhấn nút Timer, màn hình LCD chuyển sang giao diện cài đặt báo thức, cho phép người dùng chọn giờ, phút, giây bằng cách nhấn nút Timer Giá trị được điều chỉnh bằng hai nút Up và Down Nếu nhấn nút Mode hoặc nhấn Timer lần thứ tư, người dùng sẽ thoát khỏi chế độ cài đặt và trở về giao diện hiển thị thời gian Thời gian đã cài sẽ được lưu và so sánh với thời gian thực từ DS1307; khi hai thời gian trùng khớp, buzzer sẽ phát âm thanh báo hiệu.
HIỂN THỊ CHỌN GIÁ TRỊ CHỈNH LÊN LCD
TĂNG GIÁ TRỊ ĐƯỢC CHỌN TRONG GIỚI HẠN THỜI
GIẢM GIÁ TRỊ ĐƯỢC CHỌN TRONG GIỚI HẠN THỜI
TĂNG GIÁ TRỊ CHỌN CHỈNH (MODE++)
Để hiển thị âm lịch, lưu đồ chương trình được thiết kế như hình 3.13 Việc tính toán ngày, tháng, năm âm lịch dựa trên ngày, tháng, năm dương lịch khá phức tạp và vi điều khiển không đủ RAM để xử lý Do đó, giải thuật được đưa ra dựa trên sự chênh lệch giữa âm lịch và dương lịch của tháng 5 năm 2022, trong đó ngày âm và dương lịch trùng nhau, và tháng âm lịch nhỏ hơn tháng dương lịch 1 đơn vị Giải thuật này có ưu điểm là đơn giản nhưng nhược điểm là không chính xác, yêu cầu người dùng điều chỉnh lại ngày, tháng âm lịch sau mỗi tháng hoặc khi reset chương trình.
HIỂN THỊ NỘI DUNG BÁO CHỈNH BÁO THỨC LÊN
HIỂN THỊ CHỌN GIÁ TRỊ BÁO THỨC CHỈNH LÊN LCD
TĂNG GIÁ TRỊ BÁO THỨC ĐƯỢC CHỌN TRONG GIỚI
GIẢM GIÁ TRỊ BÁO THỨC ĐƯỢC CHỌN TRONG GIỚI
TĂNG GIÁ TRỊ CHỌN CHỈNH (MODE++)
Sau khi hoàn thành các lưu đồ cho các chương trình con, chúng ta có thể tạo ra lưu đồ cho chương trình chính như hình 3.14 Nút nhấn reset cho phép người dùng khởi động lại hệ thống, trong khi nút Timer được sử dụng để tắt buzzer báo thức Quá trình khởi tạo số thực hiện được tiến hành theo các bước đã định.
Đầu tiên, chúng ta tạo ra 8 mảng con gồm f, a, b, d, c, e, g+d, i, với mỗi mảng chứa 8 phần tử Giá trị của các phần tử trong các mảng này được thể hiện như trong hình 2.11.
- Lưu giá trị của các phần tử của từng mãng vào vùng nhớ CGRAM của LCD, đoạn f, a, b, d, c, e, g+d, i tương ứng với các số 0, 1, 2, 3, 4, 5, 6, 7
- Tạo ma trận 10x6 có tên là lcd_so_to; 10 hàng là các số từ 0 đến 9; 6 cột là 6 đoạn con để ghép thành số tương ứng (đã trình bày ở mục 2.4)
Hình 3 13: Lưu đồ chương trình âm lịch
Hình 3 14: Lưu đồ chương trình chính
HIỂN THỊ MÀN HÌNH GIỚI THIỆU
HIỂN THỊ THỜI GIAN LÊN LCD
SO SÁNH THỜI GIAN ĐỂ BẬT BÁO THỨC
TẠO THỜI GIAN TRỄ GIỚI THIỆU
Hình 4 1: Mạch nguyên lý toàn hệ thống
KẾT QUẢ THỰC HIỆN
Kết quả thực hiện phần cứng
Hình 4.1 trình bày mạch nguyên lý của toàn mạch đồng hồ số được vẽ bởi phần mềm Proteus Với các khối như đã trình bày ở mục 3.2
Bằng cách sử dụng phần mềm Proteus, chúng tôi đã thiết kế và vẽ mạch in dựa trên mạch nguyên lý, tạo ra mạch PCB một lớp như hiển thị trong hình 4.2 Hình 4.3 minh họa sơ đồ 3D bố trí linh kiện của thiết kế.
KHỐI THỜI GIAN THỰC KHỐI CÒI BÁO
Hình 4 2: Sơ đồ bố trí linh kiện dạng 3D của thiết kế Hình 4 3: Mạch PCB layout 1 lớp của thiết kế
Chúng ta có được mạch thực tế của thiết kế như hình 4.4 với các khối được chú thích như sau:
1 là khối vi điều khiển
3 là khối hiển thị LCD
4 là khối thời gian thực
6 là khối nút nhấn Chức năng của các nút nhấn đã được trình bày ở mục 3.2.3
Hình 4 4: Mạch thiệt tế của thiết kế
Kết quả thực hiện phần mềm
Sau khi hoàn thành viết chương trình dựa trên lưu đồ giải thuật ở mục 3.3, chúng ta sẽ tiến hành biên dịch và nạp chương trình vào vi điều khiển Hình 4.5 minh họa kết quả mô phỏng thông qua phần mềm Proteus Mã nguồn của chương trình sẽ được trình bày ở phần cuối của báo cáo này.
Hình 4.6 và 4.7 minh họa cách hiển thị thời gian và cài đặt báo thức Khi thời gian thực trùng với thời gian đã cài, buzzer sẽ phát ra âm thanh, và để tắt báo thức, người dùng chỉ cần nhấn nút Timer Để điều chỉnh thời gian khi đồng hồ sai lệch, nhấn nút Mode để chọn đối tượng cần điều chỉnh; đối tượng này sẽ nhấp nháy Sau đó, sử dụng nút Up hoặc Dw để tăng hoặc giảm giá trị Khi điều chỉnh xong, nhấn Timer để thoát và đồng hồ sẽ tiếp tục đếm thời gian từ giá trị đã chỉnh Để khởi động chức năng hẹn giờ, nhấn nút Timer, mỗi lần nhấn sẽ chọn giờ, phút, giây cho báo thức Lần nhấn thứ tư hoặc nhấn Mode sẽ thoát khỏi màn hình cài báo thức và quay lại màn hình hiển thị thời gian Đối tượng được chọn bởi nút Timer có thể được điều chỉnh giá trị bằng hai nút Up và Dw.
Hình 4 5: Kết quả mô phỏng
Hình 4 7: Màn hình hiển thị cài báo thức Hình 4 6: Màn hình hiển thị thời gian