Tải bản đầy đủ (.docx) (26 trang)

Đồng hồ kỹ thuật số hiển thị lên LCD

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 (738.52 KB, 26 trang )

BÁO CÁO ĐỒ ÁN TIẾN HÀNH THỰC NGHIỆM

Mục Lục

1


BÁO CÁO ĐỒ ÁN TIẾN HÀNH THỰC NGHIỆM

Lời mở đầu
Ngày nay, khoa học công nghệ và kỹ thuật đang đóng một vai trò quan trọng trong đời sống
con người. Bên cạnh đó, thời gian luôn trở thành một tài sản quý giá mà bất kì ai cũng mong
muốn được tận dụng một cách tối đa. Tuy nhiên, việc quản lý thời gian một cách hiệu quả vẫn là
một trong những vấn đề nan giải cần được giải quyết một cách triệt để và đây là một đề tài mà
nhóm luôn muốn tìm cách giải quyết. Kết hợp với kiến thức thiết kế và lập trình hệ thống nhúng,
nhóm đã quyết định lựa chọn đề tài “Thiết kế đồng hồ và lịch điện tử bằng PIC hay AVR”.
Đề tài này nhóm em chọn thực hiện bằng PIC16F877A, được thực hiện trong khoảng thời
gian 4 tháng với sự hỗ trợ của những kiến thức về lập trình C, thiết kế và mô phỏng mạch. Hơn
thế nữa, nhóm cũng tận dụng những khả năng của vi xử lý PIC16F877A để giải quyết những vấn
đề phát sinh trong quá trình thực hiện. Kết quả nhận được là khả quan khi thành phẩm có thể
hiện thị thời gian một cách chi tiết và có thể được điều chỉnh thông qua các nút nhấn. Trong
tương lai, sản phẩm này hoàn toàn có thể được phát triển xa hơn với các tính năng mới hơn như
báo thức, thiết lập lịch làm việc… nhằm đáp ứng nhu cầu quản lý thời gian mà mỗi người mong
muốn.

Giới thiệu chung
Bài báo cáo trình bày mạch đồng hồ hiển thị thời gian thông qua việc sử dụng ngôn ngữ lập
trình C trên PIC C Compiler và những kiến thức cơ bản về thiết kế hệ thống nhúng. Trước hết,
bài báo cáo sẽ trình bày về những đặc tính cơ bản của sản phẩm. Nhìn chung, mạch được tạo
thành từ các thành phần linh kiện khá phổ biến trong việc thiết kế hệ thống nhúng như vi xử lý
PIC16F877A, màn hình LCD, nút nhấn cùng với các linh kiện cơ bản như điện trở, tụ điện…


Ngoài ra, bài báo cáo này cũng trình bày về cách thức mô phỏng bằng Proteus cũng như thiết
kế mạch in thông qua ứng dụng Orcad, trong đó, việc thiết kế mạch in đóng vai trò quan trọng
hơn hết khi chất lượng sản phẩm phụ thuộc vào yếu tố này. Tiếp theo, sơ đồ khối cơ bản cùng
với những thuật toán dành cho sản phẩm sẽ được giới thiệu. Về cơ bản, mạch đồng hồ này sử
dụng Timer0 của vi xử lý PIC để tạo bộ đếm 1 giây cho các thành phần khác hoạt động. Thêm
vào đó, thuật toán dành cho màn hình LCD và nút nhấn cũng được chú trọng kĩ càng khi những
phần này đóng vai trò quan trọng trong việc khẳng định hiệu năng của thiết bị.

Công cụ sử dụng
Trong quá trình thực hiện đồ án này, sản phẩm đã được hình thành thông qua việc sử dụng
các phần mềm hữu ích sau đây:




PIC C Compiler, hỗ trợ viết mã và biên dịch mã nguồn thành file .hex.
Proteus 8.0, hỗ trợ mô phỏng sản phẩm.
Orcad 10.5, hỗ trợ thiết kế mạch in và hoàn thiện sản phẩm.

Nội Dung
1. Đặc tính sản phẩm

2


BÁO CÁO ĐỒ ÁN TIẾN HÀNH THỰC NGHIỆM

Sản phẩm được thiết kế là đồng hồ điện tử có khả năng hiển thị thời gian. Cụ thể hơn, mạch
có khả năng hiển thị thời gian với các thông số: ngày – tháng – năm và giờ - phút – giây. Ngoài
ra, người dùng có thể thực hiện việc điều chỉnh các thông số này thông qua các nút nhấn.

Để thực hiện được các tính năng trên, sản phẩm sử dụng giao tiếp với màn hình LCD để hiển
thị thời gian cùng với bộ định thì timer0 trong chip xử lý PIC16F877A để tạo bộ đếm giây.
Ngoài ra, như đã đề cập ở trên, sản phẩm có sử dụng các nút nhấn để nhập thông tin về thời gian
mà người dùng mong muốn. Sau khi hoàn thành quá trình nhập, thời gian sẽ được hiển thị phù
hợp với yêu cầu của người dùng.
2. Đặc tính kĩ thuật:

3.

Nút nhấn

PIC16F877A

LCD
Hiển thị thời gian

Tạo xung

Hình 1: Sơ đồ hoạt động tổng quát
Sản phẩm sử dụng đầu các thành phần linh kiện sau đây để thực hiện chức năng:
a. Nút nhấn:

Trong mạch thiết kế, sản phẩm sử dụng bốn nút nhấn với tên gọi lần lượt là SET TIME, UP,
DOWN và RESET. Mỗi nút nhấn có từng chức năng riêng biệt như sau:





SET TIME: thiết lập thời gian cho từng thông số hiển thị trên đồng hồ

UP: tăng giá trị của thông số đang tùy chỉnh lên 1 với giờ phút giây, tháng năm và tang thứ tự
ngày trong tuần
DOWN: giảm giá trị thông số đang tùy chỉnh xuống 1 với giờ phút giây, tháng, năm và giảm thứ
tự ngày trong tuần.
RESET: trả về giá trị ban đầu.

b. Vi xử lý PIC16F877A:

3


BÁO CÁO ĐỒ ÁN TIẾN HÀNH THỰC NGHIỆM

Hình 2: Sơ đồ chân Vi xử lý PIC16F877A

Về cơ bản, PIC là viết tắt của Programmable Intelligent Computer, do hãng General
Instrument đặt tên cho sản phẩm xử lý đầu tiên của họ. Hiện nay, trên thị trường có rất nhiều họ
vi điều khiển như 8051, ARM, v.v nhưng họ vi điều khiển PIC được ưa chuộng vì rất nhiều lý
do:





Họ vi điều khiển này dễ dàng tìm thấy tại thị trường Việt Nam
Giá thành phù hợp với nhu cầu học hỏi của sinh viên
Có đầy đủ tính năng của một vi điều khiển hoạt động độc lập
Là sự bổ sung rất tốt về kiến thức cũng như về ứng dụng cho họ vi điều khiển mang tính truyền
thống như 8051.
Ngoài ra, sự hỗ trợ của các nhà sản xuất về trình biên dịch (PIC C Compiler, MickroC), các

công cụ lập trình, nạp chương trình dành cho họ sản phẩm này khá đa dạng, chính vì thế PIC là
một lựa chọn hoàn hảo để xây dựng mô hình sản phẩm.
Cụ thể hơn, PIC16F877A có tập lận gồm 35 lệnh có độ dài 14 bit. Mỗi lệnh đều được thực
thi trong một chu kì xung clock. Tốc độ tối đa cho phép là 20MHz với một chu kì lệnh là 200ms.
Bộ nhớ chương trình 8k x 14 bit, bộ nhớ dữ liệu là 368 x 8 byte RAM và bộ nhớ dữ liệu
EEPROM với dung lượng là 258 x 8 byte. Sổ PORT I/O là 5 với 33 chân I/O

4


BÁO CÁO ĐỒ ÁN TIẾN HÀNH THỰC NGHIỆM

Hình 3: Sơ đồ khối Vi xử lý PIC16F877A
Ngoài ra, các đặc tính ngoại vi của sản phẩm này bao gồm các khối chức năng sau:








Timer0: bộ đếm 8 bit với bộ chia tần số 8 bit
Timer1: bộ đếm 16 bit với bộ chia tần số, có thể thực hiện chức năng đếm dựa vào xung
clock ngoại vi ngay khi vi điều khiển hoạt động ở chế độ ngủ.
Timer2: bộ đếm 8 bit với bộ chia tần số, bộ postcaler.
Hai bộ Capture/so sánh/điều chế độ xung
Các chuẩn giao tiếp SSP (Synchronous Serial Port), SPI và I2C
Chuẩn giao tiếp nối USART với 9 địa chỉ bit
Cổng giao tiếp song song PSP (Parallel Slave Port) với các chân điều khiển RD, WR, CS

ở bên ngoài.

Ngoài ra, chúng ta cũng có thể nhắc tới các đặc tính Analog như sau:



8 kênh chuyển đổi ADC 10bit
Hai bộ so sánh
5


BÁO CÁO ĐỒ ÁN TIẾN HÀNH THỰC NGHIỆM










Bộ nhớ flash với khả năng ghi xóa được 100,000 lần
Bộ nhớ EEPROM với khả năng xóa được 1,000,000 lần
Dữ liệu bộ nhớ EEPROM có thể lưu trữ trên 40 năm
Khả năng tự nạp chương trình với sự điều khiển của phần mềm
Watchdog Timer với bộ dao động trong
Chức năng bảo mật mã chương trình
Chế độ Sleep
Có thể hoạt động với nhiều dạng Oscillator khác nhau

c. Khối hiển thị LCD:
Màn hình LCD đóng vai trò hiển thị các thông số thời gian như ngày tháng năm – giờ phút
giây.
d. Khối nguồn:

Để mạch hoạt động một cách hiệu quả, sản phẩm sử dụng nguồn 5V cung cấp từ adapter
hoặc USB kết nối với máy tính. Ở đây, nhóm chọn nguồn cung cấp cho mạch là từ cổng USB.
e. Các thành phần khác:

Ngoài ra, để thực hiện mạch hoạt động cũng như thực hiện được các chức năng cơ bản như
điều chỉnh thời gian, sản phẩm sử dụng thêm các linh kiện là biến trở, điện trở, nút nhấn.
f.

Yêu cầu:
Mạch hoạt động một cách hiệu quả khi thời gian hiển thị phù hợp với thời gian chuẩn theo
giờ GMT. Để thực hiện được điều này, ta cần tạo được bộ đếm thời gian một giây để đồng hồ
hoạt động. Ngoài ra, người dùng hoàn toàn có thể điều chỉnh thời gian theo ý mình muốn cũng
như có thể xóa tất cả các thiết lập ban đầu để thiết lập mới hoàn toàn. Hơn nữa, sản phẩm cũng
phải có giao diện thiết kế đẹp, dễ nhìn và cuốn hút.

4. Đặc tính phần cứng:
a. Sơ đồ mô phỏng và sơ đồ khối mạch:

Trước tiên, quá trình mô phỏng được thực hiện để kiểm tra hoạt động của mã nguồn chương
trình. Sơ đồ mô phỏng mạch được thiết kế như sau:

6


BÁO CÁO ĐỒ ÁN TIẾN HÀNH THỰC NGHIỆM


Hình 4: Sơ đồ mạch mô phỏng bằng Proteus
Sau đó, để thực hiện sản phẩm, mạch được thiết kế với mô hình nguyên lý hoạt động sau đây:

Hình 5: Sơ đồ hoạt động của mạch

7


BÁO CÁO ĐỒ ÁN TIẾN HÀNH THỰC NGHIỆM

Vi xử lý PIC16F877A có tần số là 20 MHz. Ngoài ra, mạch sử dụng bộ định thì timer0 để tạo
bộ đếm 1 giây cho đồng hồ. Hơn nữa, mạch nhận thông tin điều chỉnh thời gian thông qua các
nút nhấn và thông tin đầu vào được đưa vào cổng E. Thông tin đầu ra sử dụng cổng D để hiển thị
lên LCD.

Hình 6: Sơ đồ khối hiển thị LCD
Khối LCD sử dụng trong mạch là LCD 16 chân: trong đó, mạch sử dụng các chân 1, 2, 3, 4,
5, 6, 11, 12, 13, 14, 15, 16 để hiển thị thời gian. Ngoài ra, thành phần này được tích hợp thêm
một biến trở để điều khiển độ sáng màn hình.
Thạch anh với tần số 20MHz đưa vào chân số 13 OSC1/CLKIN và 14 OSC2/CLKOUT tạo
xung clock cho đồng hồ.
Điện trở sử dụng trong mạch có giá trị là 4.7K
b. Nguồn

Hình 7: Sơ đồ nguồn
Nguyên lý hoạt động cơ bản:
Mạch bắt đầu hoạt động khi được cung cấp nguồn 5V thông qua dây kết nối USB với máy
tính cá nhân hoặc adapter. Khi cấp nguồn cho mạch, vi xử lý PIC16F877A sẽ bắt đầu đếm thời
gian. Ngoài ra, khi bắt đầu khởi động, các giá trị ban đầu sẽ là 00:00:00. Do đó, để điều chỉnh

thời gian, người dùng có thể sử dụng các nút nhấn SET TIME, UP, DOWN. Khi đó, mạch sẽ sử

8


BÁO CÁO ĐỒ ÁN TIẾN HÀNH THỰC NGHIỆM

dụng thuật tốn điều chỉnh thời gian cũng như xác định năm nhuận để thực hiện xác lập thời gian
hiển thị.
5. Đặc tính phần mềm
a. Đồng hồ sẽ hoạt động như thế nào?

Về cơ bản, đồng hồ hiển ghị ngày – tháng – năm và giờ – phút – giây bao gồm các thơng số
cùng với tầm hoạt động sau đây:







Giây: 0 – 59
Phút: 0 – 59
Giờ: 0 – 23
Ngày: SUN – MON – TUE– WED – THU – FRI – SAT tương ứng với chủ nhật, thứ hai, thứ ba,
thứ tư, thứ năm, thứ sáu, thứ bảy trong tuần. 1 – 7 tương ứng với các ngày trong tuần.
Số ngày: 1 – 28/29/30/31 với cận trên tương ứng với tháng trong năm.
Tháng: 1 – 12
Như vậy, để đồng hồ hoạt động, biến giây của đồng hồ sẽ bắt đầu đếm từ 0 đến 59. Khi đó,
biến phút sẽ được cộng lên 1; đồng thời, biến giây sẽ được trả lại 0 và tiếp tục q trình đếm. Sau

đó, biến phút sẽ được tăng từ 1 đến 59; khi đó, thơng số giờ sẽ được tăng lên 1 và thơng số phút
sẽ bắt đầu đến lại bằng 0. Tiếp theo, biến giờ sẽ được đếm từ 1 và khi giá trị này đạt 23, ngày và
số ngày được tăng lên một và giờ sẽ đếm lại với giá trị là 0. Ngồi ra, thơng số ngày sẽ được tăng
lên ở mốc tối đa là 7, ứng với thứ 7 và sau đó giá trị này sẽ bắt đầu lại từ 0 (ứng với chủ nhật).
Trong khi đó, thơng số số ngày sẽ tăng từ 1 tới 28/29/30/31 với cận trên tương ứng với tháng
trong năm hoặc năm nhuận hay khơng. Giả sử tháng đang nói tới là tháng 1, 3, 5, 7, 8, 10 hoặc
12 thì số ngày tối đa là 31; tháng hiện tại là 4, 6, 9, 10 hoặc 11 thì số ngày sẽ là 30. Nếu tháng
hiện tại là tháng 2 năm thường thì số ngày là 28 và tháng 2 năm nhuận là 29 ngày. Khi số ngày
của tháng đạt mức tối đa, giá trị tháng sẽ tăng lên 1 và số ngày sẽ bắt đầu lại từ 0. Cuối cùng, nếu
tháng hiện tại là 12 thì sau đó, số năm sẽ tăng lên 1 và giá trị tháng bắt đầu lại là 1.

b. Cách tạo bộ đếm thời gian?

Để đồng hồ hoạt động, ta cần tạo ra một đếm thời gian cũng như cập nhật thời gian để liên
tục đếm cũng như hiển thị lên màn hình LCD. Có rất nhiều cách thực hiện nhiệm vụ này, trong
đó nổi bật là hai cách thức : sử dụng Real Time Clock IC (IC thời gian thực) hoặc sử dụng Timer
của PIC16F877A . Dựa trên u cầu của đồ án , phương án thứ hai được lựa chọn để thực hiện.
 Sử dụng Timer của PIC16F877A :

Timer0 :
Đây là một trong ba bộ đếm hoặc bộ đònh thời của vi điều khiển PIC16F877A. Timer0 là
bộ đếm 8 bit được kết nối với bộ chia tần số (prescaler) 8 bit. Cấu trúc của Timer0 cho phép
ta lựa chọn xung clock tác động và cạnh tích cực của xung clock. Ngắt Timer0 sẽ xuất hiện
khi Timer0 bò tràn. Bit TMR0IE (INTCON<5>) là bit điều khiển của Timer0.
TMR0IE=1 cho phép ngắt Timer0 tác động, TMR0IF= 0 không cho phép ngắt Timer0 tác
động. Sơ đồ khối của Timer0 như sau:
9


BÁO CÁO ĐỒ ÁN TIẾN HÀNH THỰC NGHIỆM


Hình 8: Sơ đồ khối của Timer0
Muốn Timer0 hoạt động ở chế độ Timer ta clear bit TOSC (OPTION_REG<5>), khi đó
giá trò thanh ghi TMR0 sẽ tăng theo từng chu kì xung đồng hồ (tần số vào Timer0 bằng ¼ tần
số oscillator). Khi giá trò thanh ghi TMR0 từ FFh trở về 00h, ngắt Timer0 sẽ xuất hiện.
Thanh ghi TMR0 cho phép ghi và xóa được giúp ta ấn đònh thời điểm ngắt Timer0 xuất
hiện một cách linh động.
Muốn Timer0 hoạt động ở chế độ counter ta set bit TOSC (OPTION_REG<5>). Khi đó
xung tác động lên bộ đếm được lấy từ chân RA4/TOCK1. Bit TOSE (OPTION_REG<4>) cho
phép lựa chọn cạnh tác động vào bộ đếm. Cạnh tác động sẽ là cạnh lên nếu TOSE = 0 và
cạnh tác động sẽ là cạnh xuống nếu TOSE = 1. Khi thanh ghi TMR0 bò tràn, bit TMR0IF
(INTCON<2>) sẽ được set. Đây chính là cờ ngắt của Timer0. Cờ ngắt này phải được xóa
bằng chương trình trước khi bộ đếm bắt đầu thực hiện lại quá trình đếm. Ngắt Timer0 không
thể “đánh thức” vi điều khiển từ chế đo sleep. Ngoài ra, bộ chia tần số (prescaler) được chia
sẻ giữa Timer0 và WDT (Watchdog Timer). Điều đó có nghóa là nếu prescaler được sử dụng
cho Timer0 thì WDT sẽ không có được hỗ trợ của prescaler và ngược lại. Prescaler được điều
khiển bởi thanh ghi OPTION_REG. Bit PSA (OPTION_REG<3>) xác đònh đối tượng tác
động của prescaler. Các bit PS2:PS0 (OPTION_REG<2:0>) xác đònh tỉ số chia tần số của
prescaler. Xem lại thanh ghi OPTION_REG để xác đònh lại một cách chi tiết về các bit điều
khiển trên.
Các lệnh tác động lên giá trò thanh ghi TMR0 sẽ xóa chế độ hoạt động của prescaler.
Khi đối tượng tác động là Timer0, tác động lên giá trò thanh ghi TMR0 sẽ xóa prescaler
nhưng không làm thay đổi đối tượng tác động của prescaler. Khi đối tượng tác động là WDT,
lệnh CLRWDT sẽ xóa prescaler, đồng thời prescaler sẽ ngưng tác vụ hỗ trợ cho WDT.

10


BÁO CÁO ĐỒ ÁN TIẾN HÀNH THỰC NGHIỆM


Các thanh ghi điều khiển liên quan đến Timer0 bao gồm:




TMR0 (đòa chỉ 01h, 101h) : chứa giá trò đếm của Timer0.
INTCON (đòa chỉ 0Bh, 8Bh, 10Bh, 18Bh): cho phép ngắt hoạt động (GIE và PEIE).
OPTION_REG (đòa chỉ 81h, 181h): điều khiển prescaler.
Timer1 :

Hình 9: Sơ đồ khối của Timer1
Timer1 là bộ đònh thời 16 bit, giá trò của Timer1 sẽ được lưu trong hai thanh ghi
(TMR1H:TMR1L). Cờ ngắt của Timer1 là bit TMR1IF (PIR1<0>). Bit điều khiển của
Timer1 sẽ là TMR1IE (PIE<0>).
Tương tự như Timer0, Timer1 cũng có hai chế độ hoạt động: chế độ đònh thời (timer) với
xung kích là xung clock của oscillator (tần số của timer bằng ¼ tần số của oscillator) vàchế
độ đếm (counter) với xung kích là xung phản ánh các sự kiện cần đếm lấy từ bên ngoài
thông qua chân RC0/T1OSO/T1CKI (cạnh tác động là cạnh lên). Việc lựa chọn xung tác
động (tương ứng với việc lựa chọn chế độ hoạt động là timer hay counter) được điều khiển
bởi bit TMR1CS (T1CON<1>).
Ngoài ra, Timer1 còn có chức năng reset input bên trong được điều khiển bởi một trong
hai khối CCP (Capture/Compare/PWM). Khi bit T1OSCEN (T1CON<3>) được set, Timer1 sẽ
lấy xung clock từ hai chân RC1/T1OSI/CCP2 và RC0/T1OSO/T1CKI làm xung đếm. Timer1
sẽ bắt đầu đếm sau cạnh xuống đầu tiên của xung ngõ vào. Khi đó PORTC sẽ bỏ qua sự tác
động của hai bit TRISC<1:0> và PORTC<2:1> được gán giá trò 0. Khi clear bit T1OSCEN
Timer1 sẽ lấy xung đếm từ oscillator hoặc từ chân RC0/T1OSO/T1CKI.
Timer1 có hai chế độ đếm là đồng bộ (Synchronous) và bất đồng bộ (Asynchronous).
Chế độ đếm được quyết đònh bởi bit điều khiển T1SYNC (T1CON<2>). Khi T1SYNC =1 xung
đếm lấy từ bên ngoài sẽ không được đồng bộ hóa với xung clock bên trong, Timer1 sẽ tiếp


11


BÁO CÁO ĐỒ ÁN TIẾN HÀNH THỰC NGHIỆM

tục quá trình đếm khi vi điều khiển đang ở chế độ sleep và ngắt do Timer1 tạo ra khi bò tràn
có khả năng “đánh thức” vi điều khiển. Ở chế độ đếm bất đồng bộ,
Timer1 không thể được sử dụng để làm nguồn xung clock cho khối CCP
(Capture/Compare/Pulse width modulation). Khi T1SYNC =0 xung đếm vào Timer1 sẽ được
đồng bộ hóa với xung clock bên trong. Ở chế độ này Timer1 sẽ không hoạt động khi vi điều
khiển đang ở chế độ sleep.
Các thanh ghi liên quan đến Timer1 bao gồm:






INTCON (đòa chỉ 0Bh, 8Bh, 10Bh, 18Bh): cho phép ngắt hoạt động (GIE và PEIE).
PIR1 (đòa chỉ 0Ch): chứa cờ ngắt Timer1 (TMR1IF). PIE1( đòa chỉ 8Ch): cho phép ngắt
Timer1 (TMR1IE).
TMR1L (đòa chỉ 0Eh): chứa giá trò 8 bit thấp của bộ đếm Timer1.
TMR1H (đòa chỉ 0Eh): chứa giá trò 8 bit cao của bộ đếm Timer1.
T1CON (đòa chỉ 10h): xác lập các thông số cho Timer1.
Timer2:

Hình 10: Sơ đồ hoạt động của Timer2
Timer2 là bộ đònh thời 8 bit và được hỗ trợ bởi hai bộ chia tần số prescaler và postscaler.
Thanh ghi chứa giá trò đếm của Timer2 là TMR2. Bit cho phép ngắt Timer2 tác động là
TMR2ON (T2CON<2>). Cờ ngắt của Timer2 là bit TMR2IF (PIR1<1>). Xung ngõ vào (tần

số bằng ¼ tần số oscillator) được đưa qua bộ chia tần số prescaler 4 bit (với các tỉ số chia tần
số là 1:1, 1:4 hoặc 1:16 và được điều khiển bởi các bit T2CKPS1:T2CKPS0 (T2CON<1:0>)).
Timer2 còn được hỗ trợ bởi thanh ghi PR2. Giá trò đếm trong thanh ghi TMR2 sẽ tăng từ
00h đến giá trò chứa trong thanh ghi PR2, sau đó được reset về 00h. Khi reset thanh ghi PR2
được nhận giá trò mặc đònh FFh. Ngõ ra của Timer2 được đưa qua bộ chia tần số postscaler
với các mức chia từ 1:1 đến 1:16. Postscaler được điều khiển bởi 4 bit
T2OUTPS3:T2OUTPS0. Ngõ ra của postscaler đóng vai trò quyết đònh trong việc điều khiển
cờ ngắt. Ngoài ra ngõ ra của Timer2 còn được kết nối với khối SSP, do đó Timer2 còn đóng
vai trò tạo ra xung clock đồng bộ cho khối giao tiếp SSP.

12


BÁO CÁO ĐỒ ÁN TIẾN HÀNH THỰC NGHIỆM

Các thanh ghi liên quan đến Timer2 bao gồm:







INTCON (đòa chỉ 0Bh, 8Bh, 10Bh, 18Bh): cho phép toàn bộ các ngắt (GIE và PEIE).
PIR1 (đòa chỉ 0Ch): chứa cờ ngắt Timer2 (TMR2IF).
PIE1 (đòa chò 8Ch): chứa bit điều khiển Timer2 (TMR2IE).
TMR2 (đòa chỉ 11h): chứa giá trò đếm của Timer2.
T2CON (đòa chỉ 12h): xác lập các thông số cho Timer2.
PR2 (đòa chỉ 92h): thanh ghi hỗ trợ cho Timer2.
Ta có một vài nhận xét về Timer0, Timer1 và Timer2 như sau:








Timer0 và Timer2 là bộ đếm 8 bit (giá trò đếm tối đa là FFh), trong khi Timer1 là bộ đếm 16
bit (giá trò đếm tối đa là FFFFh).
Timer0, Timer1 và Timer2 đều có hai chế độ hoạt động là timer và counter. Xung clock có
tần số bằng ¼ tần số của oscillator.
Xung tác động lên Timer0 được hỗ trợ bởi prescaler và có thể được thiết lập ở nhiều chế độ
khác nhau (tần số tác động, cạnh tác động) trong khi các thông số của xung tác động lên
Timer1 là cố đònh. Timer2 được hỗ trợ bởi hai bộ chia tần số prescaler và postcaler độc lập,
tuy nhiên cạnh tác động vẫn được cố đònh là cạnh lên.
Timer1 có quan hệ với khối CCP, trong khi Timer2 được kết nối với khối SSP.
Khi đó, nếu sử dụng Timer, mã nguồn chương trình cần phải tạo hàm tạo thời gian 1 giây
cũng như cập nhật liên tục thời gian. Sau đó, hoạt động còn lại dựa trên các nút nhấn cùng
với vi xử lý PIC.

c. Sơ đồ khối và các hàm quan trọng.

Để đồng hồ hoạt động, ta sử dụng sơ đồ khối cũng như các đoạn mã sau đây:

13


BÁO CÁO ĐỒ ÁN TIẾN HÀNH THỰC NGHIỆM

Hình 11: Sơ đồ khối chung

Mã nguồn phần main() của chương trình:
14


BÁO CÁO ĐỒ ÁN TIẾN HÀNH THỰC NGHIỆM

Mã nguồn thành
phần tạo bộ đếm
thời gian cho
đồng hồ:
Sơ đồ khối
Buttonchecked()
– Có tác dụng
điều khiển hoạt
động khi các nút
được nhấn.

void main()
{
int8 prev_sec = 0, next_sec = 0;
int1 mode;
Initialize_RTC();
enable_interrupts(GLOBAL);
lcd_init();
delay_ms(10);
port_init();
output_low(PIN_D7);
while(true)
{
buttonchecked();

if (set_time_button)
{
set_time_button = 0;
time_setting_mode();
}
LCD_display();
}
}

void TIMER1_isr()
{
set_timer0(-125);
clear_interrupt(INT_TIMER0);
K++;
if (K == 126) {
if (++secs > 59) {
secs = 0;
if (++mins > 59) {
mins = 0;
if (++hours > 23) {
hours = 0;
if (++day > 7)
day = 1;
if (++date > end_of_month[month-1][is_leap_year(year + 2000)]) {
date = 1;
if (++month > 12) {
month = 1;
++year;
}
}

}
}
}
K = 0;
}
}

15


BÁO CÁO ĐỒ ÁN TIẾN HÀNH THỰC NGHIỆM

Hình 12: Sơ đồ khối hàm ButtonChecked

16


BÁO CÁO ĐỒ ÁN TIẾN HÀNH THỰC NGHIỆM

Mã nguồn hàm ButtonChecked()

Hàm
Incre_Decre –
để tăng giảm
giá trị khi
nhấn nút UP
và DOWN

void buttonchecked()
{

if(re0 == 0)
// neu nut duoc nhan
{
delay_ms(8);
// khong cho nguoi dung thay doi nut
nhan
if (re0 == 0)
{
set_time_button = 1;
while (re0 == 0) {}
// thay doi nut nhan
delay_ms(8);
// khong cho nguoi dung thay doi nut
nhan
}
}
int8 incre_decre(int8 min_value, int8 value, int8 max_value)
{

if ( re1 == 0)
{
delay_ms(8);
buttonchecked();
if (re1 == 0)
{
if (incre_button)
incre_button = 1;
{
while (re1 == 0) {}
delay_ms(8);

incre_button
= 0;
}
}
if (value < max_value)
if ( re2
== 0)
return(value
+ 1);
{
delay_ms(8);
else return(min_value);
if (re2 == 0)
} {
decre_button = 1;
if (decre_button)
while (re2 == 0) {}
delay_ms(8);
{ }
}
decre_button = 0;

}
int8 incre_decre(int8
int8 value, int8 max_value)
if (min_value < min_value,
value)
{
buttonchecked();
return(value - 1);

if (incre_button)
{ else return (max_value);
incre_button = 0;
} else
if return
(value value;
< max_value)
return(value + 1);
}
else return(min_value);
}
if (decre_button)
{
decre_button = 0;
if (min_value < value)
return(value - 1);
else return (max_value);
} else return value;
}

17


BÁO CÁO ĐỒ ÁN TIẾN HÀNH THỰC NGHIỆM

Hình 13: Hàm Incre_Decre với phần Incre

18



BÁO CÁO ĐỒ ÁN TIẾN HÀNH THỰC NGHIỆM

Hình 14: Hàm Incre_Decre với phần Decre

19


BÁO CÁO ĐỒ ÁN TIẾN HÀNH THỰC NGHIỆM

Sơ đồ khối Date Setting Mode – Hàm Date Setting Mode có tác dụng điều chỉnh ngày cũng
như thứ trong tuần tương ứng với tháng trong năm.

Hình 15: Sơ đồ khối hàm Date Setting Mode
Mã nguồn hàm Date Setting Mode:

20


BÁO CÁO ĐỒ ÁN TIẾN HÀNH THỰC NGHIỆM

void date_setting_mode()

Sơ đồ
khối và mã
nguồn hàm
Time setting
mode – Hàm
có chức năng
điều chỉnh
thời gian hiển

thị tương ứng
với từng ngày
trong tuần.

{

}

switch(thang)
else
{

while (!set_time_button) {

case 1: date = (incre_decre(1, date, 28));
case 3: LCD_DISPLAY();
case 5:
}
case 7:
break;
}
}

case 8:
case 10:
case 12:
while (!set_time_button) {
date = incre_decre(1,date,31);
LCD_DISPLAY();
}

break;
case 4:
case 6:
case 9:
case 11:
while (!set_time_button){
date = incre_decre(1,date,30);
LCD_DISPLAY();
}
break;
case 2:
if (year%4 == 0)
while (!set_time_button){
date = (incre_decre(1,date,29));
LCD_DISPLAY();
}
else
while (!set_time_button) {
date = (incre_decre(1, date, 28));
LCD_DISPLAY();

21


BÁO CÁO ĐỒ ÁN TIẾN HÀNH THỰC NGHIỆM

Hình 16: Sơ đồ khối hàm Time Setting Mode

22



BÁO CÁO ĐỒ ÁN TIẾN HÀNH THỰC NGHIỆM

void time_setting_mode()
{
int1 exit_1 = 0;
int8 Time_SM = 0;
while (exit_1 == 0){
set_time_button = 0;
while (!set_time_button) {
Time_SM = incre_decre(0,Time_SM,7);
disp_lcd_TimeSM(Time_SM);
buttonchecked();
}
set_time_button = 0;
switch (Time_SM) {
case 2:while (!set_time_button) {secs = incre_decre(0,secs,59);
LCD_DISPLAY();}; break;
case 1:while (!set_time_button) {mins = incre_decre(0,mins,59);
LCD_DISPLAY();}; break;
case 0:while (!set_time_button) {hours = incre_decre(0,hours,23);
LCD_DISPLAY();};break;
case 3:while (!set_time_button) {day =
incre_decre(0,day,7);LCD_DISPLAY();}; break;
case 4:date_setting_mode(); break;
case 5:while (!set_time_button) {thang =
incre_decre(0,thang,12);LCD_DISPLAY();}; break;
case 6:while (!set_time_button) {year = incre_decre(0,year,99);
LCD_DISPLAY();};break;
case 7: exit_1 = 1; break;

}
}
//printf(lcd_putc, "\f");
lcd_gotoxy(1,1);
printf(lcd_putc, "FINISHED");
delay_ms(500);
}

23


BÁO CÁO ĐỒ ÁN TIẾN HÀNH THỰC NGHIỆM

6. Đặc tính kiểm tra

Quá trình kiểm tra bao gồm việc mô phỏng mạch trên ISIS Proteus, thiết kế mạch in cũng
như thực hiện mạch trên thực tế:
a. Mô phỏng mạch trên Proteus 8.0:

Hình 17: Sơ đồ mạch mô phỏng trên Proteus
b. Thiết kế mạch in và kết quả thực tế:

Hình 18: Sơ đồ mạch in, thiết kế bằng Layout trên Orcad

24


BÁO CÁO ĐỒ ÁN TIẾN HÀNH THỰC NGHIỆM

Hình 19: Hình ảnh test mạch hoạt động

Để tiến hành kiểm tra hoạt động thực tế của mạch, ta tiến hành kiểm nghiệm từng thành
phần:





Điều chỉnh độ sáng màn hình
Nút nhấn: SET_TIME, UP, DOWN và RESET
Hoạt động LCD.
Nguồn

Sau khi kiểm kiệm, ta thu được kết quả cụ thể sau đây:
Thành phần
Độ sáng màn hình
Nút nhấn
SET_TIME
UP
DOWN
RESET
Hoạt động LCD
Nguồn
Hoạt động của đồng hồ

Kết quả kì vọng
Tốt
Tốt
Tốt
Tốt
Tốt

Tốt
Tốt
Tốt

Kết quả thực tế
Tốt
Đạt
Đạt
Đạt
Đạt
Tốt
Tốt và ổn định
Tốt

7. Kết luận

Sản phẩm được tạo thành có chức năng hiển thị ngày tháng năm, giờ phút giây và hoạt động
khá ổn đinh so với kì vọng của nhóm.

25


×